Как использовать
- Открой Claude Code в пустой рабочей папке.
- Вставь промпт целиком (кнопка «Копировать» ниже).
- Дай агенту прочитать и написать код — он сам найдёт твои транскрипты в
~/.claude/projectsи соберёт данные. - Открой получившийся
tokens/index.htmlлокально или черезpython3 -m http.server.
Построй локальную панель «Анализ расхода токенов Claude Code» — сколько токенов и денег
сожрал Claude Code по дням, по проектам и по моделям, с разбивкой «руками / автоматика».
ИСТОЧНИК ДАННЫХ
Claude Code пишет транскрипты в ~/.claude/projects/<slug>/*.jsonl — по файлу на сессию.
Каждая строка — JSON-событие; нас интересуют только строки, где есть message.usage
(в них лежат input_tokens, output_tokens, cache_read_input_tokens,
cache_creation_input_tokens и опционально message.usage.cache_creation с разбивкой
на ephemeral_5m_input_tokens / ephemeral_1h_input_tokens).
ШАГ 1 — индекс "день × проект × модель"
Напиши модуль, который проходит все *.jsonl под ~/.claude/projects и строит
{день: {проект: {модель+кто+поток: [input, cache_read, cache_write_5m, cache_write_1h,
output, calls]}}}. Учти грабли (они не гипотетические, все проверены на реальном
корпусе транскриптов):
1. Один вызов модели пишется в файл НЕСКОЛЬКО раз (по числу content-блоков ответа:
thinking, tool_use и т.д. — у всех одинаковый usage). Дедуплицируй по requestId
(или message.id/uuid как fallback) В ПРЕДЕЛАХ ОДНОГО ФАЙЛА. Между файлами requestId
не пересекаются, так что per-файловый дедуп достаточен и позволяет кэшировать
по файлам независимо.
2. Транскрипты быстро вырастают до гигабайт. Читай файл в БИНАРНОМ режиме построчно
и отбрасывай строки без подстроки b'"usage"' ДО json.loads — иначе будешь
парсить и огромные tool_result-строки, которые не нужны.
3. Определение проекта. Claude Code кладёт реальные пути в аргументы tool_use
(file_path/path/notebook_path у Read/Edit/Write, произвольная строка в command
у Bash). Возьми домашнюю папку с проектами (например ~/Projects — спроси
пользователя или прочитай из конфига) и:
- собери СПИСОК РЕАЛЬНО СУЩЕСТВУЮЩИХ подпапок в ней (fs.readdir), это твой
"known projects" — без этого фильтра любой левый путь типа
~/Projects/CLAUDE.md даст фантомный "проект CLAUDE.md";
- в каждом tool_use ищи путь вида .../Projects/<имя>/<подпапка>/... и бери
<имя>, только если оно есть в known projects;
- аргументам file_path/path/notebook_path доверяй больше, чем случайной строке
внутри длинной bash-команды (два прохода: сначала "сильные" ключи, потом
остальные);
- если у события путей нет вообще (чистое рассуждение, ответ без вызова
инструментов) — унаследуй проект от ПРЕДЫДУЩЕГО события в этом же файле
("липкая" привязка внутри сессии, не молчаливая привязка "куда попало");
- не определилось НИ РАЗУ за файл — отдельный бакет "(без привязки)", не
сваливай в общий проект;
- блоки одного ответа (thinking отдельно от tool_use) объединяй по одному
requestId — иначе половина путей потеряется, потому что путь лежит в
tool_use, а thinking идёт первым отдельной строкой.
Прямо скажи пользователю в UI: это ЭВРИСТИКА с точностью до проекта,
не бухгалтерия — сессия-обсуждение без единого файла целиком уедет в проект
последнего касания.
4. "Кто жёг" — поле entrypoint в записи: sdk-cli/sdk/headless/api = автоматика
(headless claude -p из крона/скрипта), claude-vscode/cli = живая сессия
человека. Второе измерение — поток: isSidechain=true или файл лежит в
подпапке .../subagents/... значит это подагент, иначе основной поток.
5. Дата события — по timestamp (UTC, суффикс Z), переведи в свой локальный
часовой пояс перед тем как относить к "дню" — иначе вечерняя работа
уезжает в "завтра"/"вчера" в зависимости от TZ.
ШАГ 2 — кэш (обязателен, иначе каждая пересборка будет читать гигабайты заново)
Кэшируй агрегаты по файлу, ключ — mtime+size файла: не изменились — не перечитываем,
берём агрегаты из кэша. Кэш храни отдельно от самих транскриптов и не выкидывай
записи для файлов, которых больше нет на диске (история дороже места) — просто
помечай их alive:false и подрезай по retention (например 120 дней). Пиши кэш
атомарно (tmp-файл + rename), сборка идёт по расписанию и оборванный кэш заставит
следующий запуск читать всё с нуля.
ШАГ 3 — деньги (только оценка, НЕ бухгалтерия подписки)
Заведи таблицу цен $/1M токенов (input, output) по актуальным моделям — сверь на
момент сборки с https://claude.com/pricing или скиллом claude-api, цены меняются.
Не кэшируй доллары, кэшируй только токены — при обновлении прайса вся история
пересчитывается на лету. Множители на кэш: чтение кэша ~0.1× от input-цены,
запись на 5 минут ~1.25×, запись на 1 час ~2×. Если разбивки cache_creation нет —
считай всё по дешёвому 5-минутному тарифу (занижай, не выдумывай). Токены
незнакомой модели не выбрасывай из счётчика: клади их в tokens, но отдельно
помечай unpriced_tokens, чтобы витрина могла честно написать "на N токенов цены
нет" вместо того чтобы молча занизить сумму. В UI явным текстом: "работа идёт по
подписке, эти суммы не списываются — это оценка для сравнения проектов между собой".
ШАГ 4 — JSON-контракт для витрины
Собери один tokens.json с окном (например 30 дней):
{
"generated_at": ISO-время сборки,
"dates": [30 дат по возрастанию],
"periods": ["1","7","30"],
"totals": { "1": {...}, "7": {...}, "30": {...} }, // агрегат за период:
tokens/input/cache_read/cache_write/output/calls/cost/cache_share/sessions/
projects + разбивки models/kinds/flows
"daily": [ {date, tokens, cost, calls, sessions, manual, auto, top_project} ],
"projects": [ {key, label, series:[30 чисел], cost_series:[...], last_day,
periods: {"1":{...},"7":{...},"30":{...}} } ], // periods того же
проекта содержит агрегат + models/kinds/flows/subpaths (топ-6 подпапок
внутри проекта, куда реально приходились правки)
"meta": {index:{files_total, files_scanned, files_cached, seconds, retention_days},
history_from, cost_basis:"api_list_price_estimate", note}
}
Не показывай проект в списке, если за максимальный период у него 0 токенов —
список не должен превращаться в шум из давно мёртвых папок.
ШАГ 5 — витрина (одна статическая HTML-страница, без сборщика/фреймворка)
Тёмная UI-тема, шрифты Google Fonts (заголовки — что-то геометрическое жирное,
текст — нейтральный гротеск). Разделы:
- полоса итогов (токены/деньги/запросы/сессии/проектов/доля кэша) с переключателем
периода 1 день / 7 дней / 30 дней (чисто клиентский, без повторных запросов);
- столбчатый график по дням: высота = все токены, тёмная часть столбика = доля
автоматики; при наведении — тултип с деталями дня;
- три разреза долями (stacked bar): по моделям, по "кто жёг" (руками/автоматика),
по потоку (основной/подагенты);
- таблица проектов: имя, спарклайн за период, токены с долей от макс. проекта,
оценка $, число запросов; клик разворачивает — топ подпапок, разбивка по
моделям, разбивка "из чего собран контекст" (свежий ввод / чтение кэша /
запись кэша / ответы модели).
Все числа компактно (млрд/млн/тыс), формат ru-RU. Внизу — сноска: как считается
привязка к проекту, сколько файлов индекса, глубина истории. Данные тянутся
fetch("data/tokens.json") — если файла нет, показать заметку с командой сборки.
ШАГ 6 — как это разложить и запускать
Структура: tokens/build_tokens.py (собирает data/tokens.json), tokens/index.html
(витрина), sources/claude_usage_index.py (модуль индекса из шагов 1-2).
Запуск сборки: python3 tokens/build_tokens.py. Просмотр: любой статический сервер
(python3 -m http.server из папки tokens/) либо залить index.html + data/tokens.json
на свой хостинг/VPS как статику — данные не завязаны на бэкенд.
Если нужно обновлять само — заведи локальный cron/launchd (Mac) или systemd-таймер
(Linux) раз в несколько часов, который просто перезапускает build_tokens.py и
(опционально) заливает две пары файлов на хостинг.
ВАЖНО: не хардкодь домашние пути. Определяй ~/Projects и ~/.claude/projects через
Path.home(), спроси пользователя, если у него проекты лежат не в ~/Projects.
Что получится
- Полоса итогов: сколько токенов, во сколько это оценивается по прайсу API, сколько запросов, сессий и проектов за сегодня / 7 дней / 30 дней.
- График по дням со стеком «руками / автоматика» — видно, сколько жжётся, пока ты спишь.
- Таблица проектов со спарклайнами: клик разворачивает — какие подпапки, какие модели, из чего собран контекст (свежий ввод / кэш / ответ).
Важная оговорка
Привязка расхода к проекту — эвристика по путям в вызовах инструментов, не бухгалтерия. Сессия, где ты только обсуждал стратегию и не тронул ни одного файла, целиком уедет в проект последнего касания. А доллары — справочная оценка «во что бы это встало по API»: если ты работаешь по подписке, никто их с тебя не списывает, они нужны только для сравнения проектов между собой.
Ещё промпты и скиллы для Claude Code
Разбор инструмента по ссылке, разведка ниши перед SEO-сайтом, второй мозг — всё разбирается в Telegram-канале.
Читать дальше
Все гайды рабочие: каждый — то, что реально крутится у меня, а не пересказ документации.