LM Warden

Claude Code na twoich własnych kartach GPU.

Zachowaj logowanie do Claude i uruchamiaj tutaj modele wskazane w regułach albo działaj w pełni lokalnie.

Jeden ANTHROPIC_BASE_URL, dwa miejsca, z których może przyjść odpowiedź.

Każde żądanie, które Claude Code wysyła do Anthropic, zużywa limity twojego planu albo jest rozliczane za każdy token na kluczu API, a jego prompt, łącznie z twoim kodem, opuszcza twój komputer. Wiele z tych żądań jest niewielkich. Obsłuż je na kartach, które już masz: kosztują wtedy prąd, nie liczą się do limitów, a ich prompty zostają na twoim hoście.

Sam Claude nigdy tu nie działa. Reguła wskazuje modele Claude, za które odpowiada ten serwer, na przykład claude-haiku*, a załadowany przez ciebie model odpowiada zamiast nich pod nazwą, o którą prosił Claude Code. Wszystko inne, łącznie z Opus, jest przekazywane do Anthropic bajt w bajt na twoim własnym koncie, łącznie ze strumieniowaniem. Klucz LM Warden jest przesyłany w osobnym nagłówku, więc dane logowania pozostają nietknięte, a dla klucza bez flagi „May relay to Anthropic” nic nie jest przekazywane.

Czy mały model wystarczy? Nie mierzyliśmy jakości odpowiedzi, więc to ocena, a nie benchmark. Claude Code używa modelu klasy Haiku do lżejszej pracy w tle i mały model lokalny jest tam rozsądnym zastępstwem, podobnie jak przy prostych, dobrze opisanych poprawkach. Przy zmianach w wielu plikach, debugowaniu i długich planach zostaw Sonnet i Opus w Anthropic – tak działa reguła domyślna, jeśli nie dodasz własnej. Większy model na większych kartach przesuwa tę granicę; nasze pomiary Claude Code i replik poniżej wykonano na modelu 4B.

Dobierz kontekst pod Claude Code, a nie pod czat: jego pierwsza tura w naszej sesji miała 38 167 tokenów, więc model lokalny potrzebuje znacznie ponad 40 tys. tokenów kontekstu.

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.
Rys. 2Dokąd trafia żądanie. Reguły są sprawdzane po kolei i decyduje pierwsze dopasowanie. Odpowiedź lokalna przechodzi przez tego samego planistę żądań i ten sam router replik co każde inne żądanie; replika to jedna pełna kopia modelu, tutaj po jednej na kartę GPU. Błąd lokalny przed pierwszym bajtem trafia do Anthropic albo wraca jako 529, który Claude Code ponawia, a po 3 błędach z rzędu bezpiecznik modelu się otwiera: przez 60 s nic nie jest do niego wysyłane.

Opis słowny: Claude Code wysyła żądanie do LM Warden z własnymi danymi logowania Anthropic w Authorization i kluczem LM Warden w X-LMWarden-Key. LM Warden sprawdza swoje reguły po kolei. Żądanie do modelu wskazanego w regule jest tłumaczone, ustawiane w kolejce przez planistę żądań i wysyłane przez router replik do jednej repliki vLLM. Każde inne żądanie, na przykład do Opus, jest przekazywane do api.anthropic.com z przekazanymi danymi logowania i usuniętym kluczem LM Warden. Jeśli część lokalna zawiedzie przed pierwszym bajtem, żądanie trafia do Anthropic albo reguła je odrzuca z kodem 529, który Claude Code ponawia.

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

Claude Code 2.1.227 lub nowszy. Zachowaj zwykłe logowanie claude; klucz jest przesyłany w osobnym nagłówku, a nie w ANTHROPIC_API_KEY.

Strona Router w konsoli. Na zielonym banerze widać „Routing normally” i „96% answered locally since 13:38”. W sekcji „Where each Claude model goes. First match wins” reguła 1 wysyła claude-haiku* do załadowanego modelu qwen3-4b-dp4 z „If it fails: Anthropic” i „Thinking off”. Ostatni wiersz to reguła domyślna: wszystkie inne modele Claude i ścieżki /v1 trafiają do Anthropic na własnym koncie użytkownika i wymagają klucza z „May relay to Anthropic”. Panel Traffic liczy 107 lokalnych, 2 przekazane do Anthropic, 0 przekierowanych awaryjnie do Anthropic i 2 odrzucone lub z błędem oraz podaje dwa powody, no_upstream_credential i relay_not_allowed, po jednym. Decyduje pierwsze dopasowanie; wszystkie inne modele trafiają do Anthropic Połączenie z Anthropic korzysta z własnego konta użytkownika
Rys. 3Strona Router, gdy LM Warden działał od 13:38: „Routing normally”, 96% żądań obsłużonych lokalnie od restartu. Jedna reguła wysyła claude-haiku* do modelu lokalnego, a reguła domyślna przekazuje wszystko inne do Anthropic; reguły są ponumerowane w kolejności sprawdzania. Panel Traffic liczy 107 lokalnych, 2 przekazane, 0 przekierowanych awaryjnie i 2 odrzucone. Przewiń obraz w bok, aby zobaczyć całą stronę.

