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);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
// ──────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
Reference in New Issue
Block a user