fix: add server-side retry logic for intermittent LLM JSON parse failures
This commit is contained in:
+34
-23
@@ -367,33 +367,44 @@ async function handleGenerate(req, res) {
|
|||||||
|
|
||||||
const signal = combinedSignal(req);
|
const signal = combinedSignal(req);
|
||||||
|
|
||||||
try {
|
const MAX_ATTEMPTS = 2;
|
||||||
const content = await callProvider(
|
let lastErr;
|
||||||
[
|
|
||||||
{ role: 'system', content: buildSystemPrompt(body) },
|
|
||||||
{ role: 'user', content: buildUserMessage(body) },
|
|
||||||
],
|
|
||||||
{ max_tokens: 4000 },
|
|
||||||
signal,
|
|
||||||
);
|
|
||||||
|
|
||||||
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') {
|
const parsed = extractJson(content);
|
||||||
validateFullAssets(parsed);
|
|
||||||
} else {
|
if (body.section === 'all') {
|
||||||
validateShape(parsed);
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ──────────────────────────────────────────────────────────────────────────────
|
// ──────────────────────────────────────────────────────────────────────────────
|
||||||
|
|||||||
Reference in New Issue
Block a user