distil

Optimización de contexto para agentes LLM: registro de herramientas, enmascaramiento de resultados, presupuestación y compactación.

Documentación

distil

npm MCP Registry Smithery license

Install in Cursor Install in VS Code

claude mcp add distil -- npx -y @munhq/distil

Sin cuenta, sin clave de API, nada que configurar. El paquete es un pequeño envoltorio que obtiene el binario para tu plataforma y lo verifica contra las sumas de verificación publicadas; install.sh y un binario precompilado permanecen para quienes no tienen Node.


Las escrituras de caché son el 2% de tus tokens y el 28% de tu factura

Eso no es una afirmación, es una medición: 13,814 sesiones reales de agente, 410,742 turnos de asistente, re-ejecutado el 2026-08-29. Cada token único en ellas fue facturado 550 veces, porque una solicitud reenvía todo el historial.

Lo que significa que el movimiento obvio — comprimir el historial — suele ser el equivocado. Editar el historial invalida el prefijo en caché desde la edición en adelante y convierte lecturas a 0.1x en escrituras a 1.25x o 2.0x. No puedes comprimir para salir del costo de contexto. Solo puedes negarte a admitir tokens.

Where an agent session's tokens go: tool results 59.9%, tool calls 17.9%, user text 14.0%, assistant text 7.2%, thinking 1.0% How much a rewrite must delete just to break even: 8% with one turn left, 46% with ten, 90% with a hundred

Cada herramienta en este espacio publica un porcentaje de ahorro medido en sus propios datos de prueba. Lo que ninguna publica es el denominador: qué proporción de una sesión real se le permite tocar, y cuánto cuesta esa proporción una vez aplicado el precio de caché de prompt. distil mide ambos en transcripciones que un agente realmente escribió.

Qué es arte previo y qué no lo es. La aritmética de caché a continuación no es un descubrimiento. Los https://platform.claude.com/docs/en/build-with-claude/context-editing de Anthropic afirman que borrar resultados de herramientas invalida el prefijo en caché, e incluyen clear_at_least para que un borrado solo se active cuando sea lo suficientemente grande como para pagar por ello. La regla de punto de equilibrio también está publicada: en una caché de 5 minutos, los tokens borrados multiplicados por las solicitudes antes del siguiente borrado deben superar 11.5 veces los tokens que conservas. La tabla en este README reproduce esa regla exactamente — fue derivada de forma independiente, lo cual es una verificación de la aritmética, no una contribución.

La brecha es empírica. Cada fuente dice calibrar contra tu propia carga de trabajo, y ninguna incluye una forma de hacerlo ni publica cuáles resultan ser los valores. Eso es para lo que sirve este crate: medir los números que necesitas para elegir clear_at_least, o para decidir no borrar en absoluto.

La medición completa

Medido el 2026-08-29 sobre 13,814 transcripciones locales de Claude Code — 410,742 turnos de asistente, 212.7M de tokens de texto único. Reprodúcelo en tu propio corpus con distil-bench ~/.claude/projects; un corpus crece, así que la fecha importa más que los decimales.

tokensproporción
resultados de herramientas127,371,43059.9%
llamadas a herramientas38,065,12117.9%
texto de usuario29,818,53614.0%
texto de asistente15,402,0777.2%
pensamiento2,076,7161.0%

Esos 212.7M de tokens únicos fueron facturados como 116.9 mil millones de tokens de entrada — cada token pagado 550 veces, porque una solicitud reenvía todo el historial.

Precio eso con multiplicadores de caché reales (lectura 0.1x, escritura 1.25x para el TTL de 5 minutos y 2.0x para el de 1 hora):

proporción de tokensproporción de costo
lectura de caché97.9%71.8%
escrituras de caché2.0%27.6%

Las escrituras de caché son el 2% de los tokens y el 28% de la factura. Editar el historial invalida el prefijo en caché desde la edición en adelante, convirtiendo lecturas a 0.1x en escrituras a 1.25x o 2.0x. Así que una reescritura debe reducir lo que invalida por debajo de:

turnos restantesTTL 5mTTL 1h
18.0%5.0%
1046.5%34.5%
2063.5%51.3%
10089.7%84.0%

Esa tabla es la regla de punto de equilibrio publicada en otra forma: en cada fila, cleared x turns / kept es igual a 11.5 para el nivel de 5 minutos. Úsala para elegir un valor de clear_at_least, y usa distil-bench para encontrar el número de turnos y el tamaño de cola para poner en él — esas son propiedades de la carga de trabajo, y son la parte que nadie publica.

Por unidad de historial, con 10 turnos restantes: conservarlo cuesta 1.00, comprimirlo cuesta 2.15, y nunca admitirlo cuesta 0. No puedes comprimir para salir del costo de contexto. Solo puedes negarte a admitir tokens.

Qué significa eso para usar este crate

Las capas que no tocan el historial están del lado correcto de esa aritmética: CacheAlignLayer (ordena el contenido para que el prefijo estable siga siendo cacheable) y ScratchpadLayer (mantiene el estado de trabajo fuera de la ventana).

Las capas que reescriben el historial — MaskingLayer, SummarizationLayer, CompactionLayer — cuestan más de lo que ahorran en el caso común. Recurre a ellas solo en un límite: desbordamiento de contexto, donde la alternativa es una solicitud fallida y el precio de caché deja de ser la comparación. BudgetLayer existe para exactamente ese momento.

