Черновик адаптера демона для каналов и веб-бэкенда
Цель
Позволить адаптерам каналов и веб-бэкендам чатов использовать qwen serve через
DaemonSessionClient, сохраняя при этом текущее поведение ACP-подпроцесса канала
по умолчанию.
Этот черновик охватывает только серверные клиенты:
- Бэкенд бота канала ->
qwen serve - Веб-браузер -> веб-бэкенд / BFF ->
qwen serve
Явно не разрешается вызывать демон напрямую из JavaScript браузера.
В настоящее время демон по задумке отклоняет запросы браузера с заголовком Origin.
Предлагаемые точки входа
Бэкенд канала:
QWEN_CHANNEL_DAEMON_URL=http://127.0.0.1:4170 qwen channel start telegramВеб-бэкенд:
QWEN_WEB_DAEMON_URL=http://127.0.0.1:4170 qwen web-chat-backendОбщие опциональные переменные:
QWEN_DAEMON_TOKEN=...
QWEN_DAEMON_WORKSPACE=/repoМинимальный поток работы канала
Этот PR добавляет DaemonChannelBridge — локально проверяемый серверный мост для
адаптеров каналов и веб-бэкендов. Он оставляет существующий ACP-мост в качестве
поведения по умолчанию и управляет состоянием сессии демона внутри процесса бэкенда.
- Разрешить отправителя/тред канала в ключ сессии канала.
- Использовать
DaemonClient+DaemonSessionClient.createOrAttach(). - Отправить входящий текст пользователя через
session.prompt(). - Подписаться на
session.events()и собирать фрагменты текста ассистента. - Отправить финальный текст обратно через адаптер платформы.
- Отправить голоса разрешений через
session.respondToPermission(). - Отменить активную работу через
session.cancel().
Минимальный поток работы веб-бэкенда
- Браузер открывает websocket или HTTP-стрим к веб-бэкенду.
- Бэкенд владеет
DaemonSessionClient. - Бэкенд преобразует сообщения браузера в запросы к демону.
- Бэкенд преобразует SSE-события демона в безопасные для браузера события приложения.
- Бэкенд хранит
sessionIdдемона и идентификатор последнего виденного события на серверной стороне.
Клиенты браузера не должны получать bearer-токены демона.
Ограничение изоляции сессий
Текущее поведение демона на этапе 1 фактически соответствует sessionScope: single на
уровне настроек демона. До появления sessionScope для каждого запроса многопользовательские
развертывания каналов или веба должны выбрать одну из следующих безопасных конфигураций:
- один демон на тред канала / комнату веба
- один демон на рабочее пространство пользователя
- только однопользовательское демо
Не нужно молча мультиплексировать несвязанные треды каналов в одну сессию демона.
Контракт сопоставления событий
| Событие демона | Обработка бэкендом канала/веба |
|---|---|
session_update / agent_message_chunk | Добавить текст ассистента |
session_update / agent_thought_chunk | Опциональный скрытый/отладочный стрим |
session_update / tool_call | Отправить карточку/сообщение статуса инструмента |
permission_request | Взаимодействие утверждения, зависящее от платформы |
permission_resolved | Закрыть/обновить взаимодействие утверждения |
model_switched | Обновить метаданные сессии бэкенда |
session_died | Уведомить пользователя и остановить стрим |
Неизвестные события демона должны игнорироваться или передаваться как отладочные метаданные, а не вызывать ошибку.
Мост ещё не подключен к qwen channel start. Существующее поведение Telegram,
Weixin, Dingtalk, канала плагинов и браузера остаётся без изменений.
Явно не входит в цели
- Нет прямого вызова демона из браузера через fetch или EventSource.
- Нет ослабления CORS в этом PR с адаптером.
- Нет миграции по умолчанию для каналов Telegram, Weixin, Dingtalk или плагинов.
- Нет CRUD для файлов, памяти, перезапуска MCP или изменения провайдеров.
- Нет эмуляции sessionScope на клиенте при отсутствии поддержки на стороне демона.
Безопасность слияния
- По умолчанию выключено.
- Существующий ACP-мост канала остаётся по умолчанию.
- Веб-бэкенд — это явный слой BFF, а не изменение безопасности демона.
- Ни один адаптер канала не должен импортировать токены демона в код фронтенда/браузера.
План проверки
- Модульное тестирование привязки ключа сессии канала к сессии демона.
- Модульное тестирование сопоставления событий демона с сообщениями канала/веба.
- Модульное тестирование пересылки prompt, cancel, model switch и ответа на разрешения.
- Дымовое тестирование однопользовательского бэкенда канала с локальным
qwen serve. - Дымовое тестирование браузер -> BFF -> демон без раскрытия токена демона.
Блокирующие факторы перед миграцией по умолчанию
sessionScopeдля каждого запроса.- Жизненный цикл метаданных сессии + закрытие/удаление.
- Идентификация клиента, подтверждённая демоном.
- Маршрут разрешений в рамках сессии.
- Диагностика только для чтения для MCP, навыков, провайдеров и окружения.