Skip to Content
Руководство для пользователейВозможностиКаналыОбзор

Каналы

Каналы позволяют взаимодействовать с агентом Qwen Code через мессенджеры, такие как Telegram, WeChat, QQ, DingTalk или Feishu, вместо терминала. Вы отправляете сообщения с телефона или десктопного чат-клиента, а агент отвечает так же, как в CLI.

Как это работает

При запуске qwen channel start Qwen Code:

  1. Читает конфигурации каналов из вашего settings.json
  2. Запускает единый процесс агента, используя Agent Client Protocol (ACP)
  3. Подключается к каждому мессенджеру и начинает прослушивать сообщения
  4. Направляет входящие сообщения агенту и отправляет ответы в нужный чат

Все каналы используют один процесс агента с изолированными сессиями для каждого пользователя. У каждого канала может быть свой рабочий каталог, модель и инструкции.

Быстрый старт

  1. Настройте бота в вашем мессенджере (см. руководства для конкретных каналов: Telegram, WeChat, QQ Bot, DingTalk, Feishu)
  2. Добавьте конфигурацию канала в ~/.qwen/settings.json
  3. Выполните qwen channel start, чтобы запустить все каналы, или qwen channel start <name> для одного канала

Хотите подключить платформу, которая не встроена? См. Плагины, чтобы добавить пользовательский адаптер в качестве расширения.

Конфигурация

Каналы настраиваются в ключе channels файла settings.json. Каждый канал имеет имя и набор параметров:

{ "channels": { "my-channel": { "type": "telegram", "token": "$MY_BOT_TOKEN", "senderPolicy": "allowlist", "allowedUsers": ["123456789"], "sessionScope": "user", "cwd": "/path/to/working/directory", "instructions": "Optional system instructions for the agent.", "groupPolicy": "disabled", "groups": { "*": { "requireMention": true } } } } }

Параметры

ПараметрОбязательныйОписание
typeДаТип канала: telegram, weixin, qq, dingtalk, feishu или пользовательский тип из расширения (см. Плагины)
tokenTelegramТокен бота. Поддерживается синтаксис $ENV_VAR для чтения из переменных окружения. Не требуется для WeChat, DingTalk или Feishu
clientIdDingTalk, FeishuAppKey для DingTalk или App ID для Feishu. Поддерживается синтаксис $ENV_VAR
clientSecretDingTalk, FeishuAppSecret для DingTalk или App Secret для Feishu. Поддерживается синтаксис $ENV_VAR
modelНетМодель для этого канала (например, qwen3.5-plus). Переопределяет модель по умолчанию. Полезно для мультимодальных моделей, поддерживающих ввод изображений
senderPolicyНетКто может общаться с ботом: allowlist (по умолчанию), open или pairing
allowedUsersНетСписок ID пользователей, которым разрешено использовать бота (используется политиками allowlist и pairing)
sessionScopeНетОбласть действия сессий: user (по умолчанию), thread или single
cwdНетРабочий каталог для агента. По умолчанию используется текущий каталог
instructionsНетПользовательские инструкции, добавляемые в начало первого сообщения каждой сессии
groupPolicyНетДоступ к групповым чатам: disabled (по умолчанию), allowlist или open. См. Групповые чаты
groupHistoryLimitНетОпциональная загрузка истории группы. 0 или отсутствие значения отключает её. Положительное число сохраняет указанное количество авторизованных, не упомянутых сообщений группы для следующего упоминания/ответа бота.
groupsНетНастройки для каждой группы. Ключи — это ID групповых чатов или "*" для значений по умолчанию. См. Групповые чаты
dispatchModeНетЧто происходит при отправке сообщения, пока бот занят: steer (по умолчанию), collect или followup. См. Режимы диспетчеризации
blockStreamingНетПрогрессивная доставка ответов: on или off (по умолчанию). См. Блочный стриминг
blockStreamingChunkНетГраницы размера чанка: { "minChars": 400, "maxChars": 1000 }. См. Блочный стриминг
blockStreamingCoalesceНетСброс при простое: { "idleMs": 1500 }. См. Блочный стриминг

Политика отправителя

Определяет, кто может взаимодействовать с ботом:

  • allowlist (по умолчанию) — Только пользователи из списка allowedUsers могут отправлять сообщения. Остальные игнорируются без уведомления.
  • pairing — Неизвестные отправители получают код сопряжения. Оператор бота одобряет их через CLI, и они добавляются в постоянный список разрешенных. Пользователи из allowedUsers полностью пропускают этап сопряжения. См. Сопряжение в личных сообщениях ниже.
  • open — Любой может отправлять сообщения. Используйте с осторожностью.

Область действия сессии

