89% моих трат на AI‑агентов — это кэш, а не генерация. Написал CLI, чтобы увидеть

от автора

Я много работаю с кодинг‑агентами в Claude Code. В какой‑то момент поймал себя на том, что не представляю, на что уходят токены. Счёт в конце месяца есть, а из чего он складывается, непонятно. Написал небольшую утилиту, которая читает то, что Claude Code и так пишет на диск, и раскладывает расходы по статьям. То, что она показала, мне не понравилось.

Вывод ledgent report ‑redact
Вывод ledgent report --redact (имена проектов скрыты). Почти весь счёт — cache read и cache write, на output уходит 9%.

Вывод ledgent report ‑redact (имена проектов скрыты). Почти весь счёт — cache read и cache write, на output уходит 9%.

Почти 89 процентов моих расходов это не работа модели над задачей, а перечитывание и перезапись закэшированного контекста. На саму генерацию ответов уходит около 9 процентов.

Дальше расскажу, как это считается, почему я дважды переписывал самую заметную часть отчёта и как чуть не завысил себе счёт втрое.

Что лежит на диске

Claude Code сохраняет каждую сессию в JSONL внутри ~/.claude/projects. Это полный лог диалога, и у каждого ответа ассистента есть поле usage с разбивкой токенов. Токены там лежат не одной кучей, а пятью раздельными группами, и у каждой своя цена относительно обычного входа:

группа

цена

что это

fresh input

базовая

новый, не закэшированный ввод

cache read

0.1 от базовой

чтение из кэша

cache write 5m

1.25

запись пятиминутного кэша

cache write 1h

2.0

запись часового кэша

output

своя ставка

сгенерированные токены

Утилита берёт эти счётчики, умножает на ставки моделей и складывает. Обращений к API нет: данные уже на диске, наружу ничего не уходит.

Чтение кэша стоит в десять раз дешевле свежего входа. Но когда агент за сессию прокачивает через кэш сотни тысяч токенов помногу раз, дешёвое умножается на большое. Отсюда и 89 процентов.

Как я чуть не завысил себе счёт втрое

Первую версию ставок я вписал по памяти. Поставил Opus как 15 и 75 долларов за миллион токенов, потому что так было раньше. Отчёт показал 39 тысяч за месяц, и я почти поверил.

Настоящая ставка Opus сейчас 5 и 25. То есть я переоценил втрое, и реальная цифра оказалась около 15,5 тысяч. Вывод банальный, но я его усвоил на себе: цены на модели это данные с датой, а не константа в коде. За время моих наблюдений они менялись дважды. Теперь ставки помечены датой, а в выводе есть строчка rates as of 2026–06-24. На первый же вопрос «а по каким ценам ты считал» ответ лежит прямо в отчёте, а не в исходниках. Ещё я добавил проверку в рантайме: сумма пяти групп обязана сойтись с итогом, иначе программа падает. Поймать расхождение сразу дешевле, чем потом краснеть в комментариях.

Про честность цифр

Тут два момента, которые я решил не прятать.

Первый. Доллары в отчёте это API‑эквивалент. Я на подписке, поэтому эти 15 тысяч за месяц я не платил. Столько же токенов стоили бы по тарифам API. Отчёт так и подписан. Разница, к слову, большая: по моим данным подписка даёт примерно в 155 раз больше токенов на доллар, чем API. Гонять агентов такого объёма через голый API одному разработчику экономически бессмысленно.

Второй. Одна строка в отчёте это настоящий счёт, а не гипотетический. Модель Fable тарифицируется отдельными кредитами и подпиской не покрывается. Поэтому в рамке прогноза стоит именно её месячный расход живыми деньгами, а годовой API‑эквивалент вынесен строкой ниже с явной пометкой. Мне не хотелось, чтобы придуманные 200 тысяч в год кто‑то принял за реальный счёт.

Приватность как решение, а не как галочка

Здесь я переспорил сам себя. Сначала сделал тихое автообновление по сети, как у самого Claude Code. Потом сообразил, чем именно читает эта утилита. Она читает полные транскрипты сессий: код, вывод команд в терминале, иногда что‑то похожее на секреты. Для такого инструмента бинарь, который сам ходит в сеть и подменяет себя, плохая идея. И он же ломает единственный честный аргумент: твои данные, твоя машина, ничего не уходит.

Поэтому по умолчанию сетевых обращений нет вообще. Отчёт работает полностью офлайн. Единственная команда, которая ходит в сеть, это ledgent update, и только когда ты сам её запускаешь. Автообновление осталось, но как явная опция для тех, кому оно нужно.

Как пользоваться

Запуск без установки:

npx @nexalix/ledgent report

Короткий вариант на пять строк, удобно вставить в чат или тред:

npx @nexalix/ledgent report --brief

Спрятать имена проектов, если собираешься показывать вывод:

npx @nexalix/ledgent report --redact

Нужен Node 18 или новее. Отдельно про Windows: если PowerShell отвечает running scripts is disabled, это его политика выполнения, а не проблема утилиты. Она одинаково рубит любой npx. Обход: запустить через npx.cmd, или в cmd.exe, или один раз выполнить Set‑ExecutionPolicy ‑Scope CurrentUser RemoteSigned.

Чем это отличается от ccusage

Есть хорошая утилита ccusage, она отвечает на вопрос «сколько». Моя отвечает на «почему» (разбивка по группам кэша) и «что дальше» (прогноз реальных кредитов). Логи одни и те же, вопрос разный. Имеет смысл держать обе.

Честно про версию 0.1: пока поддерживается только Claude Code и четыре модели. На чужих данных я прогонял ровно один раз, на машине приятеля. Что показательно, те же примерно 89 процентов воспроизвелись на совсем другом наборе проектов. В рантайме ноль зависимостей, TypeScript, лицензия Apache 2.0.

Код на Гитхабе.

Мне правда любопытно, какое у вас соотношение кэша и генерации. Прогоните --brief и покажите цифру. Подозреваю, у многих будет так же неуютно, как у меня.

ссылка на оригинал статьи https://habr.com/ru/articles/1058938/