Spodziewaj się, że wolna będzie pierwsza tura. We wcześniejszej sesji pierwsza tura Claude Code miała 38 167 tokenów, a model lokalny był załadowany z kontekstem 32 768 tokenów, więc silnik ją odrzucił (status_400) i żądanie trafiło do Anthropic. Po zwiększeniu kontekstu do 65 536 tokenów i włączeniu cache KV fp8 (cache uwagi przechowywany w 8 bitach, połowa pamięci) model 4B na kartach 16 GiB odpowiedział na tę samą turę lokalnie w 28 s, czytając cały prompt o długości 38 tys. tokenów od zera, gdy w cache nie było jeszcze nic. Kolejne tury rozmowy znajdują większość swojego promptu już w cache silnika: mediana czasu do pierwszego bajtu dla reguły claude-haiku* na rys. 4 wynosi 290 ms.

Strona aktywności Router. Cztery liczniki: lokalne 107, przekazane do Anthropic 2, przekierowane awaryjnie 0 oraz odrzucone · błędy 2 · 0. Tabela „By rule” podaje regułę claude-haiku* do qwen3-4b-dp4 z liczbą żądań lokalnych, przekierowanych i odrzuconych, opóźnieniem i czasem do pierwszego bajtu na p50 i p95 oraz stanem bezpiecznika: zamknięty; wiersz przekazywania podaje te same czasy dla żądań przekazanych do Anthropic. Tabela modeli lokalnych pokazuje qwen3-4b-dp4 z zamkniętym bezpiecznikiem, a panel „Fallback reasons” wymienia no_upstream_credential i relay_not_allowed, po jednym. Bezpiecznik tego modelu: zamknięty Dlaczego reguła trafiła do Anthropic lub została odrzucona, według powodu
Rys. 4Aktywność Router w tym samym okresie: 107 żądań obsłużonych lokalnie, 2 przekazane do Anthropic, 0 przekierowanych awaryjnie i 2 odrzucone przy 0 błędów. Poniżej opóźnienie i czas do pierwszego bajtu dla każdej reguły na p50 i p95, bezpiecznik dla każdego modelu lokalnego oraz powody, dla których reguła trafiła do Anthropic lub odrzuciła żądanie. Liczniki działają w obrębie procesu; restart je zeruje. Zarejestrowano 4 października 2026 r. Przewiń obraz w bok, aby zobaczyć całą stronę.
Protokół
Anthropic Messages
Obsługa
Pełna obsługa

Modele Claude wskazane w twoich regułach działają tutaj; wszystkie inne modele i ścieżki /v1 trafiają do Anthropic na twoim własnym koncie. W trybie Router nigdy nie wpisuj klucza LM Warden w ANTHROPIC_API_KEY ani ANTHROPIC_AUTH_TOKEN: zastąpiłby on twoje dane logowania. Tryb tylko lokalny uruchamia wszystko na jednym udostępnianym modelu, łącznie z małymi zadaniami w tle, i nic nie trafia do Anthropic.

Wymagania

  • Claude Code 2.1.227 lub nowszy (ANTHROPIC_CUSTOM_HEADERS).
  • Routing musi być włączony, z co najmniej jedną aktywną regułą.
  • Klucz musi mieć zgodę na przekazywanie do Anthropic (May relay).
  • Wymaga co najmniej 49 152 tokenów kontekstu: sama pierwsza tura to około 38 000 tokenów, zanim zostanie przeczytany jakikolwiek plik.
  • 131 072 tokeny lub więcej dla prawdziwych sesji; dla krótkich wystarczy mniej.
  • Claude Code może ostrzec, że nazwy modelu nie ma w jego katalogu. To tylko informacja: zakłada okno 200 tys. tokenów i odpowiednio do niego automatycznie kompresuje kontekst. Ustaw CLAUDE_CODE_MAX_CONTEXT_TOKENS na rzeczywiste okno kontekstu modelu.

Konfiguracja

W konsoli Connect zapisuje te pliki z adresem twojej instancji LM Warden, twoim kluczem i wybranym modelem. Tutaj są pokazane z symbolami zastępczymi.

Router: zachowaj logowanie do Claude

Twoje logowanie do Claude nadal trafia do Anthropic; klucz LM Warden jest przesyłany w osobnym nagłówku, a na żądania do modeli wskazanych w regułach odpowiada ten serwer.

Powłoka
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"
  }
}

Tylko lokalnie (bez konta Anthropic)

Każde ustawienie modelu wskazuje wybrany udostępniany model, a klucz LM Warden służy jako token uwierzytelniania. Nic nie trafia do Anthropic.

Powłoka
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"
  }
}

Oficjalna dokumentacja: https://code.claude.com/docs/en/llm-gateway (stan na 2026-10-04).