Accuracy никто не меряет в проде. Не потому что лень - потому что нечем. Агент либо сделал задачу, либо нет, и "нет" обнаруживается через несколько часов когда смотришь на результат.

Зато есть вещи которые можно мерять в реальном времени и которые говорят о здоровье агента раньше чем он сломается.

Индустрия идёт к полноценным observability-платформам - traces, metrics, events, DAG-графы вызовов. OpenObserve, LangSmith, Arize - инструменты становятся стандартом. Но если поставить красивый дашборд не понимая что в нём смотреть - это витрина перед пустым магазином.

Начинать надо с пяти чисел.

Базовый минимум: пять чисел для любого агента

1. Разбивка токенов - не сумма

Одна цифра "потрачено X токенов" бесполезна. Важна структура:

  • inputTokens - новый текст от пользователя и ответы инструментов
  • outputTokens - что сгенерировала модель
  • cacheReadTokens - прочитано из кеша (промпт, история)
  • cacheCreateTokens - записано в кеш

Структура говорит об архитектуре. Если cacheRead в 10-100 раз больше input - у тебя длинные стабильные сессии, и это хорошо. Если cacheRead маленький - сессии короткие или промпт постоянно меняется.

2. Cache ratio - индикатор здоровья архитектуры

Cache ratio = cacheRead / (cacheRead + cacheCreate + input).

Кеш у Claude стоит в 10 раз дешевле обычного input. При ratio 97% каждый вызов обходится в 6-7 раз дешевле чем без кеша. Это не оптимизация - это условие работы продуктового агента.

Стоимость с кешем и без, $/день

Если ratio падает ниже 80% - что-то не так. Либо сессии рестартуют слишком часто, либо системный промпт меняется динамически, либо история не сохраняется. Смотреть в первую очередь.

3. Latency: минимум, среднее, максимум

Среднее время ответа - не главная цифра. Максимальное - главная.

API вызовов и среднее время ответа

Разброс между avg и max показывает характер задач. Если avg 30 секунд, а max 23 минуты - агент иногда делает что-то тяжёлое: цепочки субагентов, внешние операции с retry, долгие SSH-сессии. Без max этого не видно.

4. Контекстное окно - ресурс который течёт

Не "сколько токенов потрачено", а "сколько токенов в окне прямо сейчас". Это разные вещи.

Контекст растёт пока сессия активна. Когда инструменты возвращают большой вывод, когда история не сжимается, когда в контекст лезет мусор - окно раздувается незаметно.

Пороги: 350K - предупреждение, 600K - красный флаг, начинай новую сессию. Без мониторинга это обнаруживается когда агент начинает вести себя странно и непонятно почему.

5. API вызовы и стоимость в день

Дневные вызовы - пульс агента. Если вызовов мало и latency высокая - что-то застряло. Если вызовов много и стоимость неожиданно выросла - проверь что именно изменилось.

Стоимость в день даёт операционную реальность. Не "мы используем Claude API" а "$15-30 в день при нормальной нагрузке, $200 без кеша".


Мои метрики и почему именно они

Я строил мониторинг не из best practices - а потому что несколько раз обнаруживал проблемы слишком поздно. Каждая метрика появилась после конкретного инцидента.

Разбивка токенов появилась когда я не понимал почему некоторые дни дорогие. Оказалось: в один день cacheCreate был в 3 раза выше обычного - промпт поменялся и кеш пришлось перезаписывать.

Cache ratio появился как главный показатель после того как я увидел что без кеша мои недельные $133 превратились бы в $924. Это не абстракция - это деньги.

Max latency появился после запроса который занял 23 минуты 29 секунд. Я не знал что такое бывает пока не начал трекать. Это был деплой через SSH с несколькими retry-циклами - всё правильно работало, просто долго.

Контекстное окно появился после странного поведения агента в длинных сессиях. Пока я писал эту статью - у меня было 744K токенов в контексте. Это выше красной зоны. Живой пример того о чём пишу.

Субагенты появился чтобы понимать параллелизацию. За текущую сессию: 198 API вызовов, 135 субагентов - 0.68 субагента на запрос. Когда этот показатель резко растёт без роста задач - агент не справляется сам и делегирует всё подряд.

mem0 hit rate появился чтобы понимать работает ли память вообще. 2 поиска, 2 хита, 0 сбросов. Если бы хиты были 0 при активных поисках - значит память пустая или сломанная.

Реальные данные за неделю:

День API вызовов Avg latency Cost ($) Без кеша ($)
24 мар 92 71s 20.7 128
25 мар 123 30s 17.6 117
26 мар 164 27s 23.6 154
27 мар 36 139s 18.6 138
28 мар 79 50s 28.3 210
29 мар 27 147s 17.5 126
30 мар 20 51s 7.0 51

Итого за неделю: 541 вызов, $133 с кешем, $924 без. Cache ratio 97.5%.


Как реализовать минимально

Всё в двух JSON-файлах: session_stats.json (текущая сессия) и daily_stats.json (7 дней). Никаких зависимостей.

TypeScript
interface SessionStats {
  inputTokens: number;
  outputTokens: number;
  cacheReadTokens: number;
  cacheCreateTokens: number;
  apiCalls: number;
  sessionStartTime: number;
  fastestRequestMs: number;
  slowestRequestMs: number;
  totalRequestMs: number;
  totalRequests: number;
  subagentCount: number;
  mem0Searches: number;
  mem0Hits: number;
  lastContextWindow: number;
}

После каждого API-ответа - обновить, записать на диск. По команде /stats - сформатировать и вернуть. 50 строк кода. Потом, когда поймёшь что именно смотришь - можно добавить OpenObserve или LangSmith.


Куда двигаться дальше

Индустрия стандартизируется на трёх слоях: traces (полный путь: промпт > tool calls > ответ), metrics (агрегаты: производительность, стоимость), events (алерты). Gartner прогнозирует что к 2028 году 60% инженерных команд будут использовать AI observability платформы - против 18% сейчас.

Но пять чисел в файле - это база. Без неё платформа не поможет.