LM Warden

Claude Code en tus propias GPU.

Sigue usando tu cuenta de Claude y ejecuta aquí los modelos indicados en tus reglas, o ejecútalo todo en local.

Una sola ANTHROPIC_BASE_URL y dos posibles orígenes para cada respuesta.

Cada solicitud que Claude Code envía a Anthropic cuenta para los límites de uso de tu plan, o se factura por token con una clave de API, y saca de tu máquina su prompt, incluido tu código. Muchas de esas solicitudes son pequeñas. Si las respondes con tarjetas que ya tienes, solo cuestan electricidad, no cuentan para tus límites y sus prompts no salen de tu host.

Claude en sí nunca se ejecuta aquí. Una regla indica en lugar de qué modelos de Claude responde esta máquina, por ejemplo claude-haiku*, y un modelo que hayas cargado responde en su lugar, con el nombre que pidió Claude Code. Todo lo demás, Opus incluido, se reenvía a Anthropic byte a byte con tu propia cuenta, streaming incluido. Tu clave del warden va en su propio encabezado, así que tus credenciales de Claude nunca se tocan, y no se reenvía nada para una clave que no tenga activada la opción «May relay to Anthropic».

¿Basta con un modelo pequeño? No hemos medido la calidad de las respuestas, así que esto es una valoración, no un benchmark. Claude Code usa su modelo de clase Haiku para el trabajo en segundo plano más ligero, y ahí, igual que para ediciones sencillas y bien definidas, un modelo local pequeño es un sustituto razonable. Para cambios en muchos archivos, depuración y planes largos, deja Sonnet y Opus en Anthropic, que es lo que hace la regla general si no añades otra. Con un modelo más grande en tarjetas más grandes, ese límite se desplaza; nuestras mediciones de Claude Code y de réplicas que verás más abajo usaron un modelo 4B.

Dimensiona el contexto para Claude Code, no para un chat: su primer turno en nuestra sesión tuvo 38.167 tokens, así que el modelo local necesita bastante más de 40 mil tokens de contexto.

Where a request from Claude Code goes Claude Code sends a request to LM Warden with two headers: Authorization, its own login, and X-LMWarden-Key, the warden key. LM Warden tries its rules in order and the first match wins. A request for claude-haiku or claude-sonnet matches a rule, is answered by your local model under the Claude name it asked for, and goes through translate, the scheduler and the replica router to one of four vLLM replicas, the conversation staying on its home replica. A request that matches no rule, such as Opus, or any other /v1 path, is passed to api.anthropic.com with the login forwarded and the warden key removed. If the local leg fails before the first byte, a dashed path sends the request to Anthropic, or the rule can refuse with a 529 that Claude Code retries. Claude Code ANTHROPIC_BASE_URL points at the warden Authorization your own login X-LMWarden-Key vw_…, the warden key POST /v1/messages LM Warden rules, first match wins claude-haiku* your local model claude-sonnet* your local model anything else pass through reads the warden key, never forwards it match Local leg translate to the engine scheduler, key priority replica router breaker: 3 failures, open 60 s session id picks the replica vLLM replica 0 vLLM replica 1 vLLM replica 2 vLLM replica 3 a conversation stays on its replica no match: Opus, or any other /v1 path passed on byte for byte, streaming included only for a key with “May relay to Anthropic” local leg failed before the first byte: the rule falls back to Anthropic, or refuses with a 529 that Claude Code retries api.anthropic.com your login forwarded, the warden key removed Off by default. The content of a passed-through request is never logged, stored or shown.
Where a request from Claude Code goes The same flow as the wide drawing, top to bottom. Claude Code sends a request to LM Warden with its own login in Authorization and the warden key in X-LMWarden-Key. LM Warden tries its rules in order; a request for claude-haiku or claude-sonnet is answered by your local model and goes down through the local leg (translate, scheduler, replica router) to one of four vLLM replicas, where the conversation stays. A request that matches no rule goes down the right-hand line to api.anthropic.com, with the login forwarded and the warden key removed. A dashed line from the local leg to Anthropic is the fallback when the local leg fails before the first byte; the rule can instead refuse with a 529 that Claude Code retries. Claude Code Authorization your own login X-LMWarden-Key the warden key ANTHROPIC_BASE_URL = the warden POST /v1/messages LM Warden rules, first match wins claude-haiku* your local model claude-sonnet* your local model anything else pass through reads the warden key, never forwards it match Local leg translate to the engine scheduler, key priority replica router breaker: 3 failures, open 60 s session id picks the replica vLLM replica 0 vLLM replica 1 vLLM replica 2 vLLM replica 3 a conversation stays on its replica no match: Opus, any other /v1 path dashed: the local leg failed before its first byte, so the rule falls back, or refuses with a 529 that Claude Code retries api.anthropic.com your login forwarded, the warden key removed Off by default. Only a key with “May relay to Anthropic” is passed through.
Fig. 2Adónde va una solicitud. Las reglas se prueban en orden y se aplica la primera que coincide. Una respuesta local pasa por el mismo planificador y el mismo enrutador de réplicas que cualquier otra solicitud; una réplica es una copia completa del modelo, aquí una por GPU. Si la parte local falla antes del primer byte, la solicitud va a Anthropic o vuelve como un 529 que Claude Code reintenta; tras 3 fallos seguidos se abre el disyuntor del modelo y durante 60 s no se le envía nada.

