LM Warden

Claude Code auf Ihren eigenen GPUs.

Behalten Sie Ihre Claude-Anmeldung und betreiben Sie die in Ihren Regeln festgelegten Modelle hier – oder alles vollständig lokal.

Eine ANTHROPIC_BASE_URL, zwei mögliche Quellen für eine Antwort.

Jede Anfrage, die Claude Code an Anthropic sendet, wird auf die Nutzungslimits Ihres Abos angerechnet oder über einen API-Schlüssel pro Token abgerechnet, und ihr Prompt, Ihr Code eingeschlossen, verlässt Ihren Rechner. Viele dieser Anfragen sind klein. Beantworten Karten, die Sie bereits besitzen, diese Anfragen, kosten sie Strom, werden nicht auf Ihre Limits angerechnet, und ihre Prompts bleiben auf Ihrem Host.

Claude selbst läuft hier nie. Eine Regel legt fest, anstelle welcher Claude-Modelle dieser Rechner antwortet, zum Beispiel claude-haiku*, und ein von Ihnen geladenes Modell antwortet an ihrer Stelle, unter dem Namen, den Claude Code angefragt hat. Alles andere, Opus eingeschlossen, wird Byte für Byte mit Ihrer eigenen Anmeldung an Anthropic weitergereicht, Streaming inklusive. Ihr Warden-Schlüssel wird in einem eigenen Header übertragen, sodass Ihre Anmeldung unverändert bleibt, und für einen Schlüssel ohne das Flag „May relay to Anthropic“ wird nichts weitergeleitet.

Reicht ein kleines Modell? Die Antwortqualität haben wir nicht gemessen; dies ist eine Einschätzung, kein Benchmark. Claude Code nutzt sein Modell der Haiku-Klasse für leichtere Hintergrundarbeit, und dort sowie für einfache, klar beschriebene Änderungen ist ein kleines lokales Modell ein vernünftiger Ersatz. Für Änderungen über viele Dateien, Debugging und lange Pläne lassen Sie Sonnet und Opus bei Anthropic – genau das tut die Auffangregel für alle übrigen Modelle, solange Sie keine Regel hinzufügen. Ein größeres Modell auf größeren Karten verschiebt diese Grenze; unsere Messungen weiter unten (Claude Code und Replikate) liefen mit einem 4B-Modell.

Bemessen Sie den Kontext für Claude Code, nicht für den Chat: Seine erste Runde in unserer Sitzung hatte 38.167 Token, das lokale Modell braucht also deutlich mehr als 40 Tsd. Token Kontext.

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.
Abb. 2Wohin eine Anfrage geht. Die Regeln werden der Reihe nach geprüft, und der erste Treffer gilt. Eine lokale Antwort durchläuft denselben Scheduler und denselben Replikat-Router wie jede andere Anfrage; ein Replikat ist eine vollständige Kopie des Modells, hier eine pro GPU. Schlägt die lokale Verarbeitung vor dem ersten Byte fehl, geht die Anfrage an Anthropic oder kommt mit Statuscode 529 zurück, worauf Claude Code es erneut versucht; nach 3 Fehlern in Folge öffnet der Circuit Breaker des Modells: 60 s lang wird nichts an dieses Modell gesendet.

Kurz gesagt: Claude Code sendet die Anfrage an den Warden, mit seiner eigenen Anthropic-Anmeldung in Authorization und dem Warden-Schlüssel in X-LMWarden-Key. Der Warden prüft seine Regeln der Reihe nach. Eine Anfrage für ein Modell, das in einer Regel festgelegt ist, wird übersetzt, vom Scheduler eingereiht und vom Replikat-Router an ein vLLM-Replikat gesendet. Jede andere Anfrage, etwa an Opus, wird an api.anthropic.com weitergereicht, mit weitergeleiteter Anmeldung und entferntem Warden-Schlüssel. Scheitert der lokale Teil vor seinem ersten Byte, geht die Anfrage an Anthropic, oder die Regel lehnt sie mit Statuscode 529 ab, worauf Claude Code es erneut versucht.

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

Claude Code 2.1.227 oder neuer. Behalten Sie Ihre normale claude-Anmeldung; der Schlüssel kommt in einen eigenen Header, nicht in ANTHROPIC_API_KEY.

Die Seite Router der Konsole. Ein grünes Banner zeigt „Routing normally“ und „96% answered locally since 13:38“. Unter „Where each Claude model goes. First match wins“ schickt Regel 1 claude-haiku* an das geladene Modell qwen3-4b-dp4, mit „If it fails: Anthropic“ und „Thinking off“. Die letzte Zeile ist die Auffangregel: Jedes andere Claude-Modell und jeder andere /v1-Pfad geht mit der eigenen Anmeldung des Benutzers an Anthropic und braucht einen Schlüssel mit „May relay to Anthropic“. Das Panel Traffic zählt 107 lokal, 2 an Anthropic durchgereicht, 0 auf Anthropic zurückgefallen und 2 abgelehnt oder fehlerhaft und nennt zwei Gründe, no_upstream_credential und relay_not_allowed, je einmal. Der erste Treffer gewinnt; jedes andere Modell geht an Anthropic Anthropic wird mit der eigenen Anmeldung des Benutzers erreicht
Abb. 3Die Seite Router, der Warden läuft seit 13:38: „Routing normally“, 96 % der Anfragen seit dem Neustart lokal beantwortet. Eine Regel schickt claude-haiku* an ein lokales Modell, und die Auffangregel reicht alles andere an Anthropic durch; die Regeln sind in der Reihenfolge nummeriert, in der sie geprüft werden. Das Panel Traffic zählt 107 lokal, 2 durchgereicht, 0 zurückgefallen und 2 abgelehnt. Scrollen Sie das Bild seitlich, um die ganze Seite zu sehen.

