fix(stage2): повтор и при транзиентных ошибках ЛЛМ (кроме отмены)

This commit is contained in:
Repinoid
2026-10-07 16:18:21 +03:00
parent b99344eed5
commit 00650265b7
3 changed files with 495 additions and 391 deletions
+13 -3
View File
@@ -252,8 +252,10 @@ async function stage2Generate({
{ role: 'user', content: userContent },
];
// До двух попыток: при обрезке ответа (нет заголовков) повторяем с бо́льшим бюджетом.
// До двух попыток: при обрезке ответа (нет заголовков) или транзиентной
// ошибке ЛЛМ — повторяем с бо́льшим бюджетом.
let budget = maxTokens;
let lastError = 'stage2_failed';
for (let attempt = 0; attempt < 2; attempt++) {
let content;
try {
@@ -267,7 +269,14 @@ async function stage2Generate({
model,
});
} catch (err) {
return { ok: false, error: err && err.code ? err.code : 'stage2_failed' };
const code = err && err.code ? err.code : 'stage2_failed';
// Отмену клиентом не повторяем.
if (code === 'aborted') {
return { ok: false, error: code };
}
lastError = code;
budget = Math.min(budget * 2, 4096);
continue;
}
// Проверяем наличие обязательных заголовков (П.12).
@@ -277,10 +286,11 @@ async function stage2Generate({
}
// Не все заголовки на месте — вероятна обрезка по max_tokens. Повтор с x2.
lastError = 'bad_llm_output';
budget = Math.min(budget * 2, 4096);
}
return { ok: false, error: 'bad_llm_output' };
return { ok: false, error: lastError };
}
module.exports = {