LITE SOFT DEV
СервераПортал

Realtime и события

WebSocket-стриминг ответов ассистента и событийная модель платформы.

Платформа событийная в двух местах: стриминг ответов чата (WebSocket, пользователь видит токены сразу) и фоновая обработка документов (очередь Asynq между серверами).

Стриминг ответа ассистента

Ответ нейросети идёт токенами через всю цепочку без буферизации:

  • Go регистрирует активную WebSocket-сессию в Redis.
  • Nginx на маршрутах ассистента работает без буферизации (proxy_buffering off) и с заголовками WebSocket-upgrade.
  • context.Context пробрасывается насквозь: школьник закрыл вкладку — отмена доходит до vLLM, GPU освобождается.

События стрима

Типичный обмен по WebSocket — от вопроса до завершения генерации:

СерверКлиент
messageклиент → сервер
Школьник отправляет вопрос
{ "text": "Какие профессии связаны с морем в нашем регионе?" }
tokenсервер → клиент
{ "type": "token", "data": "Судово" }
tokenсервер → клиент
{ "type": "token", "data": "ждение — " }
doneсервер → клиент
Генерация завершена
{ "type": "done", "data": { "message_id": "msg_7f3a…" } }

Если генерация оборвалась (vLLM недоступен, таймаут), вместо done придёт error:

СерверКлиент
errorсервер → клиент
Обрыв генерации
{ "type": "error", "data": { "code": "upstream_unavailable" } }
СобытиеКогдаРеакция клиента
tokenКаждая порция текстаДописать в сообщение
doneГенерация завершенаЗафиксировать сообщение, разблокировать ввод
errorОбрыв или отказПоказать ошибку, предложить повтор
Прозрачность кэша

При кэш-попадании Redis события те же — клиент не отличает кэшированный ответ от живой генерации.

Событийная очередь: ingest документов

Загрузка документа в базу знаний не блокирует запрос — это событие в очереди Asynq поверх Redis.

  • Producer — Go на WEB PORTAL; consumer — ingest worker на NEURO CORE. Брокер один: Redis на WEB PORTAL.
  • Payload события — ссылка на файл и метаданные, не сам файл:
Задача ingest:document
{ "doc_id": "course-01", "path": "/private_knowledge/course-01.pdf", "format": "pdf" }
  • Повторы, backoff и dead queue — штатные механизмы Asynq.
  • Запасной путь: файл положили в private_knowledge вручную → watcher ставит ту же задачу. Один обработчик на оба пути.

Обработка события описана в RAG-пайплайне.

Что не событийное

Обычные запросы (курсы, опросы, аналитика) — синхронный REST /api/v1. События применяются там, где есть поток или долгая фоновая работа, а не везде подряд.

On this page