LM Warden

Claude Code на ваших власних GPU.

Користуйтеся далі своїм обліковим записом Claude і запускайте тут моделі, названі у ваших правилах, або працюйте повністю локально.

Один ANTHROPIC_BASE_URL, два місця, звідки може прийти відповідь.

Кожен запит, який Claude Code надсилає до Anthropic, витрачає ліміти вашого тарифу або оплачується за кожен токен за ключем API, а його промпт, разом із вашим кодом, залишає вашу машину. Багато цих запитів невеликі. Обробляйте їх на картах, які у вас уже є: тоді вони коштують лише електроенергії, не витрачають ліміти, а їхні промпти залишаються на вашому хості.

Сам Claude тут ніколи не працює. Правило визначає моделі Claude, за які відповідає цей сервер, наприклад claude-haiku*, і завантажена вами модель відповідає замість них під тією назвою, яку запросив Claude Code. Усе інше, зокрема Opus, передається до Anthropic байт у байт під вашим власним обліковим записом, зокрема й потокові відповіді. Ключ LM Warden передається в окремому заголовку, тож ваші облікові дані ніхто не змінює, а для ключа без прапорця «May relay to Anthropic» нічого не пересилається.

Чи достатньо малої моделі? Якість відповідей ми не вимірювали, тож це судження, а не бенчмарк. Claude Code використовує модель класу Haiku для легшої фонової роботи, і невелика локальна модель — розумна заміна там і для простих, чітко описаних правок. Для змін у багатьох файлах, налагодження й довгих планів залишайте Sonnet і Opus на Anthropic — саме це робить загальне правило, якщо ви не додасте свого. Більша модель на потужніших картах зсуває цю межу; наші вимірювання Claude Code і реплік нижче виконано на моделі 4B.

Розраховуйте контекст на Claude Code, а не на чат: його перший раунд у нашому сеансі мав 38 167 токенів, тож локальній моделі потрібно значно більше ніж 40 тис. токенів контексту.

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.
Рис. 2Куди йде запит. Правила перевіряються по черзі, і спрацьовує перше, що збіглося. Локальна відповідь проходить через той самий планувальник і маршрутизатор реплік, що й будь-який інший запит; репліка — це одна повна копія моделі, тут по одній на GPU. Локальна помилка до першого байта йде до Anthropic або повертається як 529, який Claude Code повторює, а після 3 помилок поспіль спрацьовує запобіжник моделі: протягом 60 с їй нічого не надсилається.

Текстовий опис: Claude Code надсилає запит до LM Warden зі своїми обліковими даними Anthropic у заголовку Authorization і ключем LM Warden у X-LMWarden-Key. LM Warden перевіряє свої правила по черзі. Запит до моделі, названої в правилі, перекладається, ставиться планувальником у чергу й надсилається маршрутизатором реплік до однієї репліки vLLM. Будь-який інший запит, як-от до Opus, передається на api.anthropic.com з пересланими обліковими даними й без ключа LM Warden. Якщо локальна обробка зазнає збою до першого байта, запит іде до Anthropic, або правило відхиляє його з кодом 529, який Claude Code повторює.

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

Claude Code 2.1.227 або новіший. Залишайтеся в claude під своїм звичайним обліковим записом; ключ передається в окремому заголовку, а не в ANTHROPIC_API_KEY.

Сторінка Router у консолі. Зелений банер повідомляє «Routing normally» і «96% answered locally since 13:38». Під «Where each Claude model goes. First match wins» правило 1 надсилає claude-haiku* до завантаженої моделі qwen3-4b-dp4 з «If it fails: Anthropic» і «Thinking off». Останній рядок — загальне правило: усі інші моделі Claude і шляхи /v1 ідуть до Anthropic під власним обліковим записом користувача й потребують ключа з «May relay to Anthropic». Панель Traffic показує 107 локальних, 2 передані до Anthropic напряму, 0 перенаправлених до Anthropic після збою і 2 відхилені або з помилкою та наводить дві причини, no_upstream_credential і relay_not_allowed, по одній. Спрацьовує перше правило, що збіглося; усі інші моделі йдуть до Anthropic До Anthropic звертаються під власним обліковим записом користувача
Рис. 3Сторінка Router, коли LM Warden працював з 13:38: «Routing normally», 96 % запитів оброблено локально від перезапуску. Одне правило надсилає claude-haiku* до локальної моделі, а загальне правило передає все інше до Anthropic; правила пронумеровано в порядку перевірки. Панель Traffic показує 107 локальних, 2 передані напряму, 0 перенаправлених після збою і 2 відхилені. Прокрутіть зображення вбік, щоб побачити всю сторінку.

