Claude Code тратит заметную долю расходов на статус фоновых агентов, утверждают авторы gist

Claude Code тратит заметную долю расходов на статус фоновых агентов, утверждают авторы gist

Flamerix AI опубликовала на GitHub gist под лицензией MIT: небольшой скрипт no-agent-summary.js (около 80 строк) для Bun, который подавляет в Claude Code периодические запросы сводки статуса фоновых агентов. По описанию авторов, примерно каждые 30 секунд для каждого фонового агента Claude Code отправляет всю его расшифровку (transcript) модели этого же агента, обычно Opus, с просьбой «описать своё последнее действие в 3-5 словах». Ответ лишь обновляет строку статуса агента на панели агентов и не попадает ни в модель, ни в разговор пользователя. Настройки, которая это отключает, нет, а начиная с версии 2.1.232 (август 2026 года) сводки включены по умолчанию.

Аномалию, по словам авторов, обнаружила DRIM в экспорте OpenTelemetry из Claude Code: если сгруппировать события claude_code.api_request по query_source, то agent_summary оказывается дороже самого основного разговора. Авторы уточняют, что «расходы» здесь, собственная оценка Claude Code для каждого запроса (cost_usd), а не счёт; на подписке теряется запас по лимитам. Они ссылаются на обсуждение #86879, где собраны четыре независимых замера в диапазоне 18-26 % (на что именно приходится эта доля, в тексте не сказано). По собственной телеметрии авторов, недельная доля расходов на agent_summary выросла с 3,5-7 % в июле до 7,3 %, затем 11,8 % в неделю перехода на 2.1.233 и примерно 16 % к середине октября.

Как работает обход. Скрипт подключается через переменную BUN_OPTIONS=--preload, сам бинарник не меняется. Он оборачивает setTimeout и setInterval: если исходный текст функции обратного вызова содержит якорь сводки (например, строку лога [AgentSummary] Timer fired), вместо таймера возвращается неактивная заглушка с задержкой 2³¹−1 мс (большая задержка в Node и Bun считается за 1 мс, и «бесконечный» таймер сработал бы сразу). Остальные таймеры работают как обычно. Подход через таймеры выбран потому, что модуль поставляется как предкомпилированный байткод Bun, а клиент API не идёт через обёрнутый fetch; при этом Function.prototype.toString всё равно возвращает исходник функции. В экспорте OpenTelemetry подавленные запросы, это события claude_code.api_request с query_source = agent_summary.

Установка: скачать скрипт, выполнить claude daemon stop --any и запускать claude с BUN_OPTIONS, содержащим путь к скрипту; для постоянной работы переменную прописывают в профиле оболочки, в окружении systemd или в обёртке claude. Демон, pty host и заранее прогретые фоновые сессии наследуют окружение клиента, запустившего демон, поэтому после установки демон нужно перезапустить. Хук нужен и для headless-запусков: claude -p, cron, CI, интеграции в редакторы. Проверено на Linux и версиях Claude Code 2.1.257-2.1.312; macOS и Windows не проверялись.

