← Блог

Как снизить затраты на токены агента в рабочих процессах CLI

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

By Dora 9 min read
Как снизить затраты на токены агента в рабочих процессах CLI

Меня зовут Дора. В прошлом месяце я запустила один тест через Claude Code и наблюдала, как сессия сожгла около 12 000 входных токенов, прежде чем агент вообще произнёс хоть слово. В выводе теста было 400 строк. Возможно, 30 из них имели значение. Остальное — предупреждения об устаревании, шум зависимостей, точки прогресса Jest — всё это пошло прямо в контекст модели. Я заплатила за каждый байт.

Именно тогда я перестала относиться к токенам как к «чему-то, с чем разберётся модель», и начала воспринимать их как бюджет, который я активно расходую впустую. Если вы запускаете агентные CLI-рабочие процессы в Claude Code, Gemini CLI или чём-то подобном, это, вероятно, ваша самая крупная статья расходов — и решение не в более умной модели, а в лучшей гигиене. В собственной документации Anthropic по управлению затратами об этом говорится прямо: стоимость токенов растёт вместе с размером контекста, и большинство оптимизаций происходит до того, как модель вообще увидит данные. Эта статья о том, как снизить затраты на токены агента в CLI-рабочих процессах, не теряя отладочного сигнала, который вам нужен.

Где CLI-рабочие процессы теряют токены

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

Подробный вывод команд и нерелевантная информация

Терминальные команды создавались для людей, скользящих взглядом по экрану, а не для LLM, читающих байт за байтом. git status печатает ANSI-коды, которые модели не нужны. npm install выдаёт тысячу строк дерева зависимостей, о котором модель уже знает. next build эхом отражает собственный прогресс в течение пятнадцати секунд. Ничто из этого не оправдывает своё место в окне контекста.

Цифры хуже, чем кажутся на бумаге. Один запуск cargo test в среднем Rust-проекте может производить 8 000–15 000 токенов вывода. Большая часть — это шум компиляции. Когда агент читает всё это, чтобы найти один провалившийся тест, вы платите по тарифам Opus за привилегию потоковой передачи лога сборки.

Именно поэтому существуют такие проекты сообщества, как rtk и tokf — они стоят между оболочкой и агентом, фильтруют шаблонный вывод до того, как он попадёт в контекст, и сообщают об экономии в диапазоне 70–90% на распространённых командах. Используете ли вы обёртку или нет, принцип остаётся: необработанный вывод терминала — это не данные, готовые для LLM.

Перенос контекста и повторное чтение

Второй источник утечки более тонкий. Каждый вызов инструмента агента — чтение файла, grep, bash-команда — остаётся в истории разговора. К десятому ходу модель заново обрабатывает девять ходов устаревших выводов при каждом запросе. В собственном разборе полётов Anthropic за апрель по проблемам качества Claude Code описывается именно эта динамика: ошибка кэширования приводила к накоплению истории мышления между ходами, и использование токенов увеличивалось в 10–20 раз, прежде чем кто-то замечал. Даже без ошибок — это поведение по умолчанию. Длинные сессии — дорогие сессии.

Я проверила одну из своих недельных сессий. Агент читал один и тот же package.json четыре раза. Ни одно из этих повторных чтений не добавляло информации — файл не изменился. Это были просто артефакты того, что агент не знал, что он уже знает.

Шаг 1: Сжимайте шумный вывод

Самое дешёвое исправление, с большим отрывом, — не допускать попадания мусора в контекст с самого начала. Три правила, в таком порядке:

Фильтруйте у источника, а не после. Вместо npm test агент запускает npm test --silent 2>&1 | grep -E "(FAIL|PASS|Error)". Вместо git statusgit status --short. Вместо cargo buildcargo build --quiet 2>&1 | tail -20. Ничего умного в этом нет. Это просто дисциплина. Агент получает провалившийся тест, изменённые файлы, реальную ошибку — и ничего больше.

