48 lines
1.6 KiB
TypeScript
48 lines
1.6 KiB
TypeScript
import { openai } from '../agent.js';
|
|
import type { InterpreterOutput, RetrievalOutput } from '../types/agents.js';
|
|
|
|
export async function runRetrieval(input: InterpreterOutput, brainstormCount = 100): Promise<RetrievalOutput> {
|
|
const response = await openai.chat.completions.create({
|
|
model: 'gpt-5.4',
|
|
temperature: 0.9,
|
|
service_tier: 'flex',
|
|
response_format: { type: 'json_object' },
|
|
messages: [
|
|
{
|
|
role: 'system',
|
|
content: `You are a TV show candidate generator. Your goal is to brainstorm a LARGE, DIVERSE pool of ${brainstormCount} TV show candidates that match the user's structured preferences.
|
|
|
|
Your output MUST be valid JSON matching this schema:
|
|
{
|
|
"candidates": [
|
|
{ "title": string, "reason": string }
|
|
]
|
|
}
|
|
|
|
Rules:
|
|
- Include both well-known and obscure shows
|
|
- Prioritize RECALL over precision — it's better to include too many than too few
|
|
- Each "reason" should briefly explain why the show matches the preferences
|
|
- Avoid duplicates
|
|
- Include shows from different decades, countries, and networks
|
|
- Aim for ${brainstormCount} candidates minimum`,
|
|
},
|
|
{
|
|
role: 'user',
|
|
content: `Structured preferences:
|
|
Liked shows: ${JSON.stringify(input.liked)}
|
|
Disliked shows: ${JSON.stringify(input.disliked)}
|
|
Themes: ${JSON.stringify(input.themes)}
|
|
Character preferences: ${JSON.stringify(input.character_preferences)}
|
|
Tone: ${JSON.stringify(input.tone)}
|
|
Avoid: ${JSON.stringify(input.avoid)}
|
|
|
|
Generate a large, diverse pool of TV show candidates.`,
|
|
},
|
|
],
|
|
});
|
|
|
|
const content = response.choices[0]?.message?.content ?? '{"candidates":[]}';
|
|
return JSON.parse(content) as RetrievalOutput;
|
|
}
|