Черновик адаптера демона для каналов и веб-бэкенда
Цель
Позволить адаптерам каналов и веб-чат-бэкендам потреблять 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().
Минимальный поток веб-бэкенда
- Браузер открывает веб-сокет или HTTP-поток к веб-бэкенду.
- Бэкенд владеет
DaemonSessionClient. - Бэкенд преобразует сообщения браузера в запросы демона.
- Бэкенд преобразует SSE-события демона в безопасные для браузера события приложения.
- Бэкенд хранит
sessionIdдемона и последний идентификатор события на стороне сервера.
Клиенты браузера не должны получать токены bearer демона.
Ограничение изоляции сессий
Текущее поведение демона Стадии 1 фактически является sessionScope: single на уровне настроек демона. Пока не появится sessionScope для каждого запроса, многопользовательские развертывания каналов или веб-приложений должны выбрать одну из этих безопасных форм:
- один демон на тред канала / веб-комнату
- один демон на рабочее пространство пользователя
- только демо для одного пользователя
Не мультиплексировать несвязанные треды каналов молча в одну сессию демона.
Контракт сопоставления событий
| Daemon event | Обработка каналом/веб-бэкендом |
|---|---|
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 для файлов, CRUD для памяти, перезапуска MCP или изменения провайдеров.
- Нет эмуляции sessionScope в клиенте при отсутствии поддержки на стороне демона.
Безопасность слияния
- Отключено по умолчанию.
- Существующий мост канала ACP остаётся по умолчанию.
- Веб-бэкенд является явным слоем BFF, а не изменением безопасности демона.
- Ни один адаптер канала не должен импортировать токены демона в код фронтенда/браузера.
План валидации
- Модульное тестирование привязки ключа сессии канала к сессии демона.
- Модульное тестирование сопоставления событий демона с сообщениями канала/веб.
- Модульное тестирование пересылки запросов, отмены, переключения модели и ответа на разрешения.
- Дымовое тестирование одного однопользовательского бэкенда канала с локальным
qwen serve. - Дымовое тестирование браузер -> BFF -> демон без раскрытия токена демона.
Блокирующие факторы перед миграцией по умолчанию
sessionScopeдля каждого запроса.- Метаданные сессии + жизненный цикл закрытия/удаления.
- Идентификация клиента, заверенная демоном.
- Маршрут разрешений с областью сессии.
- Диагностика только для чтения для MCP, навыков, провайдеров и окружения.