Первый вопрос, который возникает после недели работы с кодинг-агентом, — почему счёт растёт быстрее, чем кажется по объёму написанного кода. Ответ лежит в полях usage, которые возвращает API. Токены, за которые платит пользователь, делятся не на два типа, а минимум на пять: обычный ввод (input miss), запись в кэш (cache write), чтение из кэша (cache read), вывод модели (output) и внутренние рассуждения (reasoning). Последние два пункта — главная ловушка. Reasoning-токены не видны в ответе, но тарифицируются по цене output. У моделей с высоким reasoning effort их бывает в несколько раз больше, чем полезного текста.

Порядок цен такой: чтение из кэша стоит примерно на порядок дешевле базовой цены ввода, запись в кэш — дороже обычного ввода, рассуждения стоят как ответ. Точные множители зависят от провайдера и меняются, важна не цифра, а соотношение. Посмотреть распределение можно прямо в ответе API. Anthropic-протокол возвращает отдельные поля input_tokens, output_tokens, cache_creation_input_tokens и cache_read_input_tokens. OpenAI-совместимый протокол прячет то же самое в details: prompt_tokens_details.cached_tokens и completion_tokens_details.reasoning_tokens. В одном из примеров из 234 токенов ответа 230 оказались рассуждениями — полезного текста было четыре токена, слово «работает», а заплатили за 234.

Тип токеновЧто этоПорядок цены
Input (miss)Обычный ввод, который модель видит впервыебазовая
Cache writeВвод, который провайдер положил в кэшдороже базовой
Cache readВвод, найденный в кэшепримерно на порядок дешевле базовой
OutputТо, что модель написалав разы дороже ввода
ReasoningВнутренние рассуждения моделитарифицируется как output

Кэш работает не по «похожим запросам», а по совпадающему префиксу. Совпадать должно начало запроса байт в байт: system prompt, описания инструментов, правила проекта — всё, что идёт первым. Расхождение в одном символе в начале обнуляет весь кэш дальше. У кэша есть TTL, по умолчанию короткий — порядка нескольких минут; у некоторых провайдеров есть опция продлить его за отдельную цену. Кэш привязан к организации и конкретной модели: сменили модель — греете заново. Отсюда типичные способы сжечь деньги на ровном месте: таймстемп или случайный request id в начале system prompt, динамическая сборка списка инструментов в разном порядке, вставка нового контекста в середину вместо конца, долгая пауза в сессии, после которой префикс протухает.

Reasoning-токены не видны в ответе, но оплачиваются по цене output — на рефакторинге их доля доходила до 90%.

Правила, которые срезают расход, сводятся к стабильности префикса. Системный промпт, инструменты и правила проекта не меняются в течение сессии, всё изменяемое уходит в конец. Никаких таймстемпов, счётчиков и случайных id выше по тексту. Если список инструментов собирается кодом, его сортируют детерминированно. Длинные документы передают целиком и один раз, а не кусками в каждом сообщении. Reasoning effort подбирают под задачу: для переименования переменных высокий уровень — деньги на ветер, для архитектурных вопросов наоборот. Уточняющие вопросы вместо переделок дешевле двух кругов правок. Claude стоит подключать только через Anthropic-протокол: через OpenAI-совместимый endpoint часть реализаций теряет поля кэша, и пользователь платит полную цену за то, что могло читаться из кэша.

Минимальный скрипт для замера складывает usage в jsonl и считает два числа: долю чтения из кэша и долю рассуждений в ответе. Ориентир такой: на длинной сессии с агентом доля чтения из кэша должна быть высокой. Если она около нуля, стоит искать, что ломает префикс, — это почти всегда даёт больше экономии, чем переход на модель подешевле. Поведение кэша под высокой параллельностью и точные TTL у разных провайдеров автор не проверял: цифры в документации и на практике иногда расходятся, их стоит мерить самостоятельно.