LM Warden

Claude Code, आपके अपने GPU पर।

अपना Claude लॉगिन रखें और जिन मॉडल के नाम आपके नियमों में हैं उन्हें यहाँ चलाएँ, या इसे पूरी तरह लोकल चलाएँ।

एक ANTHROPIC_BASE_URL, और जवाब दो में से किसी एक जगह से आता है।

Claude Code जो भी अनुरोध Anthropic को भेजता है, वह या तो आपके प्लान की उपयोग सीमा में गिना जाता है या API कुंजी पर हर टोकन के हिसाब से बिल होता है, और उसका प्रॉम्प्ट, आपके कोड समेत, आपकी मशीन से बाहर जाता है। इनमें से कई अनुरोध छोटे होते हैं। अगर उनका जवाब आपके पास पहले से मौजूद कार्ड से दिया जाए, तो उनकी लागत बस बिजली है, वे आपकी सीमा में नहीं गिने जाते, और उनके प्रॉम्प्ट आपके होस्ट पर ही रहते हैं।

Claude ख़ुद यहाँ कभी नहीं चलता। एक नियम तय करता है कि किन Claude मॉडल के अनुरोधों का जवाब यह मशीन देगी, जैसे claude-haiku*, और फिर आपका लोड किया हुआ मॉडल उनकी जगह जवाब देता है, उसी नाम से जो Claude Code ने माँगा था। बाकी सब, Opus समेत, आपके अपने लॉगिन से बिना किसी बदलाव के, बाइट-दर-बाइट और स्ट्रीमिंग समेत, Anthropic को भेजा जाता है। आपकी warden कुंजी अपने अलग हेडर में जाती है, इसलिए आपके लॉगिन में कोई छेड़छाड़ नहीं होती, और जिस कुंजी पर “May relay to Anthropic” फ़्लैग नहीं लगा है, उसका कोई भी अनुरोध आगे नहीं भेजा जाता।

क्या छोटा मॉडल काफ़ी है? हमने जवाबों की गुणवत्ता नहीं मापी है, इसलिए यह हमारी राय है, बेंचमार्क नहीं। Claude Code हल्के बैकग्राउंड कामों के लिए अपना Haiku-स्तर का मॉडल इस्तेमाल करता है; उनके लिए, और सरल, साफ़-साफ़ बताए गए बदलावों के लिए, एक छोटा लोकल मॉडल ठीक विकल्प है। कई फ़ाइलों में फैले बदलावों, डीबगिंग और लंबी योजनाओं के लिए Sonnet और Opus को Anthropic पर ही रहने दें; जब तक आप कोई नियम नहीं जोड़ते, आख़िरी डिफ़ॉल्ट नियम यही करता है। बड़े कार्ड पर बड़ा मॉडल हो तो यह सीमा आगे खिसक जाती है; नीचे दिए गए हमारे Claude Code और रेप्लिका माप में 4B मॉडल इस्तेमाल हुआ था।

कॉन्टेक्स्ट का आकार चैट के हिसाब से नहीं, Claude Code के हिसाब से तय करें: हमारे सेशन में उसका पहला टर्न ही 38,167 टोकन का था, इसलिए लोकल मॉडल को 40k टोकन से काफ़ी ज़्यादा कॉन्टेक्स्ट चाहिए।

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 s तक उसे कुछ नहीं भेजा जाता।

