LM Warden

Claude Code nas suas próprias GPUs.

Mantenha o seu login do Claude e rode aqui os modelos que as suas regras definem, ou rode tudo localmente.

Um ANTHROPIC_BASE_URL, dois lugares de onde uma resposta pode vir.

Cada solicitação que o Claude Code envia à Anthropic conta para os limites de uso do seu plano, ou é cobrada por token em uma chave de API, e leva o prompt, incluindo o seu código, para fora da sua máquina. Muitas dessas solicitações são pequenas. Atenda-as nas placas que você já tem: elas custam eletricidade, não contam para os seus limites, e os prompts ficam no seu host.

O Claude em si nunca roda aqui. Uma regra define por quais modelos Claude esta máquina responde, claude-haiku* por exemplo, e um modelo que você carregou responde no lugar deles, com o nome que o Claude Code pediu. Todo o resto, incluindo o Opus, é repassado à Anthropic byte a byte com o seu próprio login, inclusive o streaming. A sua chave do warden vai em um cabeçalho próprio, então o login nunca é alterado, e nada é repassado para uma chave sem a opção “May relay to Anthropic”.

Um modelo pequeno é bom o suficiente? Não medimos a qualidade das respostas, então isto é uma avaliação, não um benchmark. O Claude Code usa o modelo da classe Haiku para trabalhos mais leves em segundo plano, e um modelo local pequeno é um substituto razoável nesses casos e em edições simples e bem especificadas. Para mudanças em muitos arquivos, depuração e planos longos, mantenha o Sonnet e o Opus na Anthropic, que é o que a regra geral faz se você não adicionar uma regra. Com um modelo maior em placas maiores, esse limite se desloca; as nossas medições do Claude Code e de réplicas abaixo usaram um modelo de 4B.

Dimensione o contexto para o Claude Code, não para chat: o primeiro turno dele na nossa sessão teve 38.167 tokens, então o modelo local precisa de bem mais de 40k 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. 2Para onde vai uma solicitação. As regras são testadas em ordem e vale a primeira que corresponder. Uma resposta local passa pelo mesmo agendador e pelo mesmo roteador de réplicas que qualquer outra solicitação; uma réplica é uma cópia completa do modelo, aqui uma por GPU. Uma falha local antes do primeiro byte vai para a Anthropic, ou volta como um 529 que o Claude Code tenta de novo, e depois de 3 falhas seguidas o disjuntor do modelo abre: por 60 s nada é enviado a ele.

Em texto: o Claude Code envia a solicitação ao warden com o seu login da Anthropic em Authorization e a chave do warden em X-LMWarden-Key. O warden testa as regras em ordem. Uma solicitação para um modelo citado em uma regra é traduzida, colocada na fila pelo agendador e enviada pelo roteador de réplicas a uma réplica do vLLM. Qualquer outra solicitação, como a do Opus, é repassada a api.anthropic.com com o login encaminhado e a chave do warden removida. Se o trecho local falhar antes do primeiro byte, a solicitação vai para a Anthropic, ou a regra a recusa com um 529 que o Claude Code tenta de novo.

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

Claude Code 2.1.227 ou mais recente. Mantenha o seu login normal do claude; a chave vai em um cabeçalho próprio, não em ANTHROPIC_API_KEY.

A página Router do console. Um banner verde diz “Routing normally” e “96% answered locally since 13:38”. Em “Where each Claude model goes. First match wins”, a regra 1 envia claude-haiku* ao modelo carregado qwen3-4b-dp4, com “If it fails: Anthropic” e “Thinking off”. A última linha é a regra geral: todos os outros modelos Claude e caminhos /v1 vão para a Anthropic com o próprio login do usuário e precisam de uma chave com “May relay to Anthropic”. O painel Traffic conta 107 locais, 2 repassadas à Anthropic, 0 desviadas para a Anthropic e 2 recusadas ou com erro, e lista dois motivos, no_upstream_credential e relay_not_allowed, um de cada. Vale a primeira regra que corresponder; todos os outros modelos vão para a Anthropic A Anthropic é acessada com o próprio login do usuário
Fig. 3A página Router com o warden em execução desde as 13:38: “Routing normally”, com 96% das solicitações respondidas localmente desde a reinicialização. Uma regra envia claude-haiku* a um modelo local e a regra geral repassa todo o resto à Anthropic; as regras são numeradas na ordem em que são testadas. O painel Traffic conta 107 locais, 2 repassadas, 0 desviadas e 2 recusadas. Role a imagem para o lado para ver a página inteira.

