fix: add server-side retry logic for intermittent LLM JSON parse failures

This commit is contained in:
2026-06-03 22:55:33 +02:00
parent 2fda90729e
commit 8d09b17467
+34 -23
View File
@@ -367,33 +367,44 @@ async function handleGenerate(req, res) {
const signal = combinedSignal(req);
try {
const content = await callProvider(
[
{ role: 'system', content: buildSystemPrompt(body) },
{ role: 'user', content: buildUserMessage(body) },
],
{ max_tokens: 4000 },
signal,
);
const MAX_ATTEMPTS = 2;
let lastErr;
const parsed = extractJson(content);
for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) {
if (signal.aborted) break;
try {
const content = await callProvider(
[
{ role: 'system', content: buildSystemPrompt(body) },
{ role: 'user', content: buildUserMessage(body) },
],
{ max_tokens: 4000 },
signal,
);
if (body.section === 'all') {
validateFullAssets(parsed);
} else {
validateShape(parsed);
const parsed = extractJson(content);
if (body.section === 'all') {
validateFullAssets(parsed);
} else {
validateShape(parsed);
}
const result = body.section === 'all' ? parsed : pickResultForSection(body.section, parsed);
return json(res, result);
} catch (err) {
if (err && (err.name === 'AbortError' || /client disconnected/i.test(err.message))) {
return;
}
lastErr = err;
if (attempt < MAX_ATTEMPTS) {
console.warn(`[generate] attempt ${attempt} failed, retrying… (${err.message})`);
}
}
const result = body.section === 'all' ? parsed : pickResultForSection(body.section, parsed);
json(res, result);
} catch (err) {
if (err && (err.name === 'AbortError' || /client disconnected/i.test(err.message))) {
return;
}
console.error('[generate]', err);
json(res, { error: err.message || 'Generation failed' }, 500);
}
console.error('[generate]', lastErr);
json(res, { error: lastErr?.message || 'Generation failed' }, 500);
}
// ──────────────────────────────────────────────────────────────────────────────