_lib/anthropic.ts — Helper compartido Haiku 4.5
{“sources”: [{“type”:“code”,“ref”:“functions/_lib/anthropic.ts”,“last_seen”:“2026-08-28”},{“type”:“code”,“ref”:“functions/api/mcp/handlers/wiki.ts”,“last_seen”:“2026-05-22”},{“type”:“commit”,“ref”:“e7395bc0b5a1c3fcb93c2bde018c65705091f3fa”},{“type”:“commit”,“ref”:“c0984be35b79bfeb3b41de4946b00d623a0ef1e5”}], “content”: ”# _lib/anthropic.ts — Helper compartido Haiku 4.5\n\n## Qué es\n\nMódulo utilitario de Cloudflare Workers que encapsula la llamada directa a la API de Anthropic (Haiku 4.5) mediante fetch. Extraído de wiki.ts en la sesión s79 (22-05-2026) para evitar duplicar la lógica en biblioteca.ts al añadir bib_explain_node.\n\n> Motivo del no-SDK: Cloudflare Workers no soporta el bundle de @anthropic-ai/sdk. Se usa fetch directo con prompt caching activado por defecto.\n\n---\n\n## API pública\n\n### callAnthropicHaiku(apiKey, systemPrompt, userMessage, maxTokens)\n\nRealiza una llamada POST a https://api.anthropic.com/v1/messages con el modelo claude-haiku-4-5.\n\n- Prompt caching: el systemPrompt se envía con cache_control: { type: \"ephemeral\" } (TTL 5 min, descuento ~90% si ≥1024 tokens).\n- Retorna HaikuResponse { text, tokens, inputTokens, outputTokens }.\n- Lanza Error si res.ok === false (incluye los primeros 200 chars del body en el mensaje).\n\ntypescript\nexport interface HaikuResponse {\n text: string;\n tokens: number;\n inputTokens: number;\n outputTokens: number;\n}\n\n\n### haikuCostUsd(inputTokens, outputTokens)\n\nCalcula el coste estimado en USD usando los precios oficiales de Haiku 4.5 (corregidos 28-08-2026, task #275):\n- Input: $0.001 / 1K tokens ($1 / millón)\n- Output: $0.005 / 1K tokens ($5 / millón)\n\n> Hasta el 28-08-2026 la constante llevaba los precios de Haiku 3.5 ($0.0008 / $0.004 por 1K), heredados sin revisar al pasar a Haiku 4.5 en s79. bib_wiki_log infravaloraba el gasto real en Haiku un ~17% frente a la factura de la consola de Anthropic. Fix: commit e7395bc0.\n\n### parseJsonFromLLM<T>(text)\n\nExtractor JSON tolerante: maneja la tendencia de Haiku a envolver la respuesta en bloques ```json. Hace strip de los fences antes de JSON.parse. Genérico — retorna T (default Record<string, unknown>).\n\n---\n\n## Consumidores actuales\n\n| Archivo | Uso |\n|---|---|\n| functions/api/mcp/handlers/wiki.ts | callAnthropicHaiku, haikuCostUsd, parseJsonFromLLM — triage de wiki_archive_answer y wiki_curator_review |\n| functions/api/mcp/handlers/biblioteca.ts | callAnthropicHaiku, haikuCostUsd — bib_explain_node, bib_assign_layers, bib_generate_tour |\n\n---\n\n## Historial\n\n| Sesión | Cambio |\n|---|---|\n| s60 (13-05-2026) | callAnthropicHaiku introducido inline en wiki.ts con prompt caching |\n| s79 (22-05-2026) | Extraído a _lib/anthropic.ts; parseJsonFromLLM añadida; haikuCostUsd tipada como exportación; wiki.ts actualizado para importar desde _lib (-65 LOC neto) |\n| 28-08-2026 (task #275, commit e7395bc0) | haikuCostUsd corregida a los precios reales de Haiku 4.5 ($0.001/$0.005 por 1K); llevaba desde s79 con los precios de Haiku 3.5, infravalorando el gasto ~17% |\n\n---\n\n## Dependencias y restricciones\n\n- Env var requerida: ANTHROPIC_API_KEY (inyectada como binding en el Worker). Si falta, los handlers devuelven { error: 'ANTHROPIC_API_KEY no configurada' } sin llamar a este módulo.\n- Env var opcional: GH_PAT — usada por fetchSourceExcerpt en biblioteca.ts (no parte de este módulo directamente).\n- Sin dependencias de runtime externas: solo fetch nativo del Worker runtime.\n\n---\n\n## Véase también\n\n- [[feature—biblioteca—understand-anything-s79]]\n- [[entity—workspace—handler—biblioteca]]\n- [[entity—workspace—handler—wiki]]\n”}