ADR-0013: Conversation Service владеет диалогом
- Status: accepted
- Date: 2026-09-14
Контекст
Channel Gateway уже принимает общий текстовый запрос и вызывает Agent Runtime. Следующий шаг —
создать сохранённое действие и вернуть карточку подтверждения. Если эту цепочку реализовать внутри
каждого канала или Gateway, Web, Telegram и VK начнут по-разному обрабатывать повторы, состояние
диалога и ошибки.
Agent Runtime не должен сохранять действие: он переводит текст в предложение. Action Service
не должен вести диалог: он хранит и выполняет уже сформированное действие.
Решение
Создать отдельный Conversation Service как владельца прикладной оркестрации сообщения.
Границы компонентов:
Channel Gatewayпроверяет identity, нормализует запрос и переводит общий ответ в протокол канала. Он остаётся stateless и не вызываетAgent RuntimeилиAction Serviceнапрямую после миграции.Conversation Serviceхранит сообщения и состояние диалога, обеспечивает идемпотентность поtenantId + subject + requestKey, вызывает Agent и Action.Agent Runtimeтолько возвращает предложение действия или вопрос для уточнения.Action Serviceостаётся источником истины дляactionId,payloadHash, статуса и результата.Widget SDKпроверяет и отображает общий контракт карточки. Он не вызывает Agent, MCP или базу.- Кнопка карточки отправляет решение вместе с
actionIdиpayloadHash; толькоAction Serviceпринимает или отклоняет действие.
Переход выполняется совместимо: существующий /api/v1/messages остаётся временным техническим
маршрутом до появления Conversation Service. Новый диалоговый endpoint добавляется отдельно; старый
удаляется только в следующей major-версии контракта.
Причина
Так один и тот же диалог работает во всех каналах, а границы остаются простыми: Gateway отвечает за транспорт, Conversation — за ход диалога, Agent — за разбор текста, Action — за надёжное действие. Повтор доставки из Telegram или VK не создаёт второе действие.
Последствия
- Появится отдельный репозиторий
conversation-serviceсо своей базой и миграциями. - До его реализации Channel Gateway продолжает прямой вызов Agent как временный мост.
- Контракт ответа канала должен различать текст, карточку подтверждения и результат.
- Карточка содержит только отображаемые данные и ссылку на сохранённое действие; секреты и правила выполнения в неё не попадают.
- Реальные бизнес-правила уточнений и текста карточки требуют отдельного решения владельца продукта.