Loading...
    • Руководство разработчика
    • Справочник API
    • MCP
    • Ресурсы
    • Примечания к выпуску
    Search...
    ⌘K
    Первые шаги
    Введение в ClaudeБыстрый старт
    Модели и цены
    Обзор моделейВыбор моделиЧто нового в Claude 4.6Руководство миграцииУстаревшие моделиЦены
    Разработка с Claude
    Обзор функцийИспользование Messages APIОбработка причин остановкиЛучшие практики промптирования
    Возможности модели
    Extended thinkingAdaptive thinkingУсилиеБыстрый режим (preview)Структурированные выходные данныеЦитированияПотоковая передача сообщенийПакетная обработкаПоддержка PDFРезультаты поискаМногоязычная поддержкаEmbeddingsЗрение
    Инструменты
    ОбзорКак реализовать использование инструментовИнструмент веб-поискаИнструмент веб-загрузкиИнструмент выполнения кодаИнструмент памятиИнструмент BashИнструмент управления компьютеромИнструмент текстового редактора
    Инфраструктура инструментов
    Поиск инструментовПрограммный вызов инструментовПотоковая передача инструментов с детализацией
    Управление контекстом
    Контекстные окнаСжатиеРедактирование контекстаКэширование промптовПодсчет токенов
    Файлы и ресурсы
    Files API
    Agent Skills
    ОбзорБыстрый стартЛучшие практикиSkills для предприятийИспользование Skills с API
    Agent SDK
    ОбзорБыстрый стартTypeScript SDKTypeScript V2 (preview)Python SDKРуководство миграции
    Потоковый вводПотоковая передача ответов в реальном времениОбработка причин остановкиОбработка разрешенийОдобрения пользователей и вводУправление выполнением с помощью hooksУправление сеансамиКонтрольные точки файловСтруктурированные выходные данные в SDKРазмещение Agent SDKБезопасное развертывание AI агентовИзменение системных промптовMCP в SDKПользовательские инструментыПодагенты в SDKКоманды с косой чертой в SDKAgent Skills в SDKОтслеживание затрат и использованияСписки задачПлагины в SDK
    MCP в API
    MCP коннекторУдаленные MCP серверы
    Claude на платформах третьих сторон
    Amazon BedrockMicrosoft FoundryVertex AI
    Инженерия промптов
    ОбзорГенератор промптовИспользование шаблонов промптовУлучшитель промптовБудьте ясны и прямолинейныИспользуйте примеры (многошаговое промптирование)Дайте Claude думать (CoT)Используйте XML тегиДайте Claude роль (системные промпты)Цепочка сложных промптовСоветы для длинного контекстаСоветы для Extended thinking
    Тестирование и оценка
    Определение критериев успехаРазработка тестовых случаевИспользование инструмента оценкиСнижение задержки
    Укрепление защиты
    Снижение галлюцинацийУвеличение согласованности выходных данныхСмягчение jailbreaksПотоковая передача отказовСнижение утечки промптаДержите Claude в образе
    Администрирование и мониторинг
    Обзор Admin APIРезидентность данныхРабочие пространстваUsage and Cost APIClaude Code Analytics APIZero Data Retention
    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. Шаги: Шаг — это одна пара запрос/ответ между вашим приложением и Claude
    2. Сообщения: Отдельные сообщения в пределах шага (текст, использование инструментов, результаты инструментов)
    3. Использование: Данные о потреблении токенов, прикрепленные к сообщениям помощника

    Структура отчетности об использовании

    Последовательное и параллельное использование инструментов

    Когда Claude выполняет инструменты, отчетность об использовании различается в зависимости от того, выполняются ли инструменты последовательно или параллельно:

    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)}`);

    Обработка граничных случаев

    Несоответствия в выходных токенах

    В редких случаях вы можете заметить различные значения output_tokens для сообщений с одинаковым ID. Когда это происходит:

    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);
        
        // Обновить итоги пользователя
        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?

    • Понимание использования токенов
    • Ключевые концепции
    • Структура отчетности об использовании
    • Последовательное и параллельное использование инструментов
    • Пример потока сообщений
    • Важные правила использования
    • 1. Одинаковый ID = Одинаковое использование
    • 2. Взимайте плату один раз за шаг
    • 3. Сообщение результата содержит кумулятивное использование
    • 4. Разбивка использования по моделям
    • Реализация: Система отслеживания затрат
    • Обработка граничных случаев
    • Несоответствия в выходных токенах
    • Отслеживание токенов кэша
    • Лучшие практики
    • Справочник полей использования
    • Пример: Создание панели выставления счетов
    • Связанная документация