Команды
В этом документе подробно описаны все команды, поддерживаемые Qwen Code, которые помогут вам эффективно управлять сессиями, настраивать интерфейс и контролировать его поведение.
Команды Qwen Code вызываются с помощью специальных префиксов и делятся на три категории:
| Тип префикса | Описание функции | Типичный сценарий использования |
|---|---|---|
Slash-команды (/) | Мета-уровневое управление самим Qwen Code | Управление сессиями, изменение настроек, получение справки |
At-команды (@) | Быстрая вставка содержимого локального файла в диалог | Позволяют ИИ анализировать указанные файлы или код в директориях |
Exclamation-команды (!) | Прямое взаимодействие с системной оболочкой (Shell) | Выполнение системных команд, таких как git status, ls и т.д. |
1. Slash-команды (/)
Slash-команды используются для управления сессиями, интерфейсом и базовым поведением Qwen Code.
1.1 Управление сессиями и проектами
Эти команды помогают сохранять, восстанавливать и резюмировать ход работы.
| Команда | Описание | Примеры использования |
|---|---|---|
/init | Анализ текущей директории и создание файла начального контекста | /init |
/summary | Генерация резюме проекта на основе истории диалога | /summary или /summary docs/my-summary.md |
/compress | Замена истории чата резюме для экономии токенов | /compress или /summarize |
/compress-fast | Быстрое сжатие без ИИ — удаляет старые выводы инструментов и части рассуждений | /compress-fast |
/resume | Возобновление предыдущей сессии диалога | /resume или /continue |
/recap | Мгновенная генерация краткого резюме сессии в одну строку | /recap |
/restore | Откат файлов проекта к контрольной точке перед выполнением вызова инструмента | /restore (список) или /restore <ID> |
/delete | Удаление предыдущей сессии | /delete |
/branch | Ответвление текущего диалога в новую сессию | /branch |
/fork | Запуск фонового агента, наследующего весь диалог | /fork <directive> |
/rewind | Откат диалога к предыдущему шагу | /rewind или /rollback |
/export | Экспорт истории сессии в файл | /export html, /export md, /export json, /export jsonl |
/rename | Переименование или добавление тега к текущей сессии | /rename My Feature или /tag |
/commit | Создать коммит git с сообщением, составленным ИИ | /commit или /commit only stage the parser changes |
Открытие HTML-экспорта загружает ренде��ер и таблицу стилей именно для этой версии Qwen Code с unpkg.com. Если версия не была опубликована или один из этих ресурсов недоступен, файл показывает ошибку загрузки. Экспорты Markdown, JSON и JSONL остаются самодостаточными.
/summarize — это алиас для /compress (сжимает историю чата — деструктивная операция). Чтобы создать нерушащее резюме проекта, используйте /summary.
/summary принимает опциональный аргумент [path] для сохранения резюме в пользовательское место в корне проекта. Без аргумента он сохраняется в .qwen/PROJECT_SUMMARY.md. Резюме с пользовательским путём не обнаруживаются потоком welcome-back (ui.enableWelcomeBack), который читает только стандартное расположение .qwen/PROJECT_SUMMARY.md.
1.2 Управление интерфейсом и рабочим пространством
Команды для настройки внешнего вида интерфейса и рабочей среды.
| Команда | Описание | Примеры использования |
|---|---|---|
/clear | Очистка истории диалога и освобождение контекста | /clear, /reset, /new |
/context | Отображение детализации использования окна контекста | /context |
→ detail | Детализация использования контекста по элементам | /context detail |
/history | Управление настройками отображения и видимости истории | /history collapse-on-resume, /history expand-on-resume, /history expand-now |
/diff | Открытие интерактивного просмотрщика diff, показывающего незакоммиченные изменения и diff по шагам. Используйте ←/→ для переключения между текущим git diff и отдельными шагами диалога, ↑/↓ для навигации по файлам | /diff |
/log | Открытие просмотрщика истории коммитов для рабочего пространства (только Web Shell) | /log |
/theme | Изменение визуальной темы Qwen Code | /theme |
/vim | Включение/выключение режима редактирования Vim в области ввода | /vim |
/voice | Переключение ввода с помощью голосового диктанта | /voice, /voice hold, /voice tap, /voice off, /voice status |
/directory | Управление рабочим пространством с поддержкой нескольких директорий | /dir add ./src,./tests, /dir show |
/cd | Перемещение текущей сессии в новую рабочую директорию | /cd ../other-project |
/editor | Открытие диалога выбора поддерживаемого редактора | /editor |
/statusline | Открытие интерактивного диалога предустановок строки состояния | /statusline |
/statusline <text> | Генерация строки состояния в режиме команд с помощью агента | /statusline show model and git branch |
/terminal-setup | Настройка сочетаний клавиш терминала для многострочного ввода | /terminal-setup |
1.3 Настройки языка
Команды для управления языком интерфейса и языком вывода.
| Команда | Описание | Примеры использования |
|---|---|---|
/language | Просмотр или изменение языковых настроек | /language |
→ ui [language] | Установка языка интерфейса | /language ui zh-CN |
→ output [language] | Установка языка вывода LLM | /language output Chinese |
- Доступные встроенные языки интерфейса:
zh-CN(упрощенный китайский),en-US(английский),ru-RU(русский),de-DE(немецкий),ja-JP(японский),pt-BR(португальский - Бразилия),fr-FR(французский),ca-ES(каталанский) - Примеры языков вывода:
Chinese,English,Japaneseи т.д.
1.4 Управление инструментами и моделями
Команды для управления ИИ-инструментами и моделями.
| Команда | Описание | Примеры использования |
|---|---|---|
/mcp | Список настроенных серверов и инструментов MCP | /mcp, /mcp desc, /mcp nodesc, /mcp schema |
/import-config | Импорт серверов MCP из конфигураций Claude | /import-config all, /import-config claude-code, /import-config claude-desktop --scope user|project |
/tools | Отобразить список доступных в данный момент инструментов | /tools, /tools desc |
/skills | Открыть панель Skills для просмотра, поиска, переключения и запуска навыков | /skills, /<skill-name> |
/learn | Создать повторно используемый проект навыка (skill) из файла, каталога, URL, видео или текста | /learn https://docs.example.com/api, /learn ./tutorial.mp4 focus on deployment |
/curator | Инспектировать, закреплять, архивировать или восстанавливать неактивные авто-навыки проекта | /curator, /curator run --dry-run, /curator pin <directory>, /curator restore <directory> |
/plan | Переключиться в режим планирования или выйти из него | /plan, /plan <task>, /plan exit |
/approval-mode | Изменить режим одобрения инструментов (только для текущей сессии) | /approval-mode, /approval-mode auto-edit |
→ plan | Только анализ, без выполнения (безопасный просмотр) | /approval-mode plan |
→ default | Требовать одобрения для правок (повседневное использование) | /approval-mode default |
→ auto-edit | Автоматически одобрять правки (доверенная среда) | /approval-mode auto-edit |
→ auto | Одобрение на основе классификатора (автономный режим) | /approval-mode auto |
→ yolo | Автоматически одобрять всё (быстрое прототипирование) | /approval-mode yolo |
/peers | Просмотр отложенных сообщений коллег; управление доверенными контроллерами | /peers, /peers accept <id>, /peers deny all, /peers controllers, /peers revoke <id> |
/model | Сменить модель, используемую в текущей сессии | /model, /model <model-id> (немедленное переключение) |
/model --fast | Установить более легкую модель для подсказок промптов | /model --fast qwen3-coder-flash |
/model --voice | Установить модель, используемую для транскрипции голоса | /model --voice <model-id> |
/model --vision | Установить модель vision-bridge для транскрипции изображений для текстовой основной модели | /model --vision <model-id> |
/model --compaction | Установить модель, используемую для сжатия чата | /model --compaction <model-id>, /model --compaction clear |
/model --image | Установить модель, способную генерировать изображения, для встроенного инструмента генерации изображений | /model --image <model-id> |
/effort | Установить уровень усилий рассуждения для моделей, поддерживающих размышления | /effort (открывает выбор), /effort high (low/medium/high/xhigh/max; отображается и ограничивается согласно провайдеру) |
/output-style | Выбрать стиль вывода, определяющий формат написания ответов | /output-style (открывает выбор), /output-style Concise, /output-style default (без стиля) |
/extensions | Управление расширениями | /extensions list, /extensions manage |
→ list | Список установленных расширений | /extensions list |
→ manage | Управление установленными расширениями (интерактивно) | /extensions manage |
→ explore | Открыть страницу расширений в браузере | /extensions explore <Gemini|ClaudeCode> |
→ install | Установить расширение из git-репозитория или пути | /extensions install <repo-or-path> |
/memory | Открыть диалог менеджера памяти | /memory |
/remember | Сохранить долговременную память | /remember Prefer terse responses |
/forget | Удалить совпадающие записи из авто-памяти | /forget <query> |
/dream | Вручную запустить консолидацию авто-памяти | /dream |
/hooks | Управление хуками Qwen Code | /hooks, /hooks list |
/reload-plugins | Перезагрузить изменения расширений (команды, навыки, агенты, рабочие процессы, хуки, серверы MCP/LSP) с диска | /reload-plugins |
/permissions | Управление правилами разрешений | /permissions |
/agents | Управление субагентами | /agents manage, /agents create |
/arena | Управление сессиями Arena | /arena start, /arena stop, /arena status, /arena select (алиас choose) |
/goal | Установить цель — продолжать работу, пока верификатор не подтвердит её (см. Цели) | /goal <objective>, /goal edit <objective>, /goal pause, /goal resume, /goal clear |
/tasks | Список фоновых задач | /tasks |
/workflows | Инспектировать запуски рабочих процессов; кооперативно приостанавливать/возобновлять фоновый запуск | /workflows, /workflows <runId>, /workflows p <runId> |
/lsp | Показать статус сервера LSP | /lsp |
/trust | Управление настройками доверия к папкам | /trust |
Устанавливайте расширения (/extensions install) только из доверенных источников. Расширения могут включать серверы MCP, навыки и команды, которые выполняются с теми же разрешениями, что и сам Qwen Code — они имеют доступ к вашим файлам, ключам API и данным разговора. Они также могут поставлять скрипты рабочих процессов, которые выполняются в песочнице рабочего процесса без прямого доступа к файлам или shell, действуют через запускаемые ими субагенты и проходят через одобрение инструмента Workflow. /extensions install не запрашивает подтверждения.
Режимы подтверждения auto-edit, auto и yolo пропускают запросы на подтверждение выполнения инструментов. В режиме yolo все действия — включая команды оболочки, запись файлов и сетевые запросы — выполняются без подтверждения. Используйте эти режимы только в доверенных, изолированных (sandbox) или одноразовых средах.
Команды /workflows, /lsp и /trust регистрируются только при включении соответствующих функций — через настройку tools.workflowsEnabled в области user/system или переменную окружения QWEN_CODE_ENABLE_WORKFLOWS=1, флаг CLI --experimental-lsp и настройку security.folderTrust.enabled соответственно. Значения tools.workflowsEnabled в рабочем пространстве игнорируются. Если функция отключена, команды не будут доступны, и при попытке их вызвать будет выдана ошибка о неизвестной команде. Аналогично, /dream и /forget регистрируются только при доступности управляемой auto-memory; без неё они не будут доступны.
Навык из установленного расширения также является слэш-командой, и его имя содержит владельца: /rust:pdf, а не /pdf. Голый вариант не является алиасом — если другой навык назван pdf, то /pdf выполнит тот навык вместо этого. slashCommands.disabled ограничивает такую команду под любым написанием, поэтому запись, сделанная до того, как имя стало содержать владельца, все равно применяется. См. Как называются навыки расширений.
1.5 Встроенные skills
Эти команды вызывают встроенные skills, которые предоставляют специализированные рабочие процессы.
| Команда | Описание | Примеры использования |
|---|---|---|
/review | Многоагентный код-ревью (12 параллельных агентов с высоким уровнем усилий) | /review, /review 123, /review 123 --comment, /review --effort low |
/coordinate | Координировать работников только для чтения и одного опционального писателя worktree | /coordinate investigate and fix the authentication regression |
/loop | Запускать промпт по расписанию | /loop 5m check the build |
/goal-draft | Превратить расплывчатое намерение в проверяемую цель /goal | /goal-draft make the auth tests pass |
/autofix-pr | Следить за PR и исправлять CI, отзывы ревью и конфликты | /autofix-pr 123, /autofix-pr 123 --once, /autofix-pr resume, /autofix-pr stop 123 |
/simplify | Просмотреть недавние изменения и напрямую применить безопасные правки очистки | /simplify, /simplify focus on duplication |
/qc-helper | Отвечать на вопросы об использовании и конфигурации Qwen Code | /qc-helper how do I configure MCP? |
См. Код-ревью для полной документации /review и Автоисправление Pull Request для /autofix-pr.
1.6 Побочные вопросы (/btw)
Команда /btw позволяет задавать быстрые побочные вопросы, не прерывая и не влияя на основной ход диалога.
| Команда | Описание |
|---|---|
/btw <your question> | Задать быстрый побочный вопрос |
?btw <your question> | Альтернативный синтаксис для побочных вопросов |
Как это работает:
- Побочный вопрос отправляется как отдельный API-запрос с контекстом недавнего диалога (до последних 20 сообщений)
- Ответ отображается над Composer — вы можете продолжать печатать во время ожидания
- Основной диалог не блокируется — он продолжается независимо
- Ответ на побочный вопрос не становится частью истории основного диалога
- Ответы отображаются с полной поддержкой Markdown (блоки кода, списки, таблицы и т. д.)
Горячие клавиши (Интерактивный режим):
| Сочетание клавиш | Действие |
|---|---|
Escape | Отмена (во время загрузки) или скрытие (после завершения) |
Space или Enter | Скрыть ответ (когда поле ввода пусто) |
Ctrl+C или Ctrl+D | Отменить выполняющийся побочный вопрос |
Пример:
(While the main conversation is about refactoring code)
> /btw What's the difference between let and var in JavaScript?
╭──────────────────────────────────────────╮
│ /btw What's the difference between let │
│ and var in JavaScript? │
│ │
│ + Answering... │
│ Press Escape, Ctrl+C, or Ctrl+D to cancel│
╰──────────────────────────────────────────╯
> (Composer remains active — keep typing)
(After the answer arrives)
╭──────────────────────────────────────────╮
│ /btw What's the difference between let │
│ and var in JavaScript? │
│ │
│ `let` is block-scoped, while `var` is │
│ function-scoped. `let` was introduced │
│ in ES6 and doesn't hoist the same way. │
│ │
│ Press Space, Enter, or Escape to dismiss │
╰──────────────────────────────────────────╯
> (Composer still active)Поддерживаемые режимы выполнения:
| Режим | Поведение |
|---|---|
| Interactive | Отображается над Composer с рендерингом Markdown |
| Non-interactive | Возвращает текстовый результат: btw> question\nanswer |
| ACP (Agent Protocol) | Возвращает асинхронный генератор stream_messages |
Используйте /btw, когда вам нужен быстрый ответ, не сбиваясь с основной задачи. Это особенно полезно для уточнения концепций, проверки фактов или получения быстрых объяснений, оставаясь сосредоточенным на основном рабочем процессе.
1.7 Второе мнение (/advisor)
Команда /advisor выполняет независимое ревью текущего диалога только для чтения и возвращает структурированное второе мнение — не выполняя задачу и не прерывая основной диалог.
| Команда | Описание |
|---|---|
/advisor | Ревью текущего диалога |
/advisor <focus> | Сфокусировать ревью на конкретной проблеме |
Как это работает:
- Ревью отправляется как отдельный одноходовый API-запрос с контекстом недавнего диалога (до последних 40 сообщений)
- Модель-ревьюер не может выполнять инструменты — инструменты удаляются на уровне запроса (тот же механизм, что и для
/btw), поэтому ревью никогда не пишет код и не выполняет команды; каждое утверждение должно основываться на видимом транскрипте - Основной диалог не прерывается; ревью показывается только вам
- Ревью отображается как обрамлённый markdown-блок с четырьмя фиксированными разделами — Verdict, Risks, Missing evidence и Recommendation — под заголовком
/advisor · <model>, указывающим используемую модель-ревьюера - В отличие от
/btw, который выполняется fire-and-forget и не блокирует сессию,/advisorблокирует ввод до возврата ревью; при полном окне контекста с мощной моделью-ревьюером это может занять десятки секунд - По умолчанию используется основная модель; установите
advisorModel, чтобы направить ревью на другую (обычно более мощную) модель — недавний транскрипт отправляется этой модели, даже если она использует другого провайдера
Пример:
> /advisor is my fix for the null check actually correct?
Consulting advisor...
╭──────────────────────────────────────────────────────╮
│ /advisor · qwen3-max │
│ │
│ Verdict │
│ The approach is sound, but the edge case at line 42 │
│ is unverified. │
│ │
│ Risks │
│ - The fix assumes the config is always loaded; a │
│ startup race could leave it null. │
│ │
│ Missing evidence │
│ - No test exercises the null-config path in the │
│ visible transcript. │
│ │
│ Recommendation │
│ Add a focused unit test for the null-config branch │
│ before merging. │
╰──────────────────────────────────────────────────────╯Ревью отображается в обрамлённом блоке, заголовок которого указывает используемую модель-ревьюера. Неизвестная advisorModel не проверяется заранее — если провайдер отклоняет её, /advisor сообщает о сбое, поэтому проверяйте имя модели; только неразрешимые селекторы алиасов (например, fast без настроенной быстрой модели) откатываются на основную модель. Запросы advisor не используют настроенные фолбэки моделей.
Поддерживаемые режимы выполнения:
| Режим | Поведение |
|---|---|
| Interactive | Отображает ревью из четырёх разделов в диалоге |
| ACP (Agent Protocol) | Возвращает ревью как результат сообщения |
Используйте /advisor для получения второго мнения перед принятием направления — это особенно полезно для выявления ошибочных предположений, непроверенных утверждений или рискованных следующих шагов. Настройте advisorModel, чтобы получать ревью от другой модели, отличной от той, что ведёт основной диалог.
advisorModel задаётся только в настройках; в отличие от fastModel и visionModel, у неё пока нет аналога в виде флага /model.
1.8 Краткое содержание сессии (/recap)
Команда /recap генерирует краткое резюме «на чем вы остановились» для текущей сессии, чтобы вы могли продолжить старую беседу без прокрутки страниц истории.
| Команда | Описание |
|---|---|
/recap | Сгенерировать и показать краткое резюме сессии в одну строку |
Как это работает:
- Использует настроенную быструю модель (параметр
fastModel), если она доступна, иначе возвращается к основной модели сессии. Для краткого пересказа достаточно небольшой и дешевой модели. - Недавняя беседа (до 30 сообщений, только текст — вызовы инструментов и ответы инструментов фильтруются) отправляется в модель со строгим системным запросом.
- Пересказ отображается тусклым цветом с префиксом
❯, чтобы отличаться от реальных ответов ассистента. - Отказывается выполнять команду с встроенной ошибкой, если ход модели выполняется или обрабатывается другая команда. Если нет доступной беседы или генерация не удалась,
/recapпоказывает короткое информационное сообщение вместо пересказа — ручная команда всегда дает какой-то ответ.
Автозапуск при возвращении после отсутствия:
Если терминал теряет фокус на 5+ минут и снова получает его, пересказ генерируется и показывается автоматически (только когда нет ответа модели; иначе он ждет завершения текущего хода и затем запускается). В отличие от ручной команды, автоматический триггер полностью молчит при ошибках: если генерация завершается ошибкой или нечего резюмировать, в историю не добавляется никаких сообщений. Управляется параметром general.showSessionRecap (по умолчанию: false); ручная команда /recap всегда работает независимо от этого параметра.
Пример:
> /recap
❯ Refactoring loopDetectionService.ts to address long-session OOM caused by
unbounded streamContentHistory and contentStats. The next step is to
implement option B (LRU sliding window with FNV-1a) pending confirmation.Настройте быструю модель через /model --fast <model> (например, qwen3-coder-flash), чтобы сделать /recap быстрым и дешевым. Установите general.showSessionRecap в значение true, чтобы включить автоматический триггер; ручная команда /recap всегда работает независимо от этого параметра.
1.9 Просмотр diff (/diff)
Команда /diff открывает интерактивный просмотрщик diff, показывающий незакоммиченные изменения и diff для каждого хода. Используйте ←/→ для переключения между текущим git diff и отдельными ходами диалога, ↑/↓ для навигации по файлам и Enter для просмотра inline-diff.
Как это работает:
В интерактивном режиме /diff открывает диалоговое окно с выбором источника в верхней части:
- Current — рабочее дерево против HEAD (
git diff HEAD). Показывает все незакоммиченные изменения, включая проиндексированные, непроиндексированные и неотслеживаемые файлы. - T1, T2, T3, … — diff для каждого хода, по одной вкладке на каждый ход модели, изменивший файлы. Самые последние ходы отображаются первыми. Каждая вкладка показывает превью исходного промпта для контекста.
Список файлов отображает статистику по каждому файлу (добавленные/удаленные строки) с тегами для специальных состояний (new, deleted, untracked, binary, truncated, oversized). Нажмите Enter на файле, чтобы просмотреть его inline-diff с подсветкой синтаксиса для блоков изменений.
Diff для каждого хода требует включения контрольных точек файлов (по умолчанию включено в интерактивном режиме). Когда контрольные точки файлов отключены, доступен только источник “Current”.
Горячие клавиши:
| Клавиша | Действие |
|---|---|
← / → | Переключение между источниками (Current / T1 / T2…) |
↑ / ↓ | Навигация по списку файлов |
j / k | Навигация по списку файлов (в стиле vim) |
| Enter | Просмотр inline-diff для выбранного файла |
← / Esc | Возврат к списку файлов из просмотра inline-diff |
| Esc | Закрыть диалоговое окно |
Пример:
┌ /diff · Turn 3 "refactor the auth middleware" ──── 3 files +45 -12 ┐
│ │
│ ◀ Current · T3 · T2 · T1 ▶ │
│ │
│ › src/utils/parser.ts +30 -8 │
│ src/utils/parser.test.ts +12 -2 │
│ README.md +3 -2 │
│ │
│ ←/→ source · ↑/↓ file · Enter view · Esc close │
└─────────────────────────────────────────────────────────────────────┘Неинтерактивный режим:
В headless-режиме (--prompt) или неинтерактивном контексте /diff выводит текстовое резюме рабочего дерева против HEAD. Навигация по ходам недоступна.
3 files changed, +45 / -12
+30 -8 src/utils/parser.ts
+12 -2 src/utils/parser.test.ts
+3 -2 README.mdWeb Shell: В Web Shell UI (qwen serve), /diff открывает графический диалог diff. Панель вкладок в верхней части позволяет переключаться между представлением Changes и представлением History (/log).
Просмотр истории (/log) — только Web Shell
Команда /log открывает браузер истории коммитов для текущего рабочего пространства. Она доступна только в Web Shell UI; CLI/TUI не имеет этой команды.
Как это работает:
/log открывает диалоговое окно со списком коммитов в обратном хронологическом порядке (новые первые). Каждая строка показывает:
- Короткий SHA (моноширинный, с кнопкой копирования полного SHA)
- Тему коммита (одна строка)
- Имя автора и относительное время (например, “2h ago”)
- Метки ссылок веток/тегов, если есть
- Иконку слияния (⎇) для merge-коммитов
Нажмите на строку коммита, чтобы развернуть его детали по запросу:
- Полное тело сообщения коммита
- Статистику изменений файлов (изменённые файлы, добавленные/удалённые строки, разбивка по файлам)
Используйте Load more внизу, чтобы загрузить следующую страницу коммитов (50 на страницу).
Пример:
┌─ History ──────────────────────────── 50 commits ─ ✕ ┐
│ │
│ a1b2c3d feat(cli): add --json flag 2h ago │
│ wenshao │
│ │
│ e4f5g6h fix(core): handle null config 5h ago │
│ dev · main v1.2.0 │
│ │
│ ▼ 789abcd refactor: simplify parser 1d ago │
│ ┌─────────────────────────────────────────────┐ │
│ │ Broke the monolithic parse() into smaller │ │
│ │ functions for readability. │ │
│ │ │ │
│ │ 3 files · +45 −12 │ │
│ │ +30 −8 src/parser.ts │ │
│ │ +10 −2 src/utils.ts │ │
│ │ +5 −2 test/parser.test.ts │ │
│ └─────────────────────────────────────────────┘ │
│ │
│ [ Load more ] │
└───────────────────────────────────────────────────────┘/log требует рабочее пространство git-репозитория. Если рабочее пространство не является git-репозиторием или не имеет коммитов, диалог показывает сообщение-заглушку.
1.10 Информация, настройки и помощь
Команды для получения информации и выполнения системных настроек.
| Команда | Описание | Примеры использования |
|---|---|---|
/help | Отобразить справочную информацию по доступным командам | /help или /? |
/status | Отобразить информацию о версии | /status или /about |
/status paths | Отобразить пути к файлу текущей сессии и логам | /status paths |
/stats | Открыть интерактивную панель статистики использования (вкладки Session, Activity и Efficiency) | /stats или /usage |
/stats model | Показать разбивку токенов по моделям и оценочную стоимость | /stats model |
/stats tools | Показать количество вызовов по каждому инструменту | /stats tools |
/stats skills | Показать количество вызовов по каждому навыку для текущей активной сессии (только live; исключает ежедневную/ежемесячную активность между сессиями) | /stats skills |
/stats daily | Показать ежедневную статистику использования токенов | /stats daily (алиас day), /stats day [YYYY-MM-DD] |
/stats monthly | Показать ежемесячную статистику использования токенов | /stats monthly (алиас month), /stats month [YYYY-MM] |
/stats export | Экспортировать статистику использования в CSV или JSON | /stats export <daily|monthly> [date|month] [--format csv|json] [--output path] |
/settings | Открыть редактор настроек | /settings |
/config | Получить или установить любую настройку по ключу с точечным путем (записывает в пользовательские настройки) | /config (список всех), /config <key>, /config <key>=<value> |
/auth | Изменить метод аутентификации | /auth, /connect, /login |
/logout | Выход из активной учётной записи Qwen Subscription (доступно при входе через Qwen Subscription) | /logout |
/upgrade | Открыть тарифные планы подписки Qwen (доступно при входе через Qwen Subscription) | /upgrade |
/doctor | Запустить диагностику установки и окружения | /doctor, /doctor memory |
→ memory | Показать диагностику памяти текущего процесса | /doctor memory [--json] [--sample] [--snapshot] |
→ cpu-profile | Записать профиль ЦП для анализа в Chrome DevTools | /doctor cpu-profile [--duration <seconds>] |
→ rollback | Откатить автономный бинарный файл CLI до предыдущей версии (только для автономных установок; для истории диалогов используйте /rewind) | /doctor rollback |
/docs | Открыть полную документацию Qwen Code в браузере | /docs |
/ide | Управлять интеграцией с IDE | /ide status, /ide install, /ide enable, /ide disable |
/insight | Генерировать инсайты по программированию из истории чата | /insight |
/setup-github | Настроить GitHub Actions | /setup-github |
/bug | Отправить отчет об ошибке Qwen Code | /bug Button click unresponsive |
/copy | Скопировать в буфер обмена: ответ (N-ный с конца), код (по языку), LaTeX или Mermaid | /copy, /copy 2, /copy python, /copy latex, /copy mermaid |
/quit | Немедленно выйти из Qwen Code | /quit или /exit |
/doctor memory --snapshot записывает снимок кучи V8, который может содержать промпты, содержимое файлов, API-ключи и результаты работы инструментов из текущей сессии. Проверьте файл перед тем, как им делиться.
/config читает и записывает отдельные настройки по ключу с точечным путем (например, general.vimMode), дополняя интерактивный редактор /settings. Запуск /config без аргументов (или с --help) выводит список всех доступных для изменения ключей с их типом и текущим значением. /config <key> выводит текущее значение — за исключением булевых ключей, где он переключает значение. /config <key>=<value> устанавливает значение. Изменения записываются в пользовательские настройки (~/.qwen/settings.json). Таким образом можно изменять только настройки типов boolean, string, number и enum — настройки типов array и object необходимо редактировать напрямую в settings.json. Конфиденциальные значения (API-ключи, токены, базовые URL) маскируются в выводе, а установка tools.approvalMode в значение yolo заблокирована.
1.11 Часто используемые сочетания клавиш
| Сочетание клавиш | Функция | Примечание |
|---|---|---|
Ctrl/cmd+L | Очистить экран | Очищает только видимую часть экрана (не сбрасывает сессию, как /clear) |
Ctrl/cmd+T | Переключить описание инструмента | Управление инструментами MCP |
Ctrl/cmd+C×2 | Подтверждение выхода | Безопасный механизм выхода |
Ctrl/cmd+Z | Отменить ввод | Редактирование текста |
Ctrl/cmd+Shift+Z | Повторить ввод | Редактирование текста |
1.12 Команды аутентификации
Используйте /auth внутри сессии Qwen Code для настройки аутентификации. Используйте /doctor для проверки текущего статуса аутентификации и состояния окружения.
| Команда | Описание |
|---|---|
/auth | Интерактивная настройка аутентификации (алиасы: /connect, /login) |
/doctor | Показать проверки аутентификации и окружения |
Отдельная CLI-команда qwen auth была удалена. Устаревшие вызовы, такие как qwen auth status, выводят уведомление об удалении с инструкциями по миграции. Полную информацию см. на странице Аутентификация.
2. Команды @ (Подключение файлов)
Команды @ используются для быстрого добавления содержимого локального файла или директории в контекст разговора.
| Формат команды | Описание | Примеры |
|---|---|---|
@<file path> | Внедрить содержимое указанного файла | @src/main.py Please explain this code |
@<directory path> | Рекурсивно прочитать все текстовые файлы в директории | @docs/ Summarize content of this document |
Отдельный @ | Используется при обсуждении самого символа @ | @ What is this symbol used for in programming? |
Примечание: Пробелы в путях необходимо экранировать обратным слешем (например, @My\ Documents/file.txt).
В интерактивном промпте автодополнение @ поддерживает имена файлов с Unicode, включая эмодзи. Эмодзи в других местах промпта не влияют на путь к файлу, используемый для автодополнения.
3. Команды с восклицательным знаком (!) — Выполнение Shell-команд
Команды с восклицательным знаком позволяют выполнять системные команды непосредственно внутри Qwen Code.
| Формат команды | Описание | Примеры |
|---|---|---|
!<shell command> | Выполнить команду во внутреннем Shell | !ls -la, !git status |
Одиночный ! | Переключить в режим Shell, любой ввод выполняется как Shell-команда | !(ввод) → Ввод команды → !(выход) |
Переменные окружения: При выполнении команд через ! устанавливается переменная окружения QWEN_CODE=1.
4. Пользовательские команды
Сохраняйте часто используемые промпты в виде команд быстрого доступа для повышения эффективности работы и обеспечения согласованности.
Пользовательские команды теперь используют формат Markdown с опциональным YAML frontmatter. Формат TOML устарел, но все еще поддерживается для обратной совместимости. При обнаружении TOML-файлов будет отображаться запрос на автоматическую миграцию.
Краткий обзор
| Функция | Описание | Преимущества | Приоритет | Сценарии применения |
|---|---|---|---|---|
| Пространство имен | Поддиректория создает команды с двоеточием в имени | Лучшая организация команд | ||
| Глобальные команды | ~/.qwen/commands/ | Доступны во всех проектах | Низкий | Личные часто используемые команды, использование между проектами |
| Команды проекта | <project root directory>/.qwen/commands/ | Специфичные для проекта, управляемые системой контроля версий | Высокий | Совместное использование в команде, специфичные для проекта команды |
Правила приоритета: Команды проекта > Пользовательские команды (при совпадении имен используется команда проекта).
Правила именования команд
Таблица сопоставления пути к файлу и имени команды
| Расположение файла | Сгенерированная команда | Пример вызова |
|---|---|---|
~/.qwen/commands/test.md | /test | /test Parameter |
<project>/.qwen/commands/git/commit.md | /git:commit | /git:commit Message |
Правила именования: Разделитель пути (/ или \) преобразуется в двоеточие (:).
Спецификация формата Markdown-файлов (рекомендуется)
Пользовательские команды используют Markdown-файлы с необязательными YAML frontmatter:
---
description: Optional description (displayed in /help)
---
Your prompt content here.
Use {{args}} for parameter injection.| Поле | Обязательность | Описание | Пример |
|---|---|---|---|
description | Необязательно | Описание команды (отображается в /help) | description: Code analysis tool |
| Тело промпта | Обязательно | Содержимое промпта, отправляемое модели | Любой контент в формате Markdown после frontmatter |
Формат TOML (устаревший)
Устарело: формат TOML всё ещё поддерживается, но будет удалён в будущей версии. Пожалуйста, мигрируйте на формат Markdown.
| Поле | Обязательность | Описание | Пример |
|---|---|---|---|
prompt | Обязательно | Содержимое промпта, отправляемое модели | prompt = "Please analyze code: {{args}}" |
description | Необязательно | Описание команды (отображается в /help) | description = "Code analysis tool" |
Механизм обработки параметров
| Метод обработки | Синтаксис | Применимые сценарии | Функции безопасности |
|---|---|---|---|
| Контекстно-зависимое внедрение | {{args}} | Требуется точный контроль параметров | Автоматическое экранирование Shell |
| Обработка параметров по умолчанию | Без специальных меток | Простые команды, добавление параметров | Добавление как есть |
| Внедрение команд Shell | !{command} | Требуется динамический контент | Требуется подтверждение выполнения перед запуском |
1. Контекстное внедрение ({{args}})
| Сценарий | Конфигурация TOML | Метод вызова | Фактический результат |
|---|---|---|---|
| Прямое внедрение | prompt = "Fix: {{args}}" | /fix "Button issue" | Fix: "Button issue" |
| В Shell-команде | prompt = "Search: !{grep {{args}} .}" | /search "hello" | Выполнение grep "hello" . |
2. Обработка параметров по умолчанию
| Ситуация на входе | Метод обработки | Пример |
|---|---|---|
| Есть параметры | Добавляются в конец промпта (разделены двумя переносами строк) | /cmd parameter → Исходный промпт + параметр |
| Нет параметров | Отправка промпта как есть | /cmd → Исходный промпт |
🚀 Внедрение динамического контента
| Тип внедрения | Синтаксис | Порядок обработки | Назначение |
|---|---|---|---|
| Содержимое файла | @{file path} | Обрабатывается первым | Внедрение статических справочных файлов |
| Shell-команды | !{command} | Обрабатывается в середине | Внедрение результатов динамического выполнения |
| Замена параметров | {{args}} | Обрабатывается последним | Внедрение пользовательских параметров |
3. Выполнение Shell-команд (!{...})
| Операция | Взаимодействие с пользователем |
|---|---|
| 1. Разбор команды и параметров | - |
| 2. Автоматическое экранирование Shell | - |
| 3. Показать диалог подтверждения | ✅ Подтверждение пользователя |
| 4. Выполнить команду | - |
| 5. Внедрить вывод в промпт | - |
Пример: Генерация сообщения коммита Git
---
description: Generate Commit message based on staged changes
---
Please generate a Commit message based on the following diff:
```diff
!{git diff --staged}
```4. Внедрение содержимого файлов (@{...})
| Тип файла | Статус поддержки | Метод обработки |
|---|---|---|
| Текстовые файлы | ✅ Полная поддержка | Прямое внедрение содержимого |
| Изображения/PDF | ✅ Поддержка мультимодальности | Кодирование и внедрение |
| Бинарные файлы | ⚠️ Ограниченная поддержка | Могут быть пропущены или усечены |
| Директория | ✅ Рекурсивное внедрение | Следование правилам .gitignore |
Пример: Команда проверки кода
---
description: Code review based on best practices
---
Review {{args}}, reference standards:
@{docs/code-standards.md}Практический пример создания
Таблица шагов создания команды «Рефакторинг чистых функций»
| Операция | Команда/Код |
|---|---|
| 1. Создать структуру директорий | mkdir -p ~/.qwen/commands/refactor |
| 2. Создать файл команды | touch ~/.qwen/commands/refactor/pure.md |
| 3. Отредактировать содержимое команды | См. полный код ниже. |
| 4. Протестировать команду | @file.js → /refactor:pure |
---
description: Refactor code to pure function
---
Please analyze code in current context, refactor to pure function.
Requirements:
1. Provide refactored code
2. Explain key changes and pure function characteristic implementation
3. Maintain function unchangedРезюме лучших практик пользовательских команд
Таблица рекомендаций по проектированию команд
| Практические аспекты | Рекомендуемый подход | Чего избегать |
|---|---|---|
| Именование команд | Используйте пространства имён для организации | Избегайте слишком общих названий |
| Обработка параметров | Явно используйте {{args}} | Полагаться на добавление по умолчанию (легко запутаться) |
| Обработка ошибок | Используйте вывод ошибок Shell | Игнорировать сбои выполнения |
| Организация файлов | Группируйте по функциям в директориях | Все команды в корневой директории |
| Поле описания | Всегда предоставляйте ясное описание | Полагаться на автоматически сгенерированное описание |
Таблица напоминаний о функциях безопасности
| Механизм безопасности | Эффект защиты | Действие пользователя |
|---|---|---|
| Экранирование Shell | Предотвращение инъекций команд | Автоматическая обработка |
| Подтверждение выполнения | Избегайте случайного запуска | Диалог подтверждения |
| Отчет об ошибках | Помощь в диагностике проблем | Просмотр информации об ошибках |
5. Подкоманды CLI
Эти команды выполняются из shell как qwen <subcommand> перед началом интерактивной сессии.
Управление сессиями
| Команда | Описание | Примеры использования |
|---|---|---|
qwen sessions list | Список недавних сессий общения | qwen sessions list, qwen sessions list --json --limit 50 |
qwen sessions ps | Список интерактивных сессий, запущенных в данный момент | qwen sessions ps, qwen sessions ps --json |
qwen sessions controllers | Управление токенами доверенных контроллеров | qwen sessions controllers add --label <name>, qwen sessions controllers list |
qwen sessions list
Выводит список ваших недавних сессий Qwen Code с метаданными.
Флаги:
| Флаг | Тип | По умолчанию | Описание |
|---|---|---|---|
--json | boolean | false | Вывод в формате JSON Lines (один JSON-объект на строку) |
--limit | number | 20 | Максимальное количество отображаемых сессий |
Человекочитаемый вывод (по умолчанию):
Таблица со столбцами: SESSION ID, STARTED (UTC-время), TITLE, BRANCH, PROMPT.
JSON-вывод (--json):
Выводит JSON Lines в stdout. Каждая строка представляет собой JSON-объект с полями:
sessionId, startTime, mtime, prompt, gitBranch, customTitle, titleSource, filePath, cwdПодсказка о наличии дополнительных сессий выводится в stderr, чтобы конвейеризация в jq оставалась безопасной.
Примеры:
# Show last 20 sessions (default)
qwen sessions list
# Show last 50 sessions
qwen sessions list --limit 50
# Output as JSON for scripting
qwen sessions list --json | jq .qwen sessions ps
Списывает записи сессий Qwen Code, видимые на этой машине. sessions list просматривает сохраненные транскрипты («над чем я работал»). Эта команда показывает как реестр живых процессов, так и записи Agent View, помеченные как managed. Записи, оставшиеся после убитой сессии, удаляются из реестра по мере обнаружения. Управляемая запись — это постоянный учет, а не доказательство того, что ее рабочий процесс еще жив. Однократный запуск qwen -p никогда не регистрируется и не отображается.
Флаги:
| Флаг | Тип | По умолчанию | Описание |
|---|---|---|---|
--json | boolean | false | Вывод в формате JSON Lines (один JSON-объект на строку) |
Человекочитаемый вывод (по умолчанию):
Таблица со столбцами: NAME, KIND, PID, AGE, DIRECTORY.
KIND указывает, кто зарегистрировал сессию: tui для человека в терминале, external для программы, которая вообще не является сессией Qwen Code (голосовой интерфейс, ретранслятор), и headless или serve для сессии, управляемой другой программой. Несколько строк serve или headless могут разделять один PID: дочерний процесс qwen --acp размещает все свои сессии в одном процессе — serve когда демон запустил его, headless когда клиент управляет им напрямую — и каждый из них регистрируется отдельно, когда активна обмен сообщениями между пирингами. Хостируемая сессия не регистрируется здесь, если ее собственное окружение переводит ее в режим bare или safe. Переменная --bare демона не передается хостируемым сессиям (QWEN_CODE_SIMPLE удаляется из окружения дочернего процесса); унаследованная переменная QWEN_CODE_SAFE_MODE передается, исключая эти хостируемые сессии из данного списка. Это самоотчет, подобно NAME и DIRECTORY: каждое поле здесь было записано описываемым процессом, и ничто из того, что разрешено делать сессии, не зависит от него. Запись Agent View, помеченная как managed, использует managed для KIND и - для PID и AGE. Она остается отдельной строкой, даже если та же сессия имеет также запись в живом реестре. См. Cross-Session Protocol для формата записи и инструкций по регистрации собственной программы.
JSON-вывод (--json):
Выводит JSON Lines в stdout, сначала управляемые записи. Записи реестра сохраняют свою существующую структуру:
schemaVersion, pid, procStart, pidNs, sessionId, cwd, name, startedAt,
qwenVersion, kind, ipcPath (when peer messaging is available)Управляемая запись содержит только данные, подтвержденные источником:
sessionId, cwd, managed: trueНичего другого не пишется в stdout — пустой список ничего не печатает — поэтому qwen sessions ps --json | jq . безопасно использовать в скриптах. Если хранилище супервизора недоступно для чтения, записи реестра все равно выводятся, а причина ошибки записывается в stderr.
JSON-вывод представляет собой сырые данные: значения полей выдаются точно так, как они были записаны, без санитизации для терминала. Относитесь к ним как к данным и выполняйте санитизацию перед их отображением в терминале.
Примеры:
# Show the other live sessions
qwen sessions ps
# Which directories have a visible session record?
# Note: `jq -r` renders the raw recorded value in your terminal (see the
# raw-data note above); pipe through a sanitizer if the path is untrusted.
qwen sessions ps --json | jq -r .cwd6. Обмен сообщениями с другой запущенной сессией
Две интерактивные сессии на одной машине могут обмениваться сообщениями. Функция включена по умолчанию, но --bare и --safe-mode отключают ее независимо от настройки. При наличии входящего почтового ящика сессия становится обнаруживаемой другими сессиями того же пользователя на машине, и то, что они ей отправляют, проходит через правила проверки ниже, прежде чем ее модель увидит это. Чтобы отключить обнаружение пиров и обмен сообщениями, выключите эту функцию в settings.json и перезапустите:
{ "agents": { "crossSessionMessaging": false } }Интерактивная сессия с отключенным обменом сообщениями между пирами может по-прежнему появляться в qwen sessions ps, но не имеет ipcPath и не является достижимым пиром в list_agents. Интерфейс OpenTUI также не привязывает входящий почтовый ящик для пиров; включение настройки само по себе не делает его способным к обмену сообщениями.
При активной передаче сообщений модель в одной сессии может обнаружить другие с помощью list_agents — каждая отображается под sessions с name, который записывает qwen sessions ps --json (в табличном представлении длинные имена могут сокращаться) — и обратиться к одной из них через send_message, используя это имя как to. Если две сессии имеют одинаковое имя, list_agents показывает каждую с коротким [ref], и при отправке его необходимо указать (name [ref]); голое имя, которое может относиться к обеим, отвергается вместо угадывания. list_agents также сообщает собственное имя сессии под self, а to: "*" по-прежнему означает «мои коллеги по Agent Team» и никогда не достигает других сессий.
Сообщение приходит в другую сессию с пометкой о том, что оно исходит от другой сессии, а не от её пользователя, и не несёт никаких ваших полномочий там: принимающая сессия действует на его основе только в рамках своих настроек разрешений. Её пользователь может выбрать, что происходит с входящими сообщениями, с помощью agents.crossSessionInbound (accept, hold или refuse). Если значение не установлено, сообщение доставляется только тогда, когда обе сессии находятся в одном классе проверки: обе всё ещё проверяют каждое действие (режим по умолчанию или режим плана), или обе находятся в режиме, который применяет некоторые действия без проверки каждого действия (авто-редактирование, авто или yolo). Сообщение от сессии из другого класса или от отправителя, который не указывает свой класс, задерживается для проверки — в обоих направлениях. Сессия, которая проверяет каждое действие, задерживает сообщение от той, которая этого не делает, потому что такое сообщение было написано моделью, за которой никто не следил, а запросы на подтверждение каждого действия защищают действия, а не то, во что убеждают сессию. Задержанные сообщения перечисляются и освобождаются с помощью /peers в принимающей сессии, а сообщение, задержанное только из-за различия в режимах, освобождается автоматически, когда режимы совпадают.
Репозиторий может сделать сессии, открытые в нём, более осторожными, но никогда менее: рабочее пространство .qwen/settings.json может установить agents.crossSessionInbound в hold или refuse, или agents.crossSessionMessaging в false, и это значение имеет приоритет над более мягким значением в ваших пользовательских настройках. Значение рабочего пространства, которое ослабило бы операторскую настройку (accept, или true для переключателя, если пользовательская или системная область установили его в false), игнорируется с предупреждением; значение рабочего пространства true, где ничто другое не установило переключатель, просто повторяет значение по умолчанию и молча отбрасывается. Значение, которое CLI не распознает, задерживает все сообщения, когда оно является действующим. Системные настройки имеют приоритет над всем этим, как и для любой другой настройки.
Задержка не длится вечно. Сообщение, по которому никто не принял решение, истекает после agents.crossSessionHeldExpiry — 1m, 5m, 10m или never, по умолчанию пять минут — и отправляющей сессии сообщается, что решение не было принято. Уменьшение этого параметра применяется к уже ожидающим сообщениям.
Если сессия не может привязать свой почтовый ящик — каталог среды выполнения отсутствует, принадлежит другому пользователю или доступен только для чтения, как это может быть внутри контейнера — она сначала пытается использовать частный каталог под временным каталогом, и только если это тоже не удается, запускается без него. Когда это происходит, сессия сообщает об этом при запуске, а /peers повторяет причину и что нужно изменить (обычно XDG_RUNTIME_DIR или TMPDIR).
Две сессии также могут разрешить один и тот же адрес почтового ящика, поскольку адрес привязан к идентификатору процесса, а идентификаторы процессов повторяются в контейнерах, которые разделяют каталог среды выполнения. Сессия, запускающаяся второй, выбирает соседний адрес вместо перехвата используемого, поэтому ни одна не становится недоступной. На пиров это не влияет: они считывают адрес сессии из реестра сессий, а не вычисляют его.
Вызов send_message только подтверждает, что сообщение было передано другой сессии. Что с ним стало, приходит позже в виде квитанции: если оно было задержано, отклонено, отвергнуто, сброшено, истекло или адресовано неверно (адрес сменился — снова перечислите агентов) — или освобождено после задержки — уведомление появляется в транскрипте отправляющей сессии (Message to <name>: …). Отклонено, отвергнуто и сброшено — это три разных ответа: отклонено означает, что кто-то проверил сообщение и сказал «нет», отвергнуто означает, что agents.crossSessionInbound этой сессии равно refuse и никто его вообще не видел, а сброшено означает, что его почтовый ящик отверг сообщение до всего этого (см. ниже). Первый сброс обрабатывается немедленно, а остальные сворачиваются в квитанцию каждые несколько секунд, каждая из которых называет представляемые ею сообщения, так что серия таких событий стоит несколько строк, а не по одной строке на каждое. Модель, которая отправила его, не получает уведомления; если другая сессия ответит, ответ придет как межсессионное сообщение.
Защита от переполнения
Сессия принимает до 30 сообщений сразу от одного отправителя, а затем по одному каждые две секунды, и до 32 сообщений сразу от всех отправителей вместе, а затем по одному в секунду. Второй лимит существует потому, что отправитель называет себя сам: ротация этого имени получает новый лимит из первого ограничения, но не из второго. Он едва превышает первый, потому что каждое принятое сообщение требует квитанции, а сессия может одновременно отправлять только ограниченное количество таких квитанций. Сообщение из другой сессии, которое дословно повторяет предыдущее сообщение того же отправителя в течение 30 секунд, также отклоняется — модель, зацикленная на одной фразе, каждый раз генерирует новый идентификатор сообщения, поэтому именно текст позволяет это обнаружить. Сообщения от скрипта, запущенного сессией, и от доверенного контроллера освобождены от проверки повторов, поскольку хук, дважды сообщающий одну и ту же строку, сообщает два факта, а человек, дважды говорящий «продолжить», действительно имеет это в виду; оба типа все еще подчиняются ограничениям частоты. Наконец, сообщение, которое принято, но не может быть поставлено в очередь, так как в сессии уже есть 50 ожидающих сообщений, также отклоняется.
Отклоненное таким образом сообщение никогда не сохраняется, не показывается модели и не оставляет записи, поэтому отправитель может попробовать снова позже и успешно доставить его. Принимающая сессия сообщает об этом в своем журнале не чаще одного раза в минуту для каждого отправителя, с указанием количества пропущенных строк. Отправляющая сессия получает одну квитанцию, перечисляющую все сообщения, которые были потеряны из-за превышения лимита, и ее журнал рекомендует объединить важные данные в одно последующее сообщение вместо повторной отправки.
Отправляющая сторона не ждет ответа. Каждая сессия отслеживает то, что она отправила на каждый адрес, и отказывает в отправке, которую получатель отбросил бы, поэтому модели рекомендуется пакетировать сообщения до их записи, а не после — и получатель никогда не тратит соединение на сообщение, которое он собирался отклонить.
Аутентификация входящих сообщений и скриптовая инъекция
Входящий ящик каждой сессии требует отдельный токен для сессии: соединение должно представить его в первой строке перед чтением любого сообщения, и сессии автоматически обмениваются токенами через те же записи реестра, с помощью которых они обнаруживают друг друга. Сессии из сборки без поддержки токенов могут получать сообщения от более новой версии, но их исходящие сообщения будут отброшены.
Сессия экспортирует свой адрес входящего ящика и токен в дочерние процессы как QWEN_CODE_MESSAGING_SOCKET и QWEN_CODE_MESSAGING_TOKEN, чтобы скрипт или хук, запускаемый сессией, мог отправить сообщение обратно в нее. Это второй, дочерний токен, который нигде не публикуется: только процессы, запущенные сессией, могут его иметь, поэтому сообщение, прибывшее с ним, распознается как собственное сообщение сессии, а не как сообщение другой сессии.
{ printf '%s\n' \
'{"msgV":1,"type":"auth","token":"'"$QWEN_CODE_MESSAGING_TOKEN"'"}' \
'{"msgV":1,"msgId":"'"$(uuidgen)"'","type":"user","priority":"next","message":{"role":"user","content":"build finished"}}'; \
} | socat - UNIX-CONNECT:"$QWEN_CODE_MESSAGING_SOCKET"Присваивайте каждому внедрению новый msgId. Входящий шлюз запоминает идентификаторы, которые он уже обработал, поэтому хук, повторно использующий один и тот же идентификатор, будет доставлен при первом запуске и молча дедуплицирован при всех последующих запусках. Повторение одного и того же текста допустимо — проверка повторов выше не применяется к процессам самой сессии — но ограничения частоты применяются, поэтому хук в цикле будет отброшен, как любой другой поток сообщений.
Внедренное сообщение все равно проходит через входящий шлюз и помечается как не исходящее от пользователя, но шлюз знает, что оно поступило от собственного процесса сессии: при значении по умолчанию «режим паритета» оно доставляется без проверки (равный участник в той же позиции был бы задержан), тогда как явный agents.crossSessionInbound со значением hold или refuse применяется к нему так же, как и к любому другому сообщению. Модель видит его как <cross_session_message from="own process" origin="own-process"> с уведомлением о том, что оно поступило от скрипта или хука, запущенного сессией, а не от пользователя.
Доверенные контроллеры
Приведенное выше правило задерживает сообщение от любого отправителя, который не указывает класс проверки, а программа, не являющаяся сессией Qwen Code, не имеет такого указания. Это правильный вариант по умолчанию для неизвестного источника, но не для выбранной вами программы: голосовой интерфейс, мост диктовки или демон автоматизации, передающий ваши собственные инструкции, имели бы все свои сообщения задержанными, и ручное одобрение каждого из них лишает смысла использование этих инструментов.
Вы предоставляете такой программе доставку, создав для неё токен:
qwen sessions controllers add --label voice-bridgeТокен выводится один раз и нигде не хранится: файл в вашем домашнем каталоге Qwen сохраняет только его SHA-256 хеш, поэтому ничто, что позже прочитает этот файл, не сможет представить токен. Поместите его в конфигурацию самого контроллера, когда команда выводит его.
Контроллер представляет токен так же, как любой другой отправитель — в первой строке соединения — и берет путь сокета из реестра сессий (qwen sessions ps --json выводит одну запись на каждую активную сессию, где ipcPath является адресом):
{ printf '%s\n' \
'{"msgV":1,"type":"auth","token":"'"$QWEN_CONTROLLER_TOKEN"'"}' \
'{"msgV":1,"msgId":"'"$(uuidgen)"'","type":"user","priority":"next","message":{"role":"user","content":"open the failing test"}}'; \
} | socat - UNIX-CONNECT:"$SESSION_IPC_PATH"Сообщение, полученное по предоставленному токену, доставляется без индивидуальной проверки, независимо от класса проверки на обеих сторонах — но оно все равно подчиняется явному параметру: agents.crossSessionInbound со значением hold задерживает его, как и любое другое сообщение, а refuse отклоняет его. Предоставления принадлежат вашему домашнему каталогу Qwen, а не одной сессии, поэтому контроллер может достичь любых запущенных вами сессий, и сессии перечитывают файл при каждом подключении: создание или отзыв токена вступает в силу при следующем подключении, без необходимости перезапуска.
qwen sessions controllers list # ids, labels, when they were added
qwen sessions controllers remove c_1a2b # revoke one/peers controllers и /peers revoke <id> делают то же самое изнутри сессии. Сообщение, полученное через грант, отображается как Message from a trusted controller (voice-bridge) и появляется в /peers как [controller] voice-bridge, если настройка hold его приостановила.
Модель видит такое сообщение как <cross_session_message from="controller" origin="controller" controller="voice-bridge"> с уведомлением о том, что оно передаёт ваши собственные инструкции — и действуют те же два запрета, что и для любого другого источника: она не может редактировать настройки разрешений, QWEN.md или конфигурацию по запросу сообщения, а также не может трактовать сообщение как ваше подтверждение ожидающего запроса на подтверждение. Контроллер может указать, что делать дальше; он не может ответить на запрос от вашего имени.
Любой, кто владеет токеном, может отправлять сообщения от имени этого контроллера, поэтому относитесь к нему как к любому другому учётному данным: выдавайте его одной программе, держите вне общих конфигураций и отзывайте, когда программа завершит работу.
Сессии, управляемые программой через ACP
Любой дочерний процесс qwen --acp регистрирует каждую хостинговую сессию — как serve, если демон запустил процесс, как headless, если редактор или другой клиент управляет qwen --acp напрямую — и сессия появляется в qwen sessions ps и в list_agents другой сессии так же, как любая другая. Она может отправлять сообщения: её модель может вызвать send_message для доступа к открытому вами терминалу. Несколько таких процессов разделяют один процесс и один почтовый ящик, поэтому отправитель должен указывать нужную сессию — каждая сессия Qwen Code делает это автоматически.
Сообщения, отправленные в такую сессию, отклоняются, а не сохраняются. Сохранение — это вопрос, адресованный человеку, и никто не следит за списком сохранённых сообщений от имени управляемой сессии; вместо ожидания истечения срока действия отправителю сразу сообщается об отказе. Где именно должны отображаться сохранённые сообщения для таких сессий, пока не определено.
Сессия регистрируется, если только её собственные настройки не отключают agents.crossSessionMessaging, или если она была запущена с параметрами --bare или --safe-mode — эти параметры отключают обмен сообщениями независимо от настроек. При отключении сессия остаётся невидимой, потому что единственная причина перечислять сессию, в которую нельзя отправить сообщение, — это реклама адреса, который никогда не отвечает.
Программы, которые не являются сессиями Qwen Code
Всё вышеперечисленное работает между сессиями, но ничего из этого не специфично только для них. Программа, которая сама создаёт запись в реестре и привязывает почтовый ящик аналогичным образом, отображается в qwen sessions ps и list_agents, может быть вызвана по имени из send_message и получает квитанции о доставке для отправленных сообщений — например, голосовой интерфейс, ретранслятор или наблюдатель за сборкой. Ей следует записывать kind: "external", чтобы список мог показать, что это за программа.
Протокол межсессионного взаимодействия является контрактом для написания такой программы: схема записи и критерии оценки активности, пути сокетов и форматирование кадров, строка авторизации, все поля кадра, состояния квитанций и их переходы, а также действия получателя с сообщением до того, как его увидит модель.
Программе на Node.js не нужно писать всё это вручную: @qwen-code/sdk/peer реализует контракт. PeerEndpoint.start({ name }) публикует запись и привязывает почтовый ящик, list() и send() обращаются к сессиям по имени, а onMessage принимает отправленные ими сообщения.