RegistryLayer y CodeModeLayer son anteriores a la Herramienta de Búsqueda de Herramientas y la Llamada Programática de Herramientas de Anthropic, que hacen los mismos trabajos de forma nativa y mejor. Prefiere las funciones nativas.

Para borrar resultados antiguos de herramientas, prefiere la clear_tool_uses de edición de contexto del proveedor sobre MaskingLayer: se ejecuta en el lado del servidor, toma clear_at_least, y es un parámetro de API contra una dependencia. Recurre a una capa aquí solo cuando necesites un comportamiento que la API no ofrezca.

Medición

cargo build --features bench --release

# Where tokens are, what they cost, and the break-even table
./target/release/distil-bench ~/.claude/projects --json baseline.json

# Sessions that called a given tool, against those that did not
./target/release/distil-bench ~/.claude/projects --split-by-tool mcp__codeindex__

# Export real traffic so other compressors run on the same input
./target/release/distil-bench ~/.claude/projects --export-sessions ./sessions --min-turns 40

Consulta bench/README.md para la comparación de herramientas externas, las reglas de equidad y los dos errores de arnés que produjeron números incorrectos primero.

Retención

Un ahorro solo es un ahorro si el modelo aún puede responder lo que el contexto original podía responder.

# No LLM judge: file paths checked against ground truth from the transcript
python bench/artifact_retention.py ./sessions 12

# LLM-graded probes (recall / artifact / continuation / decision)
cargo build --features probe --release
./target/release/distil-probe <session.jsonl> --probes 6 --model qwen2.5:3b

La taxonomía de sondas es de Factory.ai; su artículo la define y no incluye ningún arnés. El juez es un Completer, nunca un Summarizer — un resumidor puede imponer un marco de resumen, que reescribe tanto el formato de la sonda como la instrucción de calificación.

Uso como biblioteca

use distil::{CacheAlignLayer, Ctx, EstimateCounter, Pipeline};

let pipeline = Pipeline::builder()
    .counter(EstimateCounter)
    .layer(CacheAlignLayer::generic())
    .build();

let mut ctx = Ctx::new(messages, tools, turn);
let result = pipeline.optimize(&mut ctx);
println!("{result}");

Este ejemplo se mantiene compilable como examples/readme_quickstart.rs — ejecútalo con cargo run --example readme_quickstart.

Cada capa implementa Layer e informa tokens_before, tokens_after y una línea de detalle, para que cada una pueda medirse por sí misma.

Características

característicaqué añade
corpuscargador de transcripciones (sin dependencias adicionales)
benchdistil-bench, necesita tiktoken
probedistil-probe, necesita proxy para el juez HTTP
tiktokenconteos BPE precisos en lugar de la estimación chars/3.5
proxyservidor HTTP distil-proxy
mcpservidor MCP distil-mcp
metricsPrometheus /metrics

Instalación

./install.sh                       # binaries, the skill, and the MCP server
/plugin marketplace add munhq/distil
/plugin install distil             # Claude Code: skill and server in one step

install.sh instala ambos binarios, coloca la habilidad en cada directorio de Claude que encuentre, y registra el servidor MCP a nivel de usuario. Cuando el plugin ya está instalado, instala solo el binario, ya que el plugin declara el servidor e incluye la habilidad en sí.

El plugin lanza el servidor con npx -y @munhq/distil, por lo que necesita Node. No puede usar una ruta relativa al plugin: Claude Code expande ${CLAUDE_PLUGIN_ROOT} y nada más lo hace, así que un plugin que declare una entrega a cada otro cliente una ruta literal que no existe. install.sh y los binarios precompilados permanecen para quienes no tienen Node.

Soporte de plataformas

plataformabinariosscripts
Linux x86_64 / arm64publicados, probados
macOS x86_64 / arm64publicados, compilados en CI
Windows x86_64 / arm64publicados, compilados en CInecesita un shell: Git Bash, MSYS2 o WSL

La versión publica seis objetivos y plugin/test_platform.sh mantiene tanto el instalador como el lanzador del plugin en esa matriz, para que un nombre de activo y el nombre solicitado no puedan separarse. install.sh y el lanzador son scripts bash, así que en Windows necesitan un shell — cmd y PowerShell no pueden ejecutarlos. Los binarios de Linux son compilaciones estáticas de musl, por lo que no necesitan un glibc coincidente.

Advertencias

El corpus es la máquina de un desarrollador. Las proporciones son el hallazgo; los totales absolutos son personales. Los conteos usan cl100k_base, que aproxima el tokenizador de Claude dentro de unos pocos por ciento. El modelo de punto de equilibrio asume un único punto de ruptura de caché, por lo que una reescritura confinada a la cola cuesta menos de lo que muestra la tabla — eso lo refina, no lo revierte.

Contribuciones

Instrucciones de compilación y prueba, las reglas que un cambio de referencia debe seguir, y lo que una solicitud de extracción necesita antes de la revisión: CONTRIBUTING.md. Informa una vulnerabilidad de forma privada — SECURITY.md.

Licencia

Licenciado bajo cualquiera de

a tu opción.

A menos que declares explícitamente lo contrario, cualquier contribución que envíes intencionalmente para inclusión en este trabajo, según lo definido en la licencia Apache-2.0, será licenciada dualmente como se indicó anteriormente, sin términos o condiciones adicionales.