Определяет, как управляются сессии диалога:

  • user (по умолчанию) — Одна сессия на пользователя. Все сообщения от одного пользователя находятся в одном диалоге.
  • thread — Одна сессия на тред/тему. Полезно для групповых чатов с тредами.
  • single — Одна общая сессия для всех пользователей. Все участники ведут один общий диалог.

Память канала

Память канала позволяет авторизованному участнику сохранять стабильный контекст для одного чата или треда. Qwen Code внедряет эту память при запуске новой сессии канала, в том числе после /clear.

Примеры на естественном языке:

  • 记住:默认使用 staging 环境 сохраняет память для текущего чата или треда.
  • 你记一下以后回复前要说 1122 сохраняет извлеченную долговременную память.
  • 你现在都记住了什么 показывает сохраненную память для текущего чата или треда.
  • 把这个聊天的记忆清空 запускает процесс очистки; 确认清空记忆 подтверждает её.

В групповых чатах можно просматривать сохраненную память, но запись и очистка заблокированы, чтобы избежать превращения общей памяти в вектор для prompt-injection другими участниками.

Только пользователи из списка allowedUsers могут читать, записывать или очищать память канала. Если allowedUsers пуст, команды памяти канала отключены для всех.

Безопасность токенов

Токены ботов не следует хранить непосредственно в settings.json. Вместо этого используйте ссылки на переменные окружения:

{ "token": "$TELEGRAM_BOT_TOKEN" }

Установите реальный токен в окружении вашей оболочки или в файле .env, который загружается перед запуском канала.

Сопряжение в личных сообщениях

Когда senderPolicy установлен в "pairing", неизвестные отправители проходят процесс одобрения:

  1. Неизвестный пользователь отправляет сообщение боту
  2. Бот отвечает 8-символьным кодом сопряжения (например, VEQDDWXJ)
  3. Пользователь передает код вам (оператору бота)
  4. Вы одобряете его через CLI:
qwen channel pairing approve my-channel VEQDDWXJ

После одобрения ID пользователя сохраняется в ~/.qwen/channels/<name>-allowlist.json, и все последующие сообщения проходят без препятствий.

CLI-команды для сопряжения

# Вывести список ожидающих запросов на сопряжение qwen channel pairing list my-channel # Одобрить запрос по коду qwen channel pairing approve my-channel <CODE>

Правила сопряжения

  • Коды состоят из 8 символов в верхнем регистре, используя однозначный алфавит (без 0/O/1/I)
  • Срок действия кодов истекает через 1 час
  • Максимум 3 ожидающих запроса на канал одновременно — дополнительные запросы игнорируются, пока один из них не истечет или не будет одобрен
  • Пользователи, указанные в allowedUsers в settings.json, всегда пропускают этап сопряжения
  • Одобренные пользователи сохраняются в ~/.qwen/channels/<name>-allowlist.json — относитесь к этому файлу как к конфиденциальному

Групповые чаты

По умолчанию бот работает только в личных сообщениях. Чтобы включить поддержку групповых чатов, установите для groupPolicy значение "allowlist" или "open".

Политика групп

Определяет, участвует ли бот в групповых чатах в принципе:

  • disabled (по умолчанию) — Бот игнорирует все сообщения в группах. Самый безопасный вариант.
  • allowlist — Бот отвечает только в группах, явно указанных в groups по ID чата. Ключ "*" задает настройки по умолчанию, но не действует как разрешающий шаблон.
  • open — Бот отвечает во всех группах, в которые он добавлен. Используйте с осторожностью.

Фильтрация по упоминаниям

В группах бот по умолчанию требует @упоминания или ответа на одно из своих сообщений. Это предотвращает ответы бота на каждое сообщение в групповом чате.

Настройка для каждой группы через параметр groups:

{ "groups": { "*": { "requireMention": true }, "-100123456": { "requireMention": false } } }
  • "*" — Настройки по умолчанию для всех групп. Задает только значения по умолчанию, не является записью в списке разрешенных.
  • ID группового чата — Переопределяет настройки для конкретной группы. Имеет приоритет над значениями по умолчанию из "*".
  • requireMention (по умолчанию: true) — Если true, бот отвечает только на сообщения, в которых его @упоминают или которые являются ответом на его сообщения. Если false, бот отвечает на все сообщения (полезно для специализированных рабочих групп).

Загрузка истории группы

По умолчанию Qwen игнорирует сообщения группы без упоминаний и не сохраняет их как ходы сессии. Чтобы следующее @упоминание включало недавний контекст группы, установите для groupHistoryLimit положительное число.