Rechnen Sie damit, dass die erste Runde am längsten dauert. In einer früheren Sitzung hatte die erste Runde von Claude Code 38.167 Token, und das lokale Modell war mit einem Kontext von 32.768 Token geladen, also lehnte die Engine sie ab (status_400), und die Anfrage ging stattdessen an Anthropic. Mit auf 65.536 Token erhöhtem Kontext und einem fp8-KV-Cache (der Attention-Cache mit 8 Bit gespeichert, halber Speicherbedarf) beantwortete das 4B-Modell auf Karten mit 16 GiB dieselbe Runde lokal in 28 s, wobei der gesamte Prompt von 38 Tsd. Token komplett neu eingelesen werden musste, weil noch nichts im Cache lag. Spätere Runden einer Unterhaltung finden den Großteil ihres Prompts schon im Cache der Engine: Die mediane Zeit bis zum ersten Byte für die Regel claude-haiku* in Abb. 4 beträgt 290 ms.

Die Aktivitätsseite des Routers. Vier Zähler: lokal 107, an Anthropic durchgereicht 2, zurückgefallen 0 und abgelehnt · Fehler 2 · 0. Eine Tabelle „By rule“ zeigt die Regel claude-haiku* zu qwen3-4b-dp4 mit ihren Zählern für lokal, zurückgefallen und abgelehnt, Latenz und Zeit bis zum ersten Byte bei p50 und p95 und dem Zustand ihres Circuit Breakers, geschlossen; die Zeile für durchgereichte Anfragen zeigt dieselben Zeiten für die an Anthropic weitergereichten Anfragen. Eine Tabelle der lokalen Modelle zeigt qwen3-4b-dp4 mit geschlossenem Circuit Breaker, und ein Panel „Fallback reasons“ nennt no_upstream_credential und relay_not_allowed, je einmal. Der Circuit Breaker für dieses Modell: geschlossen Warum eine Regel an Anthropic ging oder abgelehnt wurde, nach Grund
Abb. 4Aktivität des Routers im selben Zeitraum: 107 Anfragen lokal beantwortet, 2 an Anthropic durchgereicht, 0 zurückgefallen und 2 abgelehnt bei 0 Fehlern. Darunter Latenz und Zeit bis zum ersten Byte pro Regel bei p50 und p95, der Circuit Breaker pro lokalem Modell und die Gründe, aus denen eine Regel an Anthropic weiterleitete oder ablehnte. Die Zähler gelten pro Prozess; ein Neustart setzt sie auf null. Aufgezeichnet am 4. Oktober 2026. Scrollen Sie das Bild seitlich, um die ganze Seite zu sehen.
Protokoll
Anthropic Messages
Unterstützung
Vollständig

Die in Ihren Regeln festgelegten Claude-Modelle laufen hier; jedes andere Modell und jeder andere /v1-Pfad geht mit Ihrer eigenen Anmeldung an Anthropic. Tragen Sie den Warden-Schlüssel im Router-Modus nie in ANTHROPIC_API_KEY oder ANTHROPIC_AUTH_TOKEN ein: Das würde Ihre Anmeldung ersetzen. Der rein lokale Modus führt alles auf einem bereitgestellten Modell aus, einschließlich der kleinen Hintergrundaufgaben, und nichts geht an Anthropic.

Voraussetzungen

  • Claude Code 2.1.227 oder neuer (ANTHROPIC_CUSTOM_HEADERS).
  • Das Routing muss eingeschaltet sein, mit mindestens einer aktivierten Regel.
  • Der Schlüssel muss an Anthropic weiterleiten dürfen (May relay).
  • Braucht mindestens 49.152 Token Kontext: Allein die erste Runde umfasst etwa 38.000 Token, bevor irgendeine Datei gelesen wird.
  • 131.072 Token oder mehr für echte Sitzungen; für kurze reicht weniger.
  • Claude Code warnt möglicherweise, dass der Modellname nicht in seinem Katalog steht. Das ist nur ein Hinweis: Claude Code geht dann von einem Kontextfenster mit 200 Tsd. Token aus und komprimiert entsprechend automatisch. Setzen Sie CLAUDE_CODE_MAX_CONTEXT_TOKENS auf das echte Kontextfenster des Modells.

Einrichtung

In der Konsole erzeugt Connect diese Dateien mit der Adresse Ihres Wardens, Ihrem Schlüssel und dem gewählten Modell. Hier sehen Sie sie mit Platzhaltern.

Router: Claude-Anmeldung behalten

Ihre Claude-Anmeldung geht weiterhin an Anthropic; der Warden-Schlüssel wird in einem eigenen Header übertragen, und die in Ihren Regeln festgelegten Modelle werden hier beantwortet.

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

Nur lokal (kein Anthropic-Konto)

Jeder Modell-Slot von Claude Code wird auf das gewählte bereitgestellte Modell gesetzt, und der Warden-Schlüssel dient als Auth-Token. Nichts geht an 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"
  }
}

Offizielle Dokumentation: https://code.claude.com/docs/en/llm-gateway (abgerufen am 2026-10-04).