Мой оркестратор агентов сжигал по 1–2 миллиона токенов Opus на каждую задачу.

Почему стоимость взлетела

Оркестратор был разработан для Claude Code и использовал иерархию субагентов. Каждый субагент наследовал настройки родителя, запускал собственный промпт и возвращал результат в цикл до тех пор, пока рецензент не объявлял результат «чистым». Инструмент выполнял задачи, но цена была астрономической.

Три скрытых «налога» увеличивали количество токенов:

  • Налог на модель — субагенты никогда не указывали конкретную модель, поэтому по умолчанию использовался Opus, самый дорогой уровень. Крошечная операция, которая вполне подошла бы для более дешевой модели (Haiku или Sonnet), тарифицировалась по ставкам Opus.
  • Налог на кэш — кэширование промптов работает только при точном побайтовом совпадении. Поскольку каждый субагент добавлял свои инструкции, каждый вызов приводил к записи в «холодный» кэш. Кэш родителя нельзя было использовать повторно, что сводило на нет экономию, которую обычно обеспечивает общий кэш.
  • Налог на цикл — правило «цикл до чистоты» поддерживало процесс, пока рецензент находил хоть малейший изъян. Без жесткого ограничения цикл продолжался до тех пор, пока модель не останавливалась сама.

В совокупности эти множители превратили несколько строк кода в лавину токенов.

Почему правило бюджета в промпте не сработало

Первоначальная архитектура пыталась ограничить расходы, встроив правило бюджета прямо в системный промпт. В теории, указание модели «не превышать X токенов» должно было ограничить использование. На практике правило, основанное на промпте, является лишь предпочтением. По мере роста сессии модель сжимает контекст и может полностью проигнорировать или отбросить эти инструкции. Результат: модель вела себя так, будто этого правила никогда не существовало.

Перенос контроля из промпта в код

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

  1. Явный выбор модели — теперь каждый вызов субагента требует конкретного выбора модели (Haiku, Sonnet или Opus). Неявное наследование упразднено, поэтому дешевые задачи остаются дешевыми.
  2. Жесткие ограничения через хук PreToolUse — перед запуском любого инструмента хук проверяет:
    • Количество уже выполненных вызовов в сессии.
    • Соответствует ли выбранная модель минимальному уровню (предотвращение случайного использования Opus).
    • Максимальное количество итераций цикла, после которого процесс прерывается.

Если срабатывает любое ограничение, код прерывает работу субагента; у языковой модели нет возможности «уговорить» систему продолжить.

Что это значит для разработчиков

Любая система, накладывающая ограничения на расходы, политики безопасности или лимиты на деструктивные команды, должна рассматривать эти ограничения как код, а не как разговорные инструкции. Промпт может быть перезаписан, проигнорирован или потерян при внутреннем сжатии модели. Код же выполняется детерминированно и поддается аудиту.