{ "channels": { "my-dingtalk": { "type": "dingtalk", "clientId": "$DINGTALK_CLIENT_ID", "clientSecret": "$DINGTALK_CLIENT_SECRET", "groupPolicy": "open", "groupHistoryLimit": 50, "groups": { "*": { "requireMention": true }, "sensitive-group-id": { "requireMention": true, "groupHistoryLimit": 0 } } } } }
  • Если параметр опущен или равен 0, загрузка истории отключена.
  • groupHistoryLimit на уровне группы переопределяет значение на уровне канала.
  • Сохраняются только сообщения от авторизованных отправителей.
  • Сообщения, отклоненные groupPolicy или списком разрешенных групп, не сохраняются.
  • Ожидающая обработки история группы хранится в виде локального JSONL в ~/.qwen/channels/<channel-name>-group-history.jsonl или $QWEN_HOME/channels/<channel-name>-group-history.jsonl.
  • Кэшированные сообщения внедряются как ненадежный контекст при следующем реальном триггере и не записываются как отдельные ходы сессии.

Как оцениваются сообщения в группах

1. groupPolicy — эта группа разрешена? (нет → игнорировать) 2. requireMention — бот был упомянут/ответили на него? (нет → игнорировать) 3. senderPolicy — этот отправитель одобрен? (нет → процесс сопряжения) 4. Направить в сессию

Настройка Telegram для групп

  1. Добавьте бота в группу
  2. Отключите privacy mode в BotFather (/mybots → Bot Settings → Group Privacy → Turn Off) — иначе бот не будет видеть сообщения без команд
  3. Удалите и повторно добавьте бота в группу после изменения privacy mode (Telegram кэширует эту настройку)

Поиск ID группового чата

Чтобы найти ID чата группы для allowlist groups:

  1. Остановите бота, если он запущен
  2. Отправьте сообщение с упоминанием бота в группу
  3. Используйте Telegram Bot API для проверки обновлений в очереди:
curl -s "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/getUpdates" | python3 -m json.tool

Найдите message.chat.id в ответе — ID групп представляют собой отрицательные числа (например, -5170296765).

Поддержка медиа

Каналы поддерживают отправку изображений и файлов агенту, а не только текста.

Изображения

Отправьте фото боту, и агент его увидит — это удобно для обмена скриншотами, сообщениями об ошибках или диаграммами. Изображение отправляется модели напрямую в качестве визуального ввода.

Чтобы использовать поддержку изображений, настройте мультимодальную модель для канала:

{ "channels": { "my-channel": { "type": "telegram", "model": "qwen3.5-plus", ... } } }

Файлы

Отправьте документ (PDF, файл с кодом, текстовый файл и т.д.) боту. Файл скачивается и сохраняется во временную директорию, а агенту передается путь к файлу, чтобы он мог прочитать его содержимое с помощью своих инструментов для чтения файлов.

Файлы работают с любой моделью — мультимодальная поддержка не требуется.

Отличия платформ

ВозможностьTelegramWeChatDingTalkFeishu
ИзображенияПрямая загрузка через Bot APIЗагрузка через CDN с AES-дешифрованиемdownloadCode API (двухэтапный)Эндпоинт ресурсов Open API (аутентифицированный GET, лимит 50 МБ)
ФайлыПрямая загрузка через Bot API (лимит 20 МБ)Загрузка через CDN с AES-дешифрованиемdownloadCode API (двухэтапный)Эндпоинт ресурсов Open API (лимит 50 МБ)
ПодписиПодписи к фото/файлам включаются как текст сообщенияНе применимоRich text: смешанный текст + изображения в одном сообщенииRich text (post): текст извлекается; встроенные изображения игнорируются

QQ Bot не обрабатывает входящие медиа — сообщения с изображениями и стикерами игнорируются, поэтому для него нет строки обработки медиа в таблице выше.

Режимы диспетчеризации

Определяет, что происходит, когда вы отправляете новое сообщение, пока бот еще обрабатывает предыдущее.

  • steer (по умолчанию) — Бот отменяет текущий запрос и начинает работать с вашим новым сообщением. Лучше всего подходит для обычного чата, где последующее сообщение обычно означает, что вы хотите исправить или перенаправить бота.
  • collect — Ваши новые сообщения буферизуются. Когда текущий запрос завершается, все буферизованные сообщения объединяются в один последующий промпт. Хорошо подходит для асинхронных рабочих процессов, где вы хотите накапливать мысли.
  • followup — Каждое сообщение ставится в очередь и обрабатывается как свой отдельный ход по порядку. Полезно для пакетных рабочих процессов, где каждое сообщение независимо.
{ "channels": { "my-channel": { "type": "telegram", "dispatchMode": "steer", ... } } }

Вы также можете установить режим диспетчеризации для каждой группы, переопределяя значение по умолчанию для канала:

{ "groups": { "*": { "requireMention": true, "dispatchMode": "steer" }, "-100123456": { "dispatchMode": "collect" } } }

