mirror of
https://github.com/dartdavros/chatballs.git
synced 2026-10-05 09:14:58 +03:00
✨ feat(conversations): ответ AI считается отдельно от приёма входящих
Ход AI выполнялся прямо в приёме сообщения: цикл опроса мессенджеров и HTTP-запрос виджета ждали провайдера, держа открытой транзакцию организации. Один ход — это два обращения к модели (эмбеддинг и чат) по тридцать секунд с двумя повторами, то есть до трёх минут, и всё это время ни одно входящее по всей установке не забиралось. Владелец видел это как «бот залипает»: сайт и MAX на одном агенте отвечали с задержками или молчали. Приём теперь доводит дело до записи сообщения и ставит событие `conversation.ai_turn_requested`. Ход считает роль событий воркера (`run_worker --role=events`) короткими транзакциями, между которыми остаются походы к провайдеру и в мессенджер. Туда же уехала расшифровка голосовых — последнее обращение наружу из цикла опроса. Воркер разделён на роли: `poller` опрашивает подключения и ведёт периодические работы (один экземпляр — курсоры и паузы после сбоя живут в его памяти), `events` разбирает outbox и масштабируется репликами (`CHATBALLS_EVENT_WORKERS`, по умолчанию две). Роль `all` осталась для разработки. Очередь событий научилась двум вещам: события одного диалога не выдаются параллельно (иначе два ответа приезжают клиенту вперемешку) и событие, взятое упавшим процессом, возвращается в очередь по истечении аренды. Попутно убраны мины, которые тот же залип и продлевали: - ход клиенту ограничен своим таймаутом (CHATBALLS_AI_TURN_TIMEOUT, 20 с) и сроком годности (CHATBALLS_AI_TURN_DEADLINE_SECONDS, 120 с) — просроченный ход не зовёт модель, а передаёт диалог оператору; - отказ провайдера по существу запроса (4xx, кроме 429) больше не повторяется трижды по таймауту; - предохранитель провайдера считает сбои по ключу «организация + интеграция», а не один на процесс: отозванный ключ одной организации гасил AI у всех; - потолок паузы после сбоя опроса — минута вместо четверти часа: он был компромиссом ради журнала однопоточного воркера. Виджет узнаёт, что ответ считается, по признаку `thinking` в ленте. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
c8b8246b35
commit
83b1119d6b
37 files changed
+1702
-430
No files matched your search
@@ -116,6 +116,17 @@ services:
|
||||
- ./apps/backend:/app/apps/backend
|
||||
- ./data/media:/app/apps/backend/media
|
||||
|
||||
worker-events:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: apps/backend/Dockerfile
|
||||
environment:
|
||||
CHATBALLS_DEBUG: "true"
|
||||
CHATBALLS_DELIVERY_MODE: ${CHATBALLS_DELIVERY_MODE:-CLOUD}
|
||||
volumes:
|
||||
- ./apps/backend:/app/apps/backend
|
||||
- ./data/media:/app/apps/backend/media
|
||||
|
||||
# Dev: образ сервиса обновления собирается локально; сам сервис в dev
|
||||
# бесполезен (стек поднят из исходников), но должен собираться и стартовать.
|
||||
updater:
|
||||
|
||||
Reference in new issue
Block a user