O primeiro turno costuma ser o mais lento. Em uma sessão anterior, o primeiro turno do Claude Code teve 38.167 tokens e o modelo local estava carregado com um contexto de 32.768 tokens, então o mecanismo o recusou (status_400) e a solicitação foi para a Anthropic. Com o contexto aumentado para 65.536 tokens e um cache KV fp8 (o cache de atenção guardado em 8 bits, metade da memória), o modelo de 4B em placas de 16 GiB respondeu localmente a esse mesmo turno em 28 s, com todo o prompt de 38k tokens lido a frio e nada ainda no cache. Os turnos seguintes de uma conversa encontram a maior parte do prompt já no cache do mecanismo: o tempo mediano até o primeiro byte da regra claude-haiku* na fig. 4 é de 290 ms.

A página de atividade do Router. Quatro contadores: local 107, repassadas à Anthropic 2, desviadas 0, e recusadas · erros 2 · 0. Uma tabela “By rule” mostra a regra claude-haiku* para qwen3-4b-dp4 com as contagens de locais, desviadas e recusadas, a latência e o tempo até o primeiro byte em p50 e p95, e o estado do disjuntor, fechado; a linha de repasse mostra os mesmos tempos para as solicitações repassadas à Anthropic. Uma tabela de modelos locais mostra qwen3-4b-dp4 com o disjuntor fechado, e um painel “Fallback reasons” lista no_upstream_credential e relay_not_allowed, um de cada. O disjuntor deste modelo: fechado Motivos pelos quais uma regra encaminhou a solicitação à Anthropic ou a recusou
Fig. 4Atividade do Router no mesmo período: 107 solicitações respondidas localmente, 2 repassadas à Anthropic, 0 desviadas e 2 recusadas com 0 erros. Abaixo, a latência e o tempo até o primeiro byte por regra em p50 e p95, o disjuntor por modelo local e os motivos pelos quais uma regra encaminhou à Anthropic ou recusou a solicitação. Os contadores são por processo; uma reinicialização os zera. Registrado em 4 de outubro de 2026. Role a imagem para o lado para ver a página inteira.
Protocolo
Anthropic Messages
Suporte
Suporte total

Os modelos Claude que as suas regras definem rodam aqui; todos os outros modelos e caminhos /v1 vão para a Anthropic com o seu próprio login. Nunca coloque a chave do warden em ANTHROPIC_API_KEY nem em ANTHROPIC_AUTH_TOKEN no modo Router: isso substituiria o seu login. No modo apenas local, tudo roda em um único modelo servido, inclusive as pequenas tarefas em segundo plano, e nada vai para a Anthropic.

Requisitos

  • Claude Code 2.1.227 ou mais recente (ANTHROPIC_CUSTOM_HEADERS).
  • O roteamento precisa estar ligado, com pelo menos uma regra ativada.
  • A chave precisa ter permissão para repassar à Anthropic (May relay).
  • Precisa de pelo menos 49.152 tokens de contexto: só o primeiro turno tem cerca de 38.000 tokens antes de qualquer arquivo ser lido.
  • 131.072 tokens ou mais para sessões reais; menos funciona para sessões curtas.
  • O Claude Code pode avisar que o nome do modelo não está no catálogo dele. É só informativo: ele presume uma janela de 200k e compacta o contexto automaticamente com base nela. Defina CLAUDE_CODE_MAX_CONTEXT_TOKENS com a janela de contexto real do modelo.

Configuração

No console, o Connect grava estes arquivos com o endereço do seu warden, a sua chave e o modelo que você escolheu. Aqui eles aparecem com espaços reservados.

Router: mantenha o seu login do Claude

O seu login do Claude continua indo para a Anthropic; a chave do warden viaja em um cabeçalho próprio, e os modelos que as suas regras definem são respondidos aqui.

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"
  }
}

Só local (sem conta da Anthropic)

Todos os slots de modelo usam o modelo servido escolhido, e a chave do warden é o token de autenticação. Nada vai para 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"
  }
}

Documentação oficial: https://code.claude.com/docs/en/llm-gateway (lida em 2026-10-04).