Código abierto · Apache-2.0

Mucho más trabajo hecho
con muchos menos tokens.

Distill es un harness de agente de código ligero, con interfaz de terminal. Funciona con las suscripciones de Grok y Codex que ya pagas, con OpenRouter o con cualquier modelo que hable el protocolo compatible con la API de OpenAI. Reduce lo que tus herramientas devuelven antes de que ese texto llegue al modelo.

curl -fsSL https://raw.githubusercontent.com/samuelfaj/distill/main/install.sh | sh

macOS, Linux y Windows. Después, actualiza con distill update.

La interfaz de terminal de Distill, con el menú de inicio, la entrada Model tiers y la línea de estado con los modelos de razonamiento y de trabajo activos
Funciona con
  • Suscripción de Grok
  • Suscripción de Codex
  • OpenRouter
  • Modelos locales

Niveles de modelo

Modelos de razonamiento, de trabajo y utilitario

Cada nivel tiene su propio selector. Todos empiezan en auto.

Modelo de razonamiento

Se ocupa de la conversación principal, del razonamiento difícil y de los cambios de código.

/model o /tiers reasoning

Modelo de trabajo

Asume llamadas adecuadas dentro de la misma conversación cuando un modelo más ligero puede con ellas. Opcional.

/worker-model o /tiers worker

Modelo utilitario

Se ocupa de tareas acotadas, como extracción, resúmenes y compresión.

/utility-model o /tiers utility

Deja un nivel sin definir para funcionar sin él. Un Worker sin definir significa que no hay enrutado al Worker.

Enrutado

Jev elige el modelo de cada llamada

Jev es la capa de decisión dentro de Distill. Responde preguntas estructuradas sobre un estado pequeño que arma el harness: qué modelo debe asumir una llamada, cuánta capacidad necesita esa llamada y qué partes del resultado de una herramienta vale la pena conservar.

Qué decide Jev

  • Qué modelo y qué nivel de esfuerzo usa una llamada, cuando el esfuerzo está en auto.
  • Qué archivos, líneas, logs, resultados de búsqueda e instrucciones merecen un segundo vistazo.
  • Qué errores atender primero cuando falla una comprobación.
  • Qué conservar durante la compresión y la compactación.

Ahorro de tokens

De dónde viene el ahorro

La mayor parte de la reducción ocurre en código determinista, sobre el resultado de una herramienta, antes de que entre en la conversación. El resultado pasa por estas etapas en orden, y cada etapa tiene una barrera que puede detenerla.

Etapa Qué elimina Cuándo se ejecuta Por defecto
Reutilización de lectura Una segunda copia de bytes que ya están en la conversación 2000 bytes o más, e idéntico por hash a un payload ya enviado Activada
Barrera de salida exacta Nada. Esta etapa detiene a las demás. La llamada está direccionada por línea, o el texto pertenece a una skill Siempre
Limpieza previa Ruido de terminal y contenido que el propio payload repite 2000 bytes o más, y no es un documento Activada
Extracción de importancia La parte ilegible del medio de un payload largo 4000 bytes o más, y no es un documento Activada
Tarea utilitaria Un payload que un modelo pequeño digiere más barato de lo que debería hacerlo el modelo de la sesión 2000 bytes o más, y hay una tarea registrada para ese formato Activada
Compresión utilitaria Lo mismo, para un payload demasiado grande para quererlo entero 24 KiB o más Activada

Las cuatro primeras etapas ahorran tokens. Las dos últimas ahorran dinero, pasando el trabajo a un modelo más barato, que es otra cosa.

Barreras

El original se guarda siempre

Toda etapa que descartaría bytes escribe antes el original en un archivo y envía su ruta junto con el texto reducido. Si el almacén se niega, la etapa no se ejecuta.

La barrera de literales

La reducción se compara con el original antes de que alguien la use. Si un camino, un file:line, un número o una palabra de error desaparecería, la reducción se descarta y los bytes originales se conservan.

Volver a leer el original

retrieve_range devuelve un rango de líneas de un payload guardado. grep_handle hace una búsqueda exacta dentro de él y devuelve las líneas tal cual, con sus números de línea.

Respuestas comprobadas de modelos pequeños

Distill solo usa la respuesta de una tarea utilitaria cuando una barrera puede comprobarla. Una extracción debe citar fragmentos que aparecen de verdad en el payload, una clasificación debe caer en una etiqueta cerrada y una elección debe nombrar ids que se ofrecieron. Cuando la comprobación falla, los bytes se quedan como estaban.

Reglas

Lo que nunca pasa

