← Все статьи

Почему мы выбросили режим кодирования: пусть модель сама выбирает инструменты

Раньше Agent! пытался угадать, чего вы хотите — программирования или автоматизации, — и скрывал инструменты под эту догадку. Одна сломанная задача с Photo Booth показала, почему обвязке пора перестать додумывать за модель.

В ранних версиях Agent! были режимы: кодирование, автоматизация и стандартный. Идея казалась разумной. Задаче по программированию не нужен инструмент Accessibility, а задаче «нажми эту кнопку» не нужен Xcode. Спрячьте всё лишнее — и модель увидит более короткий список инструментов, потратит меньше токенов и реже будет ошибаться с выбором.

7 апреля 2026 года коммит 7ea44c0d удалил всю эту систему целиком. Вот баг, который к этому привёл, и принцип, который после него остался.

Как работали режимы

На втором ходе задачи обвязка смотрела на ваш запрос и сверяла его с двумя списками ключевых слов. Слова вроде build, compile, edit, fix и refactor означали кодирование. Слова вроде click, button, window, photo и accessibility — автоматизацию. Затем она переключала флаг, codingModeEnabled или automationModeEnabled, и сужала набор видимых модели инструментов до групп этого режима. Модель могла и сама переключать режимы через инструмент mode.

Баг: Photo Booth в режиме кодирования

Жалоба звучала просто: «accessibility сломан». Причина, словами самого сообщения коммита: автопереключатель воспринял open -a Photo Booth как неизвестный сигнал и по умолчанию включил режим кодирования. Режим кодирования исключал группу Auto, а именно в группе Auto живёт инструмент accessibility.

В итоге модель попросили сделать фото, а единственный инструмент, созданный для нажатия кнопки спуска, исчез прямо посреди задачи. Модель поступила так, как поступает любая толковая модель с оставшимися инструментами: откатилась к osascript через шелл, который раз за разом падал с ошибкой «Can't get toolbar 1 of window 1.»

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

Исправление, которое не стало исправлением

Очевидная заплатка — добавить open -a в ключевые слова автоматизации. Сообщение коммита прямо говорит об этом: это был бы «ещё один пластырь в длинной череде». Определение намерения по ключевым словам — заведомо проигрышная игра. Каждое новое приложение, каждая формулировка и каждый язык добавляют новую дыру, а каждый промах проявляется самым запутанным образом: модель вдруг не может сделать то, что умела ходом раньше.

Что пришло на замену: ничего

Вся система режимов была удалена: 13 файлов, 141 строка удалена и 39 добавлено. В том числе:

  • флаги codingModeEnabled и automationModeEnabled и их списки групп инструментов
  • автопереключение на втором ходе как в основном цикле задач, так и в задачах вкладок
  • predictToolGroups() — функция, угадывавшая группы инструментов по вашему промпту
  • сужение списка инструментов для локальных эндпоинтов в сервисах Claude и OpenAI-совместимых сервисах
  • алиасы coding и automation для субагентов (вместо них передаются настоящие имена групп)

Теперь инструменты фильтруются только вашими собственными переключателями в настройках (ToolPreferencesService). Каждый включённый вами инструмент доступен на каждом ходе, а модель сама выбирает то, что ей нужно.

Две мелкие детали показывают, насколько аккуратно было проведено это удаление. Инструмент mode не убрали полностью. Он превратился в заглушку, которая отвечает «mode switching has been removed», ведь модель со старым диалогом в контексте всё ещё может его вызвать, а понятный ответ лучше ошибки о неизвестном инструменте. Кроме того, ревизия системного промпта выросла с 71 до 72, чтобы любой сохранённый на диске промпт с упоминанием режимов был заново синхронизирован.

Результат

Больше никакого спама «Coding mode auto-enabled» в логах. Больше никаких исчезающих посреди задачи инструментов. Больше никакого скачущего от хода к ходу списка инструментов.

Принцип

Это решение во многом определило всё, что было дальше, поэтому стоит сформулировать его прямо:

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

Agent! строг там, где строгость объективна. Он отказывается выполнять катастрофические команды шелла, править файлы, которые модель не прочитала, и завершать задачу через «done» без доказательств. Всё это — факты, которые можно проверить. А какой инструмент нужен задаче — вопрос суждения, и модель справляется с ним лучше, чем список ключевых слов. Когда обвязка перекрывает модель в вопросе суждения, она ломается тихо и непонятно. Когда она применяет проверяемое правило, она ломается громко и с понятной причиной.

Если вы создаёте агента, велик соблазн «помочь» модели, урезав ей выбор. Сначала измерьте. Чуть более длинный список инструментов стоит нескольких токенов. Отсутствующий инструмент может стоить вам всей задачи.