diff --git a/.env.example b/.env.example index 6884e29..6e74a4d 100644 --- a/.env.example +++ b/.env.example @@ -66,12 +66,12 @@ OLD_S3_FORCE_PATH_STYLE=true OLD_S3_ACCESS_KEY_ID= OLD_S3_SECRET_ACCESS_KEY= -# AI product generation (use Groq free tier or OpenAI) -AI_PROVIDER=groq +# AI product / category generation (OpenAI preferred; Groq optional fallback) +AI_PROVIDER=openai +OPENAI_API_KEY= +OPENAI_MODEL=gpt-4.1-nano GROQ_API_KEY= GROQ_MODEL=llama-3.3-70b-versatile -OPENAI_API_KEY= -OPENAI_MODEL=gpt-4o-mini MEDIA_MAX_FILE_SIZE_MB=10 diff --git a/src/common/ai-provider.util.ts b/src/common/ai-provider.util.ts index c47f6ff..e8ea92d 100644 --- a/src/common/ai-provider.util.ts +++ b/src/common/ai-provider.util.ts @@ -38,31 +38,47 @@ export function resolveAiProvider(config: ConfigService): AiProviderConfig { return { apiKey: openAiKey, baseUrl: 'https://api.openai.com/v1', - model: config.get('OPENAI_MODEL')?.trim() || 'gpt-4o-mini', + model: config.get('OPENAI_MODEL')?.trim() || 'gpt-4.1-nano', }; } +function supportsCustomTemperature(model: string): boolean { + // gpt-5 / o-series chat models only accept the API default temperature. + const id = model.trim().toLowerCase(); + return !( + id.startsWith('gpt-5') || + id.startsWith('o1') || + id.startsWith('o3') || + id.startsWith('o4') + ); +} + export async function requestAiJsonCompletion( provider: AiProviderConfig, systemPrompt: string, userPrompt: string, temperature = 0.4, ): Promise { + const body: Record = { + model: provider.model, + response_format: { type: 'json_object' }, + messages: [ + { role: 'system', content: systemPrompt }, + { role: 'user', content: userPrompt }, + ], + }; + + if (supportsCustomTemperature(provider.model)) { + body.temperature = temperature; + } + const response = await fetch(`${provider.baseUrl}/chat/completions`, { method: 'POST', headers: { Authorization: `Bearer ${provider.apiKey}`, 'Content-Type': 'application/json', }, - body: JSON.stringify({ - model: provider.model, - temperature, - response_format: { type: 'json_object' }, - messages: [ - { role: 'system', content: systemPrompt }, - { role: 'user', content: userPrompt }, - ], - }), + body: JSON.stringify(body), }); if (!response.ok) {