Продвинутая оптимизация Claude API и управление токенами

Продвинутые приёмы максимизации эффективности Prompt Cache, оптимизации биллинга токенов, длинного контекста и надёжной логики повторов.

На основе отчётов сообщества и публичной обратной разработки. Не сверялось с документацией Anthropic по пунктам; важные детали подтверждайте в официальном Help Center.

Образовательный и диагностический контент: объясняет, как работают сигналы риска, чтобы вы могли понять и проверить свою настройку. Это не совет нарушать правила. Соблюдайте Usage Policy и Terms of Service Anthropic и законы вашей страны; если регион не поддерживается, используйте официально доступную альтернативу.

На этой странице

1. Принципы Prompt Cache и максимизация выгоды

Функция Prompt Caching Anthropic может снизить стоимость на 90% и задержку на 85% для повторяющегося контекста. Понимание поведения кэша критично для оптимизации API:

Правила работы кэша

  • Минимальный размер кэша: кэшируемые блоки должны быть ≥ 1024 tokens. Меньшие блоки не кэшируются.
  • TTL кэша: кэшированный контент истекает после 5 минут без активности. Повторное использование того же кэша в течение 5 минут продлевает TTL.
  • Ключ кэша: кэш ключуется точным совпадением содержимого. Изменение одного символа инвалидирует кэш.
  • Размещение кэша: только сообщения роли system и финальное сообщение user поддерживают кэширование. Промежуточные сообщения кэшировать нельзя.

Оптимальная стратегия кэша

const systemPrompt = `You are an expert software architect...
[Large 5000-token context that rarely changes]`;

// Mark system prompt for caching
const response = await anthropic.messages.create({
  model: "claude-sonnet-4.5-high",
  max_tokens: 2048,
  system: [
    {
      type: "text",
      text: systemPrompt,
      cache_control: { type: "ephemeral" }, // Cache this block
    },
  ],
  messages: [
    { role: "user", content: "Refactor this function..." },
  ],
});

2. Оптимизация биллинга по tokens и управление контекстом

Цены Claude API асимметричны: input tokens дешевле output tokens, а cached tokens на 90% дешевле input tokens. Стройте диалоги так, чтобы максимизировать кэширование:

Сравнение стоимости (Claude Sonnet 4.5 High)

Тип token Стоимость за 1M tokens Относительная стоимость
Output Tokens $15.00 100x
Input Tokens $3.00 20x
Cached Input Tokens $0.30 2x
Cache Write Tokens $3.75 25x

Управление длинным контекстным окном

// Sliding window approach for multi-turn conversations
function maintainContextWindow(history: Message[], maxTokens: number = 180000) {
  let totalTokens = estimateTokenCount(history);
  
  while (totalTokens > maxTokens && history.length > 2) {
    // Remove oldest non-system messages first
    history.splice(1, 2); // Remove one user-assistant pair
    totalTokens = estimateTokenCount(history);
  }
  
  return history;
}

3. Контроль параллелизма и обработка rate limit

Anthropic применяет rate limits на уровне организации. Реализуйте клиентский контроль параллелизма, чтобы избежать ошибок 429:

Rate limiter на основе token bucket

class RateLimiter {
  private tokens: number;
  private lastRefill: number;
  private refillRate: number; // tokens per second
  private capacity: number;

  constructor(requestsPerMinute: number) {
    this.capacity = requestsPerMinute;
    this.tokens = requestsPerMinute;
    this.lastRefill = Date.now();
    this.refillRate = requestsPerMinute / 60;
  }

  async acquire(): Promise {
    this.refill();
    
    while (this.tokens < 1) {
      const waitTime = (1 - this.tokens) / this.refillRate * 1000;
      await new Promise(resolve => setTimeout(resolve, waitTime));
      this.refill();
    }
    
    this.tokens -= 1;
  }

  private refill(): void {
    const now = Date.now();
    const elapsed = (now - this.lastRefill) / 1000;
    this.tokens = Math.min(this.capacity, this.tokens + elapsed * this.refillRate);
    this.lastRefill = now;
  }
}

const limiter = new RateLimiter(50); // 50 requests per minute

async function callClaude(prompt: string) {
  await limiter.acquire();
  return await anthropic.messages.create({...});
}

4. Streaming и лучшие практики повторов

Потоковые ответы сокращают time-to-first-token и позволяют постепенный рендеринг. В сочетании с экспоненциальным backoff это даёт устойчивую обработку ошибок:

Streaming с логикой повторов

async function* streamWithRetry(prompt: string, maxRetries = 3) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    try {
      const stream = await anthropic.messages.stream({
        model: "claude-sonnet-4.5-high",
        max_tokens: 4096,
        messages: [{ role: "user", content: prompt }],
      });

      for await (const chunk of stream) {
        if (chunk.type === "content_block_delta") {
          yield chunk.delta.text;
        }
      }
      
      return; // Success, exit retry loop
      
    } catch (error: any) {
      if (error.status === 529 && attempt < maxRetries - 1) {
        // Overloaded error, retry with backoff
        const delay = Math.min(1000 * Math.pow(2, attempt), 30000);
        await new Promise(resolve => setTimeout(resolve, delay));
      } else {
        throw error;
      }
    }
  }
}