LM Warden

Una clave por app, y una página para cada clave.

Da a cada colega, portátil, trabajo de CI y agente su propia clave. La página de una clave muestra lo que ha consumido y cuánto esperaron sus solicitudes en la cola (mediana y p95) en cualquier intervalo que selecciones con el ratón o escribas. Rota una clave con un periodo de gracia y fija su prioridad de P0 a P9: una solicitud P9 en espera siempre pasa antes que una P8.

Si la pausas, las solicitudes nuevas se rechazan mientras terminan las que ya están en curso:

$ curl -i http://gpu-box:8080/v1/chat/completions \
    -H "Authorization: Bearer vw_…" -d '{…}'
HTTP/1.1 403 Forbidden
content-type: application/json

{"detail":"token paused"}

De una instancia local, el 23 de septiembre de 2026. Host y clave sustituidos; el resto de los encabezados, recortados.

Fig. 13La página de demo-agent, la clave que generó la carga de la fig. 1: 37 solicitudes y 43 mil tokens generados en la hora que aparece en pantalla. Después se abre su panel God mode (una vista en directo, opcional, de los prompts y las respuestas de una clave, desactivada de forma predeterminada) y sus respuestas aparecen a medida que se escriben. Los prompts son nuestros.
El gráfico Requests de la página Stats en los últimos 7 días, del 16 al 23 de septiembre: una marca por solicitud, coloreada por clave de API, con tamaño según los tokens generados y forma según el motivo de finalización, frente a la duración en escala logarítmica de 100 ms a 10.000 s. La mayoría de las marcas están entre 3 y 100 segundos; una clave muestra dos columnas densas que van de menos de un segundo a varios cientos de segundos.
Fig. 14Las solicitudes de todas las claves en un solo gráfico, de la misma página Stats: los últimos 7 días, 28.906 solicitudes, de las que se dibuja una de cada quince. Cada marca es una solicitud, coloreada según su clave, con tamaño según los tokens que generó y forma según cómo terminó, a la altura de su duración en escala logarítmica. El ámbar constante es opencode-laptop; las dos columnas rosas densas son research-notebook. Captura del 23 de septiembre de 2026; los nombres de las claves se han sustituido. Desplaza la imagen lateralmente para ver toda la semana.

Para irte, basta con cambiar base_url.

Expone /v1/chat/completions y /v1/models, y /v1/models indica el max_model_len de cada modelo. También es compatible con la API Anthropic Messages en /v1/messages, así que en Claude Code basta con que ANTHROPIC_BASE_URL sea la URL raíz de un warden (Claude Code añade él mismo la ruta /v1/messages), y con la OpenAI Responses API en /v1/responses, así que Codex CLI puede usar un modelo que hayas cargado. Los pesos están en una caché normal de HuggingFace que make export-hf-cache te entrega como archivo tar, y el argv exacto con el que se inició cada motor se obtiene con una simple solicitud GET, así que una instalación que funciona se puede reconstruir sin nosotros. El diff de abajo, aplicado a la inversa, es justo lo que tienes que hacer para irte.

  import os
  from openai import OpenAI

  client = OpenAI(
-     base_url="https://api.openai.com/v1",
-     api_key=os.environ["OPENAI_API_KEY"],
+     base_url="http://gpu-box:8080/v1",
+     api_key=os.environ["LM_WARDEN_KEY"],   # a vw_ key from API tokens
  )

  reply = client.chat.completions.create(
-     model="gpt-4o-mini",
+     model="gpt-oss-20b",   # the served name of a model you loaded
      messages=[{"role": "user", "content": "What is a KV cache?"}],
  )