Ограничьте вывод инструментов на уровне обвязки. Claude Code позволяет установить максимальный размер вывода инструмента. Я снизила его до 8 000 символов на вызов. Когда команда превышает это, агент получает уведомление об усечении и решает, уточнять ли запрос. Эта одна настройка сэкономила мне больше токенов, чем все остальные изменения вместе взятые.

Используйте CLI-прокси, когда инструмент не хочет замолчать. У некоторых команд нет стоящего флага тихого режима — next build, webpack, всё что угодно на Java. Для них обёртка, удаляющая известный шаблонный вывод, стоит затраченного времени на настройку. Инструменты семейства rtk/tokf справляются с этим в общем виде; можно также написать 30-строчную bash-функцию для трёх команд, которые беспокоят вас больше всего.

Здесь есть реальный компромисс. Агрессивное сжатие может скрывать отладочный сигнал. Когда сборка завершается неудачей по причине, которую фильтр убирает — предупреждение об устаревании, превратившееся в ошибку, непонятная проблема конфигурации, спрятанная в строке 847 — агент получает более короткую и менее полезную картину. Такое случалось у меня дважды. В обоих случаях решением было ослабление одного правила фильтрации, а не отказ от стратегии.

Шаг 2: Ограничивайте контекст до того, как он попадёт в модель

Фильтрация вывода обрабатывает новые токены, поступающие при каждом ходе. Дисциплина контекста обрабатывает накопленные токены, уже находящиеся внутри сессии. Это разные проблемы.

Две команды, которые имеют значение — обе прямо из руководства по лучшим практикам Claude Code от Anthropic — это /clear и /compact. /clear полностью сбрасывает сессию — полезно при переключении на несвязанную задачу. /compact суммирует раннюю историю, сохраняя ключевые решения и текущее состояние — полезно, когда задача продолжается, но ранние исследования уже не несут нагрузки. Claude Code автоматически сжимает контекст при приближении к его лимитам, но ждать этого триггера обычно слишком поздно. К тому времени вы уже заплатили завышенную ставку за несколько ходов.

Моя текущая привычка: я запускаю /compact на каждом естественном рубеже задачи с инструкцией вроде /compact Focus on the failing test and the recent file edits. Инструкция важна. Без неё сжатие суммирует всё примерно в равной мере. С ней агент сохраняет части, которые важны для следующей фазы.

Для агентов на основе API (не подписка на CLI) в документации Anthropic по редактированию контекста описывается более строгий механизм: clear_tool_uses_20250919 автоматически очищает старые результаты инструментов, как только контекст превышает порог. Агент сохраняет разговор, но теряет необработанные выводы, которые уже обработал. Для агентных задач с длинным горизонтом это правильное поведение по умолчанию.

Кое-что, что стоит отметить: раздутый CLAUDE.md — это постоянный налог. Он загружается при каждом ходе, в каждой сессии, всегда. Я сократила свой примерно с 280 строк до ~90. Количество токенов на ход заметно упало, а поведение агента не изменилось каким-либо измеримым образом.

Шаг 3: Перепроектируйте инструменты агента для снижения расхода

Первые два шага тактические. Этот — структурный, и именно здесь живёт устойчивая экономия.

Проектируйте инструменты, производящие вывод, дружественный для LLM. Управляемый сообществом CLI Spec делает этот аргумент лучше, чем я могу: команды, предназначенные для агентов, должны поддерживать флаг --output, разделять данные (stdout) и диагностику (stderr) и обеспечивать постраничный вывод вместо выдачи неограниченного JSON. Если вы создаёте внутренние CLI, которые будут вызывать ваши агенты, следуйте этой спецификации. Если вы используете внешние CLI, которые её не поддерживают, оберните их.

Предпочитайте узкие инструменты широким. Функция git_status_summary, возвращающая три структурированных поля, лучше, чем позволять агенту запускать сырой git status и разбирать вывод. Каждый уровень разбора, который должна выполнить модель, — это уровень, где токены сгорают на трансляцию, а не на рассуждение. Я преобразовала четыре наиболее часто используемые команды в тонкие Python-обёртки, возвращающие JSON. Расход токенов на этих операциях туда и обратно упал примерно на 60%.

