Optimización de Costes API
Caching · Model routing · Batching · cómo bajar tu factura un 70%
Mapa rápido · salta al paso que te interese
Anatomía de los costes: dónde se va tu dinero
El 80% de tu factura viene del 20% de tus llamadas. Antes de optimizar, entendé dónde se va la dinero.
| Modelo | Input/1M tokens | Output/1M tokens | Caso de uso |
|---|---|---|---|
| Claude Opus 4 | $15.00 | $75.00 | Razonamiento complejo |
| Claude Sonnet 4 | $3.00 | $15.00 | Tareas generales |
| Claude Haiku 3.5 | $0.80 | $4.00 | Tareas simples, alto volumen |
| GPT-4.1 | $2.50 | $10.00 | Alternativa a Sonnet |
| GPT-4.1-mini | $0.15 | $0.60 | Tareas simples |
Los 3 errores más caros
- Usar Opus para todo — el 90% de las tareas no necesita el modelo más caro
- Contexto inflado — pasar 10,000 tokens cuando 2,000 bastaban
- Sin cache — la misma query 100 veces = 100x el costo
interface TokenUsage {
input_tokens: number
output_tokens: number
cache_read_tokens?: number
cache_creation_tokens?: number
}
function calculateCost(usage: TokenUsage, model: string): number {
const pricing: Record<string, { input: number; output: number; cache_read: number }> = {
'claude-opus-4-20250514': { input: 15, output: 75, cache_read: 1.5 },
'claude-sonnet-4-20250514': { input: 3, output: 15, cache_read: 0.3 },
'claude-haiku-4-20250514': { input: 0.8, output: 4, cache_read: 0.08 },
}
const p = pricing[model]
if (!p) throw new Error(`Unknown model: ${model}`)
const inputCost = (usage.input_tokens / 1_000_000) * p.input
const outputCost = (usage.output_tokens / 1_000_000) * p.output
const cacheCost = ((usage.cache_read_tokens || 0) / 1_000_000) * p.cache_read
return inputCost + outputCost + cacheCost
}
// Ejemplo: Sonnet con 5000 input, 1000 output
// Input: (5000/1M) * $3 = $0.015
// Output: (1000/1M) * $15 = $0.015
// Total: $0.03 por llamada7 técnicas de optimización
Estas técnicas combinadas pueden bajar tu factura un 70%. Implementalas en orden de impacto.
Claude cachea automáticamente prefijos de prompts. Si tu system prompt + contexto estático es igual entre llamadas, solo pagas 10% del costo.
const response = await anthropic.messages.create({
model: 'claude-sonnet-4-20250514',
max_tokens: 1024,
system: [
{
type: 'text',
text: LARGE_SYSTEM_PROMPT, // Este se cachea
cache_control: { type: 'ephemeral' } // ← la clave
}
],
messages: [{ role: 'user', content: userQuestion }]
})
// Verificar uso de cache
console.log('Cache read:', response.usage.cache_read_input_tokens)
// Si > 0, estás pagando 10% del costo normalTip Pro
Monitoreo y alertas: nunca más facturas sorpresa
Trackeá cada llamada y configura alertas antes de que la factura explote.
interface APICallLog {
timestamp: Date
model: string
input_tokens: number
output_tokens: number
cost_usd: number
endpoint: string
user_id?: string
}
async function trackAPICall(log: APICallLog) {
// Guardar en Supabase
await supabase.from('api_calls').insert(log)
// Check daily budget
const today = new Date().toISOString().split('T')[0]
const { data } = await supabase
.from('api_calls')
.select('cost_usd')
.gte('timestamp', today)
const dailySpend = data?.reduce((sum, row) => sum + row.cost_usd, 0) || 0
// Alert si superamos budget
const DAILY_BUDGET = 50 // USD
if (dailySpend > DAILY_BUDGET * 0.8) {
await sendSlackAlert(`⚠️ API spend at ${dailySpend.toFixed(2)} USD (80% of daily budget)`)
}
if (dailySpend > DAILY_BUDGET) {
await sendSlackAlert(`🔴 API spend exceeded daily budget: ${dailySpend.toFixed(2)} USD`)
}
}| Métrica | Qué monitorear | Alerta si |
|---|---|---|
| Spend diario | Suma de costos | > 80% del budget |
| Tokens por request | Promedio móvil | > 2x del baseline |
| Cache hit rate | hits / total | < 50% |
| Error rate | errores / total | > 5% |
"La factura de API es un síntoma, no el problema. El problema es arquitectura descuidada. Caching, routing, y compresión no son optimizaciones — son higiene básica."
— El Arsenal, Renderz Studio
¿Quieres el sistema completo?
500+ páginas, 25 capítulos, código de producción, acceso a todas las guías del Arsenal.
Curso Completo · €29PayPal · Acceso inmediato