From 8d09b17467a1d5b1d82c2c1483f7da50a95f9dc4 Mon Sep 17 00:00:00 2001 From: orfelorfel23 Date: Wed, 3 Jun 2026 22:55:33 +0200 Subject: [PATCH] fix: add server-side retry logic for intermittent LLM JSON parse failures --- server.mjs | 57 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 34 insertions(+), 23 deletions(-) diff --git a/server.mjs b/server.mjs index ff2a3ab..564a986 100644 --- a/server.mjs +++ b/server.mjs @@ -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); } // ──────────────────────────────────────────────────────────────────────────────