mirror of
https://github.com/R0m1k3/CollectFlow.git
synced 2026-10-11 17:26:32 +02:00
fix(ai): implement automatic network retry for OpenRouter 502/503/529 overloads in Bulk Analyzer
This commit is contained in:
1 parent
dd135ee67b
commit
b921f5ad40
3 files changed
+29
-7
No files matched your search
@@ -37,7 +37,15 @@ export async function POST(req: NextRequest) {
|
||||
console.warn(`[AI] Timeout for product analysis — OpenRouter too slow.`);
|
||||
return NextResponse.json({ error: "timeout", retryAfter: 5 }, { status: 504 });
|
||||
}
|
||||
|
||||
const msg = err instanceof Error ? err.message : "Unknown error";
|
||||
|
||||
// Propager l'état de surcharge Open Router (502 Gateway, 503 Unavailable, 529 Overloaded)
|
||||
if (msg.includes("502") || msg.includes("503") || msg.includes("529") || msg.includes("Bad Gateway") || msg.includes("overloaded")) {
|
||||
console.warn(`[AI] External API overload detected: ${msg}`);
|
||||
return NextResponse.json({ error: "gateway_timeout", detail: msg }, { status: 502 });
|
||||
}
|
||||
|
||||
return NextResponse.json({ error: msg }, { status: 500 });
|
||||
}
|
||||
}
|
||||
@@ -145,7 +145,10 @@ export function AiInsightBlock({ row }: AiInsightBlockProps) {
|
||||
|
||||
if (status === "error") {
|
||||
return (
|
||||
<div className="flex items-center gap-1.5 text-[11px] text-rose-600 dark:text-rose-500">
|
||||
<div
|
||||
className="flex items-center gap-1.5 text-[11px] text-rose-600 dark:text-rose-500 cursor-help"
|
||||
title={insight?.insight || "Une erreur inconnue est survenue"}
|
||||
>
|
||||
<AlertCircle className="w-3 h-3" />
|
||||
<span>Erreur</span>
|
||||
</div>
|
||||
|
||||
@@ -227,12 +227,12 @@ export function BulkAiAnalyzer() {
|
||||
const wait = (retryData.retryAfter ?? 30) * 1000;
|
||||
console.warn(`[BulkAI] Rate limited, retry in ${wait / 1000}s`);
|
||||
await new Promise((r) => setTimeout(r, Math.min(wait, 15_000)));
|
||||
} else if (res.status === 504) {
|
||||
// Timeout serveur : retry rapide (le modèle était peut-être surchargé)
|
||||
console.warn(`[BulkAI] Timeout (504) for ${payload.codein}, retry #${attempt + 1}`);
|
||||
await new Promise((r) => setTimeout(r, 2_000));
|
||||
} else if (res.status === 504 || res.status === 502 || res.status === 503 || res.status === 529) {
|
||||
// Timeout ou réseau surchargé : on tente de réessayer de suite
|
||||
console.warn(`[BulkAI] Network issue (${res.status}) for ${payload.codein}, retry #${attempt + 1}`);
|
||||
await new Promise((r) => setTimeout(r, 2_000 * (attempt + 1))); // Exponential backoff (2s, 4s, 6s)
|
||||
} else {
|
||||
// Autre erreur (500, etc.) : ne pas réessayer inutilement
|
||||
// Autre erreur (500 local, auth, etc.) : ne pas réessayer inutilement
|
||||
break;
|
||||
}
|
||||
} catch (fetchErr) {
|
||||
@@ -242,7 +242,18 @@ export function BulkAiAnalyzer() {
|
||||
}
|
||||
|
||||
if (!res || !res.ok) {
|
||||
setError(payload.codein, res?.status === 504 ? "Timeout IA" : "Erreur API");
|
||||
let errorMsg = res?.status === 504 ? "Timeout IA" : (res?.status === 502 ? "API Surchargée" : `Erreur HTTP ${res?.status}`);
|
||||
|
||||
// On tente d'extraire le message original s'il y en a un
|
||||
if (res && res.headers.get("content-type")?.includes("application/json")) {
|
||||
try {
|
||||
const errData = await res.json();
|
||||
if (errData.error) errorMsg += ` - ${errData.error}`;
|
||||
if (errData.detail) errorMsg += ` (${errData.detail})`;
|
||||
} catch (e) { /* ignore JSON parse error on error */ }
|
||||
}
|
||||
|
||||
setError(payload.codein, errorMsg);
|
||||
errorsCount++;
|
||||
} else {
|
||||
const data = await res.json();
|
||||
|
||||
Reference in new issue
Block a user