diff --git a/src/lib/deepseek.ts b/src/lib/deepseek.ts index 630aa26..8fa2b8d 100644 --- a/src/lib/deepseek.ts +++ b/src/lib/deepseek.ts @@ -472,10 +472,13 @@ function sanitizeJsonContent(raw: string): string { } } +const CALL_DEEPSEEK_DEFAULT_TIMEOUT_MS = 55_000; + async function callDeepSeek( system: string, user: string, temperature: number, + timeoutMs: number = CALL_DEEPSEEK_DEFAULT_TIMEOUT_MS, ): Promise { try { const response = await fetch(`${DEEPSEEK_BASE_URL}/chat/completions`, { @@ -493,10 +496,10 @@ async function callDeepSeek( temperature, response_format: { type: "json_object" }, }), - // Le prompt maître + taxonomie produit une réponse JSON longue : DeepSeek - // peut prendre 20-40 s. Le frontend abort à 60 s (CORRECTION_TIMEOUT_MS) - // → on abort ici à 55 s pour laisser une marge côté client. - signal: AbortSignal.timeout(55_000), + // EE / modèle / exercices : 55 s par défaut (frontend abort à 60 s). + // EO en mode audio : Gemini transcribe + DeepSeek correction. Frontend + // alloue 120 s → on accepte 90 s ici (cf. correctEO). + signal: AbortSignal.timeout(timeoutMs), }); if (!response.ok) { @@ -1151,7 +1154,9 @@ export async function correctEO( sujet, nclcCible, }); - const content = await callDeepSeek(system, user, 0.2); + // 90 s : EO arrive après une transcription Gemini (jusqu'à 45 s + 1 retry) + // dans le pipeline `POST /corrections/eo`. Frontend cap à 120 s. + const content = await callDeepSeek(system, user, 0.2, 90_000); const parsed: unknown = JSON.parse(content); return validateCorrectionRapportEO(parsed, nclcCible, transcript); } diff --git a/src/lib/gemini.ts b/src/lib/gemini.ts index 16e67c9..2a935f3 100644 --- a/src/lib/gemini.ts +++ b/src/lib/gemini.ts @@ -11,7 +11,7 @@ const GEMINI_API_KEY = process.env.GEMINI_API_KEY ?? ""; const GEMINI_BASE_URL = "https://generativelanguage.googleapis.com/v1beta"; -const GEMINI_TIMEOUT_MS = 30_000; +const GEMINI_TIMEOUT_MS = 45_000; /** * MIME types audio acceptés par le pipeline Sprint 4a.