Loading...
    • 開發者指南
    • API 參考
    • MCP
    • 資源
    • 發行說明
    Search...
    ⌘K
    入門
    Claude 簡介快速開始
    模型與定價
    模型概覽選擇模型Claude 4.6 新功能遷移指南模型棄用定價
    使用 Claude 構建
    功能概覽使用 Messages API處理停止原因提示詞最佳實踐
    上下文管理
    上下文視窗壓縮上下文編輯
    功能
    提示詞快取延伸思考自適應思考思考力度串流訊息批次處理引用多語言支援Token 計數嵌入視覺PDF 支援Files API搜尋結果結構化輸出
    工具
    概覽如何實作工具使用細粒度工具串流Bash 工具程式碼執行工具程式化工具呼叫電腦使用工具文字編輯器工具網頁擷取工具網頁搜尋工具記憶工具工具搜尋工具
    Agent Skills
    概覽快速開始最佳實踐企業級 Skills透過 API 使用 Skills
    Agent SDK
    概覽快速開始TypeScript SDKTypeScript V2(預覽版)Python SDK遷移指南
    串流輸入即時串流回應處理停止原因處理權限使用者核准與輸入使用 hooks 控制執行工作階段管理檔案檢查點SDK 中的結構化輸出託管 Agent SDK安全部署 AI 代理修改系統提示詞SDK 中的 MCP自訂工具SDK 中的子代理SDK 中的斜線命令SDK 中的 Agent Skills追蹤成本與用量待辦清單SDK 中的外掛
    API 中的 MCP
    MCP 連接器遠端 MCP 伺服器
    第三方平台上的 Claude
    Amazon BedrockMicrosoft FoundryVertex AI
    提示詞工程
    概覽提示詞產生器使用提示詞範本提示詞改進器清晰直接使用範例(多範例提示)讓 Claude 思考(CoT)使用 XML 標籤賦予 Claude 角色(系統提示詞)串聯複雜提示詞長上下文技巧延伸思考技巧
    測試與評估
    定義成功標準開發測試案例使用評估工具降低延遲
    強化防護機制
    減少幻覺提高輸出一致性防範越獄攻擊串流拒絕減少提示詞洩漏讓 Claude 保持角色
    管理與監控
    Admin API 概覽資料駐留工作區用量與成本 APIClaude Code Analytics API零資料保留
    Console
    Log in
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...

    Solutions

    • AI agents
    • Code modernization
    • Coding
    • Customer support
    • Education
    • Financial services
    • Government
    • Life sciences

    Partners

    • Amazon Bedrock
    • Google Cloud's Vertex AI

    Learn

    • Blog
    • Catalog
    • Courses
    • Use cases
    • Connectors
    • Customer stories
    • Engineering at Anthropic
    • Events
    • Powered by Claude
    • Service partners
    • Startups program

    Company

    • Anthropic
    • Careers
    • Economic Futures
    • Research
    • News
    • Responsible Scaling Policy
    • Security and compliance
    • Transparency

    Learn

    • Blog
    • Catalog
    • Courses
    • Use cases
    • Connectors
    • Customer stories
    • Engineering at Anthropic
    • Events
    • Powered by Claude
    • Service partners
    • Startups program

    Help and security

    • Availability
    • Status
    • Support
    • Discord

    Terms and policies

    • Privacy policy
    • Responsible disclosure policy
    • Terms of service: Commercial
    • Terms of service: Consumer
    • Usage policy
    指南

    追蹤成本與使用量

    了解並追蹤 Claude Agent SDK 中用於計費的 token 使用量

    SDK 成本追蹤

    Claude Agent SDK 為每次與 Claude 的互動提供詳細的 token 使用資訊。本指南說明如何正確追蹤成本並了解使用量報告,特別是在處理平行工具使用和多步驟對話時。

    如需完整的 API 文件,請參閱 TypeScript SDK 參考。

    了解 Token 使用量

    當 Claude 處理請求時,它會在訊息層級報告 token 使用量。這些使用資料對於追蹤成本和適當地向使用者計費至關重要。

    關鍵概念

    1. 步驟(Steps):步驟是您的應用程式與 Claude 之間的單一請求/回應對
    2. 訊息(Messages):步驟中的個別訊息(文字、工具使用、工具結果)
    3. 使用量(Usage):附加在助理訊息上的 token 消耗資料

    使用量報告結構

    單一與平行工具使用

    當 Claude 執行工具時,使用量報告會根據工具是依序執行還是平行執行而有所不同:

    Was this page helpful?

    • 了解 Token 使用量
    • 1. 相同 ID = 相同使用量
    • 2. 每個步驟只收費一次
    • 3. 結果訊息包含累計使用量
    • 4. 按模型的使用量明細
    • 輸出 Token 差異
    • 快取 Token 追蹤
    import { query } from "@anthropic-ai/claude-agent-sdk";
    
    // 範例:在對話中追蹤使用量
    const result = await query({
      prompt: "Analyze this codebase and run tests",
      options: {
        onMessage: (message) => {
          if (message.type === 'assistant' && message.usage) {
            console.log(`Message ID: ${message.id}`);
            console.log(`Usage:`, message.usage);
          }
        }
      }
    });

    訊息流程範例

    以下是典型多步驟對話中訊息和使用量的報告方式:

    <!-- 步驟 1:包含平行工具使用的初始請求 -->
    assistant (text)      { id: "msg_1", usage: { output_tokens: 100, ... } }
    assistant (tool_use)  { id: "msg_1", usage: { output_tokens: 100, ... } }
    assistant (tool_use)  { id: "msg_1", usage: { output_tokens: 100, ... } }
    assistant (tool_use)  { id: "msg_1", usage: { output_tokens: 100, ... } }
    user (tool_result)
    user (tool_result)
    user (tool_result)
    
    <!-- 步驟 2:後續回應 -->
    assistant (text)      { id: "msg_2", usage: { output_tokens: 98, ... } }

    重要的使用量規則

    1. 相同 ID = 相同使用量

    所有具有相同 id 欄位的訊息報告相同的使用量。當 Claude 在同一輪中發送多個訊息(例如文字 + 工具使用)時,它們共享相同的訊息 ID 和使用量資料。

    // 所有這些訊息具有相同的 ID 和使用量
    const messages = [
      { type: 'assistant', id: 'msg_123', usage: { output_tokens: 100 } },
      { type: 'assistant', id: 'msg_123', usage: { output_tokens: 100 } },
      { type: 'assistant', id: 'msg_123', usage: { output_tokens: 100 } }
    ];
    
    // 每個唯一訊息 ID 只收費一次
    const uniqueUsage = messages[0].usage; // 具有此 ID 的所有訊息都相同

    2. 每個步驟只收費一次

    您應該每個步驟只向使用者收費一次,而不是對每個個別訊息收費。當您看到多個具有相同 ID 的助理訊息時,使用其中任何一個的使用量即可。

    3. 結果訊息包含累計使用量

    最終的 result 訊息包含對話中所有步驟的總累計使用量:

    // 最終結果包含總使用量
    const result = await query({
      prompt: "Multi-step task",
      options: { /* ... */ }
    });
    
    console.log("Total usage:", result.usage);
    console.log("Total cost:", result.usage.total_cost_usd);

    4. 按模型的使用量明細

    結果訊息還包含 modelUsage,它提供權威的按模型使用量資料。與 total_cost_usd 一樣,此欄位是準確的,適合用於計費目的。當使用多個模型時(例如,Haiku 用於子代理,Opus 用於主代理),這特別有用。

    // modelUsage 提供按模型的明細
    type ModelUsage = {
      inputTokens: number
      outputTokens: number
      cacheReadInputTokens: number
      cacheCreationInputTokens: number
      webSearchRequests: number
      costUSD: number
      contextWindow: number
    }
    
    // 從結果訊息中存取
    const result = await query({ prompt: "..." });
    
    // result.modelUsage 是模型名稱到 ModelUsage 的映射
    for (const [modelName, usage] of Object.entries(result.modelUsage)) {
      console.log(`${modelName}: $${usage.costUSD.toFixed(4)}`);
      console.log(`  Input tokens: ${usage.inputTokens}`);
      console.log(`  Output tokens: ${usage.outputTokens}`);
    }

    如需完整的型別定義,請參閱 TypeScript SDK 參考。

    實作:成本追蹤系統

    以下是實作成本追蹤系統的完整範例:

    import { query } from "@anthropic-ai/claude-agent-sdk";
    
    class CostTracker {
      private processedMessageIds = new Set<string>();
      private stepUsages: Array<any> = [];
      
      async trackConversation(prompt: string) {
        const result = await query({
          prompt,
          options: {
            onMessage: (message) => {
              this.processMessage(message);
            }
          }
        });
        
        return {
          result,
          stepUsages: this.stepUsages,
          totalCost: result.usage?.total_cost_usd || 0
        };
      }
      
      private processMessage(message: any) {
        // 只處理具有使用量的助理訊息
        if (message.type !== 'assistant' || !message.usage) {
          return;
        }
        
        // 如果已經處理過此訊息 ID 則跳過
        if (this.processedMessageIds.has(message.id)) {
          return;
        }
        
        // 標記為已處理並記錄使用量
        this.processedMessageIds.add(message.id);
        this.stepUsages.push({
          messageId: message.id,
          timestamp: new Date().toISOString(),
          usage: message.usage,
          costUSD: this.calculateCost(message.usage)
        });
      }
      
      private calculateCost(usage: any): number {
        // 在此實作您的定價計算
        // 這是一個簡化的範例
        const inputCost = usage.input_tokens * 0.00003;
        const outputCost = usage.output_tokens * 0.00015;
        const cacheReadCost = (usage.cache_read_input_tokens || 0) * 0.0000075;
        
        return inputCost + outputCost + cacheReadCost;
      }
    }
    
    // 使用方式
    const tracker = new CostTracker();
    const { result, stepUsages, totalCost } = await tracker.trackConversation(
      "Analyze and refactor this code"
    );
    
    console.log(`Steps processed: ${stepUsages.length}`);
    console.log(`Total cost: $${totalCost.toFixed(4)}`);

    處理邊界情況

    輸出 Token 差異

    在極少數情況下,您可能會觀察到具有相同 ID 的訊息有不同的 output_tokens 值。當這種情況發生時:

    1. 使用最高值 - 群組中的最後一個訊息通常包含準確的總數
    2. 與總成本核對 - 結果訊息中的 total_cost_usd 是權威的
    3. 報告不一致 - 在 Claude Code GitHub 儲存庫提交問題

    快取 Token 追蹤

    使用提示快取時,請分別追蹤這些 token 類型:

    interface CacheUsage {
      cache_creation_input_tokens: number;
      cache_read_input_tokens: number;
      cache_creation: {
        ephemeral_5m_input_tokens: number;
        ephemeral_1h_input_tokens: number;
      };
    }

    最佳實踐

    1. 使用訊息 ID 進行去重:始終追蹤已處理的訊息 ID 以避免重複收費
    2. 監控結果訊息:最終結果包含權威的累計使用量
    3. 實作日誌記錄:記錄所有使用量資料以供稽核和除錯
    4. 優雅地處理失敗:即使對話失敗也要追蹤部分使用量
    5. 考慮串流:對於串流回應,在訊息到達時累積使用量

    使用量欄位參考

    每個使用量物件包含:

    • input_tokens:處理的基本輸入 token 數
    • output_tokens:回應中生成的 token 數
    • cache_creation_input_tokens:用於建立快取條目的 token 數
    • cache_read_input_tokens:從快取讀取的 token 數
    • service_tier:使用的服務層級(例如 "standard")
    • total_cost_usd:以美元計算的總成本(僅在結果訊息中)

    範例:建立計費儀表板

    以下是如何為計費儀表板彙總使用量資料:

    class BillingAggregator {
      private userUsage = new Map<string, {
        totalTokens: number;
        totalCost: number;
        conversations: number;
      }>();
      
      async processUserRequest(userId: string, prompt: string) {
        const tracker = new CostTracker();
        const { result, stepUsages, totalCost } = await tracker.trackConversation(prompt);
        
        // 更新使用者總計
        const current = this.userUsage.get(userId) || {
          totalTokens: 0,
          totalCost: 0,
          conversations: 0
        };
        
        const totalTokens = stepUsages.reduce((sum, step) => 
          sum + step.usage.input_tokens + step.usage.output_tokens, 0
        );
        
        this.userUsage.set(userId, {
          totalTokens: current.totalTokens + totalTokens,
          totalCost: current.totalCost + totalCost,
          conversations: current.conversations + 1
        });
        
        return result;
      }
      
      getUserBilling(userId: string) {
        return this.userUsage.get(userId) || {
          totalTokens: 0,
          totalCost: 0,
          conversations: 0
        };
      }
    }

    相關文件

    • TypeScript SDK 參考 - 完整的 API 文件
    • SDK 概覽 - SDK 入門指南
    • SDK 權限 - 管理工具權限