追蹤第三方模型詞元用量

您可以使用 Cloud Logging 和 Observability Analytics,在 AI 開發人員工具中,計算第三方模型 (例如 Anthropic Claude Opus 5.5 和 Anthropic Claude Sonnet 5.5) 的權杖消耗量 (依模型、日期和使用者)。

快速入門導覽課程

如果專案的記錄檔 bucket「_Default」已升級為使用 Observability Analytics,請在「記錄」>「Observability Analytics」中執行下列查詢 (將 [PROJECT_ID] 替換為專案 ID Google Cloud ),即可取得第三方 Anthropic 模型 30 天的權杖用量:

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

事前準備

執行教學課程步驟前,請確認專案符合下列規定:

  • 中繼資料記錄功能已啟用。AI 開發人員工具管理員必須啟用「中繼資料記錄」控制項,inference_response 記錄才會包含 jsonPayload.metadata 權杖區塊。
  • 您至少擁有「記錄檢視器」角色 (roles/logging.viewer)。標準 roles/logging.viewer 角色會授予 SQL 存取權,讓您查看本指南中使用的 _Default._Default 記錄檢視畫面。查詢 _Default._AllLogs 檢視畫面需要 roles/logging.privateLogViewer 或 roles/logging.viewAccessor。
  • 您的 _Default 記錄檔 bucket 已升級,可供 Observability Analytics 使用。
    1. 在 Google Cloud 控制台中,依序前往「Logging」>「Logs Storage」,找出 _Default bucket,然後查看「Observability Analytics」欄。
    2. 如果尚未啟用,請依序點選「更多」>「升級以使用 Observability Analytics」。升級會就地修改 _Default,且無法復原。
    3. 允許初始傳播:升級 bucket 後,Cloud Logging 需要 30 到 60 分鐘來重新整理新記錄項目的路由快取,並需要數小時來回填歷史記錄 (回填作業會在升級完成後 1 小時開始)。

記錄檔記錄的結構

每次推論呼叫都會向 businessaicode.googleapis.com%2Finference_response 記錄檔發出單一 InferenceResponseLog 項目。模型 ID 會記錄在 labels 中,權杖計數則會記錄在 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"
    }
  }
}

欄位參考資料和計數規則

LogEntry 欄位 (Logs Explorer 和記錄指標) SQL 運算式 (Observability Analytics) 說明
labels.model JSON_VALUE(labels.model) 模型 ID (例如 Anthropic Claude Sonnet 5.5 的 claude-sonnet-5-5 或 Anthropic Claude Opus 5.5 的 claude-opus-5-5)。
labels.model_provider JSON_VALUE(labels.model_provider) 供應商名稱 (例如 Anthropic 或 Google)。
labels.user_id JSON_VALUE(labels.user_id) 經過驗證的主體 (例如 user:user@example.com)。
labels.trajectory_id JSON_VALUE(labels.trajectory_id) 對話或服務專員軌跡 ID。一個使用者回合通常會跨越單一 trajectory_id 下的多個 request_id 呼叫。
jsonPayload.metadata.promptTokenCount SAFE_CAST(JSON_VALUE(json_payload.metadata.promptTokenCount) AS INT64) 通話的輸入詞元總數 (包括快取詞元)。
jsonPayload.metadata.cachedContentTokenCount SAFE_CAST(JSON_VALUE(json_payload.metadata.cachedContentTokenCount) AS INT64) 部分 promptTokenCount是從提示快取提供。如果為零,則會省略。請勿新增至 promptTokenCount 或 totalTokenCount。
jsonPayload.metadata.candidatesTokenCount SAFE_CAST(JSON_VALUE(json_payload.metadata.candidatesTokenCount) AS INT64) 模型生成的輸出內容詞元。
jsonPayload.metadata.thoughtsTokenCount SAFE_CAST(JSON_VALUE(json_payload.metadata.thoughtsTokenCount) AS INT64) 推論權杖 (如適用)。Anthropic 模型不適用。
jsonPayload.metadata.totalTokenCount SAFE_CAST(JSON_VALUE(json_payload.metadata.totalTokenCount) AS INT64) 通話的權威總計。等於 promptTokenCount + candidatesTokenCount (如有則為 + thoughtsTokenCount)。

步驟 1:在 Logs Explorer 中驗證傳入的記錄

執行 SQL 查詢前,請先確認含有權杖中繼資料的 inference_response 記錄是否已送達專案:

  1. 在 Google Cloud 控制台中,依序開啟「記錄」>「記錄檔探索工具」。
  2. 將下列查詢貼到查詢編輯器,並將 [PROJECT_ID] 替換成您的專案 ID:

    logName="projects/[PROJECT_ID]/logs/businessaicode.googleapis.com%2Finference_response"
    labels.model_provider="Anthropic"
    
  3. 點選「執行查詢」。

  4. 在「記錄檔欄位」窗格中,按一下「model」,即可查看 Anthropic 模型的要求分配情形。這項檢視畫面會計算要求,而非權杖。

步驟 2:在 Observability Analytics 中依模型加總權杖

  1. 在 Google Cloud 控制台中,開啟「記錄」>「Observability Analytics」。
  2. 將「日期範圍選取器」設為「過去 30 天」 (日期範圍選取器會限制查詢結果,SQL WHERE 子句也會限制查詢結果)。
  3. 貼上下列查詢並執行,將 [PROJECT_ID] 替換為您的專案 ID:

    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
    

步驟 3:常見的 SQL 查詢範本

在「記錄」>「Observability Analytics」中,使用下列 SQL 查詢分析每日權杖趨勢和每位使用者的權杖歸因。

各模型的每日詞元趨勢

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

依使用者和依模型歸因

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

步驟 4:釘選至 Cloud Monitoring 資訊主頁

您可以選擇兩種方式建立資訊主頁,具體取決於您需要歷史或臨時 SQL 細目,還是輕量級的連續指標:

做法 適用情境 保留超過 30 天的記錄? 是否支援 user_id 分組?
選項 A:從 Observability Analytics 儲存 SQL 圖表 無須設定指標,即可查看各模型、每日和每位使用者的表格和圖表 受記錄 bucket 保留期限 (預設為 30 天) 限制 是 (無基數限制)
方法 B:以記錄為準的分配指標 持續監控時間序列,並針對低基數標籤發出快訊 可以 (儲存在「監控」中) 否 (高基數會用盡指標配額)

方法 A:直接從 Observability Analytics 儲存

  1. 在 Observability Analytics 中,執行步驟 2 的查詢,或「每日依模型劃分的權杖趨勢」查詢。
  2. 如要以視覺化方式呈現時間序列或長條圖,請將結果窗格從「表格」切換為「圖表」。
  3. 在結果窗格工具列中,按一下「儲存至資訊主頁」,然後選擇現有的監控資訊主頁或建立新的資訊主頁。

做法 B:建立記錄分布指標

  1. 在 Google Cloud 控制台,依序前往「Logging」>「記錄指標」,然後點選「Create metric」。
  2. 選取「發布」做為指標類型。
  3. 將步驟 1 中的查詢貼到「篩選器」欄位,並將「欄位名稱」設為 jsonPayload.metadata.totalTokenCount。
  4. 新增兩個標籤:
    • model 對應至「labels.model」
    • model_provider 對應至「labels.model_provider」

後續步驟