Порівняння трекерів витрат Claude Code
Дізнайтеся, чому трекери показують різні суми: порівняння локальних парсерів журналів, вбудованих екранів usage та стеку OpenTelemetry.
Що насправді читає трекер витрат Claude Code
Кожен трекер витрат Claude Code читає одне з трьох джерел даних, і саме джерело визначає, на яке запитання він може відповісти. Парсер журналів читає файли стенограм сеансів на вашому диску. Дашборд читає записи про використання, які Anthropic зберігає для вашого облікового запису або організації. Система метрик читає потік OpenTelemetry (OTel), який Claude Code передає після ввімкнення відповідної функції. Усі три джерела можуть одночасно бути правильними й усе одно показувати різні результати, оскільки вони підраховують різні показники.
У цьому посібнику токени не пояснюються повторно. У матеріалі як Claude Code підраховує використання токенів описано вхідні та вихідні дані, операції запису в кеш і читання з кешу. Без розуміння цієї частини дашборд мало що пояснює. Тут розглядається вужче питання: що може бачити кожен тип інструмента і чого він ніколи не може побачити.
Чому в один день з’явилися три трекери витрат Claude Code
Три окремі трекери витрат Claude Code опублікували в один день. Це не були три версії одного інструмента, і саме це важливо. Один аналізував локальні файли сеансів. Другий працював як оболонка для екранів використання облікового запису. Третій був розміщеним бекендом трасування, який ви запускаєте самостійно.
Вони з’явилися одночасно, тому що вартість сеансу агента перестала бути очевидною. Чат коштує приблизно стільки, скільки видно на екрані. Агент читає двадцять файлів, запускає набір тестів і повторно надсилає весь контекст розмови під час кожного кроку, тому рахунок визначається контекстом, який ви не вводили. За підпискою вартість у доларах узагалі не відображається: є лише індикатор використання, який у деякі дні спорожнюється швидше. Кожен із трьох підходів закриває іншу частину цієї прогалини.
Форма 1: локальний парсер журналів показує вартість використання за сьогодні
Claude Code зберігає кожну розмову у форматі JSON Lines (JSONL) у каталозі ~/.claude/projects/<project>/<session-id>.jsonl, де <project> — це шлях до вашого робочого каталогу, а неалфавітно-цифрові символи замінено на -. Кожна відповідь асистента в цьому файлі містить кількість токенів для відповідного запиту. Парсер журналів підсумовує ці значення та обчислює вартість.
ccusage — найпоширеніший варіант. Він не потребує встановлення:
npx ccusage@latest daily
npx ccusage@latest daily --breakdown
npx ccusage@latest blocks
npx ccusage@latest session --jsondaily підсумовує дані за датою. --breakdown розділяє кожен рядок за моделлю. Так можна побачити, що один день роботи з Opus становить більшу частину тижневого використання. blocks групує дані за п’ятигодинним вікном, після якого поновлюється підписка. session підсумовує дані для кожної розмови, а --instances групує їх за проєктом, щоб показати, який репозиторій є найдорожчим. Додайте --since і --until, щоб обмежити діапазон, і виконайте npx ccusage@latest daily --help, щоб дізнатися формат дат, якого очікує ваша версія. Станом на August 2026 інструмент також читає дані інших CLI для агентів, зокрема Codex і OpenCode. Це важливо, якщо ви їх порівнюєте.
Вартість визначається за таблицею цін моделей. Інструмент має три режими розрахунку. --mode auto використовує значення costUSD, записане Claude Code у файл, якщо воно є, а якщо його немає — обчислює вартість за кількістю токенів. --mode calculate завжди обчислює вартість за токенами та ігнорує записану вартість. --mode display показує лише записану вартість і виводить $0.00 для рядків, де її немає. Якщо підсумок виглядає неправильним, запустіть той самий звіт спочатку з calculate, а потім із display. Велика різниця між результатами означає, що більшість записів не містить записаної вартості, тому всі показані значення є оцінками.
Ці самі дані можна використовувати у вашому prompt. ccusage statusline виводить компактний рядок для status bar Claude Code. Його можна підключити до ~/.claude/settings.json так само, як будь-яку іншу команду для status line. Див. налаштування statusline Claude Code, де наведено блок параметрів і поля, які він отримує.
Парсер журналів не бачить того, що не відбувалося на цьому комп’ютері. Другий ноутбук, сеанс на claude.ai або робота колеги: ці транскрипти зберігаються на відповідних дисках. Старі дані також можуть бути відсутні, оскільки за замовчуванням транскрипти видаляються через 30 days відповідно до параметра cleanupPeriodDays. Тому дані за минулий квартал буде втрачено, якщо ви не створили їхній архів.
Є ще один ризик, пов’язаний зі структурою даних. У документації Anthropic зазначено, що формат записів є внутрішнім форматом Claude Code і змінюється між версіями. Тому скрипти, які безпосередньо аналізують ці файли, можуть перестати працювати з будь-яким випуском. Це стосується кожного інструмента такого типу. З цієї ж причини власний однорядковий jq для обробки JSONL є гіршою ідеєю, ніж може здатися: підтримувані парсери відстежують зміни формату за вас, а ваш однорядковий скрипт почне показувати впевнено неправильне число в день, коли назву поля буде змінено.
Насамкінець, суму в доларах для підписки потрібно трактувати з урахуванням одного застереження. Для Pro або Max оплата не стягується за кожен токен, тому це сума, яку ваші токени коштували б за стандартними тарифами API. Вона показує інтенсивність вашого використання. Це не ваш рахунок. Якщо ви насправді хочете визначити, який план обрати, таке порівняння потрібно виконувати окремо: див. оплата API порівняно з підпискою Claude.
Форма 2: вбудовані екрани використання показують, яка модель витратила бюджет
Claude Code має власні звіти, але більшість користувачів ніколи їх не відкриває. Запустіть /usage у межах сеансу. Блок Session угорі показує кількість токенів за моделями та суму в доларах для поточного сеансу. Дані обчислюються локально на основі кількості токенів і стандартних тарифів. Ця сума не враховує знижки або промоційні тарифи, тому може відрізнятися від рахунка. Підсумки скидаються, коли /clear починає нову розмову.
На плані Pro, Max, Team або Enterprise цей самий екран показує, яку частину ліміту плану вже використано. Він також розподіляє нещодавнє використання між skills, subagents, plugins та окремими MCP servers у відсотках від загального обсягу. Екран позначає дії, на які припадає 10% або більше нещодавнього використання, наприклад довгий контекст або пропуски кешу. Натискайте d або w, щоб перемикатися між останніми 24 годинами та останніми 7 днями. Ці показники приблизні. Вони обчислюються на основі локальної історії сеансів на цьому комп’ютері, тому використання на іншому пристрої не враховується. Якщо індикатор порожній, а не просто низький, екран повідомляє, що вікно закрилося, але не пояснює, як продовжити роботу. Що робити після досягнення ліміту — це окреме рішення щодо моделі, контексту та плану.
Якщо розробників більше одного, ці показники переходять на рівень облікового запису. Організація, що використовує API, отримує сторінку використання в Console, панель Claude Code з витратами та кількістю прийнятих рядків для кожного учасника, а також Claude Code Analytics API, який повертає такі самі щоденні показники для кожного користувача за допомогою ключа адміністратора. Плани Team та Enterprise надають звіт про витрати в адміністративній консолі з експортом у CSV та щоденним оновленням. Enterprise також додає analytics API. Набір доступних даних залежить від способу входу кожного розробника, тому в організації зі змішаними способами автентифікації потрібно переглянути два звіти й підсумувати їх вручну.
Для планування бюджету в опублікованій документації Anthropic про вартість станом на August 2026 наведено середнє значення близько $13 на одного розробника за активний день і від $150 до $250 на одного розробника на місяць. Для 90% користувачів витрати становлять менше $30 за активний день. Сприймайте це як опублікований орієнтир на основі корпоративних розгортань, а не як прогноз для вашої команди. Спочатку запустіть пілотну групу та виміряйте фактичні витрати, а вже потім екстраполюйте результат.
Панелі не бачать нічого з точністю до окремого дня або користувача. Вони покажуть, що у вівторок більшість використання припала на Opus. Але вони не покажуть, який prompt, repository або CI job спричинив це використання. Дані також надходять із затримкою, оскільки звіти організації оновлюються щодня. Тому це інструмент для аналізу, а не спосіб виявити агента, який почав неконтрольовано витрачати кошти, у поточний день. Для такого виявлення потрібні ліміти, а не звіти. Цьому присвячено матеріал як обмежити витрати агента на VPS.
Форма 3: власний стек OpenTelemetry покаже, який prompt спричинив регресію
Claude Code передає метрики й події OpenTelemetry після встановлення однієї змінної середовища. Це єдиний варіант, який передає дані про токени та вартість для кожного користувача у вашу систему майже в реальному часі. Метрики містять claude_code.cost.usage у USD, claude_code.token.usage у токенах, claude_code.session.count і claude_code.active_time.total.
Метрика токенів особливо важлива через свої атрибути. Кожна точка даних містить type, яке може мати значення input, output, cacheRead або cacheCreation, а також model і query_source, яке може мати значення main, subagent або auxiliary. Вона також містить agent.name, skill.name, mcp_server.name і mcp_tool.name. Цього достатньо, щоб отримати відповіді на запитання, які не охоплює жодна інформаційна панель: яка частина рахунку припадає на subagents, а не на ваші власні запити; чи подвоїв один MCP server кількість вхідних токенів; чи зменшилася кількість читань із кешу після редагування кимось файла CLAUDE.md. Саме поведінка кешу зазвичай створює несподіванки. У матеріалі коли кешування prompt окупається пояснюється, на що потрібно звертати увагу.
Варто виправити одну поширену неточність, оскільки вона виникає майже в кожному обговоренні цієї теми. Langfuse — хороший self-hosted бекенд для трасування. Його запуск на VPS описано в матеріалі self-hosting Langfuse для трасування агентів. Його кінцева точка OTLP приймає лише trace. Claude Code експортує метрики та події журналу, а не span. Тому передавання OTEL_EXPORTER_OTLP_ENDPOINT до Langfuse залишить проєкт порожнім і не дасть жодної корисної помилки. Langfuse є правильним інструментом для агентів, яких ви створюєте безпосередньо через API, коли ваш власний код створює кожен span із його prompt, model і cost. Для CLI Claude Code потрібне сховище метрик.
Налаштування відстеження витрат Claude Code на власному VPS
Достатньо двох сервісів: збирача, який приймає метрики, і Prometheus, який їх зберігає. Не відкривайте їх в Інтернет, оскільки відкритий порт OTLP приймає записи від будь-кого, хто його знайде. Запишіть /opt/ccmetrics/compose.yaml:
services:
collector:
image: otel/opentelemetry-collector-contrib:latest
command: ["--config=/etc/otel/config.yaml"]
volumes:
- ./collector.yaml:/etc/otel/config.yaml:ro
ports:
- "10.8.0.1:4318:4318"
restart: unless-stopped
prometheus:
image: prom/prometheus:latest
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
- prom-data:/prometheus
ports:
- "127.0.0.1:9090:9090"
restart: unless-stopped
volumes:
prom-data:10.8.0.1 — це адреса сервера всередині тунелю WireGuard, тому збирач доступний з ваших машин і більше нізвідки. Адреса перед портом тут справді важлива, оскільки опубліковані Docker-порти не фільтруються через ufw: див. чому опубліковані Docker-порти обходять ufw. Налаштування самого тунелю описано в розділі VPN WireGuard на власному VPS.
/opt/ccmetrics/collector.yaml:
receivers:
otlp:
protocols:
http:
endpoint: 0.0.0.0:4318
processors:
batch:
exporters:
prometheus:
endpoint: 0.0.0.0:8889
service:
pipelines:
metrics:
receivers: [otlp]
processors: [batch]
exporters: [prometheus]/opt/ccmetrics/prometheus.yml. Порт 8889 ніколи не публікується на хості, оскільки Prometheus звертається до збирача через мережу Compose за іменем сервісу:
global:
scrape_interval: 30s
scrape_configs:
- job_name: claude-code
static_configs:
- targets: ["collector:8889"]cd /opt/ccmetrics
docker compose up -d
docker compose logs collectorЖурнал збирача має завершуватися повідомленням Everything is ready. Begin running and processing data.. Якщо журнал зупиняється через помилку конфігурації, це означає, що YAML не вдалося розібрати, а контейнер перезапускатиметься в циклі.
Тепер підключіть до нього Claude Code. На кожній машині, де запускається Claude Code, додайте це до ~/.claude/settings.json:
{
"env": {
"CLAUDE_CODE_ENABLE_TELEMETRY": "1",
"OTEL_METRICS_EXPORTER": "otlp",
"OTEL_LOGS_EXPORTER": "none",
"OTEL_EXPORTER_OTLP_PROTOCOL": "http/protobuf",
"OTEL_EXPORTER_OTLP_ENDPOINT": "http://10.8.0.1:4318",
"OTEL_METRIC_EXPORT_INTERVAL": "10000"
}
}Запустіть сеанс, надішліть один запит, дочекайтеся інтервалу експорту (тут 10 секунд, за замовчуванням 60 секунд), а потім запитайте Prometheus, які дані він отримав:
curl -s http://localhost:9090/api/v1/label/__name__/values | grep -o 'claude_code[a-z_]*'Ви маєте отримати кілька назв, що починаються з claude_code_. Експортер замінює крапки на символи підкреслення та додає одиницю вимірювання, тому точні рядки залежать від версії збирача. Порожній результат означає, що дані не надійшли. Перевірте, чи збігаються протокол і порт, оскільки http/protobuf використовує порт 4318, а grpc — 4317; невідповідність не спричиняє явної помилки. Виконайте claude --debug, і журнал налагодження покаже помилки експорту OTel.
Для однієї машини без сервера пропустіть усе описане вище. Встановіть OTEL_METRICS_EXPORTER=prometheus, і Claude Code відкриє endpoint для збору метрик безпосередньо на http://localhost:9464/metrics. Якщо prometheus — єдиний перелічений експортер, Claude Code не додає одиниці USD, tokens і s до назв метрик, тому endpoint залишається коректним у текстовому форматі Prometheus.
Така схема передбачає одне рішення щодо приватності. За замовчуванням із машини передаються лише лічильники: без тексту запитів і результатів роботи інструментів. OTEL_LOG_USER_PROMPTS=1 і OTEL_LOG_TOOL_CONTENT=1 змінюють цю поведінку, після чого у вашому сервері метрик зберігатимуться вихідний код та інші дані з контексту. Умикайте ці параметри свідомо й спочатку прочитайте як не допускати секрети в контекст агента.
Відстеження витрат для скриптів і CI-запусків
Неінтерактивні запуски часто стають несподіваними витратами, оскільки ніхто не стежить за екраном. claude -p із --output-format json повідомляє вартість такого запуску у своєму payload результату:
claude -p "summarise the failing tests" --output-format json | jq '.total_cost_usd'Payload містить total_cost_usd і розподіл витрат за моделями. Тому CI job може записувати власні витрати без dashboard. Додайте значення у файл або передайте його як метрику до колектора вище. Це найдешевший практичний спосіб відстежувати витрати. Для кожного запуску він потребує одного виклику jq.
Типові відмови та їхні ознаки
Звіт порожній. npx ccusage@latest daily не виводить рядків, отже, він читає не те місце, куди Claude Code записує дані. CLAUDE_CONFIG_DIR змінює це розташування, і парсеру потрібно повідомити про новий шлях. Якщо рядки є, але дані закінчуються приблизно місяць тому, це cleanupPeriodDays працює за задумом: транскрипти за замовчуванням видаляються через 30 днів.
Два комп’ютери показують різні підсумки. Це очікувано і не є помилкою. І /usage, і будь-який парсер журналів читають лише локальну історію сеансів, тому використання з іншого пристрою або з claude.ai не враховується в жодному з них.
Локальний підсумок не збігається з рахунком. Локальні показники обчислюються за кількістю токенів і стандартними роздрібними тарифами. Вони не враховують промоційні ціни або договірну знижку. За підпискою токени взагалі не оплачуються окремо. Для білінгу API визначальною є сторінка використання в Console.
Витрати зросли, хоча ви виконували ту саму роботу. Спочатку перевірте стовпці кешу. Тривалий сеанс повторно надсилає всю свою історію під час кожного запиту. Поки кеш активний, застосовується тариф для кешованих даних. Після завершення дії кешу застосовується повний тариф для вхідних даних. Тому тривала перерва призводить до повторної обробки всієї розмови. Це видно за великим значенням для вхідних даних поруч із малим значенням для вихідних даних, а ціни за вхідні та вихідні токени пояснюють, чому ці показники змінюються незалежно один від одного.
День із субагентами має нереалістичний вигляд. Кожен субагент використовує власне контекстне вікно, тому кількість токенів залежить від кількості запущених субагентів і тривалості роботи кожного з них. Лише дані OTel дають змогу розділити їх за атрибутом query_source у claude_code.token.usage. Парсер журналів покаже загальний підсумок, але не дасть змоги визначити внесок окремих субагентів.
FAQ
Чи показує ccusage, скільки з мене фактично стягують за план Max?
Ні. За підпискою оплата не розраховується за токенами, тому аналізатор журналів оцінює ваші токени за стандартними тарифами API і показує, скільки така сама робота коштувала б через API. Це корисний відносний показник навантаження за день, а також спосіб порівняти між собою проєкти або моделі. Щоб дізнатися фактичну суму до сплати, використовуйте сторінку використання в Console для тарифікації API, а для підписки — сторінку тарифікації плану.
Де Claude Code зберігає файли сеансів, які читають ці інструменти?
У ~/.claude/projects/<project>/<session-id>.jsonl, де <project> — це шлях до робочого каталогу, у якому неалфавітно-цифрові символи замінено на -. Кожен рядок є JSON-об’єктом для одного повідомлення, використання інструмента або запису метаданих. CLAUDE_CONFIG_DIR переміщує весь каталог, а cleanupPeriodDays у settings.json керує зберіганням протягом 30 днів. Anthropic описує формат записів як внутрішній, який може змінюватися між версіями, тому використовуйте для його аналізу підтримуваний інструмент, а не власний скрипт.
Чи можна надсилати телеметрію Claude Code до Langfuse?
Безпосередньо — ні. Кінцева точка OTLP Langfuse приймає трасування, а Claude Code експортує метрики та події журналу, а не спани, тому ці дані нікуди записувати. Надсилайте метрики Claude Code до колектора OpenTelemetry і зберігайте їх у Prometheus. Використовуйте Langfuse для агентів, яких ви самостійно створюєте через API, де ваш код генерує спани з промптом, моделлю та вартістю.
Чому мої локальні показники не збігаються зі сторінкою використання в Console?
Тому що вони обчислюються по-різному. /usage і аналізатори журналів підсумовують кількість токенів із файлів сеансів на комп’ютері, за яким ви працюєте, а потім оцінюють їх за стандартними тарифами. Console показує фактичну суму, яку було стягнуто з вашої організації, з урахуванням усіх комп’ютерів і ключів та після застосування знижок. Розбіжність є нормальною. Дуже велика розбіжність зазвичай означає, що до того самого облікового запису витрати відносить інший пристрій, runner CI або інший учасник команди.
Як відстежувати вартість запуску claude -p у CI?
Запустіть його з --output-format json і прочитайте total_cost_usd з результату, наприклад за допомогою claude -p "..." --output-format json | jq '.total_cost_usd'. Ті самі дані містять розподіл за моделями та ідентифікатор сеансу. Записуйте це значення для кожного завдання, і ви отримаєте витрати для кожного конвеєра без агента, dashboard або додаткового сервісу.