Comprendre l’utilisation des tokens
Les SDK TypeScript et Python exposent les mêmes données d’utilisation avec des noms de champs différents :- TypeScript fournit des ventilations de tokens par étape sur chaque message d’assistant (
message.message.id,message.message.usage), le coût par modèle viamodelUsagesur le message de résultat, et un total cumulatif sur le message de résultat. - Python fournit des ventilations de tokens par étape sur chaque message d’assistant (
message.usage,message.message_id), le coût par modèle viamodel_usagesur le message de résultat, et le total accumulé sur le message de résultat (total_cost_usdet dictionnaireusage).
- Appel
query(): une invocation de la fonctionquery()du SDK. Un seul appel peut impliquer plusieurs étapes (Claude répond, utilise des outils, obtient des résultats, répond à nouveau). Chaque appel produit un messageresultà la fin. - Étape : un seul cycle requête/réponse dans un appel
query(). Chaque étape produit des messages d’assistant avec l’utilisation des tokens. - Session : une série d’appels
query()liés par un ID de session (en utilisant l’optionresume). Chaque appelquery()dans une session rapporte son propre coût indépendamment.
query(), avec l’utilisation des tokens rapportée à chaque étape et l’estimation cumulative à la fin :
Chaque étape produit des messages d'assistant
Lorsque Claude répond, il envoie un ou plusieurs messages d’assistant. Dans TypeScript, chaque message d’assistant contient un
BetaMessage imbriqué (accessible via message.message) avec un id et un objet usage avec des comptages de tokens (input_tokens, output_tokens). En Python, la classe de données AssistantMessage expose les mêmes données directement via message.usage et message.message_id. Lorsque Claude utilise plusieurs outils en un seul tour, tous les messages de ce tour partagent le même ID, donc dédupliquez par ID pour éviter le double comptage.Le message de résultat fournit l'estimation cumulative
Lorsque l’appel
query() se termine, le SDK émet un message de résultat avec total_cost_usd et usage cumulatif. Ceci est disponible à la fois dans TypeScript (SDKResultMessage) et Python (ResultMessage). Si vous effectuez plusieurs appels query() (par exemple, dans une session multi-tours), chaque résultat ne reflète que le coût de cet appel individuel. Si vous avez seulement besoin du total estimé, vous pouvez ignorer l’utilisation par étape et lire cette valeur unique.Obtenir le coût total d’une requête
Le message de résultat (TypeScript, Python) marque la fin de la boucle d’agent pour un appelquery(). Il inclut total_cost_usd, le coût estimé cumulatif sur toutes les étapes de cet appel. Cela fonctionne à la fois pour les résultats de succès et d’erreur. Si vous utilisez des sessions pour effectuer plusieurs appels query(), chaque résultat ne reflète que le coût de cet appel individuel.
Les exemples suivants itèrent sur le flux de messages d’un appel query() et impriment le coût total lorsque le message result arrive :
Suivre l’utilisation par étape et par modèle
Les exemples de cette section utilisent les noms de champs TypeScript. En Python, les champs équivalents sontAssistantMessage.usage et AssistantMessage.message_id pour l’utilisation par étape, et ResultMessage.model_usage pour les ventilations par modèle.
Suivre l’utilisation par étape
Chaque message d’assistant contient unBetaMessage imbriqué (accessible via message.message) avec un id et un objet usage avec des comptages de tokens. Lorsque Claude utilise des outils en parallèle, plusieurs messages partagent le même id avec des données d’utilisation identiques. Suivez les ID que vous avez déjà comptés et ignorez les doublons pour éviter des totaux gonflés.
L’exemple suivant accumule les tokens d’entrée et de sortie sur toutes les étapes, en comptant chaque ID de message unique une seule fois :
Ventiler l’utilisation par modèle
Le message de résultat inclutmodelUsage, une carte du nom du modèle aux comptages de tokens et coûts par modèle. Ceci est utile lorsque vous exécutez plusieurs modèles (par exemple, Haiku pour les sous-agents et Opus pour l’agent principal) et que vous souhaitez voir où vont les tokens.
L’exemple suivant exécute une requête et imprime le coût et la ventilation des tokens pour chaque modèle utilisé :
Accumuler les coûts sur plusieurs appels
Chaque appelquery() retourne son propre total_cost_usd. Le SDK ne fournit pas de total au niveau de la session, donc si votre application effectue plusieurs appels query() (par exemple, dans une session multi-tours ou entre différents utilisateurs), accumulez les totaux vous-même.
Les exemples suivants exécutent deux appels query() séquentiellement, ajoutent le total_cost_usd de chaque appel à un total cumulatif, et impriment à la fois le coût par appel et le coût combiné :
Gérer les erreurs, la mise en cache et les divergences de tokens
Pour un suivi précis des coûts, tenez compte des conversations échouées, de la tarification des tokens en cache et des incohérences occasionnelles de rapports.Résoudre les divergences de tokens de sortie
Dans de rares cas, vous pourriez observer différentes valeursoutput_tokens pour les messages avec le même ID. Lorsque cela se produit :
- Utilisez la valeur la plus élevée : le message final d’un groupe contient généralement le total exact.
- Préférez le message de résultat : le
total_cost_usddans le message de résultat reflète l’estimation accumulée du SDK sur toutes les étapes, il est donc plus fiable que de sommer les valeurs par étape vous-même. C’est toujours une estimation et peut différer de votre facture réelle. - Signalez les incohérences : déposez des problèmes sur le référentiel GitHub Claude Code.
Suivre les coûts sur les conversations échouées
Les messages de résultat de succès et d’erreur incluentusage et total_cost_usd. Si une conversation échoue à mi-chemin, vous avez toujours consommé des tokens jusqu’au point d’échec. Lisez toujours les données de coûts du message de résultat quel que soit son subtype.
Suivre les tokens en cache
Le Agent SDK utilise automatiquement la mise en cache des invites pour réduire les coûts sur le contenu répété. Vous n’avez pas besoin de configurer la mise en cache vous-même. L’objet d’utilisation inclut deux champs supplémentaires pour le suivi du cache :cache_creation_input_tokens: tokens utilisés pour créer de nouvelles entrées de cache (facturés à un taux plus élevé que les tokens d’entrée standard).cache_read_input_tokens: tokens lus à partir des entrées de cache existantes (facturés à un taux réduit).
input_tokens pour comprendre les économies de mise en cache. Dans TypeScript, ces champs sont typés sur l’objet Usage. En Python, ils apparaissent comme des clés dans le dictionnaire ResultMessage.usage (par exemple, message.usage.get("cache_read_input_tokens", 0)).
Prolonger le TTL du cache d’invite à une heure
Les entrées de cache écrites par le SDK utilisent un TTL de 5 minutes par défaut lorsque vous vous authentifiez avec une clé API ou que vous exécutez sur Amazon Bedrock, Google Cloud Vertex AI ou Microsoft Foundry. Si votre charge de travail exécute de nombreuses sessions courtes contre le même système d’invite et le même contexte avec des écarts plus longs que 5 minutes entre elles, le cache expire entre les sessions et chaque nouvelle session paie le prix d’entrée complet. Pour demander un TTL d’une heure sur les écritures de cache, définissez la variable d’environnementENABLE_PROMPT_CACHING_1H. Vous pouvez l’exporter dans votre environnement shell ou conteneur, ou la transmettre via options.env.
L’exemple suivant active le TTL d’une heure pour un agent s’exécutant sur Bedrock :
Documentation connexe
- Référence du SDK TypeScript - Documentation complète de l’API
- Aperçu du SDK - Prise en main du SDK
- Permissions du SDK - Gestion des permissions des outils