From 9dd3522869a5ab59f5a654e71278c0bea9ffbf87 Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Fri, 12 Jun 2026 23:06:08 +0300 Subject: [PATCH] =?UTF-8?q?feat(flashcards):=20=D0=98=D0=98-=D0=B3=D0=B5?= =?UTF-8?q?=D0=BD=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BA=D0=B0=D1=80?= =?UTF-8?q?=D1=82=D0=BE=D1=87=D0=B5=D0=BA=20=D0=BF=D0=BE=20=D1=82=D0=B5?= =?UTF-8?q?=D0=BC=D0=B5/=D1=82=D0=B5=D0=BA=D1=81=D1=82=D1=83=20=D1=81=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B5=D0=B4=D0=BF=D1=80=D0=BE=D1=81=D0=BC=D0=BE?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=BC=20=D0=B2=20=D1=82=D0=B5=D0=BA=D1=83?= =?UTF-8?q?=D1=89=D1=83=D1=8E=20=D0=BA=D0=BE=D0=BB=D0=BE=D0=B4=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/controllers/assistantController.js | 15 +++-- frontend/flashcards.html | 59 +++++++++++++++++++ js/api.js | 2 +- 3 files changed, 69 insertions(+), 7 deletions(-) diff --git a/backend/src/controllers/assistantController.js b/backend/src/controllers/assistantController.js index 652f59c..3e684ad 100644 --- a/backend/src/controllers/assistantController.js +++ b/backend/src/controllers/assistantController.js @@ -588,12 +588,15 @@ async function flashcardsFromText(req, res) { if (!providersOrdered().length) return res.status(503).json({ error: 'LLM не настроена' }); const text = String((req.body && req.body.text) || '').trim().slice(0, 6000); const title = String((req.body && req.body.title) || 'Карточки').trim().slice(0, 80) || 'Карточки'; - if (text.length < 20) return res.status(400).json({ error: 'Слишком мало текста' }); - const sys = 'Ты составляешь учебные флешкарты по тексту. Верни СТРОГО JSON-массив из 5–6 объектов ' + - 'вида {"front":"...","back":"..."} без markdown и пояснений. front — короткий вопрос, back — краткий ответ (1–2 предложения). ' + - 'По-русски. Формулы в LaTeX между $...$. Никакого текста вне JSON.'; + let count = Number(req.body && req.body.count); + count = Number.isFinite(count) ? Math.max(3, Math.min(10, Math.round(count))) : 6; + if (text.length < 3) return res.status(400).json({ error: 'Введите тему или текст' }); + const sys = 'Ты составляешь учебные флешкарты. Если на вход дан учебный текст или параграф — делай карточки СТРОГО по нему. ' + + 'Если дана короткая тема (несколько слов) — раскрой её сам по школьной программе. ' + + 'Верни СТРОГО JSON-массив из ' + count + ' объектов вида {"front":"...","back":"..."} без markdown и пояснений. ' + + 'front — короткий вопрос, back — краткий ответ (1–2 предложения). По-русски. Формулы в LaTeX между $...$. Никакого текста вне JSON.'; let rr; - try { rr = await callLLMFailover([{ role: 'system', content: sys }, { role: 'user', content: text }], 1400); } + try { rr = await callLLMFailover([{ role: 'system', content: sys }, { role: 'user', content: text }], 1600); } catch (e) { return res.status(502).json({ error: 'Не удалось обратиться к ИИ' }); } const raw = rr && rr.text; let cards = []; @@ -609,7 +612,7 @@ async function flashcardsFromText(req, res) { const arr = JSON.parse(s); if (Array.isArray(arr)) { cards = arr.filter(c => c && c.front && c.back) - .slice(0, 8) + .slice(0, count + 2) .map(c => ({ front: String(c.front).slice(0, 500), back: String(c.back).slice(0, 1000) })); } } catch (e) { /* модель вернула не-JSON */ } diff --git a/frontend/flashcards.html b/frontend/flashcards.html index 7224818..cf6d3ef 100644 --- a/frontend/flashcards.html +++ b/frontend/flashcards.html @@ -398,6 +398,7 @@ Колоды

Название колоды

+ @@ -536,6 +537,29 @@ + + +