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