Авторы приводят и то, что не помогает. Документированный переключатель только включает сводки: опция SDK agentProgressSummaries по умолчанию false, но в бандле это одно из слагаемых OR, и каждый путь кода, который её пишет, ставит true. Интервал задаёт сервер: он берётся из серверного флага для семейства модели и ограничен диапазоном 30-240 с; значение по умолчанию уже минимальное, и никакое значение не выключает таймер. Переменные CLAUDE_CODE_FORK_SUBAGENT=0 и CLAUDE_CODE_DISABLE_BACKGROUND_TASKS=1 сводки останавливают, но вместе с форк-субагентами или фоновыми агентами. Кэш промптов делает запросы дешевле, но не дешёвыми: около 98 % таких вызовов перечитывают расшифровку из кэша, а ~2 % с холодным кэшем дают больше трети стоимости. Эти запросы не пишутся в журналы сессий на диске (#104358), поэтому инструменты учёта расходов, читающие расшифровки, их не видят; они заметны только в экспорте OpenTelemetry. Более дешёвый режим short, где вместо полной расшифровки используются заметки около 2k токенов (возможно, составленные меньшей моделью), появился в 2.1.310, но выключен; по умолчанию по-прежнему полная расшифровка, менять это могут только серверные флаги.

По данным авторов, с тех пор как они запускают хук во всех процессах Claude Code на своей машине (версия 2.1.301), запросов agent_summary не было совсем, и другие побочные запросы на их место не выросли. Субагенты, фоновые агенты, форкнутые навыки и фоновые сессии работают как раньше; пропускается только форк сводки. Видимое последствие: статус отдельного агента на панели перестаёт обновляться, а в SDK у task_progress нет summary. Накладные расходы, одно обращение к toString на каждую уникальную функцию таймера; claude --version: ~10 мс → ~17 мс (одно измерение). Авторы оговаривают, что изменение поведения клиента может противоречить условиям сервиса, и проверять это должен сам пользователь; проект независимый и не связан с Anthropic.

Ключевые факты

  • По описанию авторов gist (Flamerix AI, MIT), примерно каждые 30 секунд для каждого фонового агента Claude Code отправляет его полную расшифровку модели агента (обычно Opus) ради статуса из 3-5 слов; с версии 2.1.232 (август 2026) это включено по умолчанию и отключить настройкой нельзя.
  • Доля в расходах: четыре замера в обсуждении #86879 дают 18-26 % (база не указана); в телеметрии самих авторов доля agent_summary выросла с 3,5-7 % в июле до примерно 16 % к середине октября. Речь о собственной оценке cost_usd, а не о счёте.
  • Обход, Bun-скрипт на ~80 строк через BUN_OPTIONS=--preload: он подменяет таймеры сводки неактивной заглушкой, бинарник не меняется. Проверено на Linux, Claude Code 2.1.257-2.1.312; после обновления клиента хук может молча перестать работать.
  • Побочный эффект: статус отдельных агентов на панели перестаёт обновляться; остальная работа агентов, по словам авторов, не затронута. Более дешёвый режим short есть в 2.1.310, но выключен.

Почему это важно

Если утверждение авторов верно, фоновые агенты Claude Code регулярно запускают скрытые запросы, которые пользователь не видит: ответ нужен только для строки статуса на панели и не попадает в разговор. По описанию авторов, такие запросы не пишутся в журналы сессий на диске, поэтому инструменты учёта расходов по расшифровкам их не показывают; заметны они только в экспорте OpenTelemetry. На подписке цена проявляется как расход запаса по лимитам, а не как счёт. Отметим, что заголовок на Hacker News говорит о «15-20 % токенов» и «трёх словах», тогда как в самом gist речь о долях расходов (оценка cost_usd) в 18-26 % и ~16 % и о статусе из 3-5 слов.

Кому это важно

Тем, кто часто запускает фоновые субагенты и фоновые сессии Claude Code, особенно с Opus, а также командам, которые собирают телеметрию OpenTelemetry и разбирают расходы по query_source. Затронуты и headless-сценарии: claude -p, cron, CI. Сколько пользователей запускают фоновых агентов и насколько их коснётся проблема, в источнике не сказано.

Как это применить

По инструкции gist: скачать no-agent-summary.js в стабильное место, выполнить claude daemon stop --any и запускать claude с BUN_OPTIONS=--preload и абсолютным путём к скрипту; для постоянного эффекта прописать переменную в профиль оболочки, окружение systemd или обёртку claude. Проверка: запустить claude --version с CC_AGENT_SUMMARY_LOG и увидеть строку preload active mode=off, затем запустить фонового субагента на пару минут и убедиться, что в логе есть подавленный таймер, а query_source = agent_summary в OpenTelemetry остаётся нулевым. Режим CC_AGENT_SUMMARY_MODE=pass возвращает сводки для сравнения. Скрипт распространяется по MIT без гарантий; стоимость в источнике не упоминается.

Можно ли доверять

Это материал самих авторов обхода, а не независимое расследование. Цифры самоотчётные: 18-26 % взяты из обсуждения #86879, где, по тексту gist, собраны четыре независимых замера, но их условия и база расчёта в источнике не описаны; ~16 %, телеметрия самих авторов. Откуда взялась и как связана с авторами компания DRIM, обнаружившая аномалию, в тексте не объяснено. Ответ Anthropic в источнике не приведён.

Риски и подводные камни

Хук держится на совпадении исходного текста функции таймера с якорями вроде строки лога или идентификатора query_source: если обновление переименует их, передаст функцию через bind, вынесет строки в общую константу или перенесёт таймер в необёрнутый API, хук ничего не найдёт и сводки молча вернутся, поэтому проверку нужно повторять после каждого обновления. Протестирован только Linux; на Windows хук, по словам авторов, скорее всего вообще не установится, macOS не проверялся. Демон и прогретые сессии наследуют окружение, поэтому нужен перезапуск демона. Авторы сами предупреждают, что изменение поведения клиента может противоречить условиям сервиса, и проверка этого лежит на пользователе; за возможные последствия, включая меры в отношении аккаунта, они не отвечают.

«опиши своё последнее действие в 3-5 словах»

— запрос на сводку статуса в Claude Code, как его описывают авторы gist