Descripción: Claude Code envía la solicitud al warden con sus propias credenciales de Anthropic en Authorization y la clave del warden en X-LMWarden-Key. El warden prueba sus reglas en orden. Una solicitud para un modelo indicado en una regla se traduce, el planificador la pone en cola y el enrutador de réplicas la envía a una réplica de vLLM. Cualquier otra solicitud, como las de Opus, se reenvía a api.anthropic.com con las credenciales intactas y sin la clave del warden. Si la parte local falla antes de su primer byte, la solicitud va a Anthropic o la regla la rechaza con un 529 que Claude Code reintenta.

export ANTHROPIC_BASE_URL=https://warden.example
export ANTHROPIC_CUSTOM_HEADERS="X-LMWarden-Key: vw_…"
claude

Claude Code 2.1.227 o posterior. Sigue iniciando sesión en claude como siempre; la clave va en su propio encabezado, no en ANTHROPIC_API_KEY.

La página Router de la consola. Un banner verde dice «Routing normally» y «96% answered locally since 13:38». Bajo «Where each Claude model goes. First match wins», la regla 1 envía claude-haiku* al modelo cargado qwen3-4b-dp4, con «If it fails: Anthropic» y «Thinking off». La última fila es la regla general: todos los demás modelos de Claude y rutas /v1 van a Anthropic con la cuenta del propio usuario y necesitan una clave con «May relay to Anthropic». El panel Traffic cuenta 107 locales, 2 reenviadas a Anthropic, 0 desviadas a Anthropic por fallo y 2 rechazadas o con error, y enumera dos motivos, no_upstream_credential y relay_not_allowed, uno de cada. Se aplica la primera regla que coincide; todos los demás modelos van a Anthropic Se accede a Anthropic con la cuenta del propio usuario
Fig. 3La página Router con el warden en marcha desde las 13:38: «Routing normally», con el 96 % de las solicitudes respondidas por el modelo local desde el reinicio. Una regla envía claude-haiku* a un modelo local y la regla general reenvía todo lo demás a Anthropic; las reglas se numeran en el orden en que se prueban. El panel Traffic cuenta 107 locales, 2 reenviadas, 0 desviadas por fallo y 2 rechazadas. Desplaza la imagen lateralmente para ver toda la página.

Ten en cuenta que el primer turno es el lento. En una sesión anterior, el primer turno de Claude Code tuvo 38.167 tokens y el modelo local estaba cargado con un contexto de 32.768 tokens, así que el motor lo rechazó (status_400) y la solicitud se envió a Anthropic. Con el contexto ampliado a 65.536 tokens y una caché KV fp8 (la caché de atención guardada en 8 bits, con la mitad de memoria), el modelo 4B en tarjetas de 16 GiB respondió ese mismo turno en local en 28 s, leyendo en frío el prompt completo de 38 mil tokens, sin nada todavía en la caché. Los turnos siguientes de una conversación encuentran la mayor parte de su prompt ya en la caché del motor: la mediana del tiempo hasta el primer byte para la regla claude-haiku* de la fig. 4 es de 290 ms.

