Loading...
    • 개발자 가이드
    • API 레퍼런스
    • MCP
    • 리소스
    • 릴리스 노트
    Search...
    ⌘K
    시작하기
    Claude 소개빠른 시작
    모델 및 가격
    모델 개요모델 선택Claude 4.6의 새로운 기능마이그레이션 가이드모델 지원 중단가격
    Claude로 구축하기
    기능 개요Messages API 사용중지 사유 처리프롬프트 모범 사례
    컨텍스트 관리
    컨텍스트 윈도우압축컨텍스트 편집
    기능
    프롬프트 캐싱확장 사고적응형 사고노력 수준메시지 스트리밍배치 처리인용다국어 지원토큰 카운팅임베딩비전PDF 지원Files API검색 결과구조화된 출력
    도구
    개요도구 사용 구현 방법세분화된 도구 스트리밍Bash 도구코드 실행 도구프로그래밍 방식 도구 호출컴퓨터 사용 도구텍스트 편집기 도구웹 페치 도구웹 검색 도구메모리 도구도구 검색 도구
    Agent Skills
    개요빠른 시작모범 사례엔터프라이즈용 SkillsAPI로 Skills 사용
    Agent SDK
    개요빠른 시작TypeScript SDKTypeScript V2 (미리보기)Python SDK마이그레이션 가이드
    스트리밍 입력실시간 응답 스트리밍중지 사유 처리권한 처리사용자 승인 및 입력훅으로 실행 제어세션 관리파일 체크포인팅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에서 청구를 위한 토큰 사용량 이해 및 추적

    SDK 비용 추적

    Claude Agent SDK는 Claude와의 각 상호작용에 대한 상세한 토큰 사용량 정보를 제공합니다. 이 가이드에서는 비용을 올바르게 추적하고 사용량 보고를 이해하는 방법을 설명하며, 특히 병렬 도구 사용 및 다단계 대화를 다룰 때 유용합니다.

    전체 API 문서는 TypeScript SDK 레퍼런스를 참조하세요.

    토큰 사용량 이해

    Claude가 요청을 처리할 때, 메시지 수준에서 토큰 사용량을 보고합니다. 이 사용량 데이터는 비용을 추적하고 사용자에게 적절하게 청구하는 데 필수적입니다.

    핵심 개념

    1. 단계(Steps): 단계는 애플리케이션과 Claude 간의 단일 요청/응답 쌍입니다
    2. 메시지(Messages): 단계 내의 개별 메시지 (텍스트, 도구 사용, 도구 결과)
    3. 사용량(Usage): 어시스턴트 메시지에 첨부된 토큰 소비 데이터

    사용량 보고 구조

    단일 vs 병렬 도구 사용

    Claude가 도구를 실행할 때, 도구가 순차적으로 실행되는지 병렬로 실행되는지에 따라 사용량 보고가 달라집니다:

    import { query } from "@anthropic-ai/claude-agent-sdk";
    
    // Example: Tracking usage in a conversation
    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);
          }
        }
      }
    });

    메시지 흐름 예시

    다음은 일반적인 다단계 대화에서 메시지와 사용량이 보고되는 방식입니다:

    <!-- Step 1: Initial request with parallel tool uses -->
    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)
    
    <!-- Step 2: Follow-up response -->
    assistant (text)      { id: "msg_2", usage: { output_tokens: 98, ... } }

    중요한 사용량 규칙

    1. 동일 ID = 동일 사용량

    동일한 id 필드를 가진 모든 메시지는 동일한 사용량을 보고합니다. Claude가 같은 턴에서 여러 메시지를 보낼 때(예: 텍스트 + 도구 사용), 동일한 메시지 ID와 사용량 데이터를 공유합니다.

    // All these messages have the same ID and usage
    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 } }
    ];
    
    // Charge only once per unique message ID
    const uniqueUsage = messages[0].usage; // Same for all messages with this ID

    2. 단계당 한 번만 청구

    사용자에게는 단계당 한 번만 청구해야 합니다, 개별 메시지마다 청구하면 안 됩니다. 동일한 ID를 가진 여러 어시스턴트 메시지가 보이면, 그 중 하나의 사용량을 사용하세요.

    3. 결과 메시지에 누적 사용량 포함

    최종 result 메시지에는 대화의 모든 단계에서 발생한 총 누적 사용량이 포함됩니다:

    // Final result includes total usage
    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 provides per-model breakdown
    type ModelUsage = {
      inputTokens: number
      outputTokens: number
      cacheReadInputTokens: number
      cacheCreationInputTokens: number
      webSearchRequests: number
      costUSD: number
      contextWindow: number
    }
    
    // Access from result message
    const result = await query({ prompt: "..." });
    
    // result.modelUsage is a map of model name to 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) {
        // Only process assistant messages with usage
        if (message.type !== 'assistant' || !message.usage) {
          return;
        }
        
        // Skip if we've already processed this message ID
        if (this.processedMessageIds.has(message.id)) {
          return;
        }
        
        // Mark as processed and record usage
        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 {
        // Implement your pricing calculation here
        // This is a simplified example
        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;
      }
    }
    
    // Usage
    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)}`);

    엣지 케이스 처리

    출력 토큰 불일치

    드문 경우, 동일한 ID를 가진 메시지에서 서로 다른 output_tokens 값을 관찰할 수 있습니다. 이 경우:

    1. 가장 높은 값을 사용하세요 - 그룹의 마지막 메시지가 일반적으로 정확한 총계를 포함합니다
    2. 총 비용과 대조 확인하세요 - 결과 메시지의 total_cost_usd가 권위 있는 값입니다
    3. 불일치를 보고하세요 - Claude Code GitHub 저장소에 이슈를 제출하세요

    캐시 토큰 추적

    프롬프트 캐싱을 사용할 때, 다음 토큰 유형을 별도로 추적하세요:

    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: 처리된 기본 입력 토큰
    • output_tokens: 응답에서 생성된 토큰
    • cache_creation_input_tokens: 캐시 항목 생성에 사용된 토큰
    • cache_read_input_tokens: 캐시에서 읽은 토큰
    • service_tier: 사용된 서비스 티어 (예: "standard")
    • total_cost_usd: 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);
        
        // Update user totals
        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 권한 - 도구 권한 관리

    Was this page helpful?

    • 단일 vs 병렬 도구 사용
    • 1. 동일 ID = 동일 사용량
    • 2. 단계당 한 번만 청구
    • 3. 결과 메시지에 누적 사용량 포함
    • 4. 모델별 사용량 분석