Claude Code тратит до пятой части токенов на статус из трёх слов
Компания Flamerix AI опубликовала на GitHub Gist разбор одной малозаметной функции Claude Code и небольшой скрипт, который её отключает. Речь об agent_summary: примерно раз в 30 секунд для каждого фонового агента клиент отправляет весь его транскрипт модели этого же агента (обычно Opus) и просит «описать последнее действие в 3–5 словах». Ответ попадает только в строку статуса на панели агентов. Ни в разговор, ни к модели он не возвращается. Штатной настройки для отключения нет, а с версии 2.1.232 (август 2026 года) функция включена по умолчанию.
Цифры
Аномалию заметили в экспорте OpenTelemetry. Авторы сгруппировали события claude_code.api_request по полю query_source, и оказалось, что за неделю agent_summary дала 16,4% всех расходов Claude Code. Основной диалог обошёлся в 15,7%. На эту функцию пришлось 19,7% запросов, то есть примерно каждый пятый. 96% этих затрат ушло на Opus, а на один выходной токен приходилось около 9000 входных. Под расходами здесь понимается собственная оценка клиента (cost_usd), а не счёт. На подписке пользователь теряет запас по лимитам запросов. В issue #86879 собраны ещё четыре независимых замера, и они дают 18–26%.
Почему нельзя просто выключить
Документированный переключатель умеет только включать функцию. Опция SDK agentProgressSummaries по умолчанию равна false, но в коде она входит в логическое ИЛИ, и все пути выставляют true. Интервал задаёт сервер в диапазоне 30–240 секунд, и значение по умолчанию уже минимальное. Переменной DISABLE_NON_ESSENTIAL_MODEL_CALLS в бинарнике нет вовсе. Есть флаги, которые останавливают сводки, но заодно отключают форк-субагентов или фоновых агентов целиком.
Кеш промптов смягчает картину лишь отчасти. Около 98% вызовов читают транскрипт из кеша, но оставшиеся 2% с холодным кешем дают больше трети стоимости. Утилиты, которые считают расходы по логам сессий, этих запросов не видят: на диск они не пишутся, и заметить их можно только через OpenTelemetry. При этом в версии 2.1.310 уже есть экономный режим, где модели вместо полного транскрипта передаются заметки примерно на 2 тыс. токенов. Он выключен, и включить его можно только серверными флагами.
Как работает обход
no-agent-summary.js занимает около 80 строк. Это preload-скрипт для Bun, который подключается через BUN_OPTIONS=--preload, так что сам бинарник не модифицируется. Скрипт оборачивает setTimeout и setInterval. Если исходный текст колбэка содержит характерную строку, например [AgentSummary] Timer fired, таймер не запускается. Остальные таймеры проходят без изменений. Опознавать колбэк приходится по тексту, потому что модуль поставляется в виде скомпилированного байткода Bun, а Function.prototype.toString всё равно возвращает исходник. Для «вечной» задержки взято ровно 2³¹−1 мс: большее значение Node и Bun трактуют как 1 мс, и таймер сработал бы сразу.
Скрипт проверен на Linux с версиями от 2.1.257 до 2.1.312. На macOS и Windows его не тестировали. Авторы честно предупреждают, что любое обновление может молча вернуть сводки, и советуют перепроверять работу после каждого апдейта. Единственный видимый эффект хука в том, что статус агента на панели перестаёт обновляться.
По телеметрии авторов, доля функции в расходах выросла с 3,5–7% в июле до примерно 16% к середине октября. Скрипт распространяется под лицензией MIT. Авторы отдельно оговаривают, что изменение поведения клиента может противоречить условиям сервиса.
Источник: Hacker News
Комментарии
Войдите, чтобы комментировать.