Понимание использования токенов
SDK TypeScript и Python предоставляют одни и те же данные об использовании с разными названиями полей:- TypeScript предоставляет разбивку токенов по шагам для каждого сообщения помощника (
message.message.id,message.message.usage), стоимость для каждой модели черезmodelUsageв результирующем сообщении и совокупный итог в результирующем сообщении. - Python предоставляет разбивку токенов по шагам для каждого сообщения помощника (
message.usage,message.message_id), стоимость для каждой модели черезmodel_usageв результирующем сообщении и накопленный итог в результирующем сообщении (total_cost_usdи словарьusage).
- Вызов
query(): одно вызывание функцииquery()SDK. Один вызов может включать несколько шагов (Claude отвечает, использует инструменты, получает результаты, отвечает снова). Каждый вызов создаёт одно сообщениеresultв конце. - Шаг: один цикл запроса/ответа в пределах вызова
query(). Каждый шаг создаёт сообщения помощника с использованием токенов. - Сессия: серия вызовов
query(), связанных идентификатором сессии (с использованием опцииresume). Каждый вызовquery()в пределах сессии сообщает о своих затратах независимо.
query() с использованием токенов, сообщаемым на каждом шаге и совокупной оценкой в конце:
Каждый шаг создаёт сообщения помощника
Когда Claude отвечает, он отправляет одно или несколько сообщений помощника. В TypeScript каждое сообщение помощника содержит вложенное
BetaMessage (доступное через message.message) с id и объектом usage с подсчётом токенов (input_tokens, output_tokens). В Python класс данных AssistantMessage предоставляет одни и те же данные непосредственно через message.usage и message.message_id. Когда Claude использует несколько инструментов в одном ходу, все сообщения в этом ходу имеют одинаковый ID, поэтому дедублируйте по ID, чтобы избежать двойного подсчёта.Результирующее сообщение предоставляет совокупную оценку
Когда вызов
query() завершается, SDK выдаёт результирующее сообщение с total_cost_usd и совокупным usage. Это доступно как в TypeScript (SDKResultMessage), так и в Python (ResultMessage). Если вы делаете несколько вызовов query() (например, в многошаговой сессии), каждый результат отражает только стоимость этого отдельного вызова. Если вам нужна только предполагаемая сумма, вы можете игнорировать использование по шагам и прочитать это единственное значение.Получение общей стоимости запроса
Результирующее сообщение (TypeScript, Python) отмечает конец цикла агента для вызоваquery(). Оно включает total_cost_usd, совокупную предполагаемую стоимость всех шагов в этом вызове. Это работает как для успешных, так и для ошибочных результатов. Если вы используете сессии для создания нескольких вызовов query(), каждый результат отражает только стоимость этого отдельного вызова.
Следующие примеры перебирают поток сообщений из вызова query() и выводят общую стоимость при поступлении сообщения result:
Отслеживание использования по шагам и по моделям
Примеры в этом разделе используют названия полей TypeScript. В Python эквивалентные поля — этоAssistantMessage.usage и AssistantMessage.message_id для использования по шагам, и ResultMessage.model_usage для разбивки по моделям.
Отслеживание использования по шагам
Каждое сообщение помощника содержит вложенноеBetaMessage (доступное через message.message) с id и объектом usage с подсчётом токенов. Когда Claude использует инструменты параллельно, несколько сообщений имеют одинаковый id с идентичными данными об использовании. Отслеживайте, какие ID вы уже подсчитали, и пропускайте дубликаты, чтобы избежать завышенных итогов.
Следующий пример накапливает входные и выходные токены на всех шагах, считая каждый уникальный ID сообщения только один раз:
Разбивка использования по моделям
Результирующее сообщение включаетmodelUsage, карту имени модели на подсчёты токенов и стоимость для каждой модели. Это полезно, когда вы запускаете несколько моделей (например, Haiku для подагентов и Opus для основного агента) и хотите увидеть, куда идут токены.
Следующий пример запускает запрос и выводит разбивку стоимости и токенов для каждой используемой модели:
Накопление затрат на несколько вызовов
Каждый вызовquery() возвращает свой собственный total_cost_usd. SDK не предоставляет итог на уровне сессии, поэтому если ваше приложение делает несколько вызовов query() (например, в многошаговой сессии или для разных пользователей), накапливайте итоги самостоятельно.
Следующие примеры запускают два вызова query() последовательно, добавляют total_cost_usd каждого вызова к текущему итогу и выводят как стоимость за вызов, так и совокупную стоимость:
Обработка ошибок, кэширования и расхождений в токенах
Для точного отслеживания затрат учитывайте неудачные диалоги, цены на кэшированные токены и случайные несоответствия в отчётах.Разрешение расхождений в выходных токенах
В редких случаях вы можете заметить разные значенияoutput_tokens для сообщений с одинаковым ID. Когда это происходит:
- Используйте наибольшее значение: финальное сообщение в группе обычно содержит точный итог.
- Предпочитайте результирующее сообщение:
total_cost_usdв результирующем сообщении отражает накопленную оценку SDK на всех шагах, поэтому оно более надёжно, чем суммирование значений по шагам самостоятельно. Это всё ещё оценка и может отличаться от вашего фактического счёта. - Сообщайте о несоответствиях: подавайте проблемы в репозитории Claude Code на GitHub.
Отслеживание затрат на неудачные диалоги
Как успешные, так и ошибочные результирующие сообщения включаютusage и total_cost_usd. Если диалог завершится неудачей на полпути, вы всё равно потребили токены до момента отказа. Всегда читайте данные о затратах из результирующего сообщения независимо от его subtype.
Отслеживание кэшированных токенов
Agent SDK автоматически использует кэширование подсказок для снижения затрат на повторяющееся содержимое. Вам не нужно самостоятельно настраивать кэширование. Объект использования включает два дополнительных поля для отслеживания кэша:cache_creation_input_tokens: токены, используемые для создания новых записей кэша (взимаются по более высокой ставке, чем стандартные входные токены).cache_read_input_tokens: токены, прочитанные из существующих записей кэша (взимаются по сниженной ставке).
input_tokens, чтобы понять экономию от кэширования. В TypeScript эти поля типизированы на объекте Usage. В Python они появляются как ключи в словаре ResultMessage.usage (например, message.usage.get("cache_read_input_tokens", 0)).
Расширение TTL кэша подсказок до одного часа
Записи кэша, написанные SDK, используют TTL в 5 минут по умолчанию, когда вы аутентифицируетесь с помощью ключа API или запускаете на Amazon Bedrock, Google Cloud Vertex AI или Microsoft Foundry. Если ваша рабочая нагрузка запускает много коротких сессий против одной и той же системной подсказки и контекста с промежутками более 5 минут между ними, кэш истекает между сессиями и каждая новая сессия платит полную входную цену. Чтобы запросить TTL в 1 час на записи кэша, установите переменную окруженияENABLE_PROMPT_CACHING_1H. Вы можете экспортировать её в окружение вашей оболочки или контейнера, или передать её через options.env.
Следующий пример включает TTL в 1 час для агента, работающего на Bedrock:
Связанная документация
- Справочник TypeScript SDK - Полная документация API
- Обзор SDK - Начало работы с SDK
- Разрешения SDK - Управление разрешениями инструментов