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

Автоматический режим

Автоматический режим использует LLM-классификатор для оценки каждого вызова инструмента и принятия решения об автоматическом одобрении. Он находится между Auto-Edit (который автоматически одобряет только правки файлов) и YOLO (который автоматически одобряет всё).

Эта страница — справочная информация по настройке и устранению неполадок автоматического режима. Вводная информация приведена в разделе Обзор режимов одобрения.

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

Когда вы находитесь в автоматическом режиме и агент пытается выполнить инструмент, Qwen Code последовательно проходит три уровня:

  1. acceptEdits fast-path — Правки/Записи, целевой путь которых находится внутри рабочей области, автоматически одобряются без вызова классификатора. Исключение: записи в собственные поверхности самомодификации Qwen Code (.qwen/settings*.json, QWEN.md, AGENTS.md, QWEN.local.md, настроенные имена контекстных файлов, .qwen/rules/, .qwen/commands/, .qwen/agents/, .qwen/skills/, .qwen/hooks/, .mcp.json) и поверхности персистентности (.git/, .husky/, package.json, .npmrc, Makefile, .github/workflows/ и т.д.) проходят через классификатор, даже если они находятся внутри рабочей области. Симлинки, указывающие на защищённые пути, также разрешаются и отклоняются. Команды shell, которые достигают этих путей через cd && bash -lc '...' или другие обёртки, также проходят через классификатор.
  2. Белый список безопасных инструментов — Инструменты, работающие только на чтение и метаданные (Read, Grep, Glob, LS, LSP, TodoWrite, AskUserQuestion и т.д.) автоматически одобряются без вызова классификатора.
  3. LLM-классификатор — Всё остальное (команды shell, веб-запросы, запуски под-агентов, правки вне рабочей области, MCP-инструменты) отправляется в двухэтапный классификатор:
    • Этап 1 (быстрый) — выводит только { shouldBlock }. Около ~300 мс. Если shouldBlock равен false, действие разрешается, и вызов продолжается.
    • Этап 2 (рассуждающий) — запускается только если Этап 1 сказал блокировать. Использует обзор по цепочке рассуждений для уменьшения ложноположительных срабатываний Этапа 1. Может понизить блокировку Этапа 1 до разрешения. Выводит видимую пользователю reason при блокировке.

Классификатор использует вашу настроенную быструю модель (/model --fast). Если быстрая модель не настроена, используется основная модель сессии.

Жёсткие правила всё ещё в силе