Будьте готові, що повільним буде перший раунд. В одному з попередніх сеансів перший раунд Claude Code мав 38 167 токенів, а локальну модель було завантажено з контекстом 32 768 токенів, тож рушій його відхилив (status_400), і запит пішов до Anthropic. Коли контекст збільшили до 65 536 токенів і ввімкнули KV-кеш fp8 (кеш уваги зберігається у 8 бітах і займає вдвічі менше пам’яті), модель 4B на картах по 16 ГіБ відповіла на той самий раунд локально за 28 с, прочитавши весь промпт на 38 тис. токенів із нуля, коли в кеші ще нічого не було. Наступні раунди розмови знаходять більшу частину промпту вже в кеші рушія: медіанний час до першого байта для правила claude-haiku* на рис. 4 — 290 мс.

Сторінка активності Router. Чотири лічильники: локальні 107, передані до Anthropic напряму 2, перенаправлені після збою 0, відхилені · помилки 2 · 0. Таблиця «By rule» наводить правило claude-haiku* до qwen3-4b-dp4 з кількістю локальних, перенаправлених після збою і відхилених запитів, затримкою й часом до першого байта на p50 і p95 та станом запобіжника — замкнений; рядок прямої передачі наводить ті самі часи для запитів, переданих до Anthropic. Таблиця локальних моделей показує qwen3-4b-dp4 із замкненим запобіжником, а панель «Fallback reasons» наводить no_upstream_credential і relay_not_allowed, по одному. Запобіжник цієї моделі: замкнений Чому правило передало запит до Anthropic або відхилило його, за причинами
Рис. 4Активність Router за той самий період: 107 запитів оброблено локально, 2 передано до Anthropic напряму, 0 перенаправлено після збою, 2 відхилено, 0 помилок. Нижче — затримка й час до першого байта для кожного правила на p50 і p95, запобіжник для кожної локальної моделі та причини, з яких правило передало запит до Anthropic або відхилило його. Лічильники зберігаються в пам’яті процесу; перезапуск їх обнуляє. Записано 4 жовтня 2026 р. Прокрутіть зображення вбік, щоб побачити всю сторінку.
Протокол
Anthropic Messages
Підтримка
Повна підтримка

Моделі Claude, названі у ваших правилах, працюють тут; усі інші моделі й шляхи /v1 ідуть до Anthropic під вашим власним обліковим записом. У режимі Router ніколи не вказуйте ключ LM Warden в ANTHROPIC_API_KEY чи ANTHROPIC_AUTH_TOKEN: він замінить ваші облікові дані. У режимі «лише локально» все, зокрема дрібні фонові завдання, виконується на одній моделі, що обслуговується, і до Anthropic нічого не надходить.

Вимоги

  • Claude Code 2.1.227 або новіший (ANTHROPIC_CUSTOM_HEADERS).
  • Маршрутизацію має бути ввімкнено, і щонайменше одне правило має бути активним.
  • Ключ повинен мати дозвіл на пересилання до Anthropic (May relay).
  • Потрібно щонайменше 49 152 токени контексту: лише перший раунд займає близько 38 000 токенів, ще до читання будь-якого файлу.
  • 131 072 токени або більше для реальних сеансів; для коротких вистачить і менше.
  • Claude Code може попередити, що назви моделі немає в його каталозі. Це лише інформація: він вважає, що вікно має 200 тис. токенів, і відповідно автоматично стискає контекст. Задайте в CLAUDE_CODE_MAX_CONTEXT_TOKENS справжнє контекстне вікно моделі.

Налаштування

У консолі Connect записує ці файли з адресою вашого LM Warden, вашим ключем і вибраною моделлю. Тут вони наведені із заповнювачами.

Router: зі своїм обліковим записом Claude

Ваші облікові дані Claude і далі йдуть до Anthropic; ключ LM Warden передається в окремому заголовку, а на запити до моделей, названих у ваших правилах, відповідають тут.

Оболонка
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"
  }
}

Лише локально (без облікового запису Anthropic)

Кожному слоту моделі призначено вибрану модель, що обслуговується, а ключ LM Warden — це токен автентифікації. До Anthropic нічого не надходить.

Оболонка
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"
  }
}

Офіційна документація: https://code.claude.com/docs/en/llm-gateway (переглянуто 2026-10-04).