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» ничего не пересылается.

Хватит ли небольшой модели? Качество ответов мы не измеряли, так что это экспертная оценка, а не бенчмарк. Модели класса Haiku Claude Code поручает легкую фоновую работу, и небольшая локальная модель — разумная замена для этих задач, а также для простых правок с четкой постановкой. Изменения во многих файлах, отладку и длинные планы оставьте 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 с вашими собственными учетными данными. В режиме маршрутизатора никогда не указывайте ключ 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).