[{"data":1,"prerenderedAt":352},["ShallowReactive",2],{"navigation_docs":3,"-api-gemini-recommendations":100,"-api-gemini-recommendations-surround":347},[4,35,80,90],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting Started",false,"\u002Fgetting-started","1.getting-started",[10,15,20,25,30],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F2.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F3.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Project Structure","\u002Fgetting-started\u002Fproject-structure","1.getting-started\u002F4.project-structure","i-lucide-folder-tree",{"title":26,"path":27,"stem":28,"icon":29},"Backend Server","\u002Fgetting-started\u002Fbackend","1.getting-started\u002F6.backend","i-lucide-server",{"title":31,"path":32,"stem":33,"icon":34},"Troubleshooting","\u002Fgetting-started\u002Ftroubleshooting","1.getting-started\u002F8.troubleshooting","i-lucide-wrench",{"title":36,"icon":6,"path":37,"stem":38,"children":39,"page":6},"API","\u002Fapi","2.api",[40,45,50,55,60,65,70,75],{"title":41,"path":42,"stem":43,"icon":44},"API Overview","\u002Fapi\u002Foverview","2.api\u002F1.overview","i-lucide-zap",{"title":46,"path":47,"stem":48,"icon":49},"TMDB Integration","\u002Fapi\u002Ftmdb-proxy","2.api\u002F2.tmdb-proxy","i-si-movie-line",{"title":51,"path":52,"stem":53,"icon":54},"Watched and My List APIs","\u002Fapi\u002Fwatched-movies","2.api\u002F3.watched-movies","i-lucide-eye",{"title":56,"path":57,"stem":58,"icon":59},"Recommendation Generation","\u002Fapi\u002Fgemini-recommendations","2.api\u002F4.gemini-recommendations","i-lucide-sparkles",{"title":61,"path":62,"stem":63,"icon":64},"Movie Search API","\u002Fapi\u002Fmovie-search","2.api\u002F5.movie-search","i-lucide-search",{"title":66,"path":67,"stem":68,"icon":69},"TMDB Import","\u002Fapi\u002Ftmdb-import","2.api\u002F6.tmdb-import","i-lucide-database",{"title":71,"path":72,"stem":73,"icon":74},"Movie Details & Caching","\u002Fapi\u002Fmovie-details","2.api\u002F7.movie-details","i-lucide-film",{"title":76,"path":77,"stem":78,"icon":79},"Recommendations (Cached)","\u002Fapi\u002Frecommendations-cache","2.api\u002F8.recommendations-cache","i-lucide-brain",{"title":81,"icon":6,"path":82,"stem":83,"children":84,"page":6},"Frontend","\u002Ffrontend","4.frontend",[85],{"title":86,"path":87,"stem":88,"icon":89},"Components","\u002Ffrontend\u002Fcomponents","4.frontend\u002F1.components","i-lucide-layout",{"title":91,"icon":6,"path":92,"stem":93,"children":94,"page":6},"Reference","\u002Freference","5.reference",[95],{"title":96,"path":97,"stem":98,"icon":99},"Rate Limiting","\u002Freference\u002Frate-limiting","5.reference\u002F2.rate-limiting","i-lucide-shield",{"id":101,"title":56,"body":102,"description":339,"extension":340,"links":341,"meta":342,"navigation":343,"path":57,"seo":344,"stem":58,"__hash__":346},"docs\u002F2.api\u002F4.gemini-recommendations.md",{"type":103,"value":104,"toc":330},"minimark",[105,114,119,156,160,163,170,184,187,194,217,220,228,231,281,285,292,305,314,318],[106,107,108,109,113],"p",{},"Recommendation generation happens inside ",[110,111,112],"code",{},"GET \u002Fapi\u002Frecommend",", which handles auth, cache reuse, regeneration, My List context, validation, and fallback behavior in one place.",[115,116,118],"h2",{"id":117},"how-it-works","How It Works",[120,121,122,126,132,138,141,144,147,150,153],"ol",{},[123,124,125],"li",{},"Authenticates the user via a Supabase JWT token",[123,127,128,129],{},"Fetches the user's watched movies from ",[110,130,131],{},"user_watched_movies",[123,133,134,135],{},"Fetches the user's My List IDs from ",[110,136,137],{},"user_my_list",[123,139,140],{},"Builds a compact taste profile from watched movies plus My List context",[123,142,143],{},"Calls the platform AI client with JSON-schema-constrained output",[123,145,146],{},"Resolves recommendation names back to TMDB IDs through Supabase search first, then TMDB fallback when needed",[123,148,149],{},"Filters out watched movies, duplicates, unresolved titles, and excess My List matches",[123,151,152],{},"Requests replacement picks when backend validation blocks too many candidates",[123,154,155],{},"Returns valid TMDB IDs and caches them in Supabase",[115,157,159],{"id":158},"provider-strategy","Provider Strategy",[106,161,162],{},"The AI client uses OpenAI-compatible chat completions.",[106,164,165,166,169],{},"Provider order comes from ",[110,167,168],{},"server\u002Futils\u002Frecommendations\u002Fai-client.ts",":",[120,171,172,178],{},[123,173,174,175],{},"Google AI Studio models from ",[110,176,177],{},"NUXT_GOOGLE_MODELS",[123,179,180,181],{},"OpenRouter models from ",[110,182,183],{},"NUXT_OPENROUTER_MODELS",[106,185,186],{},"If both providers are configured, Google is tried first. The server walks every configured model in order until one succeeds.",[106,188,189,190,193],{},"Default models in ",[110,191,192],{},"nuxt.config.ts"," are:",[120,195,196,201,206,211],{},[123,197,198],{},[110,199,200],{},"gemini-flash-lite-latest",[123,202,203],{},[110,204,205],{},"gemini-2.5-flash-lite",[123,207,208],{},[110,209,210],{},"gemini-2.0-flash-lite",[123,212,213,216],{},[110,214,215],{},"google\u002Fgemini-2.5-flash-lite"," through OpenRouter",[115,218,96],{"id":219},"rate-limiting",[106,221,222,223,227],{},"Recommendation generation is limited to ",[224,225,226],"strong",{},"20 requests per day"," per authenticated user.",[106,229,230],{},"The following headers are included on generation requests:",[232,233,234,247],"table",{},[235,236,237],"thead",{},[238,239,240,244],"tr",{},[241,242,243],"th",{},"Header",[241,245,246],{},"Description",[248,249,250,261,271],"tbody",{},[238,251,252,258],{},[253,254,255],"td",{},[110,256,257],{},"X-RateLimit-Limit",[253,259,260],{},"Maximum requests allowed per day",[238,262,263,268],{},[253,264,265],{},[110,266,267],{},"X-RateLimit-Remaining",[253,269,270],{},"Requests remaining in the current window",[238,272,273,278],{},[253,274,275],{},[110,276,277],{},"X-RateLimit-Reset",[253,279,280],{},"Unix timestamp (ms) when the window resets",[115,282,284],{"id":283},"failure-behavior","Failure Behavior",[106,286,287,288,291],{},"When regeneration fails and an older cached set exists, ",[110,289,290],{},"\u002Fapi\u002Frecommend"," can return:",[293,294,295,300],"ul",{},[123,296,297],{},[110,298,299],{},"regenerationError",[123,301,302],{},[110,303,304],{},"staleRecommendations",[106,306,307,308,310,311,313],{},"If no provider is configured, or every configured provider\u002Fmodel attempt fails, the route returns an AI-provider error message and a ",[110,309,299],{}," flag. If cached recommendations are available, it also returns a ",[110,312,304],{}," flag to indicate that the returned recommendations may be outdated.",[115,315,317],{"id":316},"see-also","See Also",[293,319,320,325],{},[123,321,322],{},[323,324,76],"a",{"href":77},[123,326,327],{},[323,328,329],{"href":52},"Watched Movies API",{"title":331,"searchDepth":332,"depth":332,"links":333},"",2,[334,335,336,337,338],{"id":117,"depth":332,"text":118},{"id":158,"depth":332,"text":159},{"id":219,"depth":332,"text":96},{"id":283,"depth":332,"text":284},{"id":316,"depth":332,"text":317},"Recommendation generation used by the recommendation endpoint","md",null,{},{"icon":59},{"title":56,"description":345},"Recommendation flow used by the current Movie Recommender server","zsGUQll4m2cAki2IW5Wrul2rk_j7-7tUi7M1EHpLoRg",[348,350],{"title":51,"path":52,"stem":53,"description":349,"icon":54,"children":-1},"Authenticated APIs for the user's watched movies and saved list",{"title":61,"path":62,"stem":63,"description":351,"icon":64,"children":-1},"Search movies through the current TMDB-backed search endpoint",1782138812406]