agentleFS
dewildewil/ai-toolkit/skills/session-cost/SKILL.md

session-cost

Skill9 starsChanged 2 months agoMITView on GitHub

Посчитать токены задачи из явных локальных receipts или токены сессии Claude Code из транскрипта. Для ledger задачи, отчета и сметы; не для остатка лимита аккаунта или внешних usage API.

Files
SKILL.md

session-cost

Умеет сводить расход отдельной задачи из явных receipts, собирать receipt из явного Codex CLI JSONL и считать выбранную сессию Claude Code по локальному транскрипту. Работает без внешних API. /usage показывает остаток лимита аккаунта - это другая задача.

Когда применять

  • Есть один активный task ID и нужен честный учет нескольких сессий/ролей/моделей: следуй task-accounting.md, не допуская параллельных писателей ledger.
  • Запуск выполнен через Codex CLI exec --json и сохранен в явно выбранный локальный файл: используй --codex-events по процедуре task-accounting.md.
  • Нужен локальный расход явной Claude Code сессии: используй legacy режимы ниже.

Когда НЕ применять

  • Остаток лимита аккаунта: используй штатный /usage, не этот скрипт.
  • Доступ к аккаунту, внешние usage API, поиск транскриптов или извлечение текста prompt/ответов: скрипт этого не делает.
  • Нативная orchestration-сессия без доступного usage receipt остается unknown; этот parser не находит и не восстанавливает такие вызовы.
  • Клиентский счет: внутренний ledger не определяет цену, ставку или сумму к выставлению заказчику.

Как работает

Claude Code пишет каждую сессию в ~/.claude/projects/<encoded-project>/<session-id>.jsonl. У каждого assistant-сообщения есть message.usage с полями input_tokens, output_tokens, cache_creation_input_tokens (запись кэша), cache_read_input_tokens (чтение кэша). Скрипт считает только записи типа assistant с непустым usage. Повторные записи одного сообщения в транскрипте не завышают расход: учитывается последний непустой usage; сообщения без ID считаются отдельно.

Для каждого выбранного <dir>/<id>.jsonl добавляются <dir>/<id>/subagents/*.jsonl: при --file, --session, выборе текущей сессии и --all-sessions. Чужие сессии не включаются. Отсутствующий каталог субагентов дает нулевой вклад; ошибка доступа к существующему каталогу или файлу останавливает подсчет. Входные файлы не изменяются.

Текстовый вывод показывает основной контекст, суммарную строку субагентов (включая нулевую) и общий итог. В каждой группе есть число сообщений, четыре типа токенов, work = output + cache_write и grand_total = input + output + cache_read + cache_write.

В --json верхние поля files, messages, tokens, work_tokens, grand_total включают весь учтенный расход, в том числе субагентов. files перечисляет все прочитанные файлы без дублей. Группы main и subagents содержат те же пять полей. На верхнем уровне и в каждой группе есть invalid_lines и messages_without_id; общие числа равны сумме групп.

Непустой битый JSON пропускается с увеличением invalid_lines. Пустые строки и корректные служебные записи не считаются ни сообщениями, ни ошибками. messages_without_id показывает число учтенных записей без ID, для которых дедупликация невозможна. При ненулевых счетчиках stderr содержит причину, число записей и путь файла. Битый JSON дает код 3 с явно неполной сводкой, записи без ID - сводку с ограничением дедупликации. При успешном подсчете stdout с --json остается валидным JSON. Ошибки доступа и отсутствующий явно указанный файл дают код 1 и причину в stderr, без успешной частичной сводки в stdout.

Имя папки проекта - абсолютный путь рабочей папки, где каждый не-alnum символ заменен на - (/Users/x/My.Proj -> -Users-x-My-Proj).

Запуск

python3 scripts/session-cost.py                 # текущая сессия (env CLAUDE_CODE_SESSION_ID), проект по CWD
python3 scripts/session-cost.py --session <id>  # конкретная сессия
python3 scripts/session-cost.py --file <path.jsonl>
python3 scripts/session-cost.py --project <dir> --all-sessions
python3 scripts/session-cost.py --json          # машиночитаемо

Что знать про цифры (важно для честной сметы)

  • Текущая сессия определяется по env CLAUDE_CODE_SESSION_ID (его ставит Claude Code) - надежно. Без него - свежайшая по mtime, а при параллельных сессиях в одном проекте это может оказаться ЧУЖАЯ сессия. Тогда указывай --session явно.
  • cache_read обычно доминирует (десятки млн) - это перечитывание постоянного контекста (системный промпт, правила, память, схемы тулов) на каждом ходу, а НЕ работа по задаче. Показатель реального труда агента - output (и отчасти cache_write). Скрипт помечает это в выводе (строка work).
  • per-session = per-задача только когда сессия однотемная. Для сессии, где смешаны разные задачи, точной разбивки по задачам нет - бери сессию целиком или дели вручную по границам.

Когда НЕ применять

  • Нужен остаток лимита аккаунта (не расход конкретной сессии) - это /usage или usage-эндпоинты аккаунта.
  • Нужна стоимость в деньгах - скрипт дает токены; конверсию в валюту делать снаружи по актуальным ценам модели.

Модель и текущие назначения

Перед новым заданием и запуском применяй маршрутизацию моделей: свежий MODELS выше канонического дефолта. Границы данных и полномочий этого навыка сохраняются.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.