El prompt caching de Anthropic resuelve un problema concreto: si tienes un system prompt largo o un documento de referencia que envías en cada llamada, estás pagando por tokenizar ese contexto en cada request. Con caching, lo tokenizas una vez y las llamadas posteriores cuestan 90% menos para esa parte.

Cómo funciona

Marcas un fragmento del prompt con cache_control: { type: "ephemeral" }. En la primera llamada, Anthropic tokeniza ese fragmento y lo guarda en caché durante 5 minutos (renovable). En las llamadas siguientes dentro de esa ventana, cobran $0.30 por millón de tokens en lugar de $3.

La primera llamada (cache miss) cuesta $3.75 por millón de tokens de entrada, un poco más que el precio estándar. Pero si haces varias llamadas en 5 minutos con el mismo contexto, el ahorro es inmediato.

Implementación básica: system prompt cacheado

import Anthropic from '@anthropic-ai/sdk';

const client = new Anthropic();

const SYSTEM_PROMPT = `
  Eres un asistente técnico especializado en React y TypeScript.
  
  Sigue estas guías de estilo:
  - Usa componentes funcionales, nunca clases
  - Los hooks personalizados empiezan con 'use'
  - Tipar siempre con TypeScript estricto
  - Documenta los props con JSDoc
  
  [...documento de guías de estilo muy largo...]
`;

const response = await client.messages.create({
  model: 'claude-3-5-sonnet-20241022',
  max_tokens: 1024,
  system: [
    {
      type: 'text',
      text: SYSTEM_PROMPT,
      cache_control: { type: 'ephemeral' }  // Cachea este bloque
    }
  ],
  messages: [
    { role: 'user', content: '¿Cómo creo un hook para fetch de datos?' }
  ]
});

Cachear documentos de referencia en el prompt de usuario

const documentoEspecificacion = await fs.readFile('especificacion.md', 'utf-8');

const response = await client.messages.create({
  model: 'claude-3-5-sonnet-20241022',
  max_tokens: 2048,
  messages: [
    {
      role: 'user',
      content: [
        {
          type: 'text',
          text: `Aquí está la especificación del proyecto:\n\n${documentoEspecificacion}`,
          cache_control: { type: 'ephemeral' }
        },
        {
          type: 'text',
          text: '¿Cuáles son los endpoints de autenticación definidos?'
        }
      ]
    }
  ]
});

Cachear definiciones de herramientas

Si usas muchas herramientas con definiciones largas:

const tools = [
  {
    name: 'consultar_base_datos',
    description: 'Ejecuta consultas SQL...',
    input_schema: { /* schema largo */ },
  },
  // ... más herramientas
];

const response = await client.messages.create({
  model: 'claude-3-5-sonnet-20241022',
  max_tokens: 1024,
  tools: tools.map((tool, i) => ({
    ...tool,
    // Marcar el último tool para cachear todo el bloque
    ...(i === tools.length - 1 ? { cache_control: { type: 'ephemeral' } } : {})
  })),
  messages: [{ role: 'user', content: 'Lista los usuarios activos' }]
});

Verificar si el cache funcionó

const response = await client.messages.create({ ... });

console.log({
  input_tokens: response.usage.input_tokens,
  cache_creation_tokens: response.usage.cache_creation_input_tokens,
  cache_read_tokens: response.usage.cache_read_input_tokens,
});

// Si cache_read_tokens > 0, el cache funcionó

Cuándo vale la pena implementarlo

  • System prompts de más de 1.000 tokens que se usan frecuentemente
  • Documentos de referencia que se incluyen en múltiples llamadas
  • Conversaciones con contexto fijo largo que se reutiliza
  • Definiciones de herramientas extensas

Con less de 1.000 tokens el ahorro es mínimo. Para llamadas únicas también.


Fuentes: Documentación oficial de Prompt Caching de Anthropic, guía de optimización de costes.