Я много работаю с кодинг‑агентами в Claude Code. В какой‑то момент поймал себя на том, что не представляю, на что уходят токены. Счёт в конце месяца есть, а из чего он складывается, непонятно. Написал небольшую утилиту, которая читает то, что Claude Code и так пишет на диск, и раскладывает расходы по статьям. То, что она показала, мне не понравилось.
Вывод ledgent report ‑redact
Почти 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/