La página de actividad del Router. Cuatro contadores: locales 107, reenviadas a Anthropic 2, desviadas por fallo 0, y rechazadas · errores 2 · 0. Una tabla «By rule» muestra la regla claude-haiku* hacia qwen3-4b-dp4 con sus recuentos de locales, desviadas por fallo y rechazadas, la latencia y el tiempo hasta el primer byte en p50 y p95, y el estado de su disyuntor, cerrado; la fila de reenvío muestra los mismos tiempos para las solicitudes reenviadas a Anthropic. Una tabla de modelos locales muestra qwen3-4b-dp4 con su disyuntor cerrado, y un panel «Fallback reasons» enumera no_upstream_credential y relay_not_allowed, uno de cada. El disyuntor de este modelo: cerrado Por qué una regla envió la solicitud a Anthropic o la rechazó, por motivo
Fig. 4Actividad del Router en el mismo periodo: 107 solicitudes respondidas por el modelo local, 2 reenviadas a Anthropic, 0 desviadas por fallo y 2 rechazadas, con 0 errores. Debajo, la latencia y el tiempo hasta el primer byte por regla en p50 y p95, el disyuntor de cada modelo local y los motivos por los que una regla envió la solicitud a Anthropic o la rechazó. Los contadores son por proceso; un reinicio los pone a cero. Captura del 4 de octubre de 2026. Desplaza la imagen lateralmente para ver toda la página.
Protocolo
Anthropic Messages
Compatibilidad
Completa

Los modelos de Claude indicados en tus reglas se ejecutan aquí; todos los demás modelos y rutas /v1 van a Anthropic con tu propia cuenta. En modo Router, nunca pongas la clave del warden en ANTHROPIC_API_KEY ni en ANTHROPIC_AUTH_TOKEN: sustituiría tus credenciales de Claude. El modo Solo local lo ejecuta todo en un único modelo servido, incluidas las pequeñas tareas en segundo plano, y no se envía nada a Anthropic.

Requisitos

  • Claude Code 2.1.227 o posterior (ANTHROPIC_CUSTOM_HEADERS).
  • El enrutamiento debe estar activado, con al menos una regla habilitada.
  • La clave debe tener permiso para reenviar a Anthropic (May relay).
  • Necesita al menos 49.152 tokens de contexto: solo el primer turno ocupa unos 38.000 tokens antes de leer ningún archivo.
  • 131.072 tokens o más para sesiones reales; para sesiones cortas basta con menos.
  • Claude Code puede avisar de que el nombre del modelo no está en su catálogo. Es solo informativo: asume una ventana de 200 mil tokens y compacta automáticamente en función de ella. Define CLAUDE_CODE_MAX_CONTEXT_TOKENS con la ventana de contexto real del modelo.

Configuración

En la consola, Connect genera estos archivos con la dirección de tu warden, tu clave y el modelo que hayas elegido. Aquí aparecen con marcadores de posición.

Router: sigue usando tu cuenta de Claude

Tus credenciales de Claude siguen yendo a Anthropic; la clave del warden se envía en su propio encabezado, y las solicitudes a los modelos indicados en tus reglas se responden aquí.

Shell
export ANTHROPIC_BASE_URL=https://your-warden
export ANTHROPIC_CUSTOM_HEADERS="X-LMWarden-Key: vw_YOUR_KEY"
claude
settings.json (~/.claude/settings.json)
{
  "env": {
    "ANTHROPIC_BASE_URL": "https://your-warden",
    "ANTHROPIC_CUSTOM_HEADERS": "X-LMWarden-Key: vw_YOUR_KEY"
  }
}

Solo local (sin cuenta de Anthropic)

Todas las opciones de modelo de Claude Code usan el modelo servido elegido, y la clave del warden es el token de autenticación. No se envía nada a Anthropic.

Shell
export ANTHROPIC_BASE_URL=https://your-warden
export ANTHROPIC_AUTH_TOKEN=vw_YOUR_KEY
export ANTHROPIC_MODEL=your-served-model-name
export ANTHROPIC_DEFAULT_OPUS_MODEL=your-served-model-name
export ANTHROPIC_DEFAULT_SONNET_MODEL=your-served-model-name
export ANTHROPIC_DEFAULT_HAIKU_MODEL=your-served-model-name
export CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1
export CLAUDE_CODE_MAX_CONTEXT_TOKENS=32768
# The model's context window is unknown: 32768 is a guess. Set it to the model's real window.
settings.json (~/.claude/settings.json)
{
  "env": {
    "ANTHROPIC_BASE_URL": "https://your-warden",
    "ANTHROPIC_AUTH_TOKEN": "vw_YOUR_KEY",
    "ANTHROPIC_MODEL": "your-served-model-name",
    "ANTHROPIC_DEFAULT_OPUS_MODEL": "your-served-model-name",
    "ANTHROPIC_DEFAULT_SONNET_MODEL": "your-served-model-name",
    "ANTHROPIC_DEFAULT_HAIKU_MODEL": "your-served-model-name",
    "CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS": "1",
    "CLAUDE_CODE_MAX_CONTEXT_TOKENS": "32768"
  }
}

Documentación oficial: https://code.claude.com/docs/en/llm-gateway (consultada el 2026-10-04).