AI-powered film discovery companion built on Next.js 14 that curates indie gems, international standouts, and blockbuster crowd-pleasers through a conversational UX.
app/page.tsxrenders theFilmPulsechat interface.- Chat generation now runs server-side through the OpenAI Responses API in
app/api/getRecommendation/route.ts. - The client streams assistant text in real time over SSE for a more natural conversational feel.
- The route uses stateful conversation continuity via
previous_response_id. - After generation, a structured extraction pass returns movie titles as JSON, then TMDB enrichment adds posters, release years, genres, and links.
- User submits a message and slider preference in
components/FilmPulse.tsx. - Client calls
POST /api/getRecommendationwith:userMessagepreferencepreviousResponseId(optional)
- Route calls
openai.responses.create({ stream: true })with model instructions tuned for a warm, conversational movie concierge style. - Route emits SSE events:
tokenfor text deltasmetadatawith{ responseId, movieTitles }errorfor failuresdonewhen complete
- Client appends token deltas into the bot message as they arrive.
- Client enriches
movieTitleswith TMDB poster/details data and renders recommendation cards. - If structured extraction returns no titles, client falls back to bold-title regex extraction.
- OpenAI Responses API (
gpt-5.2default): primary generation path, streamed. - OpenAI Responses API (
gpt-5-minidefault): structured title extraction pass. - TMDB Search + Movie Details API: enrichment layer for posters and metadata.
POST /api/getRecommendation
Request body:
{
"userMessage": "string",
"preference": 0.5,
"previousResponseId": "resp_optional"
}Response: text/event-stream with events:
event: token
data: {"delta":"..."}
event: metadata
data: {"responseId":"resp_...","movieTitles":["..."]}
event: error
data: {"message":"..."}
event: done
data: {}
- Install dependencies:
npm install- Create
.env.localwith:
OPENAI_API_KEY=your_openai_key
OPENAI_MODEL=gpt-5.2
OPENAI_EXTRACT_MODEL=gpt-5-mini
NEXT_PUBLIC_TMDB_API_KEY=your_tmdb_key- Run dev server:
npm run dev- Open
http://localhost:3000.
- OpenAI keys are now server-only (
OPENAI_API_KEY), not exposed in browser code. - SDK is pinned to
openai@^6.22.0. - Stateful conversation is enabled with
store: true+previous_response_id.
Have ideas or spot a great film pairing? Open an issue or reach out at @thomasfdevito.