Блочный стриминг

По умолчанию агент работает некоторое время, а затем отправляет один большой ответ. При включенном блочном стриминге ответ поступает в виде нескольких более коротких сообщений, пока агент еще работает — аналогично тому, как ChatGPT или Claude показывают прогрессивный вывод.

{ "channels": { "my-channel": { "type": "telegram", "blockStreaming": "on", "blockStreamingChunk": { "minChars": 400, "maxChars": 1000 }, "blockStreamingCoalesce": { "idleMs": 1500 }, ... } } }

Как это работает

  • Ответ агента разбивается на блоки по границам абзацев и отправляется в виде отдельных сообщений
  • minChars (по умолчанию 400) — не отправлять блок, пока он не достигнет хотя бы этой длины, чтобы избежать спама крошечными сообщениями
  • maxChars (по умолчанию 1000) — если блок достигает этой длины без естественного разрыва, все равно отправить его
  • idleMs (по умолчанию 1500) — если агент делает паузу (например, запускает инструмент), отправить то, что накопилось в буфере
  • Когда агент завершает работу, любой оставшийся текст отправляется немедленно

Требуется только blockStreaming. Настройки chunk и coalesce необязательны и имеют разумные значения по умолчанию.

Слэш-команды

Каналы поддерживают слэш-команды. Они обрабатываются локально (без обращения к агенту):

  • /help — Список доступных команд
  • /clear — Очистить сессию и начать заново (алиасы: /reset, /new)
  • /status — Показать информацию о сессии и политике доступа

Все остальные слэш-команды (например, /compress, /summary) перенаправляются агенту.

Эти команды работают во всех типах каналов (Telegram, WeChat, QQ, DingTalk, Feishu).

Запуск

# Запуск всех настроенных каналов (общий процесс агента) qwen channel start # Запуск одного канала qwen channel start my-channel # Проверка статуса работы сервиса qwen channel status # Остановка работающего сервиса qwen channel stop

Бот запускается в активном режиме (foreground). Нажмите Ctrl+C для остановки или используйте qwen channel stop из другого терминала.

Экспериментальный режим управления через демон

Вы также можете запускать настроенные каналы через qwen serve:

# Запуск одного канала в жизненном цикле демона qwen serve --channel my-channel # Запуск всех настроенных каналов qwen serve --channel all

Этот режим запускает один рабочий процесс канала, принадлежащий qwen serve. Воркер подключается к демону через SDK и использует те же адаптеры каналов. Он отделен от процесса демона, поэтому сбой адаптера канала не приводит к сбою демона.

qwen serve --channel — это не тот же сервис, что и qwen channel start. Автономный qwen channel start по-прежнему использует сервис каналов на базе ACP и может запускать конфигурации каналов с разными значениями cwd. Каналы, управляемые демоном, требуют, чтобы cwd каждого выбранного канала указывал на рабочее пространство демона.

Когда каналы управляются через serve, qwen channel status показывает владельцем qwen serve, а qwen channel stop предлагает остановить демон вместо прямой отправки сигнала воркеру. Если готовый воркер неожиданно завершает работу, демон продолжает работать и сообщает о предупреждении channel-worker в /daemon/status.

Мультиканальный режим

Когда вы запускаете qwen channel start без указания имени, все каналы, определенные в settings.json, запускаются вместе, используя единый процесс агента. Каждый канал поддерживает свои собственные сессии — пользователь Telegram и пользователь WeChat получают отдельные диалоги, даже если они используют одного и того же агента.

Каждый канал использует свой собственный cwd из конфигурации, поэтому разные каналы могут работать над разными проектами одновременно.

Управление сервисом

Сервис каналов использует PID-файл (~/.qwen/channels/service.pid) для отслеживания запущенного экземпляра:

  • Предотвращение дубликатов: Запуск qwen channel start при уже работающем сервисе приведет к ошибке вместо запуска второго экземпляра
  • qwen channel stop: Корректно останавливает работающий сервис из другого терминала
  • qwen channel status: Показывает, запущен ли сервис, его время работы и количество сессий для каждого канала

Восстановление после сбоев

Если процесс агента неожиданно завершается с ошибкой, сервис каналов автоматически перезапускает его и пытается восстановить все активные сессии. Пользователи могут продолжить свои диалоги без необходимости начинать заново.

  • Сессии сохраняются в ~/.qwen/channels/sessions.json во время работы сервиса
  • При сбое: агент перезапускается в течение 3 секунд и перезагружает сохраненные сессии
  • После 3 последовательных сбоев сервис завершает работу с ошибкой
  • При штатном завершении работы (Ctrl+C или qwen channel stop): данные сессий очищаются — следующий запуск всегда начинается с чистого состояния
Last updated on