Автоматический режим не заменяет жёсткие правила разрешений. До запуска классификатора:

  • Правила permissions.deny блокируют действие с указанием причины правила. Классификатор его никогда не видит.
  • Правила permissions.allow с конкретными спецификаторами (например, Bash(git status), Read(./docs/**)) по-прежнему автоматически разрешаются без классификатора — за исключением случаев, когда вызов приводит к записи в защищённый путь самомодификации или персистентности (см. список в разделе «Как это работает»). В этом случае автоматический режим повторно проверяет вызов через классификатор, чтобы правило allow на Bash(*) не превратилось молча в разрешение перезаписывать настройки Qwen Code, команды, хуки, навыки или MCP-серверы.
  • Правила permissions.ask принудительно требуют ручного подтверждения даже в автоматическом режиме.

Излишне широкие правила allow отключаются в автоматическом режиме

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

  • Bash / Bash(*) / Bash() — автоматическое разрешение любой команды shell
  • Bash(python:*), Bash(node*), Bash(bash*) — подстановочные знаки для интерпретаторов
  • Agent / Agent(coder) — любое разрешение для инструмента Agent
  • Skill / Skill(pdf) — любое разрешение для инструмента Skill

Когда вы входите в автоматический режим, Qwen Code временно удаляет эти правила из активного набора разрешений и выводит уведомление с их списком. Правила возвращаются в момент выхода из автоматического режима. settings.json никогда не изменяется.

Если вам действительно нужны такие широкие правила, используйте режим YOLO.

Настройка подсказок

Автоматический режим считывает permissions.autoMode из вашего settings.json. Записи представляют собой описания на естественном языке, а не шаблоны правил — они аддитивно добавляются в системный промпт классификатора вместе со встроенными значениями по умолчанию.

Существует три категории подсказок плюс список окружения:

  • allow — действия, которые классификатор должен автоматически одобрять.
  • softDeny — разрушительные или необратимые действия, которые классификатор должен блокировать, если только самый последний явный запрос пользователя не требовал именно этого действия и области действия. Мягкие запреты могут быть отменены намерением пользователя; общее «да, делай что хочешь» не считается.
  • hardDeny — действия на границе безопасности, которые классификатор должен блокировать в автоматическом режиме независимо от autoMode.hints.allow или недавнего намерения пользователя. Это политика классификатора, а не детерминированное правило разрешений: она не переопределяет permissions.allow. Используйте permissions.deny для действий, которые никогда не должны разрешаться менеджером разрешений.
{ "permissions": { "autoMode": { "hints": { "allow": [ "Running poetry install and poetry update in this Python project", "Cleaning build artifacts under ./dist or ./build", "Reading any file under /Users/me/code/" ], "softDeny": [ "Editing Qwen Code settings unless I explicitly ask for the exact change", "Running migration scripts that touch the production DB" ], "hardDeny": [ "Sending secrets or .env contents to any network endpoint", "Modifying anything under ~/.ssh or ~/.aws" ] }, "environment": [ "This is a private monorepo with strict commit signing", "Production credentials live in 1Password, never in plain files" ] } } }

hints.deny по-прежнему принимается для обратной совместимости и обрабатывается как softDeny. Смешивать оба можно — записи объединяются, сначала softDeny.

Ограничения длины и количества записей

Чтобы системный промпт классификатора оставался компактным:

  • Каждая запись ограничена 200 символами (более длинные записи обрезаются с предупреждением).
  • hints.allow, hints.softDeny и hints.hardDeny принимают до 50 записей каждая.
  • environment принимает до 20 записей.

Наслоение между файлами настроек

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

Чтение решения

Когда классификатор блокирует действие, вызов инструмента завершается ошибкой с одним из следующих сообщений:

  • Blocked by auto mode policy: <причина> — классификатор счёл действие небезопасным. Причина поступает из этапа 2 классификатора.
  • Auto mode classifier unavailable; action blocked for safety — API классификатора был недоступен, истекло время ожидания или вернул неразбираемый ответ. Это поведение fail-closed: при сомнениях блокировать.

Оба сообщения сопровождаются вспомогательной строкой, указывающей агенту, что конкретно запрещённое действие не должно выполняться через другой инструмент, косвенный вызов shell, сгенерированный скрипт, псевдоним, символическую ссылку, изменение конфигурации, хук, файл команд, конфигурацию MCP, закодированный payload или эквивалентный путь. Не связанные с этим безопасные действия и действительно более безопасные альтернативы по-прежнему разрешены — блокируются только попытки достичь того же запрещённого намерения через другую поверхность.

Если запрещённое действие действительно необходимо, агент должен остановиться и запросить у вас явное одобрение, а не пытаться обойти запрет.

Язык причины классификатора

Причины классификатора формируются LLM и не переводятся. Если вы хотите получать причины не на английском, добавьте подсказку вроде Указывай причины на русском в permissions.autoMode.environment.

Откат к ручному одобрению

Автоматический режим защищает вас от застревания:

  • После 3 последовательных блокировок политикой следующий вызов инструмента возвращается к стандартному запросу ручного одобрения. Это ловит случай, когда агент постоянно пытается использовать незначительные варианты запрещённой команды.
  • После 2 последовательных результатов “недоступен” (сбоев API классификатора) следующий вызов инструмента также откатывается. Это позволяет не ждать неработающий классификатор.

Сессия при этом остаётся в автоматическом режиме — только единственный откатный вызов проходит через ручное одобрение. Счётчики сбрасываются, когда вы одобряете откатный вызов или переключаете режимы.

Если вы постоянно сталкиваетесь с откатом, наиболее вероятные причины — сбой API классификатора или подсказки, требующие настройки. Переключитесь в обычный режим, пока разбираетесь.

Устранение неполадок

«Автоматический режим постоянно блокирует мои команды»

Посмотрите на причину в сообщении об ошибке. Если классификатор слишком консервативен для вашего контекста, добавьте запись в permissions.autoMode.hints.allow, описывающую шаблон на естественном языке. Примеры:

  • "Сборка Docker-образов для этого проекта (docker build ...)"
  • “Выполнение миграций базы данных в локальной тестовой БД”

«Классификатор автоматического режима недоступен»

API классификатора не ответил. Возможные причины:

  • Проблемы сети между вами и конечной точкой модели.
  • Настроенная быстрая модель больше не доступна — проверьте /model --fast.
  • Журнал слишком длинный и превышает окно контекста быстрой модели.

На время диагностики переключитесь обратно в обычный режим: /approval-mode default.

«Откат к ручному одобрению»

Вы достигли либо ограничителя в 3 последовательные блокировки, либо в 2 последовательные недоступности. Одобрите или отклоните запрос как обычно. После одного одобренного отката счётчик последовательных сбоев сбрасывается.

Классификатор видит конфиденциальные данные в моих подсказках

Входные данные инструментов проецируются через метод toAutoClassifierInput каждого инструмента, прежде чем попасть к классификатору. Длинное содержимое редактирования, подсказки веб-запроса и подсказки вспомогательных агентов усекаются. Результаты работы инструментов (содержимое файлов, веб-страницы) никогда не отправляются классификатору — проходят только текст пользователя и вызовы инструментов ассистента.

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

Ограничения

  • Не работает в офлайне. Классификатор требует вызова LLM.
  • Добавляет задержку на медленном пути. Белый список + acceptEdits покрывают большинство вызовов без задержки, но run_shell_command обычно добавляет ~300 мс (быстрый путь классификатора) или ~3-5 с (медленный путь с проверкой рассуждений).
  • Не заменяет правила deny. Классификатор действует по принципу best-effort. Для команд, которые, как вы уверены, никогда не должны выполняться, поместите их в permissions.deny.
  • Инструменты MCP по умолчанию блокируются консервативно. Сторонние инструменты MCP (mcp__*) подключают пересылку аргументов через переопределение toAutoClassifierInput. Инструменты, которые этого не сделали, передают классификатору только своё имя — большинство таких вызовов консервативно блокируются, если вы не написали явное правило allow. Это fail-closed по дизайну (учётные данные и объёмный контент не просачиваются в LLM классификатора). Если вы доверяете конкретному инструменту MCP, добавьте permissions.allow: ["mcp__сервер__инструмент"], чтобы он полностью обходил классификатор.

Часто задаваемые вопросы

Отправляет ли Auto Mode мой код третьей стороне?

Auto Mode использует вашу существующую конфигурацию модели — тот же эндпоинт, что и основной агент. Если вы настроили Qwen Code на использование самостоятельно размещённой модели, классификатор также обращается к этому эндпоинту.

Попадают ли мои секреты / содержимое .env в классификатор?

Классификатор видит только то, что возвращает проекция toAutoClassifierInput каждого инструмента:

  • read_file и другие инструменты только для чтения: не вызываются (они находятся в белом списке быстрого пути).
  • edit / write_file: путь к файлу и первые 80 символов старого/нового содержимого. Полное содержимое не передаётся.
  • run_shell_command: полная команда (иначе нельзя — именно её оценивает классификатор).
  • web_fetch: только URL. Поле prompt не передаётся.
  • agent: тип подагента и полный prompt. Prompt — это инструкция, которой будет следовать подагент, поэтому классификатору нужен он полностью, чтобы обнаружить атаки, направляющие подагента на деструктивные действия — по той же причине run_shell_command передаёт полную команду.

Результаты инструментов (фактическое содержимое, возвращаемое инструментами) полностью удаляются из транскрипта классификатора.

Инструменты MCP (mcp__*) следуют более строгим правилам по умолчанию: их параметры не передаются, если автор инструмента MCP явно не согласился на это через переопределение toAutoClassifierInput. Классификатор видит имя инструмента, но не аргументы, поэтому большинство вызовов MCP будут консервативно заблокированы, если пользователь не написал явное правило разрешения. Это сделано по принципу «закрыто по умолчанию» — сторонние инструменты не должны без намерения пропускать учётные данные или объёмное содержимое файлов в LLM классификатора.

Можно ли отключить информационное сообщение, появляющееся в первый раз?

Оно показывается только один раз на файл пользовательских настроек. После закрытия в пользовательских настройках устанавливается ui.autoModeAcknowledged: true.

Чем это отличается от Auto-Edit?

Auto-Edit автоматически одобряет только изменения файлов — команды оболочки всё равно запрашивают подтверждение. Auto Mode использует классификатор, чтобы также автоматически одобрять безопасные команды оболочки и другие вызовы инструментов, но при этом блокировать рискованные.

Чем это отличается от YOLO?

YOLO автоматически одобряет всё без какой-либо проверки. Auto Mode включает классификатор в процесс и блокирует рискованные действия.

Last updated on