Когда счётчики usage врут: пять повторяющихся ошибок в open-source вокруг агентов

Сводка расхода по агенту за спринт может систематически врать: ретраи в стриме раздувают цифру, а пропущенное поле usage превращается в «бесплатный» ноль. В полевом отчёте Roy Tong и команда AgentMeasure прошли 110 open-source инструментов учёта, выделили пять семейств типовых багов, зафиксировали 45+ подтверждённых дефектов и 23 принятых upstream-исправления; отдельно прогнали conformance suite на 236 проверках.
Пять семейств багов в метриках ИИ-инструментов
Повторяющиеся классы ошибок в учёте токенов, cost и бюджетов, а не «уникальные» сбои по одному репозиторию:
| # | Семейство | Что ломается на практике |
|---|---|---|
| 1 | Устаревшие pricing tables | Таблицы тарифов моделей не обновляют месяцами; инструмент считает уверенно по ставкам, которые рынок уже сменил. В выборке из 7 инструментов у 5 устаревшие или отсутствующие строки тарифов. |
| 2 | Неверные cache multipliers между провайдерами | Cache read/write считаются с разными коэффициентами у разных провайдеров; типичный shortcut: подставить множители одного вендора всем. Anthropic-подобная скидка на cache read, перенесённая на модели OpenAI, занижает cache reads примерно в 5×. |
| 3 | Двойной учёт retry в стримах | При byte-identical повторе стримингового запроса часть агрегаторов суммирует обе попытки. В корпусе из 604 re-emitted events у 46% байты совпадают с предыдущим событием: наивная агрегация удваивает usage, слишком жёсткая дедупликация съедает реальную работу. |
| 4 | «Нет поля» = ноль | Пропущенное поле usage превращается в or 0, и «неизвестно» читается как «бесплатно». Рекомендация: absent остаётся absent; rollup должен уметь состояние UNPROVABLE, а не ноль. |
| 5 | Ошибки границ квотных окон | Окна привязаны к wall-clock; тесты с фикстурами на абсолютные даты проходят «30 дней» и ломаются разом при сдвиге календаря. Такой класс Roy Tong относит к собственному CI. |
Для vibe-coding цикл с агентом и ретраями в стриме бьёт прямо в семейства 3 и 4: дашборд может показать и вдвое больший расход, и «нулевой» ход, хотя модель реально работала.
Как строился аудит ~110 репозиториев в экосистеме агентов
Критерий отбора (публикация 22 сентября 2026): open-source проекты, которые считают токены, отслеживают cost или enforce budgets; работа заняла около месяца. Audit-report задаёт рамку: репозитории вокруг Claude Code, Codex, gateway, eval и observability; метод: читать код, собрать synthetic fixture и прогнать собственный парсер каждого инструмента, с публичным filing и pinned commit на каждый finding.
Полный машиночитаемый список всех 110 repo в открытом тексте не выгружен: на Dev.to агрегат, в report выборочные кейсы со ссылками на issues и PR. Таксономия пяти семейств и примеры upstream-фиксов всё равно позволяют проверять свой стек по классам ошибок, без полного реестра.
Среди проектов с уже принятыми исправлениями по учёту usage называют langfuse (порядка 34k stars на GitHub) и codeburn (порядка 11k stars). Якоря в report: langfuse #17117 (OTel cache_write alias) и codeburn PR #1264 (трёхслойная dedup token_count); это иллюстрации, не исчерпывающий список всех 23 merge к дате публикации.
Отдельно от пяти семейств report описывает класс ошибок Claude Code JSONL («одно assistant-сообщение ≠ одна строка») с пересчётом usage в 2×–5×. Его не смешивают с пятью семействами field report, хотя лимиты и cost alerts страдают те же.
Коммерческий биллинг: занижение, споры и открытый conformance
Внешний аудитор один раз независимо прогнал полный conformance suite (236 checks) и добавил разбор cache accounting у коммерческого провайдера: 4 code paths с ошибками, занижение usage на 98.9% и 95.1% на затронутых путях, с привязкой к exact commit. На одном cache-accounting path вводная формулировка даёт roughly ~99% занижения. Имя аудитора и название провайдера в открытых текстах не названы.
Open-source meters закрывают только половину картины, если вы платите вендору напрямую. AgentMeasure проверил 20 commercial vendors на опубликованный процесс при ошибке счётчика (dispute path, correction policy): ни у одного такого процесса в открытом доступе не нашли. Инициатива требует как минимум named dispute path и machine-checkable billing disclosures.
Для соло-разработчика с несколькими подписками на API и gateway идеальный локальный meter не заменяет прозрачность биллинга провайдера, но помогает отличить баг обёртки от «чёрного ящика» на стороне вендора.
Локальный conformance pack: проверка без утечки данных
Практика «10 minutes»: открытый conformance pack (MIT), данные при локальной проверке не уходят с машины (export usage → checker on machine), с разделением logical operations vs physical attempts, cache read vs write, absent vs zero. Спека settlement в том же проекте AgentMeasure: AMS-1; репозиторий: https://github.com/roy-tong/AgentMeasure (в report: clone и python3 conformance/pack/agentmeasure selftest).
Чеклист по пяти семействам (опубликовано 22.09):
- Сверить дату последнего обновления pricing table с актуальными ставками моделей, которые реально дергает агент.
- Убедиться, что cache multipliers не «унаследованы» от другого провайдера в мульти-модельном gateway.
- Прогнать сценарий с повтором стрима и посмотреть, не удваивается ли usage на идентичных байтах.
- Проверить, что отсутствующее поле usage не превращается в ноль в rollup.
- Пересмотреть тесты квотных окон: не завязаны ли они на абсолютные даты, которые завтра сломают CI.
Если стек включает observability вокруг Claude Code или Codex, сверьте парсинг JSONL с отдельным классом ошибок в report: он не дублирует названия пяти семейств, но бьёт по тем же лимитам и cost alerts.
Источники
- Roy Tong — «We audited 110 AI usage tools. Here is where the numbers go wrong.» Dev.to, опубликовано 2026-09-22. Dev.to (доступ: 2026-09-23 UTC)
- AgentMeasure —
campaigns/audit-report-2026-09.md. https://github.com/roy-tong/AgentMeasure/blob/main/campaigns/audit-report-2026-09.md (доступ: 2026-09-23 UTC)