Используйте субагентов для задач с интенсивным чтением. Функция субагентов Claude Code запускает отдельный контекст для таких задач, как «просканировать репозиторий и резюмировать поток авторизации». Результаты возвращаются как компактное резюме — а не 40 файлов, которые субагент фактически прочитал. Основной разговор никогда не видит необработанных данных. Для задач с интенсивным исследованием это единственный крупнейший структурный выигрыш, доступный сегодня.

Подбирайте модель под работу. Opus 4.7 впечатляет и дорог. Большинство CLI-задач — редактирование файлов, исправление тестов, рутинный рефакторинг — нормально работает на Sonnet, примерно за 40% стоимости Opus на токен. Стоит знать: новый токенизатор Opus 4.7 может производить до 35% больше токенов для идентичного текста по сравнению с более ранними моделями, что усугубляет разрыв в стоимости.

Честная оговорка: измеряйте до оптимизации, затем измеряйте после. Я установила базовый уровень с помощью /cost (API) или /usage (подписка) в течение недели до каких-либо изменений, затем перемерила после каждого изменения. Две мои «оптимизации» оказались неизмеримо бесполезными. Без базового уровня вы угадываете.

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

Почему терминальные рабочие процессы потребляют так много токенов?

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

Насколько может помочь сжатие вывода?

По моим измерениям, фильтрация на уровне команд плюс ограничения вывода сократили входные токены на ход на 40–60% в тестовых запусках, сборках и операциях git. Обёртки сообщества вроде rtk сообщают о сокращениях на 80–90% для конкретных команд, хотя эти цифры предполагают наихудший случай максимально подробного вывода. Реальный выигрыш зависит от того, какие команды ваш агент запускает чаще всего. Проаудируйте пять главных, исправьте их, и большинство экономии появится немедленно.

Что командам следует оптимизировать в первую очередь?

В таком порядке: ограничения вывода инструментов, дисциплина /clear и /compact, выбор модели. Ограничения вывода — это однократное изменение конфигурации с нулевыми текущими затратами. Гигиена сессий — это привычка, но она бесплатна, когда вы её выработали. Выбор модели — это самый простой выигрыш, который легко упустить: запускать всё на Opus, когда большинство задач нормально работают на Sonnet — это тихая, крупная утечка.

Когда оптимизация токенов ухудшает качество отладки?

Когда вы сжимаете настолько, что агент не может видеть, что сломалось. Усечённый стек вызовов, отфильтрованное предупреждение об устаревании, флаг --quiet, скрывающий реальную ошибку — всё это стоило мне реального времени. Паттерн, которому я следую: агрессивно сжимайте для рутинных команд (git status, npm install, успешные тестовые запуски), сохраняйте подробный вывод для заведомо проваливающихся или незнакомых операций. Если вы обнаруживаете, что перезапускаете команду без фильтров для отладки, фильтр был неправильным, а не стратегия.

Заключение

Стоимость токенов в CLI-рабочих процессах — это не проблема модели. Это проблема водопроводчика. Большая часть расходов исчезает в разрыве между тем, что производят терминальные команды, и тем, что модели действительно нужно для рассуждения — а этот разрыв устраняется с помощью фильтрации вывода, дисциплины контекста и инструментов, уважающих агента на другом конце.

Я работаю с описанной выше установкой около шести недель. Ежедневное потребление токенов в Claude Code снизилось примерно на 55%, задержка агента улучшилась как побочный эффект меньших контекстов, а рабочий процесс стал менее шумным для отладки. Ни одна из этих цифр не является универсальной — ваш базовый уровень и ваши пять главных команд будут выглядеть иначе. Но паттерн работает: контролируйте, что входит в контекст, контролируйте, что остаётся в контексте, и позвольте модели тратить свой бюджет на рассуждение, а не на чтение логов сборки.

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

Предыдущие публикации:

Поделиться