Optimización avanzada de la API de Claude y gestión de tokens

Técnicas avanzadas para maximizar la eficiencia de Prompt Cache, optimizar la facturación por tokens, gestionar ventanas de contexto largas e implementar lógica de reintentos sólida.

Basado en informes de la comunidad e ingeniería inversa pública. No contrastado punto por punto con la documentación de Anthropic; confirme los detalles importantes en el Centro de ayuda oficial.

Contenido educativo y de diagnóstico: explica cómo funcionan las señales de riesgo para que pueda entender y depurar su propia configuración. No es un consejo para infringir reglas. Siga la Política de uso y los Términos de servicio de Anthropic y las leyes de su país; si su región no está admitida, use una alternativa disponible oficialmente.

En esta página

1. Principios de Prompt Cache y maximización

La función Prompt Caching de Anthropic puede reducir costos un 90% y la latencia un 85% para contexto repetido. Entender el comportamiento de la caché es crítico para optimizar la API:

Reglas de comportamiento de la caché

  • Tamaño mínimo de caché: Los bloques en caché deben ser ≥ 1024 tokens. Bloques más pequeños no se almacenan en caché.
  • TTL de caché: El contenido en caché expira tras 5 minutos de inactividad. Reutilizar la misma caché dentro de 5 minutos extiende el TTL.
  • Clave de caché: La caché se indexa por coincidencia exacta de contenido. Cambiar un solo carácter invalida la caché.
  • Ubicación de caché: Solo los mensajes con rol system y el último mensaje user admiten caché. Los mensajes intermedios no se pueden cachear.

Estrategia óptima de caché

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. Optimización de facturación por tokens y gestión de contexto

El precio de la API de Claude es asimétrico: los tokens de entrada cuestan menos que los de salida, y los tokens en caché cuestan un 90% menos que los de entrada. Estructure las conversaciones para maximizar la caché:

Comparación de costos (Claude Sonnet 4.5 High)

Tipo de token Costo por 1M tokens Costo relativo
Tokens de salida $15.00 100x
Tokens de entrada $3.00 20x
Tokens de entrada en caché $0.30 2x
Tokens de escritura en caché $3.75 25x

Gestión de ventana de contexto largo

// 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. Control de concurrencia y manejo de límites de tasa

Anthropic aplica límites de tasa a nivel de organización. Implemente control de concurrencia en el cliente para evitar errores 429:

Limitador de tasa tipo 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. Salida en streaming y mejores prácticas de reintento

Las respuestas en streaming reducen el tiempo hasta el primer token y permiten renderizado progresivo. Combínelas con retroceso exponencial para un manejo de errores robusto:

Streaming con lógica de reintento

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