Son reglas del código, no ajustes.

  • El resultado de una llamada de salida exacta nunca se reescribe.
  • Un documento nunca se reescribe.
  • Un mensaje escrito por ti nunca se comprime ni se reescribe. El pipeline solo recibe resultados de herramientas.
  • El cuerpo de una skill y el texto de permisos nunca se reescriben.
  • El valor de un secreto nunca lo devuelve una transformación. Una marca de presencia lo enmascara.
  • Un payload nunca cambia sin el visto bueno de la barrera de literales, y una etapa con pérdida nunca se ejecuta sin el original guardado.
  • No se publica ninguna cifra de ahorro, porque nada en Distill mide una.

Un límite no es un ahorro, una estimación no es una medición, y un payload omitido no es una victoria.

El harness

Qué más viene incluido

Distill es un agente de código completo. El token saver es una parte.

Logins separados por proveedor

Entra en Grok, ChatGPT y OpenRouter de forma independiente. Salir de uno no afecta a los demás.

Modelos locales

Levanta un servidor compatible con la API de OpenAI, añade una entrada en config.toml y úsalo como cualquier nivel.

Selectores de nivel

Abre Model tiers en la pantalla de inicio para cambiar un nivel, o escribe /tiers con su nombre.

Comandos de contexto

/context muestra hacia dónde va la ventana, incluido lo que cuestan las definiciones de herramientas y la lista de skills. /compact recupera espacio al momento.

Un registro de decisiones

GROK_LOG_JEV=1 registra la palanca, el veredicto, el motivo y la confianza de cada decisión.

Apagado con un interruptor

Define [jev] enabled = false, o arranca con GROK_JEV=0, para apagar toda la capa. Cada palanca tiene además su propia clave.

Perfiles

Los perfiles nuevos viven en ~/.distill. Apunta DISTILL_HOME a otro sitio, y un perfil ~/.grok existente sigue funcionando.

Actualización en el sitio

distill update actualiza una instalación hecha con el instalador de releases.

El menú de inicio

Nuevo worktree, retomar sesión, niveles de modelo y un logout aparte por proveedor, todo en una pantalla.

Inicio rápido

Cuatro pasos

El instalador detecta tu plataforma y tu arquitectura, y escribe el binario dentro de tu directorio de usuario.

  1. Instala

    Ejecuta el comando de tu plataforma.

  2. Entra

    Inicia sesión en la suscripción que ya pagas, o en OpenRouter. Puedes usar más de una.

  3. Define los niveles

    Elige un modelo de razonamiento, uno de trabajo y uno utilitario, o déjalos en auto.

  4. Ejecútalo

    Arranca distill en cualquier directorio de proyecto.

macOS y Linux

curl -fsSL https://raw.githubusercontent.com/samuelfaj/distill/main/install.sh | sh

Windows

irm https://raw.githubusercontent.com/samuelfaj/distill/main/install.ps1 | iex

Actualizar una instalación existente

distill update

Dudas

Preguntas y respuestas

¿Qué cuentas necesito?

Cualquiera de ellas. Distill mantiene el login y el logout por separado para Grok, ChatGPT y OpenRouter, y salir de uno no cierra los demás. ChatGPT usa OAuth, y OpenRouter acepta un login por navegador o una OPENROUTER_API_KEY.

¿Puedo usar un modelo local?

Sí. Levanta un servidor compatible con la API de OpenAI, añade una entrada en config.toml con el id del modelo y la base URL, y selecciónalo como nivel. Los perfiles nuevos usan ~/.distill, y puedes mover esa ubicación con DISTILL_HOME.

¿Jev decide lo que mi agente puede hacer?

No. Jev elige entre modelos y rutas candidatas que le entrega el código. El modo de planificación, la aprobación automática, el YOLO y las políticas de permisos son de Distill, y Jev no aprueba, no veta ni retiene una llamada para confirmación.

¿Y cuando una decisión se equivoca?

El harness vuelve a su camino normal. Una decisión de enrutado que falla, agota el tiempo o llega sin confianza deja el modelo de la sesión en su sitio, y una respuesta utilitaria que no pasa su barrera se descarta, así que los bytes originales se quedan como estaban.

¿Cómo veo lo que hizo?

Arranca Distill con GROK_LOG_JEV=1. Escribe logs/jev.jsonl dentro de tu perfil, una entrada por decisión, con etiquetas como reuse, crush, extract, keep, used, defer, local y cloud.

¿Cuánto ahorra en realidad?

Distill no publica una cifra de ahorro, y el código no mide ninguna. Las etapas y sus umbrales están documentados, así que puedes leer lo que se ejecuta y revisar el registro de decisiones de tus propias sesiones.

Instálalo con un comando

Distill funciona en macOS, Linux y Windows, y se actualiza en el sitio.

curl -fsSL https://raw.githubusercontent.com/samuelfaj/distill/main/install.sh | sh

Código abierto bajo la licencia Apache-2.0.