Suivre l'utilisation de jetons par un modèle tiers

Vous pouvez calculer la consommation de jetons par modèle, jour et utilisateur pour les modèles tiers dans les outils pour les développeurs d'IA, tels que Anthropic Claude Opus 5.5 et Anthropic Claude Sonnet 5.5, à l'aide de Cloud Logging et d'Analyse de l'observabilité.

Guide de démarrage rapide

Si le bucket de journaux _Default de votre projet est déjà mis à niveau pour Analyse de l'observabilité, exécutez la requête suivante dans Journalisation > Analyse de l'observabilité (en remplaçant [PROJECT_ID] par l'ID de votre projet Google Cloud ) pour obtenir l'utilisation de jetons sur 30 jours pour les modèles Anthropic tiers :

SELECT
  JSON_VALUE(labels.model) AS model,
  COUNT(*) AS requests,
  SUM(SAFE_CAST(JSON_VALUE(json_payload.metadata.promptTokenCount) AS INT64)) AS input_tokens,
  SUM(SAFE_CAST(JSON_VALUE(json_payload.metadata.candidatesTokenCount) AS INT64)) AS output_tokens,
  IFNULL(SUM(SAFE_CAST(JSON_VALUE(json_payload.metadata.cachedContentTokenCount) AS INT64)), 0) AS cached_tokens,
  IFNULL(SUM(SAFE_CAST(JSON_VALUE(json_payload.metadata.thoughtsTokenCount) AS INT64)), 0) AS thoughts_tokens,
  SUM(SAFE_CAST(JSON_VALUE(json_payload.metadata.totalTokenCount) AS INT64)) AS total_tokens
FROM
  `[PROJECT_ID].global._Default._Default`
WHERE
  log_id = "businessaicode.googleapis.com/inference_response"
  AND JSON_VALUE(labels.model_provider) = "Anthropic"
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  model
ORDER BY
  total_tokens DESC

Avant de commencer

Avant d'exécuter les étapes du tutoriel, assurez-vous que votre projet répond aux exigences suivantes :

  • La journalisation des métadonnées est activée. Les contrôles de l'administrateur de vos outils pour les développeurs d'IA doivent être activés pour la journalisation des métadonnées afin que les enregistrements inference_response incluent le bloc de jetons jsonPayload.metadata.
  • Vous disposez au moins du rôle Visionneuse de journaux (roles/logging.viewer). Le rôle standard roles/logging.viewer accorde un accès SQL à la vue de journaux _Default._Default utilisée tout au long de ce guide. Pour interroger la vue _Default._AllLogs, vous devez disposer de roles/logging.privateLogViewer ou roles/logging.viewAccessor.
  • Votre bucket de journaux _Default a été mis à niveau pour l'Analyse de l'observabilité.
    1. Dans la console Google Cloud , accédez à Journalisation > Stockage des journaux, recherchez le bucket_Default et consultez la colonne Analyse de l'observabilité.
    2. Si ce n'est pas le cas, cliquez sur Plus > Mettre à niveau pour utiliser l'Analyse de l'observabilité. La mise à niveau modifie _Default sur place et est irréversible.
    3. Laissez le temps à la propagation initiale : après la mise à niveau d'un bucket, Cloud Logging met entre 30 et 60 minutes pour actualiser les caches de routage pour les nouvelles entrées de journal, et plusieurs heures pour remplir les journaux historiques (le remplissage commence une heure après la fin de la mise à niveau).

Structure de l'enregistrement du journal

Chaque appel d'inférence émet une seule entrée InferenceResponseLog dans le journal businessaicode.googleapis.com%2Finference_response. L'identité du modèle est enregistrée dans labels et le nombre de jetons est enregistré dans jsonPayload.metadata :

{
  "logName": "projects/[PROJECT_ID]/logs/businessaicode.googleapis.com%2Finference_response",
  "timestamp": "2026-10-07T17:23:03.495323480Z",
  "labels": {
    "model": "claude-sonnet-5-5",
    "model_provider": "Anthropic",
    "client_name": "antigravity_cli",
    "user_id": "user:user@example.com",
    "trajectory_id": "25cd0b58-58ea-4beb-b2d7-42e0d3fdd96d",
    "request_id": "25cd0b58-58ea-4beb-b2d7-42e0d3fdd96d-19"
  },
  "jsonPayload": {
    "@type": "type.googleapis.com/google.cloud.businessaicode.logging.v1.InferenceResponseLog",
    "metadata": {
      "promptTokenCount": "70825",
      "cachedContentTokenCount": "69079",
      "candidatesTokenCount": "14215",
      "totalTokenCount": "85040"
    }
  }
}

Documentation de référence sur les champs et règles de comptabilisation

Champ LogEntry (explorateur de journaux et métriques basées sur les journaux) Expression SQL (Analyse de l'observabilité) Description
labels.model JSON_VALUE(labels.model) Identifiant du modèle (par exemple, claude-sonnet-5-5 pour Anthropic Claude Sonnet 5.5 ou claude-opus-5-5 pour Anthropic Claude Opus 5.5).
labels.model_provider JSON_VALUE(labels.model_provider) Nom du fournisseur (par exemple, Anthropic ou Google).
labels.user_id JSON_VALUE(labels.user_id) Principal authentifié (par exemple, user:user@example.com).
labels.trajectory_id JSON_VALUE(labels.trajectory_id) ID de la conversation ou de la trajectoire de l'agent. Un tour d'utilisateur s'étend généralement sur plusieurs appels request_id sous un même trajectory_id.
jsonPayload.metadata.promptTokenCount SAFE_CAST(JSON_VALUE(json_payload.metadata.promptTokenCount) AS INT64) Nombre total de jetons d'entrée pour l'appel (y compris les jetons mis en cache).
jsonPayload.metadata.cachedContentTokenCount SAFE_CAST(JSON_VALUE(json_payload.metadata.cachedContentTokenCount) AS INT64) Sous-ensemble de promptTokenCount diffusé à partir du cache de requêtes. Omettez-le s'il est nul. N'ajoutez pas à promptTokenCount ni à totalTokenCount.
jsonPayload.metadata.candidatesTokenCount SAFE_CAST(JSON_VALUE(json_payload.metadata.candidatesTokenCount) AS INT64) Jetons de sortie générés par le modèle.
jsonPayload.metadata.thoughtsTokenCount SAFE_CAST(JSON_VALUE(json_payload.metadata.thoughtsTokenCount) AS INT64) Jetons de raisonnement, le cas échéant. Omitted for Anthropic models.
jsonPayload.metadata.totalTokenCount SAFE_CAST(JSON_VALUE(json_payload.metadata.totalTokenCount) AS INT64) Total faisant autorité pour l'appel. Équivaut à promptTokenCount + candidatesTokenCount (+ thoughtsTokenCount si disponible).

Étape 1 : Vérifiez les journaux entrants dans l'explorateur de journaux

Avant d'exécuter des requêtes SQL, vérifiez que les enregistrements inference_response avec des métadonnées de jeton arrivent dans votre projet :

  1. Dans la console Google Cloud , ouvrez Logging > Explorateur de journaux.
  2. Collez la requête suivante dans l'éditeur de requête, en remplaçant [PROJECT_ID] par l'ID de votre projet :

    logName="projects/[PROJECT_ID]/logs/businessaicode.googleapis.com%2Finference_response"
    labels.model_provider="Anthropic"
    
  3. Cliquez sur Exécuter la requête.

  4. Dans le volet Champs de journaux, cliquez sur model pour afficher la répartition des requêtes entre les modèles Anthropic. Cette vue comptabilise les requêtes, et non les jetons.

Étape 2 : Additionner les jetons par modèle dans Analyse de l'observabilité

  1. Dans la console Google Cloud , ouvrez Logging > Analyse de l'observabilité.
  2. Définissez le sélecteur de période sur 30 derniers jours (le sélecteur de période limite les résultats de votre requête en plus de votre clause WHERE SQL).
  3. Collez et exécutez la requête suivante en remplaçant [PROJECT_ID] par l'ID de votre projet :

    SELECT
      JSON_VALUE(labels.model) AS model,
      COUNT(*) AS requests,
      SUM(SAFE_CAST(JSON_VALUE(json_payload.metadata.promptTokenCount) AS INT64)) AS input_tokens,
      SUM(SAFE_CAST(JSON_VALUE(json_payload.metadata.candidatesTokenCount) AS INT64)) AS output_tokens,
      IFNULL(SUM(SAFE_CAST(JSON_VALUE(json_payload.metadata.cachedContentTokenCount) AS INT64)), 0) AS cached_tokens,
      IFNULL(SUM(SAFE_CAST(JSON_VALUE(json_payload.metadata.thoughtsTokenCount) AS INT64)), 0) AS thoughts_tokens,
      SUM(SAFE_CAST(JSON_VALUE(json_payload.metadata.totalTokenCount) AS INT64)) AS total_tokens
    FROM
      `[PROJECT_ID].global._Default._Default`
    WHERE
      log_id = "businessaicode.googleapis.com/inference_response"
      AND JSON_VALUE(labels.model_provider) = "Anthropic"
      AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
    GROUP BY
      model
    ORDER BY
      total_tokens DESC
    

Étape 3 : Recettes SQL courantes

Utilisez les requêtes SQL suivantes dans Journalisation > Analyse de l'observabilité pour analyser les tendances quotidiennes des jetons et l'attribution des jetons par utilisateur.

Tendance quotidienne des jetons par modèle

SELECT
  TIMESTAMP_TRUNC(timestamp, DAY) AS day,
  JSON_VALUE(labels.model) AS model,
  COUNT(*) AS requests,
  SUM(SAFE_CAST(JSON_VALUE(json_payload.metadata.totalTokenCount) AS INT64)) AS total_tokens
FROM
  `[PROJECT_ID].global._Default._Default`
WHERE
  log_id = "businessaicode.googleapis.com/inference_response"
  AND JSON_VALUE(labels.model_provider) = "Anthropic"
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  day, model
ORDER BY
  day DESC, total_tokens DESC

Attribution par utilisateur et par modèle

SELECT
  JSON_VALUE(labels.user_id) AS user_id,
  JSON_VALUE(labels.model) AS model,
  COUNT(*) AS requests,
  SUM(SAFE_CAST(JSON_VALUE(json_payload.metadata.totalTokenCount) AS INT64)) AS total_tokens
FROM
  `[PROJECT_ID].global._Default._Default`
WHERE
  log_id = "businessaicode.googleapis.com/inference_response"
  AND JSON_VALUE(labels.model_provider) = "Anthropic"
  AND JSON_VALUE(labels.user_id) IS NOT NULL
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  user_id, model
ORDER BY
  total_tokens DESC

Étape 4 : Épingler à un tableau de bord Cloud Monitoring

Deux options s'offrent à vous pour créer des tableaux de bord, selon que vous ayez besoin de répartitions SQL historiques ou ponctuelles, ou d'une métrique continue légère :

Méthode Application idéale Conserver l'historique au-delà de 30 jours ? Compatible avec le regroupement user_id ?
Option A : Enregistrer un graphique SQL depuis Analyse de l'observabilité Tableaux et graphiques quotidiens, par modèle et par utilisateur, sans configuration de métrique Limitée par la durée de conservation du bucket de journaux (30 jours par défaut) Oui (aucune limite de cardinalité)
Option B : Métrique de distribution basée sur les journaux Séries temporelles de surveillance continue et alertes sur les libellés à faible cardinalité Oui (stockées dans Monitoring) Non (la cardinalité élevée épuise le quota de métriques)

Option A : Enregistrer directement depuis Analyse de l'observabilité

  1. Exécutez la requête de l'étape 2 ou la requête Tendance quotidienne des jetons par modèle dans Analyse de l'observabilité.
  2. Passez du volet des résultats Tableau à Graphique si vous souhaitez obtenir une série temporelle ou un graphique à barres visuels.
  3. Dans la barre d'outils du volet des résultats, cliquez sur Enregistrer dans le tableau de bord, puis choisissez un tableau de bord Monitoring existant ou créez-en un.

Option B : Créer une métrique de distribution basée sur les journaux

  1. Dans la console Google Cloud , accédez à Logging > Métriques basées sur les journaux, puis cliquez sur Créer une métrique.
  2. Sélectionnez Distribution comme type de métrique.
  3. Collez la requête de l'étape 1 dans le champ Filtre, puis définissez Nom du champ sur jsonPayload.metadata.totalTokenCount.
  4. Ajoutez deux libellés :
    • model mappé sur labels.model
    • model_provider mappé sur labels.model_provider

Étapes suivantes