From b9d63b0776bdce17e0bde72f2076a0e5c43371e4 Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Thu, 4 Jun 2026 21:33:07 +0300 Subject: [PATCH] =?UTF-8?q?fix(assistant):=20=D0=BD=D0=B5=20=D0=BE=D0=B1?= =?UTF-8?q?=D1=80=D0=B5=D0=B7=D0=B0=D1=82=D1=8C=20=D0=BF=D0=BE=D1=88=D0=B0?= =?UTF-8?q?=D0=B3=D0=BE=D0=B2=D1=8B=D0=B5=20=D1=80=D0=B5=D1=88=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BF=D0=BE=D1=81=D1=80=D0=B5=D0=B4=D0=B8=20?= =?UTF-8?q?=D1=84=D0=BE=D1=80=D0=BC=D1=83=D0=BB=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Лимит ответа был 420 токенов — длинное решение обрывалось внутри $$…$$, незакрытый блок показывался сырым LaTeX. Теперь лимит по режиму (ответ 1200, проверка 900, подсказка 320), а рендер отбрасывает незакрытый хвост $$ (ставит «…») вместо сырого кода. Co-Authored-By: Claude Opus 4.8 (1M context) --- backend/src/controllers/assistantController.js | 4 +++- frontend/js/assistant.js | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/backend/src/controllers/assistantController.js b/backend/src/controllers/assistantController.js index e9aba3f..7e9ef3d 100644 --- a/backend/src/controllers/assistantController.js +++ b/backend/src/controllers/assistantController.js @@ -405,7 +405,9 @@ async function askModel(q, hits, context, history, role, mode) { const msgs = [{ role: 'system', content: sys }]; (history || []).forEach(m => { if (m && (m.role === 'user' || m.role === 'assistant') && m.content) msgs.push({ role: m.role, content: String(m.content).slice(0, 1500) }); }); msgs.push({ role: 'user', content: user }); - return callLLMFailover(msgs, 420); + // подсказка короткая; ответ/проверка — длиннее, чтобы пошаговое решение с формулами не обрезалось на середине + const cap = mode === 'hint' ? 320 : (mode === 'check' ? 900 : 1200); + return callLLMFailover(msgs, cap); } /* ── POST /api/assistant/ask { q, context?, history? } ── «Спроси Квантика» ─ diff --git a/frontend/js/assistant.js b/frontend/js/assistant.js index 4bf3d07..36dc22d 100644 --- a/frontend/js/assistant.js +++ b/frontend/js/assistant.js @@ -437,8 +437,12 @@ return html; } function renderRich(container, text) { + var src = String(text || ''); + // ответ мог оборваться по лимиту токенов посреди $$…$$ — не показываем сырой LaTeX, обрезаем хвост + var dd = src.match(/\$\$/g); + if (dd && dd.length % 2 === 1) { var li = src.lastIndexOf('$$'); src = src.slice(0, li).replace(/[\s\\]+$/, '') + ' …'; } var math = []; - var protectedText = String(text || '').replace(/(\$\$[\s\S]+?\$\$|\$[^\n$]+?\$)/g, function (m) { math.push(m); return '@@M' + (math.length - 1) + '@@'; }); + var protectedText = src.replace(/(\$\$[\s\S]+?\$\$|\$[^\n$]+?\$)/g, function (m) { math.push(m); return '@@M' + (math.length - 1) + '@@'; }); var html = mdToHtml(protectedText).replace(/@@M(\d+)@@/g, function (_, i) { return esc(math[+i] || ''); }); container.innerHTML = html; ensureKatex().then(function () {