Comprender el uso de tokens
Los SDK de TypeScript y Python exponen los mismos datos de uso con nombres de campo diferentes:- TypeScript proporciona desgloses de tokens por paso en cada mensaje del asistente (
message.message.id,message.message.usage), costo por modelo a través demodelUsageen el mensaje de resultado, y un total acumulativo en el mensaje de resultado. - Python proporciona desgloses de tokens por paso en cada mensaje del asistente (
message.usage,message.message_id), costo por modelo a través demodel_usageen el mensaje de resultado, y el total acumulado en el mensaje de resultado (total_cost_usdy diccionariousage).
- Llamada
query(): una invocación de la funciónquery()del SDK. Una sola llamada puede implicar múltiples pasos (Claude responde, usa herramientas, obtiene resultados, responde nuevamente). Cada llamada produce un mensajeresultal final. - Paso: un ciclo único de solicitud/respuesta dentro de una llamada
query(). Cada paso produce mensajes del asistente con uso de tokens. - Sesión: una serie de llamadas
query()vinculadas por un ID de sesión (usando la opciónresume). Cada llamadaquery()dentro de una sesión reporta su propio costo de forma independiente.
query(), con el uso de tokens reportado en cada paso y la estimación acumulativa al final:
Cada paso produce mensajes del asistente
Cuando Claude responde, envía uno o más mensajes del asistente. En TypeScript, cada mensaje del asistente contiene un
BetaMessage anidado (accesible a través de message.message) con un id y un objeto usage con conteos de tokens (input_tokens, output_tokens). En Python, la clase de datos AssistantMessage expone los mismos datos directamente a través de message.usage y message.message_id. Cuando Claude usa múltiples herramientas en un turno, todos los mensajes en ese turno comparten el mismo ID, así que deduplique por ID para evitar contar dos veces.El mensaje de resultado proporciona la estimación acumulativa
Cuando se completa la llamada
query(), el SDK emite un mensaje de resultado con total_cost_usd y usage acumulativo. Esto está disponible tanto en TypeScript (SDKResultMessage) como en Python (ResultMessage). Si realiza múltiples llamadas query() (por ejemplo, en una sesión de múltiples turnos), cada resultado solo refleja el costo de esa llamada individual. Si solo necesita el total estimado, puede ignorar el uso por paso y leer este valor único.Obtener el costo total de una consulta
El mensaje de resultado (TypeScript, Python) marca el final del bucle del agente para una llamadaquery(). Incluye total_cost_usd, el costo estimado acumulativo en todos los pasos de esa llamada. Esto funciona tanto para resultados de éxito como de error. Si utiliza sesiones para realizar múltiples llamadas query(), cada resultado solo refleja el costo de esa llamada individual.
Los siguientes ejemplos iteran sobre el flujo de mensajes de una llamada query() e imprimen el costo total cuando llega el mensaje result:
Rastrear el uso por paso y por modelo
Los ejemplos en esta sección utilizan nombres de campo de TypeScript. En Python, los campos equivalentes sonAssistantMessage.usage y AssistantMessage.message_id para el uso por paso, y ResultMessage.model_usage para desgloses por modelo.
Rastrear el uso por paso
Cada mensaje del asistente contiene unBetaMessage anidado (accesible a través de message.message) con un id y un objeto usage con conteos de tokens. Cuando Claude usa herramientas en paralelo, múltiples mensajes comparten el mismo id con datos de uso idénticos. Realice un seguimiento de qué ID ya ha contado y omita los duplicados para evitar totales inflados.
El siguiente ejemplo acumula tokens de entrada y salida en todos los pasos, contando cada ID de mensaje único solo una vez:
Desglosar el uso por modelo
El mensaje de resultado incluyemodelUsage, un mapa del nombre del modelo a conteos de tokens y costo por modelo. Esto es útil cuando ejecuta múltiples modelos (por ejemplo, Haiku para suagentes y Opus para el agente principal) y desea ver dónde van los tokens.
El siguiente ejemplo ejecuta una consulta e imprime el costo y desglose de tokens para cada modelo utilizado:
Acumular costos en múltiples llamadas
Cada llamadaquery() devuelve su propio total_cost_usd. El SDK no proporciona un total a nivel de sesión, así que si su aplicación realiza múltiples llamadas query() (por ejemplo, en una sesión de múltiples turnos o entre diferentes usuarios), acumule los totales usted mismo.
Los siguientes ejemplos ejecutan dos llamadas query() secuencialmente, agregan el total_cost_usd de cada llamada a un total acumulado, e imprimen tanto el costo por llamada como el combinado:
Manejar errores, almacenamiento en caché y discrepancias de tokens
Para un rastreo de costos preciso, tenga en cuenta conversaciones fallidas, precios de tokens en caché e inconsistencias ocasionales en los informes.Resolver discrepancias de tokens de salida
En casos raros, puede observar diferentes valores deoutput_tokens para mensajes con el mismo ID. Cuando esto ocurra:
- Utilice el valor más alto: el mensaje final en un grupo típicamente contiene el total preciso.
- Prefiera el mensaje de resultado: el
total_cost_usden el mensaje de resultado refleja la estimación acumulada del SDK en todos los pasos, por lo que es más confiable que sumar valores por paso usted mismo. Sigue siendo una estimación y puede diferir de su factura real. - Reporte inconsistencias: presente problemas en el repositorio de GitHub de Claude Code.
Rastrear costos en conversaciones fallidas
Tanto los mensajes de resultado de éxito como de error incluyenusage y total_cost_usd. Si una conversación falla a mitad de camino, aún consumió tokens hasta el punto de falla. Siempre lea datos de costo del mensaje de resultado independientemente de su subtype.
Rastrear tokens en caché
El SDK del Agente utiliza automáticamente almacenamiento en caché de indicaciones para reducir costos en contenido repetido. No necesita configurar el almacenamiento en caché usted mismo. El objeto de uso incluye dos campos adicionales para rastreo de caché:cache_creation_input_tokens: tokens utilizados para crear nuevas entradas de caché (facturados a una tasa más alta que los tokens de entrada estándar).cache_read_input_tokens: tokens leídos de entradas de caché existentes (facturados a una tasa reducida).
input_tokens para comprender los ahorros de almacenamiento en caché. En TypeScript, estos campos se escriben en el objeto Usage. En Python, aparecen como claves en el diccionario ResultMessage.usage (por ejemplo, message.usage.get("cache_read_input_tokens", 0)).
Extender el TTL de caché de indicaciones a una hora
Las entradas de caché escritas por el SDK utilizan un TTL de 5 minutos de forma predeterminada cuando se autentica con una clave de API o se ejecuta en Amazon Bedrock, Google Cloud Vertex AI o Microsoft Foundry. Si su carga de trabajo ejecuta muchas sesiones cortas contra el mismo indicador del sistema y contexto con brechas más largas que 5 minutos entre ellas, el caché expira entre sesiones y cada nueva sesión paga el precio de entrada completo. Para solicitar un TTL de 1 hora en escrituras de caché, establezca la variable de entornoENABLE_PROMPT_CACHING_1H. Puede exportarla en su entorno de shell o contenedor, o pasarla a través de options.env.
El siguiente ejemplo habilita TTL de 1 hora para un agente que se ejecuta en Bedrock:
Documentación relacionada
- Referencia del SDK de TypeScript - Documentación completa de la API
- Descripción general del SDK - Introducción al SDK
- Permisos del SDK - Gestión de permisos de herramientas