feat(assistant): стриминг ответов Квантика (фича 1/6)
Ответ модели «печатается» вживую через SSE поверх POST (fetch-stream, не EventSource). Бэкенд: callLLMStream (stream:true, парсинг SSE upstream) + callLLMStreamFailover (failover только до первого куска) + endpoint POST /assistant/ask/stream (события meta|delta|done; быстрые пути FAQ/кэш/мета отдаются одним done). buildAskMessages выделен из askModel (DRY). Клиент: LS.assistantAskStream (fetch-stream + парсер SSE). Виджет: send() стримит дельты как plain-текст с CSS-кареткой, на done — KaTeX-рендер, источники, ссылки, оценка. Фоллбэк на sendNonStream (старый путь) если стриминг недоступен/упал до первого куска. Cache-Control: no-transform отключает буферизацию compression. Проверено против живого шлюза: 24 дельты, первый текст ~1.3с, 100% русский. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -17,6 +17,7 @@ router.post('/seen', ctrl.markSeen);
|
||||
router.post('/dismiss', ctrl.dismiss);
|
||||
router.patch('/settings', ctrl.setSettings);
|
||||
router.post('/ask', requirePermissionForStudents('assistant.use'), askLimiter, ctrl.ask);
|
||||
router.post('/ask/stream', requirePermissionForStudents('assistant.use'), askLimiter, ctrl.askStream);
|
||||
router.post('/flashcards', requirePermissionForStudents('assistant.use'), fcLimiter, ctrl.flashcardsFromText);
|
||||
router.post('/feedback', ctrl.feedback);
|
||||
router.get('/memory', ctrl.getMemory);
|
||||
|
||||
Reference in New Issue
Block a user