Reduce 60-95% los tokens de tus agentes sin cambiar una línea de código
Headroom es la capa de compresión de contexto para agentes y aplicaciones LLM: comprime salidas de herramientas, logs, chunks RAG, ficheros e historial de conversación antes de que lleguen al modelo. Mismas respuestas, fracción de los tokens. Funciona en cuatro modos — proxy, wrap, librería y MCP — es local-first y reversible (CCR): el agente puede recuperar los originales cuando los necesita. En este curso lo instalas, lo conectas a Claude Code, Codex y tus propias apps, y mides el ahorro real.
Cada turno de un agente de IA reenvía al modelo un contexto que crece sin control: salidas de herramientas (búsquedas de código, respuestas de APIs, logs), chunks de RAG, ficheros leídos, diffs, y todo el historial de la conversación. Ese contexto se paga por token, y además choca con la ventana de contexto del modelo.
Con cargas de trabajo reales de agentes, el desperdicio es enorme. Headroom publica mediciones sobre workloads reales:
| Workload | Antes | Después | Ahorro |
|---|---|---|---|
| Code search (100 resultados) | 17.765 | 1.408 | 92% |
| Debug de incidente SRE | 65.694 | 5.118 | 92% |
| Triage de issue GitHub | 54.174 | 14.761 | 73% |
| Exploración de codebase | 78.502 | 41.254 | 47% |
Y la precisión se conserva: en GSM8K se mantiene exactamente (0.870 → 0.870), y en TruthfulQA incluso sube (+0.030). El ahorro no es "apretar texto a ciegas": es quitar lo que no aporta y comprimir lo que sí aporta de forma estructurada.
Comprimir con un simple "resume el historial" del proveedor pierde fidelidad y rompe el caché KV. Headroom comprime solo la "zona viva" (bytes nuevos) y mantiene el prefijo congelado byte-idéntico para no invalidar el caché del proveedor.
Headroom es una capa que se coloca entre tu agente/app y el proveedor de LLM. Comprime todo lo que el agente lee — prompts, salidas de herramientas, logs, resultados RAG, ficheros e historial — antes de que llegue al modelo. Corre en tu máquina: tus datos no salen de tu equipo (local-first).
El pipeline interno es:
| Componente | Función |
|---|---|
| CacheAligner | Detecta contenido volátil que rompería el prefijo de caché KV del proveedor; nunca reescribe prompts |
| ContentRouter | Detecta el tipo de contenido y selecciona el compresor adecuado |
| SmartCrusher | Compresión estadística de JSON: arrays de dicts, objetos anidados, tipos mixtos (70-90%) |
| CodeCompressor | Compresión AST para Python, JS/TS, Go, Rust, Java, C/C++, Perl (preserva imports, firmas y tipos) |
| Kompress-v2-base | Modelo HuggingFace entrenado con trazas de agentes, para texto/prosa |
| CCR | Compress-Cache-Retrieve: guarda los originales localmente y los recupera bajo demanda |
Se integra de cuatro maneras, según tu caso:
| Modo | Cuándo usarlo | Cambios de código |
|---|---|---|
| Proxy | Cualquier cliente OpenAI-compatible; tráfico de agentes y apps | Cero — solo cambiar la base URL |
| Wrap | Agentes de código: Claude Code, Codex, Cursor, Aider, OpenCode, etc. | Cero — un comando |
| Librería | Tu app Python/TypeScript, inline | Una llamada a compress() |
| MCP | Herramientas headroom_compress, headroom_retrieve, headroom_stats | Cero — instalar servidor MCP |
Headroom requiere Python 3.10+ y se instala con tu gestor favorito. El paquete de PyPI es headroom-ai e incluye el CLI headroom.
CLI aislado en su propio entorno virtual:
uv tool install --python 3.13 "headroom-ai[all]"
Instala en el entorno Python que uses:
pip install "headroom-ai[all]"
Sin CLI, solo la función compress:
npm install headroom-ai
headroom --version
headroom doctor
Los extras se instalan por separado cuando los necesitas: [proxy], [mcp], [ml] (modelo Kompress-v2-base), [code], [memory], [langchain], [agno], [evals]…
Usa Python 3.13 si quieres ver el ahorro en dólares: el tile "Proxy $ Saved" del dashboard usa LiteLLM, que no se instala en Python 3.14+.
Si el proxy no arranca en Docker/QEMU o en VMs antiguas x86, es por la CPU: las features ONNX (detección Magika y relevancia por embeddings) necesitan AVX2. Headroom cae automáticamente a BM25 y detección heurística — no es un error grave.
El modo proxy levanta un endpoint local compatible con OpenAI. Cualquier cliente que apunte su base_url al proxy recibe compresión automática — cero cambios de código.
headroom proxy --port 8787
Luego apunta tu cliente al proxy:
# Python (OpenAI SDK)
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8787/v1", api_key="tu-key")
# CLI
export OPENAI_BASE_URL="http://localhost:8787/v1"
El proxy también puede recortar lo que el modelo escribe de vuelta (los tokens de salida cuestan hasta 5× más):
export HEADROOM_OUTPUT_SHAPER=1 # off por defecto
headroom proxy --port 8787
Los switches del proxy se leen en vivo en cada request. Si usas headroom wrap, los cambios de entorno se sincronizan al proxy en caliente vía POST /admin/runtime-env — sin reiniciar, sin perder cachés.
El modo wrap es la vía más rápida para agentes de código: lanza el proxy local, instala Serena (navegación semántica de código) y arranca tu agente ya configurado para pasar por Headroom.
headroom wrap claude # Claude Code
headroom wrap codex # Codex (comparte memoria con Claude)
headroom wrap cursor # imprime las base URLs para configurar Cursor
headroom wrap aider
headroom wrap opencode
headroom wrap grok
Para deshacer el wrapping de forma duradera:
headroom unwrap claude # también: copilot, codex, grok, kimi, opencode, openclaw…
Matriz de compatibilidad (extraída del README oficial):
| Agente | headroom wrap | Notas |
|---|---|---|
| Claude Code | ✅ | --memory · --code-graph · --1m · --tool-search |
| Codex | ✅ | Comparte memoria con Claude |
| Grok CLI | ✅ | Rutea vía GROK_MODELS_BASE_URL |
| Cursor | Setup manual | Arranca proxy y muestra base URLs para settings |
| VS Code Copilot | ✅ | Proxy transparente; preserva el modelo seleccionado |
| OpenClaw | ✅ | Se instala como plugin ContextEngine |
| OpenCode / Cline / Continue / Goose / OpenHands | ✅ | Arranca proxy + lanza o inyecta config |
| Cortex Code | Solo librería | 60-65% de ahorro en modo librería |
Si usas --code-memory none al wrap, evitas que Serena quede registrada a nivel de usuario (~/.claude.json). Si no lo haces, Serena permanece disponible en otros proyectos hasta que ejecutes headroom unwrap.
Si tu app construye los mensajes ella misma, la llamada compress() es lo más simple que existe:
from headroom import compress
messages = [
{"role": "system", "content": "Eres un asistente de operaciones."},
{"role": "user", "content": "Resume este incidente: " + tool_output},
]
compressed = compress(messages, model="gpt-4o")
# compressed.messages -> mensajes comprimidos
# compressed.tokens_saved -> 12345
También puedes medir antes de enviar con simulación (sin hacer llamada al LLM):
from headroom import simulate
result = simulate(messages)
print(result.summary)
# {'total_requests': 1, 'total_tokens_saved': 245, 'average_savings_percent': 12.3}
Para apps ASGI (FastAPI, etc.) hay middleware directo:
from headroom.asgi import CompressionMiddleware
app.add_middleware(CompressionMiddleware)
get_summary() devuelve total_requests, total_tokens_saved, avg_compression_ratio y total_cost_saved_usd — ideal para exponer el ahorro en tu propio dashboard.
En TypeScript/Node la API es equivalente:
import { compress } from 'headroom-ai';
const result = await compress(messages, { model: 'gpt-4o' });
// result.messages, result.tokensSaved
Y con los SDKs oficiales basta un wrapper:
import { withHeadroom } from 'headroom-ai';
import Anthropic from '@anthropic-ai/sdk';
const client = withHeadroom(new Anthropic()); // Anthropic SDK
const client2 = withHeadroom(new OpenAI()); // OpenAI SDK
Headroom se conecta a casi cualquier stack de agentes:
| Stack | Cómo se engancha |
|---|---|
| Vercel AI SDK | wrapLanguageModel({ model, middleware: headroomMiddleware() }) |
| LiteLLM | litellm.callbacks = [HeadroomCallback()] (100+ proveedores) |
| LangChain | HeadroomChatModel(your_llm) |
| Agno | HeadroomAgnoModel(your_model) |
| CrewAI / AutoGen | Compresión automática de tool outputs con métricas por herramienta |
| Multi-agente | SharedContext().put / .get — contexto comprimido entre agentes (~80% menos tokens) |
El paquete npm headroom-ai es solo librería: no trae el CLI headroom. El CLI solo llega con el paquete de PyPI.
No todo se comprime igual. Headroom enruta cada tipo de contenido al compresor que mejor lo preserva:
| Compresor | Contenido | Técnica | Ahorro típico |
|---|---|---|---|
| SmartCrusher | JSON: arrays de dicts, objetos anidados, tipos mixtos | Estadístico: conserva los items importantes, descarta el resto | 70-90% |
| CodeCompressor | Código fuente | AST con tree-sitter: preserva imports, firmas y tipos; comprime cuerpos de funciones | — |
| Kompress-v2-base | Texto/prosa, logs, búsquedas | Modelo HuggingFace entrenado con trazas de agentes | 15-20% en agentes de código |
| Image compression | Imágenes para modelos de visión | Router ML | 40-90% |
| Text & logs | Resultados de búsqueda, build logs, diffs | Compresores específicos por tipo | — |
La clave está en la live-zone compression: solo se comprimen los bytes nuevos (salida fresca de herramienta, último turno). El prefijo congelado permanece byte-idéntico para que el caché KV del proveedor siga pegando. El historial nunca se descarta.
Para estimar el ahorro antes de tocar producción, ejecuta el benchmark local: python -m headroom.evals suite --tier 1 reproduce las métricas oficiales en tu máquina.
La arquitectura CCR (Compress-Cache-Retrieve) hace la compresión prácticamente lossless: los originales se guardan en caché local y el LLM puede pedirlos cuando los necesita.
# Configura el TTL de la caché CCR (7200 s = 2 h)
HEADROOM_CCR_TTL_SECONDS=7200 headroom proxy
# Estado de la caché de recuperación
curl http://localhost:8787/v1/retrieve/stats
Este diseño es lo que permite afirmar "mismas respuestas, fracción de los tokens": el modelo nunca pierde acceso a la información completa — solo decide cuándo merece la pena recuperarla.
La compresión reversible no es magia: si el TTL expira, el original ya no está disponible para recuperar. Para sesiones largas de agentes, sube HEADROOM_CCR_TTL_SECONDS antes de arrancar el proxy.
Headroom expone compresión, recuperación y estadísticas como herramientas MCP para cualquier host compatible:
headroom mcp install # para hosts MCP (Claude Code, Cursor…)
# Config manual en el cliente MCP:
# [mcp_servers.headroom]
# command = "/ruta/absoluta/headroom"
# args = ["mcp", "serve"]
Herramientas disponibles: headroom_compress, headroom_retrieve y headroom_stats.
La memoria es compartida entre agentes (Claude, Codex, Gemini, Grok) con procedencia por agente y auto-dedup. Y headroom learn mina tus sesiones fallidas y escribe correcciones en CLAUDE.local.md (gitignored), AGENTS.md o GEMINI.md:
headroom learn # analiza y muestra qué corregir (dry run)
headroom learn --apply # escribe las correcciones en CLAUDE.local.md
headroom learn --target AGENTS.md # o en el fichero de otro agente
headroom learn --verbosity --apply # aprende el nivel de concisión que prefieres
headroom doctor # health check — confirma que el routing funciona
headroom perf # benchmark rápido
headroom savings # ahorro acumulado: hoy / últimos 7 días / total, por modelo y cliente
headroom output-savings
# Reduction: 31.7% (95% CI 27.7% … 35.7%) [estimated]
headroom dashboard # dashboard en vivo (requiere proxy en marcha)
Los ahorros de salida son contrafactuales (nunca vemos lo que el modelo habría escrito), así que Headroom reporta una estimación honesta con rango de confianza. Para una cifra medida, deja un 10% de conversaciones sin moldear como grupo de control: export HEADROOM_OUTPUT_HOLDOUT=0.1.
¿Actualizas a menudo? headroom update detecta cómo instalaste Headroom (pip, pipx o uv tool) y se actualiza en el sitio correcto. headroom update --check solo informa de la última versión.
No. Corre local-first: el proxy, la caché CCR y el modelo de compresión viven en tu máquina. Solo el tráfico ya comprimido sale hacia tu proveedor de LLM habitual.
Sí. El proxy es compatible con cualquier endpoint OpenAI-compatible, y el wrap cubre Claude Code, Codex, Cursor, Aider, OpenCode, Grok CLI, Copilot, OpenClaw y más. Para Anthropic y OpenAI hay SDKs dedicados, y LiteLLM da acceso a 100+ proveedores con un solo callback.
En los benchmarks oficiales, no: GSM8K se mantiene idéntico y TruthfulQA mejora ligeramente. Además, CCR permite recuperar los originales cuando el modelo los necesita, así que la compresión es reversible dentro del TTL configurado.