Skip to Content
Руководство для разработчиковDaemon Client AdaptersЧерновик адаптера демона для каналов и веб-бэкенда

Черновик адаптера демона для каналов и веб-бэкенда

Цель

Позволить адаптерам каналов и веб-бэкендам чатов использовать 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-мост в качестве поведения по умолчанию и управляет состоянием сессии демона внутри процесса бэкенда.

  1. Разрешить отправителя/тред канала в ключ сессии канала.
  2. Использовать DaemonClient + DaemonSessionClient.createOrAttach().
  3. Отправить входящий текст пользователя через session.prompt().
  4. Подписаться на session.events() и собирать фрагменты текста ассистента.
  5. Отправить финальный текст обратно через адаптер платформы.
  6. Отправить голоса разрешений через session.respondToPermission().
  7. Отменить активную работу через session.cancel().

Минимальный поток работы веб-бэкенда

  1. Браузер открывает websocket или HTTP-стрим к веб-бэкенду.
  2. Бэкенд владеет DaemonSessionClient.
  3. Бэкенд преобразует сообщения браузера в запросы к демону.
  4. Бэкенд преобразует SSE-события демона в безопасные для браузера события приложения.
  5. Бэкенд хранит 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, навыков, провайдеров и окружения.
Last updated on