शब्दों में: Claude Code अनुरोध warden को भेजता है, Authorization में अपने Anthropic लॉगिन के साथ और X-LMWarden-Key में warden कुंजी के साथ। warden अपने नियम क्रम से आज़माता है। जिस मॉडल का नाम किसी नियम में है, उसका अनुरोध अनुवादित होता है, शेड्यूलर उसे क़तार में रखता है और रेप्लिका राउटर उसे एक vLLM रेप्लिका को भेजता है। कोई भी दूसरा अनुरोध, जैसे Opus, api.anthropic.com को भेजा जाता है, लॉगिन आगे भेजा जाता है और 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 से जुड़ाव यूज़र के अपने लॉगिन से होता है
चित्र 3Router पेज, 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 टोकन तक बढ़ाने और fp8 KV कैश (अटेंशन कैश 8 बिट में, यानी आधी मेमोरी) के साथ, 16 GiB कार्ड पर 4B मॉडल ने वही टर्न 28 s में लोकल रूप से पूरा किया, जबकि पूरा 38k-टोकन प्रॉम्प्ट शुरू से पढ़ना पड़ा और कैश में अभी कुछ नहीं था। बातचीत के बाद वाले टर्न में प्रॉम्प्ट का ज़्यादातर हिस्सा इंजन के कैश में पहले से मिलता है: चित्र 4 में claude-haiku* नियम के लिए पहले बाइट तक का मीडियन समय 290 ms है।

Router गतिविधि पेज। चार काउंटर: लोकल 107, Anthropic पास-थ्रू 2, फ़ॉलबैक 0, और अस्वीकार · त्रुटि 2 · 0। “By rule” तालिका में claude-haiku* से qwen3-4b-dp4 वाले नियम की लोकल, फ़ॉलबैक और अस्वीकार गिनती, p50 और p95 पर लेटेंसी और पहले बाइट तक का समय दिखता है, और उसके ब्रेकर की स्थिति closed है; पास-थ्रू पंक्ति Anthropic को भेजे गए अनुरोधों के लिए यही समय दिखाती है। लोकल मॉडल की तालिका में qwen3-4b-dp4 का ब्रेकर closed दिखता है, और “Fallback reasons” पैनल में no_upstream_credential और relay_not_allowed हैं, एक-एक बार। इस मॉडल का ब्रेकर: closed अनुरोध Anthropic को क्यों गया या अस्वीकार क्यों हुआ, कारण के हिसाब से
चित्र 4उसी अवधि की Router गतिविधि: 107 अनुरोधों का जवाब लोकल रूप से, 2 Anthropic को पास-थ्रू, 0 फ़ॉलबैक, और 2 अस्वीकार, 0 त्रुटियाँ। नीचे, हर नियम के लिए p50 और p95 पर लेटेंसी और पहले बाइट तक का समय, हर लोकल मॉडल का ब्रेकर, और वे कारण जिनसे अनुरोध Anthropic को गया या अस्वीकार हुआ। काउंटर हर प्रोसेस के अपने होते हैं; रीस्टार्ट उन्हें शून्य कर देता है। 4 अक्टूबर 2026 को रिकॉर्ड किया गया। पूरा पेज देखने के लिए इमेज को दाएँ-बाएँ स्क्रॉल करें।
प्रोटोकॉल
Anthropic Messages
सपोर्ट
पूरा सपोर्ट

जिन Claude मॉडल के नाम आपके नियमों में हैं, वे यहीं चलते हैं; बाकी हर मॉडल और /v1 पाथ आपके अपने लॉगिन से Anthropic को जाता है। राउटर मोड में 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 चेतावनी दे सकता है कि मॉडल का नाम उसके कैटलॉग में नहीं है। यह सिर्फ़ जानकारी है: वह 200k की विंडो मान लेता है और उसी हिसाब से बातचीत को अपने-आप छोटा (कॉम्पैक्ट) करता है। CLAUDE_CODE_MAX_CONTEXT_TOKENS को मॉडल की असली कॉन्टेक्स्ट विंडो पर सेट करें।

सेटअप

कंसोल में Connect ये फ़ाइलें आपके warden के पते, आपकी कुंजी और आपके चुने हुए मॉडल के साथ लिखता है। यहाँ ये प्लेसहोल्डर के साथ दी गई हैं।

Router: अपना Claude लॉगिन रखें

आपका Claude लॉगिन Anthropic को जाता रहता है; 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 अकाउंट के बिना)

हर मॉडल स्लॉट में आपका चुना हुआ लोड किया गया मॉडल होता है, और 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 की स्थिति)।