1 line
274 KiB
JSON
1 line
274 KiB
JSON
{"repo": "aj-omanai/1st", "files": {"omniroute/src/shared/constants/providers/apikey/gateways.ts": {"6eea4894299d5371c00c11f1f6dec2f7c0076253": {"t": 1785596390.1589055, "n": 24421, "h": "40c6bbda8e7e5a38", "c": "/**\n * APIKEY provider catalog — gateways family (aggregators, multi-model routers & API marketplaces).\n * Pure data; merged by apikey/index.ts via spread (god-file decomposition; semantic split).\n */\nexport const APIKEY_PROVIDERS_GATEWAYS = {\n \"charm-hyper\": {\n id: \"charm-hyper\",\n alias: \"charm-hyper\",\n name: \"Charm Hyper\",\n icon: \"router\",\n color: \"#7C3AED\",\n textIcon: \"CH\",\n passthroughModels: true,\n website: \"https://hyper.charm.land\",\n hasFree: true,\n freeNote: \"100 free monthly Hypercredits on signup\",\n apiHint: \"Create an API key at https://hyper.charm.land, then paste it here as a Bearer token.\",\n },\n agentrouter: {\n id: \"agentrouter\",\n alias: \"agentrouter\",\n name: \"AgentRouter\",\n icon: \"router\",\n color: \"#10B981\",\n textIcon: \"AR\",\n passthroughModels: true,\n website: \"https://agentrouter.org\",\n hasFree: true,\n freeNote: \"$200 free credits on signup - multi-model routing gateway\",\n apiHint: \"Get $200 free credits at https://agentrouter.org/register — no credit card required.\",\n },\n \"command-code\": {\n id: \"command-code\",\n alias: \"cmd\",\n name: \"Command Code\",\n icon: \"terminal\",\n color: \"#111827\",\n textIcon: \"CC\",\n website: \"https://commandcode.ai/\",\n authHint:\n \"Use a Command Code API key. Requests are sent to Command Code's /alpha/generate endpoint.\",\n apiHint: \"Create or copy an API key from Command Code, then paste it here as a Bearer token.\",\n },\n openrouter: {\n id: \"openrouter\",\n alias: \"openrouter\",\n name: \"OpenRouter\",\n icon: \"router\",\n color: \"#F97316\",\n textIcon: \"OR\",\n passthroughModels: true,\n website: \"https://openrouter.ai\",\n hasFree: true,\n freeNote: \"Free models at $0/token with :free suffix - 20 RPM / 200 RPD\",\n },\n requesty: {\n id: \"requesty\",\n alias: \"requesty\",\n name: \"Requesty\",\n icon: \"router\",\n color: \"#6366F1\",\n textIcon: \"RQ\",\n passthroughModels: true,\n website: \"https://requesty.ai\",\n hasFree: true,\n freeNote: \"Free tier ~200 requests/day - multi-model routing gateway (300+ models)\",\n apiHint:\n \"Create an API key at https://app.requesty.ai, then paste it here as a Bearer token. \" +\n \"OpenAI-compatible endpoint at https://router.requesty.ai/v1, with a live /v1/models catalog.\",\n },\n dgrid: {\n id: \"dgrid\",\n alias: \"dgrid\",\n name: \"DGrid\",\n icon: \"router\",\n color: \"#65A30D\",\n textIcon: \"DG\",\n passthroughModels: true,\n website: \"https://dgrid.ai\",\n hasFree: true,\n freeNote:\n \"DGrid Free Models Router: 10 requests/minute and 100 requests/day. \" +\n \"A $5 lifetime top-up unlocks up to 20 requests/minute and 1,000 requests/day.\",\n apiHint:\n \"Create a DGrid API key at https://dgrid.ai, then use https://api.dgrid.ai/v1 \" +\n \"as the OpenAI-compatible base URL.\",\n },\n qiniu: {\n id: \"qiniu\",\n alias: \"qiniu\",\n name: \"Qiniu\",\n icon: \"cloud\",\n color: \"#1E88E5\",\n textIcon: \"QN\",\n passthroughModels: true,\n website: \"https://www.qiniu.com\",\n apiHint:\n \"Create a Qiniu AI inference API key at https://portal.qiniu.com/ai-inference/api-key, \" +\n \"then paste it here as a Bearer token. OpenAI-compatible endpoint \" +\n \"at https://api.qnaigc.com/v1, proxying DeepSeek, Claude, Kimi and more behind one key.\",\n },\n orcarouter: {\n id: \"orcarouter\",\n alias: \"orcarouter\",\n name: \"OrcaRouter\",\n icon: \"router\",\n color: \"#0891B2\",\n textIcon: \"ORC\",\n passthroughModels: true,\n website: \"https://www.orcarouter.ai\",\n apiHint:\n \"Create an API key (starts with sk-orca-) at https://www.orcarouter.ai, then paste it as a Bearer token. OpenAI-compatible endpoint at https://api.orcarouter.ai/v1.\",\n },\n \"api-airforce\": {\n id: \"api-airforce\",\n alias: \"af\",\n name: \"Api.airforce\",\n icon: \"flight\",\n color: \"#1E3A5F\",\n textIcon: \"AF\",\n website: \"https://api.airforce\",\n hasFree: true,\n freeNote:\n \"55 free tier models including Grok-3, Claude 3.7, Qwen3, Kimi-K2, Gemini 2.5 Flash, DeepSeek-V3\",\n apiHint:\n \"Get your API key from https://panel.api.airforce — OpenAI-compatible endpoint at https://api.airforce/v1\",\n },\n crof: {\n id: \"crof\",\n alias: \"crof\",\n name: \"CrofAI\",\n icon: \"auto_awesome\",\n color: \"#0EA5E9\",\n textIcon: \"CR\",\n website: \"https://crof.ai\",\n },\n bazaarlink: {\n id: \"bazaarlink\",\n alias: \"bzl\",\n name: \"BazaarLink\",\n icon: \"storefront\",\n color: \"#6366F1\",\n textIcon: \"BZ\",\n website: \"https://bazaarlink.ai\",\n hasFree: true,\n freeNote:\n \"Free tier: 4M tokens/day per account with auto:free routing — zero-cost inference, no credit card required.\",\n authHint:\n \"Use your BazaarLink API key (starts with sk-bl-) in Authorization: Bearer <key>. OpenAI SDK works with base URL https://bazaarlink.ai/api/v1. Models use provider/model-name format.\",\n apiHint:\n \"Create a free API key at https://bazaarlink.ai — model 'auto:free' routes to zero-cost inference. All models use the provider/model-name format, e.g. xiaomi/mimo-v2.5-pro.\",\n },\n synthetic: {\n id: \"synthetic\",\n alias: \"synthetic\",\n name: \"Synthetic\",\n icon: \"verified_user\",\n color: \"#6366F1\",\n textIcon: \"SY\",\n website: \"https://synthetic.new\",\n passthroughModels: true,\n },\n \"kilo-gateway\": {\n id: \"kilo-gateway\",\n alias: \"kg\",\n name: \"Kilo Gateway\",\n icon: \"hub\",\n color: \"#617A91\",\n textIcon: \"KG\",\n website: \"https://kilo.ai\",\n passthroughModels: true,\n },\n wafer: {\n id: \"wafer\",\n alias: \"wafer\",\n name: \"Wafer AI\",\n icon: \"layers\",\n color: \"#6366F1\",\n textIcon: \"WF\",\n website: \"https://wafer.ai\",\n apiHint: \"API key from https://wafer.ai\",\n },\n \"opencode-zen\": {\n id: \"opencode-zen\",\n alias: \"opencode-zen\",\n name: \"OpenCode Zen\",\n icon: \"opencode\",\n color: \"#6366f1\",\n website: \"https://opencode.ai/zen\",\n anonymousFallback: true,\n },\n \"opencode-go\": {\n id: \"opencode-go\",\n alias: \"opencode-go\",\n name: \"OpenCode Go\",\n icon: \"opencode\",\n color: \"#6366f1\",\n website: \"https://opencode.ai/go\",\n anonymousFallback: true,\n },\n dahl: {\n id: \"dahl\",\n alias: \"dahl\",\n name: \"Dahl\",\n icon: \"dahl\",\n color: \"#6B7280\",\n textIcon: \"DA\",\n website: \"https://inference.dahl.global\",\n hasFree: true,\n freeNote: \"Free — MiniMax M2.7, Kimi K2.6. Click 'Add Account' to auto-generate a token.\",\n authHint: \"Click 'Add Account' to auto-generate a token.\",\n apiHint: \"No manual API key needed. Click 'Add Account' to auto-generate a token.\",\n apiKeyUrl: \"https://inference.dahl.global/tokens\",\n passthroughModels: false,\n managedAccount: true,\n notice: {\n text: \"Dahl auto-generates tokens via https://inference.dahl.global/tokens. No signup needed. Rate limits apply.\",\n },\n },\n puter: {\n id: \"puter\",\n alias: \"pu\",\n name: \"Puter AI\",\n icon: \"cloud_circle\",\n color: \"#6366F1\",\n textIcon: \"PU\",\n website: \"https://puter.com\",\n hasFree: true,\n freeNote:\n \"500+ models (GPT-5, Claude Opus 4, Gemini 3 Pro, Grok 4, DeepSeek V3...) — Users pay via free Puter account\",\n passthroughModels: true,\n authHint: \"Get token at puter.com/dashboard → Copy Auth Token\",\n },\n uncloseai: {\n id: \"uncloseai\",\n alias: \"unc\",\n name: \"UncloseAI\",\n icon: \"auto_awesome\",\n color: \"#8B5CF6\",\n textIcon: \"UN\",\n website: \"https://uncloseai.com\",\n hasFree: true,\n freeNote: \"Free forever — no signup, no credit card. OpenAI-compatible endpoints.\",\n passthroughModels: true,\n authHint: \"No auth required. API accepts any non-empty string as key for identification.\",\n },\n hackclub: {\n id: \"hackclub\",\n alias: \"hc\",\n name: \"Hackclub AI\",\n icon: \"auto_awesome\",\n color: \"#FF6B00\",\n textIcon: \"HC\",\n website: \"https://ai.hackclub.com\",\n hasFree: true,\n freeNote: \"Free AI for Hack Club members — 30+ models, no credit card.\",\n passthroughModels: true,\n authHint: \"Sign in with your Hack Club account at ai.hackclub.com.\",\n },\n freetheai: {\n id: \"freetheai\",\n alias: \"fta\",\n name: \"FreeTheAi\",\n icon: \"hub\",\n color: \"#22C55E\",\n textIcon: \"FTA\",\n website: \"https://freetheai.xyz\",\n hasFree: true,\n freeNote: \"Free OpenAI-compatible gateway — sign up via Discord for an API key.\",\n passthroughModels: true,\n authHint: \"Join the FreeTheAi Discord to get your free API key.\",\n },\n \"g4f-groq\": {\n id: \"g4f-groq\",\n alias: \"g4fgroq\",\n name: \"g4f.space — Groq\",\n icon: \"bolt\",\n color: \"#F97316\",\n textIcon: \"G4F\",\n website: \"https://g4f.space\",\n hasFree: true,\n freeNote:\n \"Free no-key reverse proxy to Groq (gpt4free project) — rate-limited to 5 req/min.\",\n passthroughModels: true,\n authHint:\n \"No auth required. Free tier is limited to 5 requests/minute — sign up at g4f.dev/members.html for higher limits.\",\n },\n \"g4f-gemini\": {\n id: \"g4f-gemini\",\n alias: \"g4fgem\",\n name: \"g4f.space — Gemini\",\n icon: \"bolt\",\n color: \"#F97316\",\n textIcon: \"G4F\",\n website: \"https://g4f.space\",\n hasFree: true,\n freeNote:\n \"Free no-key reverse proxy to Gemini (gpt4free project) — rate-limited to 5 req/min.\",\n passthroughModels: true,\n authHint:\n \"No auth required. Free tier is limited to 5 requests/minute — sign up at g4f.dev/members.html for higher limits.\",\n },\n \"g4f-pollinations\": {\n id: \"g4f-pollinations\",\n alias: \"g4fpol\",\n name: \"g4f.space — Pollinations\",\n icon: \"bolt\",\n color: \"#F97316\",\n textIcon: \"G4F\",\n website: \"https://g4f.space\",\n hasFree: true,\n freeNote:\n \"Free no-key reverse proxy to Pollinations (gpt4free project) — rate-limited to 5 req/min.\",\n passthroughModels: true,\n authHint:\n \"No auth required. Free tier is limited to 5 requests/minute — sign up at g4f.dev/members.html for higher limits.\",\n },\n \"g4f-ollama\": {\n id: \"g4f-ollama\",\n alias: \"g4foll\",\n name: \"g4f.space — Ollama\",\n icon: \"bolt\",\n color: \"#F97316\",\n textIcon: \"G4F\",\n website: \"https://g4f.space\",\n hasFree: true,\n freeNote:\n \"Free no-key hosted Ollama gateway (gpt4free project) — rate-limited to 5 req/min.\",\n passthroughModels: true,\n authHint:\n \"No auth required. Free tier is limited to 5 requests/minute — sign up at g4f.dev/members.html for higher limits.\",\n },\n \"g4f-nvidia\": {\n id: \"g4f-nvidia\",\n alias: \"g4fnv\",\n name: \"g4f.space — NVIDIA\",\n icon: \"bolt\",\n color: \"#F97316\",\n textIcon: \"G4F\",\n website: \"https://g4f.space\",\n hasFree: true,\n freeNote:\n \"Free no-key reverse proxy to NVIDIA NIM (gpt4free project) — rate-limited to 5 req/min.\",\n passthroughModels: true,\n authHint:\n \"No auth required. Free tier is limited to 5 requests/minute — sign up at g4f.dev/members.html for higher limits.\",\n },\n \"vercel-ai-gateway\": {\n id: \"vercel-ai-gateway\",\n alias: \"vag\",\n name: \"Vercel AI Gateway\",\n icon: \"route\",\n color: \"#111827\",\n textIcon: \"VAI\",\n website: \"https://vercel.com/docs/ai-gateway\",\n },\n llm7: {\n id: \"llm7\",\n alias: \"llm7\",\n name: \"LLM7.io\",\n icon: \"hub\",\n color: \"#6366F1\",\n textIcon: \"LM\",\n website: \"https://llm7.io\",\n hasFree: true,\n freeNote: \"No signup required - 2 req/s, 20 RPM, 100 req/hr free tier\",\n apiHint:\n \"Works without API key (use 'unused' as key). Get free token at token.llm7.io for higher limits.\",\n },\n llamagate: {\n id: \"llamagate\",\n alias: \"llamagate\",\n name: \"LlamaGate\",\n icon: \"gate\",\n color: \"#16A34A\",\n textIcon: \"LG\",\n website: \"https://llamagate.ai\",\n },\n gitlawb: {\n id: \"gitlawb\",\n alias: \"glb\",\n name: \"Gitlawb Opengateway (MiMo)\",\n icon: \"hub\",\n color: \"#10B981\",\n textIcon: \"GLB\",\n website: \"https://opengateway.gitlawb.com\",\n hasFree: false,\n freeNote:\n \"Free MiMo (xiaomi/mimo-v2.5) revoked 2026-05 — Opengateway is now a pay-as-you-go credit gateway; no recurring free model.\",\n apiHint: \"Get your API key from Gitlawb Opengateway dashboard.\",\n },\n \"gitlawb-gmi\": {\n id: \"gitlawb-gmi\",\n alias: \"glb-gmi\",\n name: \"Gitlawb Opengateway (GMI Cloud)\",\n icon: \"hub\",\n color: \"#10B981\",\n textIcon: \"GMI\",\n website: \"https://opengateway.gitlawb.com\",\n hasFree: false,\n freeNote:\n \"Free Nemotron promo ended 2026-06 — the GMI Cloud route is now pay-as-you-go credit only.\",\n apiHint: \"Get your API key from Gitlawb Opengateway dashboard.\",\n },\n nanogpt: {\n id: \"nanogpt\",\n alias: \"nanogpt\",\n name: \"NanoGPT\",\n icon: \"chat\",\n color: \"#4F46E5\",\n textIcon: \"NG\",\n website: \"https://nano-gpt.com\",\n },\n aimlapi: {\n id: \"aimlapi\",\n alias: \"aiml\",\n name: \"AI/ML API\",\n icon: \"hub\",\n color: \"#6366F1\",\n textIcon: \"AI\",\n website: \"https://aimlapi.com\",\n hasFree: false,\n freeNote:\n \"Free tier paused (2026) — AI/ML API is now pay-as-you-go only (min $20 top-up); no recurring free credits.\",\n passthroughModels: true,\n },\n novita: {\n id: \"novita\",\n alias: \"novita\",\n name: \"Novita AI\",\n icon: \"auto_awesome\",\n color: \"#FF4081\",\n textIcon: \"NV\",\n website: \"https://novita.ai\",\n hasFree: true,\n freeNote: \"$0.50 trial credits on signup (valid about 1 year)\",\n passthroughModels: true,\n },\n piapi: {\n id: \"piapi\",\n alias: \"pi\",\n name: \"PiAPI\",\n icon: \"api\",\n color: \"#7C4DFF\",\n textIcon: \"PI\",\n website: \"https://piapi.ai\",\n passthroughModels: true,\n },\n getgoapi: {\n id: \"getgoapi\",\n alias: \"ggo\",\n name: \"GoAPI\",\n icon: \"rocket_launch\",\n color: \"#FF6D00\",\n textIcon: \"GO\",\n website: \"https://api.getgoapi.com\",\n passthroughModels: true,\n },\n laozhang: {\n id: \"laozhang\",\n alias: \"lz\",\n name: \"LaoZhang AI\",\n icon: \"hub\",\n color: \"#FF1744\",\n textIcon: \"LZ\",\n website: \"https://api.laozhang.ai\",\n passthroughModels: true,\n },\n thebai: {\n id: \"thebai\",\n alias: \"thebai\",\n name: \"TheB.AI\",\n icon: \"hub\",\n color: \"#3B82F6\",\n textIcon: \"TB\",\n website: \"https://theb.ai\",\n authHint: \"Bearer API key for the TheB.AI OpenAI-compatible gateway.\",\n passthroughModels: true,\n },\n bai: {\n id: \"bai\",\n alias: \"bai\",\n name: \"b.ai\",\n icon: \"hub\",\n color: \"#6366F1\",\n textIcon: \"BA\",\n website: \"https://b.ai\",\n authHint:\n \"Bearer API key for the b.ai OpenAI-compatible LLM gateway (distinct from TheB.AI). \" +\n \"Create a key at https://docs.b.ai, then use https://api.b.ai/v1 as the OpenAI-compatible base URL.\",\n passthroughModels: true,\n },\n fenayai: {\n id: \"fenayai\",\n alias: \"fenayai\",\n name: \"FenayAI\",\n icon: \"hub\",\n color: \"#FF9800\",\n textIcon: \"FN\",\n website: \"https://fenayai.com\",\n authHint: \"Bearer API key for the FenayAI OpenAI-compatible gateway.\",\n passthroughModels: true,\n },\n empower: {\n id: \"empower\",\n alias: \"empower\",\n name: \"Empower\",\n icon: \"hub\",\n color: \"#14B8A6\",\n textIcon: \"EM\",\n website: \"https://docs.empower.dev\",\n authHint: \"Bearer API key for the Empower OpenAI-compatible endpoint.\",\n apiHint:\n \"Empower exposes OpenAI-compatible chat on https://app.empower.dev/api/v1 with tool-calling support on empower-functions.\",\n passthroughModels: true,\n },\n poe: {\n id: \"poe\",\n alias: \"poe\",\n name: \"Poe\",\n icon: \"hub\",\n color: \"#F97316\",\n textIcon: \"PO\",\n website: \"https://creator.poe.com/api-reference\",\n authHint: \"Bearer API key for the Poe OpenAI-compatible API.\",\n apiHint:\n \"Poe exposes OpenAI-compatible chat and responses on https://api.poe.com/v1, with authenticated balance checks on /usage/current_balance.\",\n passthroughModels: true,\n },\n chutes: {\n id: \"chutes\",\n alias: \"chutes\",\n name: \"Chutes.ai\",\n icon: \"hub\",\n color: \"#06B6D4\",\n textIcon: \"CH\",\n website: \"https://chutes.ai\",\n hasFree: false,\n freeNote:\n \"No free tier as of 2026 — Chutes moved to pay-as-you-go (free Early Access ended 2026-03).\",\n authHint: \"Bearer API key for the Chutes OpenAI-compatible gateway.\",\n passthroughModels: true,\n },\n // Factory AI (\"Factory Droids\") subscription gateway — the same backend the\n // local `droid` CLI shells into, exposed here as an OpenAI-compatible HTTP\n // endpoint. Auth surface per https://github.com/Factory-AI/droid-sdk-typescript\n // is `FACTORY_API_KEY` (Bearer). Subscription tier uses app.factory.ai quota.\n factory: {\n id: \"factory\",\n alias: \"factory\",\n name: \"Factory\",\n icon: \"smart_toy\",\n color: \"#0F172A\",\n textIcon: \"FA\",\n website: \"https://factory.ai\",\n authHint: \"Bearer API key for the Factory OpenAI-compatible gateway.\",\n apiHint:\n \"Get your Factory API key at https://app.factory.ai/settings/api-keys, then paste it as a Bearer token. OpenAI-compatible endpoint at https://api.factory.ai/v1.\",\n passthroughModels: true,\n },\n bluesminds: {\n id: \"bluesminds\",\n alias: \"bm\",\n name: \"BluesMinds\",\n icon: \"psychology\",\n color: \"#3B82F6\",\n textIcon: \"BM\",\n website: \"https://www.bluesminds.com\",\n hasFree: true,\n freeNote:\n \"Free daily pi credits — supports 200+ models including GPT-4o, GPT-4.1, Claude Sonnet 4.5, Gemini 2.0 Flash, DeepSeek V4, Qwen, Kimi K2\",\n apiHint:\n \"Get your API key at https://www.bluesminds.com — OpenAI-compatible endpoint at https://api.bluesminds.com/v1 with free daily credits. VIP models (Claude Opus 4.5, Gemini 2.5 Pro) consume pi credits.\",\n },\n \"freemodel-dev\": {\n id: \"freemodel-dev\",\n alias: \"fmd\",\n name: \"FreeModel.dev\",\n icon: \"auto_awesome\",\n color: \"#8B5CF6\",\n textIcon: \"FM\",\n website: \"https://freemodel.dev\",\n hasFree: true,\n freeNote:\n \"$300 free credits on signup — no credit card required. Access GPT-5.4 and GPT-5.5 (OpenAI's latest flagship models) through an OpenAI-compatible API.\",\n apiHint:\n \"Get $300 free API credits at https://freemodel.dev — no payment info required. OpenAI-compatible endpoint. GPT-5.4 and GPT-5.5 models available.\",\n },\n freeaiapikey: {\n id: \"freeaiapikey\",\n alias: \"faik\",\n name: \"FreeAIAPIKey\",\n icon: \"vpn_key\",\n color: \"#F59E0B\",\n textIcon: \"FK\",\n website: \"https://freeaiapikey.com\",\n apiHint:\n \"Discounted API proxy for 40+ models including GPT-5, Claude Opus 4.6, Claude Sonnet 4.6, Qwen 3.5. Get your API key at https://freeaiapikey.com/dashboard. Base URL: https://freeaiapikey.com/v1.\",\n },\n zenmux: {\n id: \"zenmux\",\n alias: \"zm\",\n name: \"ZenMux\",\n icon: \"neurology\",\n color: \"#7C3AED\",\n textIcon: \"ZM\",\n website: \"https://zenmux.ai\",\n hasFree: true,\n freeNote:\n \"Free tier includes access to Gemini 3 Flash, DeepSeek V3.2, Grok 4.1 Fast, Mistral Large, and more. Get your API key at https://zenmux.ai.\",\n authHint:\n \"Use your ZenMux API key in Authorization: Bearer <key>. ZenMux is fully OpenAI-compatible. Base URL: https://zenmux.ai/api/v1.\",\n apiHint:\n \"ZenMux exposes an OpenAI-compatible chat completions endpoint at /api/v1/chat/completions, plus Anthropic Messages (/api/anthropic/v1/messages) and Google Gemini (/api/vertex-ai) protocol surfaces. OmniRoute uses the OpenAI protocol.\",\n },\n openadapter: {\n id: \"openadapter\",\n alias: \"oad\",\n name: \"OpenAdapter\",\n icon: \"hub\",\n color: \"#10B981\",\n textIcon: \"OD\",\n website: \"https://openadapter.dev\",\n hasFree: true,\n freeNote:\n \"Free tier with a generous quota and no credit card — 15+ open-source models with daily quota. Get your API key at https://dashboard.openadapter.in.\",\n authHint:\n \"Use your OpenAdapter API key in Authorization: Bearer sk-cv-<key>. Fully OpenAI-compatible. API base URL: https://api.openadapter.in/v1.\",\n apiHint:\n \"OpenAdapter exposes an OpenAI-compatible chat completions endpoint at https://api.openadapter.in/v1/chat/completions, aggregating 70+ open-source models (DeepSeek, Qwen, Kimi, MiniMax, GLM, Llama, Mistral, …). OmniRoute uses the OpenAI protocol.\",\n },\n dit: {\n id: \"dit\",\n alias: \"dai\",\n name: \"DIT.ai\",\n icon: \"hub\",\n color: \"#0EA5E9\",\n textIcon: \"DT\",\n website: \"https://dit.ai\",\n authHint:\n \"Use your dit.ai API key in Authorization: Bearer <key>. Fully OpenAI-compatible — a drop-in replacement, just change the base URL to https://api.dit.ai/v1.\",\n apiHint:\n \"dit.ai (Distributed Intelligence Trade) is an OpenAI-compatible router/gateway with dynamic per-request pricing, exposing /v1/chat/completions at https://api.dit.ai/v1. OmniRoute uses the OpenAI protocol; spend/savings analytics live in the dit.ai dashboard.\",\n },\n tokenrouter: {\n id: \"tokenrouter\",\n alias: \"trk\",\n name: \"TokenRouter\",\n icon: \"hub\",\n color: \"#F59E0B\",\n textIcon: \"TK\",\n website: \"https://tokenrouter.com\",\n hasFree: true,\n freeNote:\n \"Free tier includes the MiniMax 3 model. Get your API key at https://tokenrouter.com.\",\n authHint:\n \"Use your TokenRouter API key in Authorization: Bearer <key>. Fully OpenAI-compatible. API base URL: https://api.tokenrouter.com/v1.\",\n apiHint:\n \"TokenRouter exposes an OpenAI-compatible chat completions endpoint at https://api.tokenrouter.com/v1/chat/completions, plus a working /v1/models catalog. OmniRoute uses the OpenAI protocol.\",\n },\n sumopod: {\n id: \"sumopod\",\n alias: \"sumopod\",\n name: \"SumoPod\",\n icon: \"router\",\n color: \"#2563EB\",\n textIcon: \"SP\",\n passthroughModels: true,\n website: \"https://ai.sumopod.com\",\n authHint:\n \"Use your SumoPod API key (sk-...) in Authorization: Bearer <key>. Fully OpenAI-compatible. API base URL: https://ai.sumopod.com/v1.\",\n apiHint:\n \"SumoPod exposes an OpenAI-compatible chat completions endpoint at https://ai.sumopod.com/v1/chat/completions, plus a live /v1/models catalog. OmniRoute uses the OpenAI protocol and lists models via passthrough.\",\n },\n x5lab: {\n id: \"x5lab\",\n alias: \"x5lab\",\n name: \"X5Lab\",\n icon: \"router\",\n color: \"#7C3AED\",\n textIcon: \"X5\",\n passthroughModels: true,\n website: \"https://x5lab.dev\",\n authHint:\n \"Use your X5Lab API key (x5-...) in Authorization: Bearer <key>. Fully OpenAI-compatible. API base URL: https://api.x5lab.dev/v1.\",\n apiHint:\n \"X5Lab exposes an OpenAI-compatible chat completions endpoint at https://api.x5lab.dev/v1/chat/completions, plus a live /v1/models catalog. OmniRoute uses the OpenAI protocol and lists models via passthrough.\",\n },\n chenzk: {\n id: \"chenzk\",\n alias: \"chenzk\",\n name: \"Chenzk API\",\n icon: \"hub\",\n color: \"#10B981\",\n textIcon: \"CZ\",\n passthroughModels: true,\n website: \"https://chenzk.top\",\n apiHint:\n \"Create an API key at https://chenzk.top/token, then paste it here as a Bearer token. \" +\n \"OpenAI-compatible endpoint at https://chenzk.top/v1, with a live /v1/models catalog.\",\n },\n kenari: {\n id: \"kenari\",\n alias: \"kenari\",\n name: \"Kenari\",\n icon: \"hub\",\n color: \"#B5362A\",\n textIcon: \"KN\",\n passthroughModels: true,\n website: \"https://kenari.id\",\n authHint:\n \"Use your Kenari API key (kn-...) in Authorization: Bearer <key>. Fully OpenAI-compatible. API base URL: https://kenari.id/v1.\",\n apiHint:\n \"Kenari exposes an OpenAI-compatible chat completions endpoint at https://kenari.id/v1/chat/completions, plus a live /v1/models catalog covering Claude, GPT, DeepSeek, GLM, Kimi and more. OmniRoute uses the OpenAI protocol and lists models via passthrough.\",\n },\n navy: {\n id: \"navy\",\n alias: \"navy\",\n name: \"NavyAI\",\n icon: \"hub\",\n color: \"#1E3A8A\",\n textIcon: \"NV\",\n passthroughModels: true,\n website: \"https://api.navy\",\n hasFree: true,\n freeNote:\n \"Free plan is one shared 150K tokens/day pool at 20 RPM. Each model carries a \" +\n \"token multiplier, so heavier models drain the pool faster (grok-4 at 10x is ~15K real tokens/day).\",\n authHint:\n \"Create a free API key from the NavyAI dashboard, then paste it here as a Bearer token.\",\n apiHint:\n \"OpenAI-compatible endpoint at https://api.navy/v1 with a live /v1/models catalog that exposes \" +\n \"per-model token_multiplier and premium flags. Upstream requires an explicit User-Agent header.\",\n },\n};\n"}}, "omniroute/docs/i18n/zh-CN/docs/reference/CLI-TOOLS.md": {"6eea4894299d5371c00c11f1f6dec2f7c0076253": {"t": 1785596434.3110518, "n": 24168, "h": "f2febed5995ea9c8", "c": "---\ntitle: \"CLI 工具 — OmniRoute\"\nversion: 3.8.40\nlastUpdated: 2026-06-28\n---\n\n# CLI 工具 — OmniRoute\n\n最后更新:2026-06-28\n\nOmniRoute 与三类 CLI 工具集成,分布在三个专用的 dashboard 页面中:\n\n| 页面 | 路由 | 概念 | 数量 |\n| ---------------- | ------------------------ | --------------------------------------------------------------------------- | ------------ |\n| **CLI Code's** | `/dashboard/cli-code` | 指向 OmniRoute 的编程工具(客户端 → CLI → OmniRoute → 服务商) | 19 |\n| **CLI Agents** | `/dashboard/cli-agents` | 指向 OmniRoute 的自主代理(相同流程,更广泛的范围) | 6 |\n| **ACP Agents** | `/dashboard/acp-agents` | OmniRoute 通过 stdio/ACP 作为后端启动的 CLI(反向流程) | 见注册表 |\n\n旧路由通过 308 重定向:`/dashboard/cli-tools` → `/dashboard/cli-code`,`/dashboard/agents` → `/dashboard/acp-agents`。\n\n---\n\n## 工作原理\n\n```\nCLI Code's / CLI Agents(消费流程):\nClaude / Codex / OpenCode / Cline / KiloCode / Continue / Hermes Agent / Goose / ...\n │\n ▼ (全部指向 OmniRoute)\n http://YOUR_SERVER:20128/v1\n │\n ▼ (OmniRoute 路由到合适的服务商)\n Anthropic / OpenAI / Gemini / DeepSeek / Groq / Mistral / ...\n\nACP Agents(反向启动流程):\n 客户端请求 → OmniRoute → 通过 stdio/ACP 启动 CLI → 响应\n```\n\n**优势:**\n\n- 一个 API Key 管理所有工具\n- 在 dashboard 中追踪所有 CLI 的成本\n- 无需重新配置每个工具即可切换模型\n- 在本地和远程服务器(VPS、Docker、Akamai、Cloudflare Tunnel)均可使用\n\n---\n\n## 使用 `setup-*` 自动配置\n\n无需手动编写每个工具的配置。OmniRoute 为每个支持的 CLI 提供对应的 `setup-*` 命令,该命令从运行中的 OmniRoute(本地或远程)读取**实时**模型目录并将工具的配置写入你的机器:\n\n```bash\nomniroute setup-codex omniroute setup-claude omniroute setup-opencode\nomniroute setup-cline omniroute setup-kilo omniroute setup-continue\nomniroute setup-cursor omniroute setup-roo omniroute setup-crush\nomniroute setup-goose omniroute setup-qwen omniroute setup-aider\n```\n\n每个命令接受 `--remote <url> --api-key <key>`(针对远程 OmniRoute 配置本地工具)、`--dry-run`(预览不写入)和 `--port`。不支持模型自动发现的工具(Cline、Kilo、Roo、Goose、Qwen、Aider、Gemini)接受 `--model <id>`(以及用于非交互式运行的 `--yes`)。启动器 `omniroute launch`(Claude Code)和 `omniroute launch-codex`(Codex)在注入正确的环境变量后启动 CLI,不写入任何配置。\n\n> **完整参考:** 主表 — 每个命令写入的内容、所有标志、本地 vs 远程,以及哪些工具需要 `/v1` 后缀 — 在 **[CLI Integrations](../guides/CLI-INTEGRATIONS.md)** 中。\n\n---\n\n## 数据源\n\n统一目录位于 `src/shared/constants/cliTools.ts`,定义为 `CLI_TOOLS: Record<string, CliCatalogEntry>`。\n\n每个条目包含以下字段(定义在 `src/shared/schemas/cliCatalog.ts`):\n\n| 字段 | 类型 | 说明 |\n| ------------------------------------------------ | ------------------------------------------------------------ | -------------------------------------------------------- |\n| `category` | `\"code\" \\| \"agent\"` | 工具显示的页面 |\n| `vendor` | `string` | 工具来源(\"Anthropic\"、\"OSS (P. Gauthier)\") |\n| `acpSpawnable` | `boolean` | 也可作为 ACP Agent 使用(显示徽章) |\n| `baseUrlSupport` | `\"full\" \\| \"partial\" \\| \"none\"` | 自定义端点支持级别。`\"none\"` = MITM 待办列表 |\n| `configType` | `\"env\" \\| \"custom\" \\| \"guide\" \\| \"custom-builder\" \\| \"mitm\"` | 配置机制 |\n| `id`、`name`、`color`、`description`、`docsUrl` | 标准字段 | 核心显示字段 |\n\n`baseUrlSupport: \"none\"` 的条目**不会显示**在 dashboard 页面中 — 它们注册在 MITM 待办列表中,供 plan 11 使用(参见 `_tasks/features-v3.8.6/refactorpages/_orchestration/_plan11-mitm-backlog.md`)。\n\n---\n\n## 1. CLI Code's 目录(19 个工具)\n\n支持自定义 base URL 并出现在 `/dashboard/cli-code` 中的工具:\n\n| id | name | vendor | baseUrlSupport | configType | acpSpawnable |\n|----|------|--------|---------------|-----------|-------------|\n| claude | Claude Code | Anthropic | full | env | true |\n| codex | OpenAI Codex CLI | OpenAI | full | custom | true |\n| cline | Cline | OSS (ex-Claude Dev) | full | custom | true |\n| kilo | Kilo Code | Kilo-Org | full | custom | false |\n| roo | Roo Code | Roo (OSS) | full | guide | false |\n| continue | Continue | continue.dev | full | guide | false |\n| qwen | Qwen Code | Alibaba | full | guide | true |\n| aider | Aider | OSS (P. Gauthier) | full | guide | true |\n| forge | ForgeCode | Antinomy HQ | full | custom | true |\n| jcode | jcode | 1jehuang (OSS) | full | custom | false |\n| deepseek-tui | DeepSeek TUI | Hunter Bown (OSS) | full | custom | false |\n| opencode | OpenCode | Anomaly (ex-SST) | full | guide | true |\n| droid | Factory Droid | Factory AI | partial | guide | false |\n| copilot | GitHub Copilot CLI | GitHub/MS | full | custom | false |\n| cursor-cli | Cursor CLI | Anysphere | partial | guide | true |\n| smelt | Smelt | leonardcser (OSS) | full | custom | false |\n| pi | Pi (pi-coding-agent) | M. Zechner (OSS) | full | custom | false |\n| custom | Custom CLI | — | full | custom-builder | false |\n\n`baseUrlSupport: \"partial\"` 的工具在 dashboard 卡片中显示徽章 \"⚠ Base URL parcial\"。\n\n---\n\n## 2. CLI Agents 目录(6 个工具)\n\n出现在 `/dashboard/cli-agents` 中的自主代理:\n\n| id | name | vendor | baseUrlSupport | acpSpawnable |\n| ------------ | ---------------- | ------------------------ | -------------- | ------------ |\n| hermes-agent | Hermes Agent | Nous Research | full | false |\n| openclaw | OpenClaw | OSS (P. Steinberger) | full | true |\n| goose | Goose | Block / Linux Foundation | full | true |\n| interpreter | Open Interpreter | OSS | full | true |\n| warp | Warp AI | Warp Inc. | partial | true |\n| agent-deck | Agent Deck | asheshgoplani (OSS) | full | false |\n\n---\n\n## 3. ACP Agents(/dashboard/acp-agents)\n\n此页面(从 `/dashboard/agents` 重命名而来)显示 OmniRoute 可以通过 stdio/ACP 协议**启动**为后端执行引擎的 CLI。目录在 `src/lib/acp/registry.ts` 中单独维护,**不同于** `CLI_TOOLS`。\n\n---\n\n## 4. MITM 待办列表(不在 dashboard 中显示)\n\n以下 CLI 原生不支持自定义 base URL,因此**不会**在 CLI Code's 或 CLI Agents 页面中列出。它们是 plan 11 中 MITM 拦截的候选项:\n\n| CLI | 原因 |\n| ------------------- | ------------------------------------------------------------- |\n| windsurf | BYOK 限于部分 Claude 模型 + 企业 URL/Token |\n| amp | 封闭生态系统(Sourcegraph) |\n| amazon-q / kiro-cli | AWS SSO 认证,无自定义 URL |\n| cowork | Anthropic Desktop,无可配置端点 |\n\n完整对照参见 `_tasks/features-v3.8.6/refactorpages/_orchestration/_plan11-mitm-backlog.md`。\n\n---\n\n## 5. 批量检测 API\n\n所有工具检测通过单个端点聚合:\n\n**`GET /api/cli-tools/all-statuses`**\n\n- 认证:`requireCliToolsAuth(request)`(与其他 `/api/cli-tools/` 路由相同)\n- 返回:`Record<toolId, ToolBatchStatus>`(类型:`src/shared/types/cliBatchStatus.ts`)\n- 策略:对全部工具执行 `Promise.all`,每个工具 5 秒超时\n- 缓存:以配置文件 `mtime` 为索引的内存 LRU 缓存。当 mtime 变化时缓存失效。服务器重启时重置。\n\n每个工具的响应结构:\n\n```ts\ninterface ToolBatchStatus {\n detection: {\n installed: boolean;\n runnable: boolean;\n version?: string;\n command?: string;\n commandPath?: string;\n reason?: string;\n };\n config: {\n status: \"configured\" | \"not_configured\" | \"not_installed\" | \"unknown\" | \"other\";\n endpoint?: string | null;\n lastConfiguredAt?: string | null;\n };\n error?: string; // 已脱敏,无堆栈跟踪\n}\n```\n\n---\n\n## 6. 新工具的 Settings 处理器\n\n`configType: \"custom\"` 的新工具具有专用的 settings API 路由:\n\n| 路由 | 工具 |\n| -------------------------------------------- | -------------------------------- |\n| `POST /api/cli-tools/forge-settings` | ForgeCode (.forge.toml) |\n| `POST /api/cli-tools/jcode-settings` | jcode (--base-url 标志) |\n| `POST /api/cli-tools/deepseek-tui-settings` | DeepSeek TUI (OPENAI_BASE_URL) |\n| `POST /api/cli-tools/smelt-settings` | Smelt |\n| `POST /api/cli-tools/pi-settings` | Pi coding agent |\n\n所有路由均使用 `sanitizeErrorMessage()` 处理错误响应(Hard Rule #12)。\n\n---\n\n## 7. Dashboard 页面架构\n\n### CLI Code's(`/dashboard/cli-code`)\n\n- `src/app/(dashboard)/dashboard/cli-code/page.tsx` — 服务端组件\n- `src/app/(dashboard)/dashboard/cli-code/CliCodePageClient.tsx` — 客户端网格\n- `src/app/(dashboard)/dashboard/cli-code/[id]/page.tsx` — 工具详情页\n- `src/app/(dashboard)/dashboard/cli-code/components/` — 12 个专用工具卡片 + `ToolDetailClient.tsx`\n\n### CLI Agents(`/dashboard/cli-agents`)\n\n- `src/app/(dashboard)/dashboard/cli-agents/page.tsx` — 服务端组件\n- `src/app/(dashboard)/dashboard/cli-agents/CliAgentsPageClient.tsx` — 客户端网格\n- `src/app/(dashboard)/dashboard/cli-agents/[id]/page.tsx` — 复用 `ToolDetailClient`\n\n### ACP Agents(`/dashboard/acp-agents`)\n\n- `src/app/(dashboard)/dashboard/acp-agents/page.tsx` — 服务端组件(从 `agents/` 迁移而来)\n\n### 共享 UI 组件(`src/shared/components/cli/`)\n\n| 文件 | 用途 |\n| ------------------------- | --------------------------------------------------- |\n| `CliToolCard.tsx` | 智能状态卡片(检测 + 配置 + 端点) |\n| `CliConceptCard.tsx` | 每页概念说明卡片 |\n| `CliComparisonCard.tsx` | 三类 CLI 对比卡 |\n| `BaseUrlSelect.tsx` | 端点下拉选择(本地/云端/自定义) |\n| `ApiKeySelect.tsx` | API Key 选择器 |\n| `ManualConfigModal.tsx` | 可复制的配置片段弹窗 |\n\n### 共享 Hook(`src/shared/hooks/cli/`)\n\n| 文件 | 用途 |\n| --------------------------- | --------------------------------------------------------------------- |\n| `useToolBatchStatuses.ts` | 获取 `/api/cli-tools/all-statuses`,管理 loading/refresh 状态 |\n\n---\n\n## 8. i18n\n\n在 plan 14 F9 中添加的新命名空间:\n\n| 命名空间 | 用途 |\n| ----------- | ---------------------------------------------------------------------------- |\n| `cliCommon` | 共享字符串(卡片标签、概念/对比文本、详情页标签) |\n| `cliCode` | CLI Code's 页面字符串 |\n| `cliAgents` | CLI Agents 页面字符串 |\n| `acpAgents` | ACP Agents 页面字符串 |\n\n提供完整的 PT-BR 和 EN 翻译。其余 39 个语言环境通过 `src/i18n/request.ts` 中的命名空间级合并自动回退到 EN。\n\n---\n\n## 9. 快速开始\n\n### 步骤 1 — 获取 OmniRoute API Key\n\n1. 打开 `/dashboard/api-manager` → **创建 API Key**\n2. 为其命名(例如 `cli-tools`)并选择所有权限\n3. 复制 Key — 以下所有 CLI 都会用到\n\n> 你的 Key 格式为:`sk-xxxxxxxxxxxxxxxx-xxxxxxxxx`\n\n---\n\n### 步骤 2 — 安装 CLI 工具\n\n所有基于 npm 的工具需要 Node.js 22.22.2+ 或 24.x:\n\n```bash\n# Claude Code (Anthropic)\nnpm install -g @anthropic-ai/claude-code\n\n# OpenAI Codex\nnpm install -g @openai/codex\n\n# OpenCode\nnpm install -g opencode-ai\n\n# Cline\nnpm install -g cline\n\n# KiloCode\nnpm install -g kilocode\n\n# Qwen Code (Alibaba)\nnpm install -g @qwen-code/qwen-code\n\n# Aider\npip install aider-chat\n\n# Smelt\ncargo install smelt # Rust 编写\n\n# Pi coding agent\n# 安装参见 https://github.com/zechnerj/pi-coding-agent\n\n# jcode\n# 安装参见 https://github.com/1jehuang/jcode\n```\n\n---\n\n### 步骤 3 — 通过 Dashboard 配置\n\n1. 访问 `http://localhost:20128/dashboard/cli-code`\n2. 在网格中找到你的工具\n3. 点击卡片进入工具详情页\n4. 选择你的 API Key 和 base URL\n5. 点击**应用配置**或复制手动配置片段\n\n---\n\n### 步骤 4 — 设置全局环境变量\n\n```bash\n# OmniRoute 通用端点\nexport OPENAI_BASE_URL=\"http://localhost:20128/v1\"\nexport OPENAI_API_KEY=\"sk-your-omniroute-key\"\nexport ANTHROPIC_BASE_URL=\"http://localhost:20128\"\nexport ANTHROPIC_AUTH_TOKEN=\"sk-your-omniroute-key\"\nexport GEMINI_BASE_URL=\"http://localhost:20128/v1\"\nexport GEMINI_API_KEY=\"sk-your-omniroute-key\"\n```\n\n> 对于**远程服务器**,将 `localhost:20128` 替换为服务器的 IP 或域名,\n> 例如 `http://<your-server-ip>:20128`。\n\n---\n\n### 步骤 4 — 配置每个工具\n\n#### Claude Code\n\n```bash\n# 创建 ~/.claude/settings.json:\nmkdir -p ~/.claude && cat > ~/.claude/settings.json << EOF\n{\n \"env\": {\n \"ANTHROPIC_BASE_URL\": \"http://localhost:20128\",\n \"ANTHROPIC_AUTH_TOKEN\": \"sk-your-omniroute-key\"\n }\n}\nEOF\n```\n\nClaude Code 使用统一的 Anthropic 网关根路径。不要在这里添加 `/v1`。\n\n**测试:** `claude \"say hello\"`\n\n---\n\n#### OpenAI Codex\n\n```bash\nmkdir -p ~/.codex && cat > ~/.codex/config.yaml << EOF\nmodel: auto\napiKey: sk-your-omniroute-key\napiBaseUrl: http://localhost:20128/v1\nEOF\n```\n\n**测试:** `codex \"what is 2+2?\"`\n\n---\n\n#### OpenCode\n\n```bash\nmkdir -p ~/.config/opencode && cat > ~/.config/opencode/opencode.json << EOF\n{\n \"\\$schema\": \"https://opencode.ai/config.json\",\n \"provider\": {\n \"omniroute\": {\n \"npm\": \"@ai-sdk/openai-compatible\",\n \"name\": \"OmniRoute\",\n \"options\": {\n \"baseURL\": \"http://localhost:20128/v1\",\n \"apiKey\": \"sk-your-omniroute-key\"\n },\n \"models\": {\n \"claude-sonnet-4-5\": { \"name\": \"claude-sonnet-4-5\" },\n \"claude-sonnet-4-5-thinking\": { \"name\": \"claude-sonnet-4-5-thinking\" },\n \"gemini-3-flash\": { \"name\": \"gemini-3-flash\" }\n }\n }\n }\n}\nEOF\n```\n\n**测试:** `opencode`\n\n> 使用 `opencode run \"your prompt\" --model omniroute/claude-sonnet-4-5-thinking --variant high`\n> 发送 thinking 变体。\n\n---\n\n#### Cline(CLI 或 VS Code)\n\n**CLI 模式:**\n\n```bash\nmkdir -p ~/.cline/data && cat > ~/.cline/data/globalState.json << EOF\n{\n \"apiProvider\": \"openai\",\n \"openAiBaseUrl\": \"http://localhost:20128/v1\",\n \"openAiApiKey\": \"sk-your-omniroute-key\"\n}\nEOF\n```\n\n**VS Code 模式:**\nCline 扩展设置 → API Provider:`OpenAI Compatible` → Base URL:`http://localhost:20128/v1`\n\n或使用 OmniRoute dashboard → **CLI Tools → Cline → 应用配置**。\n\n---\n\n#### KiloCode(CLI 或 VS Code)\n\n**CLI 模式:**\n\n```bash\nkilocode --api-base http://localhost:20128/v1 --api-key sk-your-omniroute-key\n```\n\n**VS Code 设置:**\n\n```json\n{\n \"kilo-code.openAiBaseUrl\": \"http://localhost:20128/v1\",\n \"kilo-code.apiKey\": \"sk-your-omniroute-key\"\n}\n```\n\n或使用 OmniRoute dashboard → **CLI Tools → KiloCode → 应用配置**。\n\n---\n\n#### Continue(VS Code 扩展)\n\n编辑 `~/.continue/config.yaml`:\n\n```yaml\nmodels:\n - name: OmniRoute\n provider: openai\n model: auto\n apiBase: http://localhost:20128/v1\n apiKey: sk-your-omniroute-key\n default: true\n```\n\n编辑后重启 VS Code。\n\n---\n\n#### VS Code Insiders(`chatLanguageModels.json`)\n\n当 VS Code Insiders 配置了自定义端点模型,且你希望 OmniRoute 在不使用自定义请求头字段的情况下工作时使用。\n\n**推荐位置:**\n\n- Linux:`~/.config/Code - Insiders/User/chatLanguageModels.json`\n- Windows:`%APPDATA%/Code - Insiders/User/chatLanguageModels.json`\n\n**使用 Token 化 OmniRoute 别名的示例:**\n\n```json\n[\n {\n \"vendor\": \"customendpoint\",\n \"id\": \"auto\",\n \"name\": \"OmniRoute Auto\",\n \"family\": \"gpt-4\",\n \"version\": \"1.0.0\",\n \"url\": \"http://localhost:20128/api/v1/vscode/sk-your-omniroute-key/chat/completions\",\n \"modelsUrl\": \"http://localhost:20128/api/v1/vscode/sk-your-omniroute-key/models\",\n \"requestFormat\": \"openai-chat-completions\",\n \"contextWindow\": 256000,\n \"maxOutputTokens\": 32768,\n \"auth\": {\n \"type\": \"none\"\n }\n }\n]\n```\n\n**说明:**\n\n- 将 `sk-your-omniroute-key` 替换为在 OmniRoute 中创建的 API Key。\n- `url` 字段应指向 `/api/v1/vscode/{token}/chat/completions`。\n- `modelsUrl` 字段应指向 `/api/v1/vscode/{token}/models`。\n- 只要客户端支持自定义请求头,应优先使用正常的 `/v1` + Bearer 请求头流程。\n- URL 嵌入的 Token 是兼容性回退方案,可能出现在编辑器日志或代理历史中。\n\n---\n\n#### Kiro CLI(Amazon)\n\n```bash\n# 登录你的 AWS/Kiro 账户:\nkiro-cli login\n\n# CLI 使用自己的认证 — Kiro CLI 本身不需要 OmniRoute 作为后端。\n# 将 kiro-cli 与 OmniRoute 配合用于其他工具。\nkiro-cli status\n```\n\n对于 **Kiro IDE** 桌面应用,使用 OmniRoute 通过 `/dashboard/cli-tools → Kiro` 暴露的 MITM 端点。\n\n---\n\n#### Qwen Code(Alibaba)\n\nQwen Code 通过环境变量或 `settings.json` 支持 OpenAI 兼容的 API 端点。\n\n> Qwen OAuth 免费层已于 2026-04-15 停用。改为使用 OmniRoute 搭配\n> `bailian-coding-plan` / `alibaba` / `alibaba-cn` / `openrouter` / `anthropic` /\n> `gemini` 服务商。\n\n**选项 1:环境变量(`~/.qwen/.env`)**\n\n```bash\nmkdir -p ~/.qwen && cat > ~/.qwen/.env << EOF\nOPENAI_API_KEY=\"sk-your-omniroute-key\"\nOPENAI_BASE_URL=\"http://localhost:20128/v1\"\nOPENAI_MODEL=\"auto\"\nEOF\n```\n\n**选项 2:`settings.json` 配合 `security.auth`**\n\n```json\n// ~/.qwen/settings.json\n{\n \"security\": {\n \"auth\": {\n \"selectedType\": \"openai\",\n \"apiKey\": \"sk-your-omniroute-key\",\n \"baseUrl\": \"http://localhost:20128/v1\"\n }\n },\n \"model\": {\n \"name\": \"claude-sonnet-4-6\"\n }\n}\n```\n\n**选项 3:内联 CLI 标志**\n\n```bash\nOPENAI_BASE_URL=\"http://localhost:20128/v1\" \\\nOPENAI_API_KEY=\"sk-your-omniroute-key\" \\\nOPENAI_MODEL=\"auto\" \\\nqwen\n```\n\n> 对于**远程服务器**,将 `localhost:20128` 替换为服务器的 IP 或域名。\n\n---\n\n## 10. OmniRoute 内置 CLI\n\n`omniroute` 二进制文件提供服务端生命周期、设置、诊断和服务商管理的命令。入口点:`bin/omniroute.mjs`。\n\n```bash\nomniroute # 启动服务器(默认端口 20128)\nomniroute setup # 交互式设置向导\nomniroute doctor # 检查配置、数据库、端口、运行时\nomniroute providers list # 已配置的服务商连接\nomniroute providers test-all # 测试所有活跃连接\nomniroute reset-password # 重置管理员密码\nomniroute logs # 流式输出请求日志\nomniroute health # 详细健康状态(熔断器、缓存、内存)\nomniroute --version # 输出版本号\nomniroute --help # 显示所有命令\n```\n\n### 设置与初始化\n\n```bash\nomniroute setup # 交互式设置向导\nomniroute setup --non-interactive # CI/自动化模式(读取环境变量 + 标志)\nomniroute setup --password '<value>' # 直接设置管理员密码\nomniroute setup --add-provider \\\n --provider openai \\\n --api-key '<value>' \\\n --test-provider # 一步添加并测试服务商\n```\n\n非交互式设置识别的环境变量:\n\n| 变量 | 用途 |\n| ------------------- | ----------------------------------------------------------- |\n| `OMNIROUTE_API_KEY` | 服务商 API Key(通过 Commander `.env()` 绑定到 `--api-key`) |\n| `DATA_DIR` | 覆盖 OmniRoute 数据目录 |\n\n其他所有非交互式输入通过标志传入,而非环境变量:\n`--password`、`--provider`、`--provider-name`、`--provider-base-url`、`--default-model`\n(参见上述 `omniroute setup` 选项)。\n\n### 诊断\n\n```bash\nomniroute doctor # 检查配置、数据库、端口、运行时、内存、存活状态\nomniroute doctor --json # 机器可读的 JSON\nomniroute doctor --no-liveness # 跳过 HTTP 健康探测\nomniroute doctor --host 0.0.0.0 # 覆盖存活探测的主机\nomniroute doctor --liveness-url <url> # 完全覆盖健康端点 URL\n```\n\ndoctor 运行以下检查:`Config`、`Database`、`Storage/encryption`、`Port availability`、`Node runtime`、`Native binary`(better-sqlite3)、`Memory` 和 `Server liveness`。任何检查为 `fail` 时以非零退出码退出。\n\n### 服务商管理\n\n```bash\nomniroute providers available # OmniRoute 服务商目录\nomniroute providers available --search openai # 按 id/name/alias/category 过滤目录\nomniroute providers available --category api-key # 按分类过滤(api-key、oauth、free 等)\nomniroute providers available --json # 机器可读的 JSON\n\nomniroute providers list # 已配置的服务商连接\nomniroute providers list --json\n\nomniroute providers test <id|name> # 测试一个已配置的连接\nomniroute providers test-all # 测试所有活跃连接\nomniroute providers validate # 仅本地结构校验\n```\n\n> `providers available` 读取 OmniRoute 目录;`providers list/test/test-all/validate`\n> 直接读取本地 SQLite 数据库,不需要服务器运行。\n\n### 恢复与重置\n\n```bash\nomniroute reset-password # 重置管理员密码(旧别名仍然可用)\nomniroute reset-encrypted-columns # 显示加密凭证重置的警告 + 干运行\nomniroute reset-encrypted-columns --force # 实际在 SQLite 中将加密凭证设为 null\n```\n\n### 其他子命令\n\n以下命令假定 OmniRoute 服务器正在运行(另有说明除外):\n\n```bash\nomniroute status # 全面的运行时状态\nomniroute logs # 流式输出请求日志(--json、--search、--follow)\nomniroute config show # 显示当前配置\n\nomniroute provider list # 列出可用服务商(providers list 的别名)\nomniroute provider add # 将 OmniRoute 注册为某个工具的服务商\nomniroute keys add | list | remove # 管理 API Key\nomniroute models [provider] # 列出模型(--json、--search)\nomniroute combo list | switch | create | delete\n\nomniroute backup # 快照配置 + 数据库\nomniroute restore # 从之前的快照恢复\n\nomniroute health # 详细健康状态(熔断器、缓存、内存)\nomniroute quota # 服务商配额用量\nomniroute cache # 缓存状态\nomniroute cache clear # 清除语义 + 签名缓存\n\nomniroute mcp status | restart # MCP 服务器状态 / 重启\nomniroute a2a status | card # A2A 服务器状态 / agent card\n\nomniroute tunnel list | create | stop # 管理隧道(cloudflare/tailscale/ngrok)\nomniroute env show | get <k> | set <k> <v> # 检查 / 设置环境变量(临时)\n\nomniroute test # 服务商连通性冒烟测试\nomniroute update # 检查更新\nomniroute completion # 生成 shell 补全\n```\n\n### 通用标志\n\n| 标志 | 说明 |\n| ------------------- | ------------------------------------------------------ |\n| `--no-open` | 启动时不自动打开浏览器 |\n| `--port <n>` | 覆盖 API 端口(默认 20128) |\n| `--mcp` | 以 MCP 服务器通过 stdio 运行(供 IDE 使用) |\n| `--non-interactive` | CI 模式(无交互提示;从 env/flags 读取) |\n| `--json` | 机器可读的 JSON 输出(doctor、providers 等) |\n| `--help`、`-h` | 显示命令特定的帮助 |\n| `--version`、`-v` | 输出版本号 |\n\n---\n\n## 可用 API 端点\n\n| 端点 | 说明 | 用途 |\n| ---------------------------- | ------------------------------ | -------------------------- |\n| `/v1/chat/completions` | 标准聊天(所有服务商) | 所有现代工具 |\n| `/v1/responses` | Responses API(OpenAI 格式) | Codex、代理工作流 |\n| `/v1/completions` | 旧版文本补全 | 使用 `prompt:` 的旧工具 |\n| `/v1/embeddings` | 文本嵌入 | RAG、搜索 |\n| `/v1/images/generations` | 图像生成 | GPT-Image、Flux 等 |\n| `/v1/audio/speech` | 文本转语音 | ElevenLabs、OpenAI TTS |\n| `/v1/audio/transcriptions` | 语音转文本 | Deepgram、AssemblyAI |\n\n可直接粘贴的示例(使用 Token 化 OmniRoute URL):\n\n```txt\nToken 示例:sk-a3ab3c080beaee3a-69f4a4-070d71af\n\n标准 OpenAI base:http://localhost:20128/v1\nVS Code 模型:http://localhost:20128/api/v1/vscode/sk-a3ab3c080beaee3a-69f4a4-070d71af/models\nVS Code 聊天:http://localhost:20128/api/v1/vscode/sk-a3ab3c080beaee3a-69f4a4-070d71af/chat/completions\nVS Code Responses:http://localhost:20128/api/v1/vscode/sk-a3ab3c080beaee3a-69f4a4-070d71af/responses\nOllama 标签:http://localhost:20128/api/v1/vscode/sk-a3ab3c080beaee3a-69f4a4-070d71af/api/tags\nOllama 聊天:http://localhost:20128/api/v1/vscode/sk-a3ab3c080beaee3a-69f4a4-070d71af/api/chat\n```\n\n---\n\n## 故障排除\n\n| 错误 | 原因 | 修复方法 |\n| --------------------------------------------- | ------------------------ | ------------------------------------------------- |\n| `Connection refused` | OmniRoute 未运行 | `omniroute serve` |\n| `401 Unauthorized` | API Key 错误 | 在 `/dashboard/api-manager` 中检查 |\n| `No combo configured` | 无活跃的路由 Combo | 在 `/dashboard/combos` 中设置 |\n| CLI 显示 \"not installed\" | 二进制文件不在 PATH 中 | 检查 `which <command>` |\n| Dashboard 安装后显示 \"not detected\" | 缓存过期 | 点击 dashboard 中的 \"⟳ 刷新检测\" |\n| 旧链接 `/dashboard/cli-tools` | v3.8.6 之前的书签 | 自动重定向到 `/dashboard/cli-code`(308) |\n| 旧链接 `/dashboard/agents` | v3.8.6 之前的书签 | 自动重定向到 `/dashboard/acp-agents`(308) |\n"}, "21dc426d54bc37c5a51ab378ec3abd82813d1521": {"t": 1785764933.65839, "n": 24168, "h": "f2febed5995ea9c8", "c": "---\ntitle: \"CLI 工具 — OmniRoute\"\nversion: 3.8.40\nlastUpdated: 2026-06-28\n---\n\n# CLI 工具 — OmniRoute\n\n最后更新:2026-06-28\n\nOmniRoute 与三类 CLI 工具集成,分布在三个专用的 dashboard 页面中:\n\n| 页面 | 路由 | 概念 | 数量 |\n| ---------------- | ------------------------ | --------------------------------------------------------------------------- | ------------ |\n| **CLI Code's** | `/dashboard/cli-code` | 指向 OmniRoute 的编程工具(客户端 → CLI → OmniRoute → 服务商) | 19 |\n| **CLI Agents** | `/dashboard/cli-agents` | 指向 OmniRoute 的自主代理(相同流程,更广泛的范围) | 6 |\n| **ACP Agents** | `/dashboard/acp-agents` | OmniRoute 通过 stdio/ACP 作为后端启动的 CLI(反向流程) | 见注册表 |\n\n旧路由通过 308 重定向:`/dashboard/cli-tools` → `/dashboard/cli-code`,`/dashboard/agents` → `/dashboard/acp-agents`。\n\n---\n\n## 工作原理\n\n```\nCLI Code's / CLI Agents(消费流程):\nClaude / Codex / OpenCode / Cline / KiloCode / Continue / Hermes Agent / Goose / ...\n │\n ▼ (全部指向 OmniRoute)\n http://YOUR_SERVER:20128/v1\n │\n ▼ (OmniRoute 路由到合适的服务商)\n Anthropic / OpenAI / Gemini / DeepSeek / Groq / Mistral / ...\n\nACP Agents(反向启动流程):\n 客户端请求 → OmniRoute → 通过 stdio/ACP 启动 CLI → 响应\n```\n\n**优势:**\n\n- 一个 API Key 管理所有工具\n- 在 dashboard 中追踪所有 CLI 的成本\n- 无需重新配置每个工具即可切换模型\n- 在本地和远程服务器(VPS、Docker、Akamai、Cloudflare Tunnel)均可使用\n\n---\n\n## 使用 `setup-*` 自动配置\n\n无需手动编写每个工具的配置。OmniRoute 为每个支持的 CLI 提供对应的 `setup-*` 命令,该命令从运行中的 OmniRoute(本地或远程)读取**实时**模型目录并将工具的配置写入你的机器:\n\n```bash\nomniroute setup-codex omniroute setup-claude omniroute setup-opencode\nomniroute setup-cline omniroute setup-kilo omniroute setup-continue\nomniroute setup-cursor omniroute setup-roo omniroute setup-crush\nomniroute setup-goose omniroute setup-qwen omniroute setup-aider\n```\n\n每个命令接受 `--remote <url> --api-key <key>`(针对远程 OmniRoute 配置本地工具)、`--dry-run`(预览不写入)和 `--port`。不支持模型自动发现的工具(Cline、Kilo、Roo、Goose、Qwen、Aider、Gemini)接受 `--model <id>`(以及用于非交互式运行的 `--yes`)。启动器 `omniroute launch`(Claude Code)和 `omniroute launch-codex`(Codex)在注入正确的环境变量后启动 CLI,不写入任何配置。\n\n> **完整参考:** 主表 — 每个命令写入的内容、所有标志、本地 vs 远程,以及哪些工具需要 `/v1` 后缀 — 在 **[CLI Integrations](../guides/CLI-INTEGRATIONS.md)** 中。\n\n---\n\n## 数据源\n\n统一目录位于 `src/shared/constants/cliTools.ts`,定义为 `CLI_TOOLS: Record<string, CliCatalogEntry>`。\n\n每个条目包含以下字段(定义在 `src/shared/schemas/cliCatalog.ts`):\n\n| 字段 | 类型 | 说明 |\n| ------------------------------------------------ | ------------------------------------------------------------ | -------------------------------------------------------- |\n| `category` | `\"code\" \\| \"agent\"` | 工具显示的页面 |\n| `vendor` | `string` | 工具来源(\"Anthropic\"、\"OSS (P. Gauthier)\") |\n| `acpSpawnable` | `boolean` | 也可作为 ACP Agent 使用(显示徽章) |\n| `baseUrlSupport` | `\"full\" \\| \"partial\" \\| \"none\"` | 自定义端点支持级别。`\"none\"` = MITM 待办列表 |\n| `configType` | `\"env\" \\| \"custom\" \\| \"guide\" \\| \"custom-builder\" \\| \"mitm\"` | 配置机制 |\n| `id`、`name`、`color`、`description`、`docsUrl` | 标准字段 | 核心显示字段 |\n\n`baseUrlSupport: \"none\"` 的条目**不会显示**在 dashboard 页面中 — 它们注册在 MITM 待办列表中,供 plan 11 使用(参见 `_tasks/features-v3.8.6/refactorpages/_orchestration/_plan11-mitm-backlog.md`)。\n\n---\n\n## 1. CLI Code's 目录(19 个工具)\n\n支持自定义 base URL 并出现在 `/dashboard/cli-code` 中的工具:\n\n| id | name | vendor | baseUrlSupport | configType | acpSpawnable |\n|----|------|--------|---------------|-----------|-------------|\n| claude | Claude Code | Anthropic | full | env | true |\n| codex | OpenAI Codex CLI | OpenAI | full | custom | true |\n| cline | Cline | OSS (ex-Claude Dev) | full | custom | true |\n| kilo | Kilo Code | Kilo-Org | full | custom | false |\n| roo | Roo Code | Roo (OSS) | full | guide | false |\n| continue | Continue | continue.dev | full | guide | false |\n| qwen | Qwen Code | Alibaba | full | guide | true |\n| aider | Aider | OSS (P. Gauthier) | full | guide | true |\n| forge | ForgeCode | Antinomy HQ | full | custom | true |\n| jcode | jcode | 1jehuang (OSS) | full | custom | false |\n| deepseek-tui | DeepSeek TUI | Hunter Bown (OSS) | full | custom | false |\n| opencode | OpenCode | Anomaly (ex-SST) | full | guide | true |\n| droid | Factory Droid | Factory AI | partial | guide | false |\n| copilot | GitHub Copilot CLI | GitHub/MS | full | custom | false |\n| cursor-cli | Cursor CLI | Anysphere | partial | guide | true |\n| smelt | Smelt | leonardcser (OSS) | full | custom | false |\n| pi | Pi (pi-coding-agent) | M. Zechner (OSS) | full | custom | false |\n| custom | Custom CLI | — | full | custom-builder | false |\n\n`baseUrlSupport: \"partial\"` 的工具在 dashboard 卡片中显示徽章 \"⚠ Base URL parcial\"。\n\n---\n\n## 2. CLI Agents 目录(6 个工具)\n\n出现在 `/dashboard/cli-agents` 中的自主代理:\n\n| id | name | vendor | baseUrlSupport | acpSpawnable |\n| ------------ | ---------------- | ------------------------ | -------------- | ------------ |\n| hermes-agent | Hermes Agent | Nous Research | full | false |\n| openclaw | OpenClaw | OSS (P. Steinberger) | full | true |\n| goose | Goose | Block / Linux Foundation | full | true |\n| interpreter | Open Interpreter | OSS | full | true |\n| warp | Warp AI | Warp Inc. | partial | true |\n| agent-deck | Agent Deck | asheshgoplani (OSS) | full | false |\n\n---\n\n## 3. ACP Agents(/dashboard/acp-agents)\n\n此页面(从 `/dashboard/agents` 重命名而来)显示 OmniRoute 可以通过 stdio/ACP 协议**启动**为后端执行引擎的 CLI。目录在 `src/lib/acp/registry.ts` 中单独维护,**不同于** `CLI_TOOLS`。\n\n---\n\n## 4. MITM 待办列表(不在 dashboard 中显示)\n\n以下 CLI 原生不支持自定义 base URL,因此**不会**在 CLI Code's 或 CLI Agents 页面中列出。它们是 plan 11 中 MITM 拦截的候选项:\n\n| CLI | 原因 |\n| ------------------- | ------------------------------------------------------------- |\n| windsurf | BYOK 限于部分 Claude 模型 + 企业 URL/Token |\n| amp | 封闭生态系统(Sourcegraph) |\n| amazon-q / kiro-cli | AWS SSO 认证,无自定义 URL |\n| cowork | Anthropic Desktop,无可配置端点 |\n\n完整对照参见 `_tasks/features-v3.8.6/refactorpages/_orchestration/_plan11-mitm-backlog.md`。\n\n---\n\n## 5. 批量检测 API\n\n所有工具检测通过单个端点聚合:\n\n**`GET /api/cli-tools/all-statuses`**\n\n- 认证:`requireCliToolsAuth(request)`(与其他 `/api/cli-tools/` 路由相同)\n- 返回:`Record<toolId, ToolBatchStatus>`(类型:`src/shared/types/cliBatchStatus.ts`)\n- 策略:对全部工具执行 `Promise.all`,每个工具 5 秒超时\n- 缓存:以配置文件 `mtime` 为索引的内存 LRU 缓存。当 mtime 变化时缓存失效。服务器重启时重置。\n\n每个工具的响应结构:\n\n```ts\ninterface ToolBatchStatus {\n detection: {\n installed: boolean;\n runnable: boolean;\n version?: string;\n command?: string;\n commandPath?: string;\n reason?: string;\n };\n config: {\n status: \"configured\" | \"not_configured\" | \"not_installed\" | \"unknown\" | \"other\";\n endpoint?: string | null;\n lastConfiguredAt?: string | null;\n };\n error?: string; // 已脱敏,无堆栈跟踪\n}\n```\n\n---\n\n## 6. 新工具的 Settings 处理器\n\n`configType: \"custom\"` 的新工具具有专用的 settings API 路由:\n\n| 路由 | 工具 |\n| -------------------------------------------- | -------------------------------- |\n| `POST /api/cli-tools/forge-settings` | ForgeCode (.forge.toml) |\n| `POST /api/cli-tools/jcode-settings` | jcode (--base-url 标志) |\n| `POST /api/cli-tools/deepseek-tui-settings` | DeepSeek TUI (OPENAI_BASE_URL) |\n| `POST /api/cli-tools/smelt-settings` | Smelt |\n| `POST /api/cli-tools/pi-settings` | Pi coding agent |\n\n所有路由均使用 `sanitizeErrorMessage()` 处理错误响应(Hard Rule #12)。\n\n---\n\n## 7. Dashboard 页面架构\n\n### CLI Code's(`/dashboard/cli-code`)\n\n- `src/app/(dashboard)/dashboard/cli-code/page.tsx` — 服务端组件\n- `src/app/(dashboard)/dashboard/cli-code/CliCodePageClient.tsx` — 客户端网格\n- `src/app/(dashboard)/dashboard/cli-code/[id]/page.tsx` — 工具详情页\n- `src/app/(dashboard)/dashboard/cli-code/components/` — 12 个专用工具卡片 + `ToolDetailClient.tsx`\n\n### CLI Agents(`/dashboard/cli-agents`)\n\n- `src/app/(dashboard)/dashboard/cli-agents/page.tsx` — 服务端组件\n- `src/app/(dashboard)/dashboard/cli-agents/CliAgentsPageClient.tsx` — 客户端网格\n- `src/app/(dashboard)/dashboard/cli-agents/[id]/page.tsx` — 复用 `ToolDetailClient`\n\n### ACP Agents(`/dashboard/acp-agents`)\n\n- `src/app/(dashboard)/dashboard/acp-agents/page.tsx` — 服务端组件(从 `agents/` 迁移而来)\n\n### 共享 UI 组件(`src/shared/components/cli/`)\n\n| 文件 | 用途 |\n| ------------------------- | --------------------------------------------------- |\n| `CliToolCard.tsx` | 智能状态卡片(检测 + 配置 + 端点) |\n| `CliConceptCard.tsx` | 每页概念说明卡片 |\n| `CliComparisonCard.tsx` | 三类 CLI 对比卡 |\n| `BaseUrlSelect.tsx` | 端点下拉选择(本地/云端/自定义) |\n| `ApiKeySelect.tsx` | API Key 选择器 |\n| `ManualConfigModal.tsx` | 可复制的配置片段弹窗 |\n\n### 共享 Hook(`src/shared/hooks/cli/`)\n\n| 文件 | 用途 |\n| --------------------------- | --------------------------------------------------------------------- |\n| `useToolBatchStatuses.ts` | 获取 `/api/cli-tools/all-statuses`,管理 loading/refresh 状态 |\n\n---\n\n## 8. i18n\n\n在 plan 14 F9 中添加的新命名空间:\n\n| 命名空间 | 用途 |\n| ----------- | ---------------------------------------------------------------------------- |\n| `cliCommon` | 共享字符串(卡片标签、概念/对比文本、详情页标签) |\n| `cliCode` | CLI Code's 页面字符串 |\n| `cliAgents` | CLI Agents 页面字符串 |\n| `acpAgents` | ACP Agents 页面字符串 |\n\n提供完整的 PT-BR 和 EN 翻译。其余 39 个语言环境通过 `src/i18n/request.ts` 中的命名空间级合并自动回退到 EN。\n\n---\n\n## 9. 快速开始\n\n### 步骤 1 — 获取 OmniRoute API Key\n\n1. 打开 `/dashboard/api-manager` → **创建 API Key**\n2. 为其命名(例如 `cli-tools`)并选择所有权限\n3. 复制 Key — 以下所有 CLI 都会用到\n\n> 你的 Key 格式为:`sk-xxxxxxxxxxxxxxxx-xxxxxxxxx`\n\n---\n\n### 步骤 2 — 安装 CLI 工具\n\n所有基于 npm 的工具需要 Node.js 22.22.2+ 或 24.x:\n\n```bash\n# Claude Code (Anthropic)\nnpm install -g @anthropic-ai/claude-code\n\n# OpenAI Codex\nnpm install -g @openai/codex\n\n# OpenCode\nnpm install -g opencode-ai\n\n# Cline\nnpm install -g cline\n\n# KiloCode\nnpm install -g kilocode\n\n# Qwen Code (Alibaba)\nnpm install -g @qwen-code/qwen-code\n\n# Aider\npip install aider-chat\n\n# Smelt\ncargo install smelt # Rust 编写\n\n# Pi coding agent\n# 安装参见 https://github.com/zechnerj/pi-coding-agent\n\n# jcode\n# 安装参见 https://github.com/1jehuang/jcode\n```\n\n---\n\n### 步骤 3 — 通过 Dashboard 配置\n\n1. 访问 `http://localhost:20128/dashboard/cli-code`\n2. 在网格中找到你的工具\n3. 点击卡片进入工具详情页\n4. 选择你的 API Key 和 base URL\n5. 点击**应用配置**或复制手动配置片段\n\n---\n\n### 步骤 4 — 设置全局环境变量\n\n```bash\n# OmniRoute 通用端点\nexport OPENAI_BASE_URL=\"http://localhost:20128/v1\"\nexport OPENAI_API_KEY=\"sk-your-omniroute-key\"\nexport ANTHROPIC_BASE_URL=\"http://localhost:20128\"\nexport ANTHROPIC_AUTH_TOKEN=\"sk-your-omniroute-key\"\nexport GEMINI_BASE_URL=\"http://localhost:20128/v1\"\nexport GEMINI_API_KEY=\"sk-your-omniroute-key\"\n```\n\n> 对于**远程服务器**,将 `localhost:20128` 替换为服务器的 IP 或域名,\n> 例如 `http://<your-server-ip>:20128`。\n\n---\n\n### 步骤 4 — 配置每个工具\n\n#### Claude Code\n\n```bash\n# 创建 ~/.claude/settings.json:\nmkdir -p ~/.claude && cat > ~/.claude/settings.json << EOF\n{\n \"env\": {\n \"ANTHROPIC_BASE_URL\": \"http://localhost:20128\",\n \"ANTHROPIC_AUTH_TOKEN\": \"sk-your-omniroute-key\"\n }\n}\nEOF\n```\n\nClaude Code 使用统一的 Anthropic 网关根路径。不要在这里添加 `/v1`。\n\n**测试:** `claude \"say hello\"`\n\n---\n\n#### OpenAI Codex\n\n```bash\nmkdir -p ~/.codex && cat > ~/.codex/config.yaml << EOF\nmodel: auto\napiKey: sk-your-omniroute-key\napiBaseUrl: http://localhost:20128/v1\nEOF\n```\n\n**测试:** `codex \"what is 2+2?\"`\n\n---\n\n#### OpenCode\n\n```bash\nmkdir -p ~/.config/opencode && cat > ~/.config/opencode/opencode.json << EOF\n{\n \"\\$schema\": \"https://opencode.ai/config.json\",\n \"provider\": {\n \"omniroute\": {\n \"npm\": \"@ai-sdk/openai-compatible\",\n \"name\": \"OmniRoute\",\n \"options\": {\n \"baseURL\": \"http://localhost:20128/v1\",\n \"apiKey\": \"sk-your-omniroute-key\"\n },\n \"models\": {\n \"claude-sonnet-4-5\": { \"name\": \"claude-sonnet-4-5\" },\n \"claude-sonnet-4-5-thinking\": { \"name\": \"claude-sonnet-4-5-thinking\" },\n \"gemini-3-flash\": { \"name\": \"gemini-3-flash\" }\n }\n }\n }\n}\nEOF\n```\n\n**测试:** `opencode`\n\n> 使用 `opencode run \"your prompt\" --model omniroute/claude-sonnet-4-5-thinking --variant high`\n> 发送 thinking 变体。\n\n---\n\n#### Cline(CLI 或 VS Code)\n\n**CLI 模式:**\n\n```bash\nmkdir -p ~/.cline/data && cat > ~/.cline/data/globalState.json << EOF\n{\n \"apiProvider\": \"openai\",\n \"openAiBaseUrl\": \"http://localhost:20128/v1\",\n \"openAiApiKey\": \"sk-your-omniroute-key\"\n}\nEOF\n```\n\n**VS Code 模式:**\nCline 扩展设置 → API Provider:`OpenAI Compatible` → Base URL:`http://localhost:20128/v1`\n\n或使用 OmniRoute dashboard → **CLI Tools → Cline → 应用配置**。\n\n---\n\n#### KiloCode(CLI 或 VS Code)\n\n**CLI 模式:**\n\n```bash\nkilocode --api-base http://localhost:20128/v1 --api-key sk-your-omniroute-key\n```\n\n**VS Code 设置:**\n\n```json\n{\n \"kilo-code.openAiBaseUrl\": \"http://localhost:20128/v1\",\n \"kilo-code.apiKey\": \"sk-your-omniroute-key\"\n}\n```\n\n或使用 OmniRoute dashboard → **CLI Tools → KiloCode → 应用配置**。\n\n---\n\n#### Continue(VS Code 扩展)\n\n编辑 `~/.continue/config.yaml`:\n\n```yaml\nmodels:\n - name: OmniRoute\n provider: openai\n model: auto\n apiBase: http://localhost:20128/v1\n apiKey: sk-your-omniroute-key\n default: true\n```\n\n编辑后重启 VS Code。\n\n---\n\n#### VS Code Insiders(`chatLanguageModels.json`)\n\n当 VS Code Insiders 配置了自定义端点模型,且你希望 OmniRoute 在不使用自定义请求头字段的情况下工作时使用。\n\n**推荐位置:**\n\n- Linux:`~/.config/Code - Insiders/User/chatLanguageModels.json`\n- Windows:`%APPDATA%/Code - Insiders/User/chatLanguageModels.json`\n\n**使用 Token 化 OmniRoute 别名的示例:**\n\n```json\n[\n {\n \"vendor\": \"customendpoint\",\n \"id\": \"auto\",\n \"name\": \"OmniRoute Auto\",\n \"family\": \"gpt-4\",\n \"version\": \"1.0.0\",\n \"url\": \"http://localhost:20128/api/v1/vscode/sk-your-omniroute-key/chat/completions\",\n \"modelsUrl\": \"http://localhost:20128/api/v1/vscode/sk-your-omniroute-key/models\",\n \"requestFormat\": \"openai-chat-completions\",\n \"contextWindow\": 256000,\n \"maxOutputTokens\": 32768,\n \"auth\": {\n \"type\": \"none\"\n }\n }\n]\n```\n\n**说明:**\n\n- 将 `sk-your-omniroute-key` 替换为在 OmniRoute 中创建的 API Key。\n- `url` 字段应指向 `/api/v1/vscode/{token}/chat/completions`。\n- `modelsUrl` 字段应指向 `/api/v1/vscode/{token}/models`。\n- 只要客户端支持自定义请求头,应优先使用正常的 `/v1` + Bearer 请求头流程。\n- URL 嵌入的 Token 是兼容性回退方案,可能出现在编辑器日志或代理历史中。\n\n---\n\n#### Kiro CLI(Amazon)\n\n```bash\n# 登录你的 AWS/Kiro 账户:\nkiro-cli login\n\n# CLI 使用自己的认证 — Kiro CLI 本身不需要 OmniRoute 作为后端。\n# 将 kiro-cli 与 OmniRoute 配合用于其他工具。\nkiro-cli status\n```\n\n对于 **Kiro IDE** 桌面应用,使用 OmniRoute 通过 `/dashboard/cli-tools → Kiro` 暴露的 MITM 端点。\n\n---\n\n#### Qwen Code(Alibaba)\n\nQwen Code 通过环境变量或 `settings.json` 支持 OpenAI 兼容的 API 端点。\n\n> Qwen OAuth 免费层已于 2026-04-15 停用。改为使用 OmniRoute 搭配\n> `bailian-coding-plan` / `alibaba` / `alibaba-cn` / `openrouter` / `anthropic` /\n> `gemini` 服务商。\n\n**选项 1:环境变量(`~/.qwen/.env`)**\n\n```bash\nmkdir -p ~/.qwen && cat > ~/.qwen/.env << EOF\nOPENAI_API_KEY=\"sk-your-omniroute-key\"\nOPENAI_BASE_URL=\"http://localhost:20128/v1\"\nOPENAI_MODEL=\"auto\"\nEOF\n```\n\n**选项 2:`settings.json` 配合 `security.auth`**\n\n```json\n// ~/.qwen/settings.json\n{\n \"security\": {\n \"auth\": {\n \"selectedType\": \"openai\",\n \"apiKey\": \"sk-your-omniroute-key\",\n \"baseUrl\": \"http://localhost:20128/v1\"\n }\n },\n \"model\": {\n \"name\": \"claude-sonnet-4-6\"\n }\n}\n```\n\n**选项 3:内联 CLI 标志**\n\n```bash\nOPENAI_BASE_URL=\"http://localhost:20128/v1\" \\\nOPENAI_API_KEY=\"sk-your-omniroute-key\" \\\nOPENAI_MODEL=\"auto\" \\\nqwen\n```\n\n> 对于**远程服务器**,将 `localhost:20128` 替换为服务器的 IP 或域名。\n\n---\n\n## 10. OmniRoute 内置 CLI\n\n`omniroute` 二进制文件提供服务端生命周期、设置、诊断和服务商管理的命令。入口点:`bin/omniroute.mjs`。\n\n```bash\nomniroute # 启动服务器(默认端口 20128)\nomniroute setup # 交互式设置向导\nomniroute doctor # 检查配置、数据库、端口、运行时\nomniroute providers list # 已配置的服务商连接\nomniroute providers test-all # 测试所有活跃连接\nomniroute reset-password # 重置管理员密码\nomniroute logs # 流式输出请求日志\nomniroute health # 详细健康状态(熔断器、缓存、内存)\nomniroute --version # 输出版本号\nomniroute --help # 显示所有命令\n```\n\n### 设置与初始化\n\n```bash\nomniroute setup # 交互式设置向导\nomniroute setup --non-interactive # CI/自动化模式(读取环境变量 + 标志)\nomniroute setup --password '<value>' # 直接设置管理员密码\nomniroute setup --add-provider \\\n --provider openai \\\n --api-key '<value>' \\\n --test-provider # 一步添加并测试服务商\n```\n\n非交互式设置识别的环境变量:\n\n| 变量 | 用途 |\n| ------------------- | ----------------------------------------------------------- |\n| `OMNIROUTE_API_KEY` | 服务商 API Key(通过 Commander `.env()` 绑定到 `--api-key`) |\n| `DATA_DIR` | 覆盖 OmniRoute 数据目录 |\n\n其他所有非交互式输入通过标志传入,而非环境变量:\n`--password`、`--provider`、`--provider-name`、`--provider-base-url`、`--default-model`\n(参见上述 `omniroute setup` 选项)。\n\n### 诊断\n\n```bash\nomniroute doctor # 检查配置、数据库、端口、运行时、内存、存活状态\nomniroute doctor --json # 机器可读的 JSON\nomniroute doctor --no-liveness # 跳过 HTTP 健康探测\nomniroute doctor --host 0.0.0.0 # 覆盖存活探测的主机\nomniroute doctor --liveness-url <url> # 完全覆盖健康端点 URL\n```\n\ndoctor 运行以下检查:`Config`、`Database`、`Storage/encryption`、`Port availability`、`Node runtime`、`Native binary`(better-sqlite3)、`Memory` 和 `Server liveness`。任何检查为 `fail` 时以非零退出码退出。\n\n### 服务商管理\n\n```bash\nomniroute providers available # OmniRoute 服务商目录\nomniroute providers available --search openai # 按 id/name/alias/category 过滤目录\nomniroute providers available --category api-key # 按分类过滤(api-key、oauth、free 等)\nomniroute providers available --json # 机器可读的 JSON\n\nomniroute providers list # 已配置的服务商连接\nomniroute providers list --json\n\nomniroute providers test <id|name> # 测试一个已配置的连接\nomniroute providers test-all # 测试所有活跃连接\nomniroute providers validate # 仅本地结构校验\n```\n\n> `providers available` 读取 OmniRoute 目录;`providers list/test/test-all/validate`\n> 直接读取本地 SQLite 数据库,不需要服务器运行。\n\n### 恢复与重置\n\n```bash\nomniroute reset-password # 重置管理员密码(旧别名仍然可用)\nomniroute reset-encrypted-columns # 显示加密凭证重置的警告 + 干运行\nomniroute reset-encrypted-columns --force # 实际在 SQLite 中将加密凭证设为 null\n```\n\n### 其他子命令\n\n以下命令假定 OmniRoute 服务器正在运行(另有说明除外):\n\n```bash\nomniroute status # 全面的运行时状态\nomniroute logs # 流式输出请求日志(--json、--search、--follow)\nomniroute config show # 显示当前配置\n\nomniroute provider list # 列出可用服务商(providers list 的别名)\nomniroute provider add # 将 OmniRoute 注册为某个工具的服务商\nomniroute keys add | list | remove # 管理 API Key\nomniroute models [provider] # 列出模型(--json、--search)\nomniroute combo list | switch | create | delete\n\nomniroute backup # 快照配置 + 数据库\nomniroute restore # 从之前的快照恢复\n\nomniroute health # 详细健康状态(熔断器、缓存、内存)\nomniroute quota # 服务商配额用量\nomniroute cache # 缓存状态\nomniroute cache clear # 清除语义 + 签名缓存\n\nomniroute mcp status | restart # MCP 服务器状态 / 重启\nomniroute a2a status | card # A2A 服务器状态 / agent card\n\nomniroute tunnel list | create | stop # 管理隧道(cloudflare/tailscale/ngrok)\nomniroute env show | get <k> | set <k> <v> # 检查 / 设置环境变量(临时)\n\nomniroute test # 服务商连通性冒烟测试\nomniroute update # 检查更新\nomniroute completion # 生成 shell 补全\n```\n\n### 通用标志\n\n| 标志 | 说明 |\n| ------------------- | ------------------------------------------------------ |\n| `--no-open` | 启动时不自动打开浏览器 |\n| `--port <n>` | 覆盖 API 端口(默认 20128) |\n| `--mcp` | 以 MCP 服务器通过 stdio 运行(供 IDE 使用) |\n| `--non-interactive` | CI 模式(无交互提示;从 env/flags 读取) |\n| `--json` | 机器可读的 JSON 输出(doctor、providers 等) |\n| `--help`、`-h` | 显示命令特定的帮助 |\n| `--version`、`-v` | 输出版本号 |\n\n---\n\n## 可用 API 端点\n\n| 端点 | 说明 | 用途 |\n| ---------------------------- | ------------------------------ | -------------------------- |\n| `/v1/chat/completions` | 标准聊天(所有服务商) | 所有现代工具 |\n| `/v1/responses` | Responses API(OpenAI 格式) | Codex、代理工作流 |\n| `/v1/completions` | 旧版文本补全 | 使用 `prompt:` 的旧工具 |\n| `/v1/embeddings` | 文本嵌入 | RAG、搜索 |\n| `/v1/images/generations` | 图像生成 | GPT-Image、Flux 等 |\n| `/v1/audio/speech` | 文本转语音 | ElevenLabs、OpenAI TTS |\n| `/v1/audio/transcriptions` | 语音转文本 | Deepgram、AssemblyAI |\n\n可直接粘贴的示例(使用 Token 化 OmniRoute URL):\n\n```txt\nToken 示例:sk-a3ab3c080beaee3a-69f4a4-070d71af\n\n标准 OpenAI base:http://localhost:20128/v1\nVS Code 模型:http://localhost:20128/api/v1/vscode/sk-a3ab3c080beaee3a-69f4a4-070d71af/models\nVS Code 聊天:http://localhost:20128/api/v1/vscode/sk-a3ab3c080beaee3a-69f4a4-070d71af/chat/completions\nVS Code Responses:http://localhost:20128/api/v1/vscode/sk-a3ab3c080beaee3a-69f4a4-070d71af/responses\nOllama 标签:http://localhost:20128/api/v1/vscode/sk-a3ab3c080beaee3a-69f4a4-070d71af/api/tags\nOllama 聊天:http://localhost:20128/api/v1/vscode/sk-a3ab3c080beaee3a-69f4a4-070d71af/api/chat\n```\n\n---\n\n## 故障排除\n\n| 错误 | 原因 | 修复方法 |\n| --------------------------------------------- | ------------------------ | ------------------------------------------------- |\n| `Connection refused` | OmniRoute 未运行 | `omniroute serve` |\n| `401 Unauthorized` | API Key 错误 | 在 `/dashboard/api-manager` 中检查 |\n| `No combo configured` | 无活跃的路由 Combo | 在 `/dashboard/combos` 中设置 |\n| CLI 显示 \"not installed\" | 二进制文件不在 PATH 中 | 检查 `which <command>` |\n| Dashboard 安装后显示 \"not detected\" | 缓存过期 | 点击 dashboard 中的 \"⟳ 刷新检测\" |\n| 旧链接 `/dashboard/cli-tools` | v3.8.6 之前的书签 | 自动重定向到 `/dashboard/cli-code`(308) |\n| 旧链接 `/dashboard/agents` | v3.8.6 之前的书签 | 自动重定向到 `/dashboard/acp-agents`(308) |\n"}}, "omniroute/tests/snapshots/provider/translate-path.json": {"6eea4894299d5371c00c11f1f6dec2f7c0076253": {"t": 1785674321.649731, "n": 143630, "h": "b099a5061026b5ec", "c": "{\n \"adapta-web\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://agent.adapta.one/api/chat/stream/v1\",\n \"stream\": \"https://agent.adapta.one/api/chat/stream/v1\"\n }\n },\n \"agentrouter\": {\n \"format\": \"claude\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Content-Type\": \"application/json\",\n \"User-Agent\": \"claude-cli/2.1.207 (external, sdk-cli)\",\n \"X-Stainless-Arch\": \"<ARCH>\",\n \"X-Stainless-Lang\": \"js\",\n \"X-Stainless-OS\": \"MacOS\",\n \"X-Stainless-Package-Version\": \"0.94.0\",\n \"X-Stainless-Retry-Count\": \"0\",\n \"X-Stainless-Runtime\": \"node\",\n \"X-Stainless-Runtime-Version\": \"v24.3.0\",\n \"X-Stainless-Timeout\": \"600\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"anthropic-beta\": \"claude-code-20250219,interleaved-thinking-2025-05-14,effort-2025-11-24\",\n \"anthropic-dangerous-direct-browser-access\": \"true\",\n \"anthropic-version\": \"2023-06-01\",\n \"x-api-key\": \"<CRED>\",\n \"x-app\": \"cli\"\n },\n \"nonStream\": {\n \"Accept\": \"application/json\",\n \"Content-Type\": \"application/json\",\n \"User-Agent\": \"claude-cli/2.1.207 (external, sdk-cli)\",\n \"X-Stainless-Arch\": \"<ARCH>\",\n \"X-Stainless-Lang\": \"js\",\n \"X-Stainless-OS\": \"MacOS\",\n \"X-Stainless-Package-Version\": \"0.94.0\",\n \"X-Stainless-Retry-Count\": \"0\",\n \"X-Stainless-Runtime\": \"node\",\n \"X-Stainless-Runtime-Version\": \"v24.3.0\",\n \"X-Stainless-Timeout\": \"600\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"anthropic-beta\": \"claude-code-20250219,interleaved-thinking-2025-05-14,effort-2025-11-24\",\n \"anthropic-dangerous-direct-browser-access\": \"true\",\n \"anthropic-version\": \"2023-06-01\",\n \"x-api-key\": \"<CRED>\",\n \"x-app\": \"cli\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Content-Type\": \"application/json\",\n \"User-Agent\": \"claude-cli/2.1.207 (external, sdk-cli)\",\n \"X-Stainless-Arch\": \"<ARCH>\",\n \"X-Stainless-Lang\": \"js\",\n \"X-Stainless-OS\": \"MacOS\",\n \"X-Stainless-Package-Version\": \"0.94.0\",\n \"X-Stainless-Retry-Count\": \"0\",\n \"X-Stainless-Runtime\": \"node\",\n \"X-Stainless-Runtime-Version\": \"v24.3.0\",\n \"X-Stainless-Timeout\": \"600\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"anthropic-beta\": \"claude-code-20250219,interleaved-thinking-2025-05-14,effort-2025-11-24\",\n \"anthropic-dangerous-direct-browser-access\": \"true\",\n \"anthropic-version\": \"2023-06-01\",\n \"x-api-key\": \"<CRED>\",\n \"x-app\": \"cli\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://agentrouter.org/v1/messages?beta=true\",\n \"stream\": \"https://agentrouter.org/v1/messages?beta=true\"\n }\n },\n \"agnes\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://apihub.agnes-ai.com/v1/chat/completions\",\n \"stream\": \"https://apihub.agnes-ai.com/v1/chat/completions\"\n }\n },\n \"agy\": {\n \"format\": \"antigravity\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"User-Agent\": \"Antigravity/4.2.0 (<PLATFORM>) Chrome/142.0.7444.175 Electron/39.2.3\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"User-Agent\": \"Antigravity/4.2.0 (<PLATFORM>) Chrome/142.0.7444.175 Electron/39.2.3\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"User-Agent\": \"Antigravity/4.2.0 (<PLATFORM>) Chrome/142.0.7444.175 Electron/39.2.3\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://daily-cloudcode-pa.googleapis.com/v1internal:generateContent\",\n \"stream\": \"https://daily-cloudcode-pa.googleapis.com/v1internal:streamGenerateContent?alt=sse\"\n }\n },\n \"ai21\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.ai21.com/studio/v1/chat/completions\",\n \"stream\": \"https://api.ai21.com/studio/v1/chat/completions\"\n }\n },\n \"aihorde\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://oai.aihorde.net/v1/chat/completions\",\n \"stream\": \"https://oai.aihorde.net/v1/chat/completions\"\n }\n },\n \"aimlapi\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.aimlapi.com/v1/chat/completions\",\n \"stream\": \"https://api.aimlapi.com/v1/chat/completions\"\n }\n },\n \"alibaba\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://dashscope-intl.aliyuncs.com/compatible-mode/v1/chat/completions\",\n \"stream\": \"https://dashscope-intl.aliyuncs.com/compatible-mode/v1/chat/completions\"\n }\n },\n \"alibaba-cn\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions\",\n \"stream\": \"https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions\"\n }\n },\n \"anthropic\": {\n \"format\": \"claude\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Anthropic-Beta\": \"claude-code-20250219,interleaved-thinking-2025-05-14,context-management-2025-06-27,prompt-caching-scope-2026-01-05,advanced-tool-use-2025-11-20,effort-2025-11-24,structured-outputs-2025-12-15,fast-mode-2026-02-01,redact-thinking-2026-02-12,token-efficient-tools-2026-03-28,advisor-tool-2026-03-01,extended-cache-ttl-2025-04-11,cache-diagnosis-2026-04-07\",\n \"Anthropic-Version\": \"2023-06-01\",\n \"Content-Type\": \"application/json\",\n \"x-api-key\": \"<CRED>\"\n },\n \"nonStream\": {\n \"Anthropic-Beta\": \"claude-code-20250219,interleaved-thinking-2025-05-14,context-management-2025-06-27,prompt-caching-scope-2026-01-05,advanced-tool-use-2025-11-20,effort-2025-11-24,structured-outputs-2025-12-15,fast-mode-2026-02-01,redact-thinking-2026-02-12,token-efficient-tools-2026-03-28,advisor-tool-2026-03-01,extended-cache-ttl-2025-04-11,cache-diagnosis-2026-04-07\",\n \"Anthropic-Version\": \"2023-06-01\",\n \"Content-Type\": \"application/json\",\n \"x-api-key\": \"<CRED>\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Anthropic-Beta\": \"claude-code-20250219,interleaved-thinking-2025-05-14,context-management-2025-06-27,prompt-caching-scope-2026-01-05,advanced-tool-use-2025-11-20,effort-2025-11-24,structured-outputs-2025-12-15,fast-mode-2026-02-01,redact-thinking-2026-02-12,token-efficient-tools-2026-03-28,advisor-tool-2026-03-01,extended-cache-ttl-2025-04-11,cache-diagnosis-2026-04-07\",\n \"Anthropic-Version\": \"2023-06-01\",\n \"Content-Type\": \"application/json\",\n \"x-api-key\": \"<CRED>\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.anthropic.com/v1/messages?beta=true\",\n \"stream\": \"https://api.anthropic.com/v1/messages?beta=true\"\n }\n },\n \"antigravity\": {\n \"format\": \"antigravity\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"User-Agent\": \"Antigravity/4.2.0 (<PLATFORM>) Chrome/142.0.7444.175 Electron/39.2.3\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"User-Agent\": \"Antigravity/4.2.0 (<PLATFORM>) Chrome/142.0.7444.175 Electron/39.2.3\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"User-Agent\": \"Antigravity/4.2.0 (<PLATFORM>) Chrome/142.0.7444.175 Electron/39.2.3\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://daily-cloudcode-pa.googleapis.com/v1internal:generateContent\",\n \"stream\": \"https://daily-cloudcode-pa.googleapis.com/v1internal:streamGenerateContent?alt=sse\"\n }\n },\n \"api-airforce\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"HTTP-Referer\": \"https://endpoint-proxy.local\",\n \"X-Title\": \"Endpoint Proxy\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"HTTP-Referer\": \"https://endpoint-proxy.local\",\n \"X-Title\": \"Endpoint Proxy\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"HTTP-Referer\": \"https://endpoint-proxy.local\",\n \"X-Title\": \"Endpoint Proxy\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.airforce/v1/chat/completions\",\n \"stream\": \"https://api.airforce/v1/chat/completions\"\n }\n },\n \"auggie\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"auggie://cli/stdio\",\n \"stream\": \"auggie://cli/stdio\"\n }\n },\n \"bai\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.b.ai/v1/chat/completions\",\n \"stream\": \"https://api.b.ai/v1/chat/completions\"\n }\n },\n \"baichuan\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.baichuan-ai.com/v1/chat/completions\",\n \"stream\": \"https://api.baichuan-ai.com/v1/chat/completions\"\n }\n },\n \"baidu\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://qianfan.baidubce.com/v2/chat/completions\",\n \"stream\": \"https://qianfan.baidubce.com/v2/chat/completions\"\n }\n },\n \"bailian-coding-plan\": {\n \"format\": \"claude\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Anthropic-Version\": \"2023-06-01\",\n \"Content-Type\": \"application/json\",\n \"x-api-key\": \"<CRED>\"\n },\n \"nonStream\": {\n \"Anthropic-Version\": \"2023-06-01\",\n \"Content-Type\": \"application/json\",\n \"x-api-key\": \"<CRED>\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Anthropic-Version\": \"2023-06-01\",\n \"Content-Type\": \"application/json\",\n \"x-api-key\": \"<CRED>\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://coding-intl.dashscope.aliyuncs.com/apps/anthropic/v1\",\n \"stream\": \"https://coding-intl.dashscope.aliyuncs.com/apps/anthropic/v1\"\n }\n },\n \"baseten\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://inference.baseten.co/v1/chat/completions\",\n \"stream\": \"https://inference.baseten.co/v1/chat/completions\"\n }\n },\n \"bazaarlink\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://bazaarlink.ai/api/v1/chat/completions\",\n \"stream\": \"https://bazaarlink.ai/api/v1/chat/completions\"\n }\n },\n \"bedrock\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {}\n },\n \"blackbox\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.blackbox.ai/v1/chat/completions\",\n \"stream\": \"https://api.blackbox.ai/v1/chat/completions\"\n }\n },\n \"blackbox-web\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://app.blackbox.ai/api/chat\",\n \"stream\": \"https://app.blackbox.ai/api/chat\"\n }\n },\n \"bluesminds\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.bluesminds.com/v1/chat/completions\",\n \"stream\": \"https://api.bluesminds.com/v1/chat/completions\"\n }\n },\n \"byteplus\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://ark.ap-southeast.bytepluses.com/api/v3/chat/completions\",\n \"stream\": \"https://ark.ap-southeast.bytepluses.com/api/v3/chat/completions\"\n }\n },\n \"bytez\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.bytez.com/models/v2/openai/v1/chat/completions\",\n \"stream\": \"https://api.bytez.com/models/v2/openai/v1/chat/completions\"\n }\n },\n \"cerebras\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.cerebras.ai/v1/chat/completions\",\n \"stream\": \"https://api.cerebras.ai/v1/chat/completions\"\n }\n },\n \"charm-hyper\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://hyper.charm.land/v1/chat/completions\",\n \"stream\": \"https://hyper.charm.land/v1/chat/completions\"\n }\n },\n \"chatgpt-web\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://chatgpt.com/backend-api/conversation\",\n \"stream\": \"https://chatgpt.com/backend-api/conversation\"\n }\n },\n \"chenzk\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://chenzk.top/v1/chat/completions\",\n \"stream\": \"https://chenzk.top/v1/chat/completions\"\n }\n },\n \"chipotle\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://amelia.chipotle.com\",\n \"stream\": \"https://amelia.chipotle.com\"\n }\n },\n \"chutes\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://llm.chutes.ai/v1/chat/completions\",\n \"stream\": \"https://llm.chutes.ai/v1/chat/completions\"\n }\n },\n \"claude\": {\n \"format\": \"claude\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Anthropic-Beta\": \"claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,fine-grained-tool-streaming-2025-05-14,context-management-2025-06-27,prompt-caching-scope-2026-01-05,advanced-tool-use-2025-11-20,effort-2025-11-24,structured-outputs-2025-12-15,fast-mode-2026-02-01,redact-thinking-2026-02-12,token-efficient-tools-2026-03-28,advisor-tool-2026-03-01,extended-cache-ttl-2025-04-11,cache-diagnosis-2026-04-07\",\n \"Anthropic-Dangerous-Direct-Browser-Access\": \"true\",\n \"Anthropic-Version\": \"2023-06-01\",\n \"Content-Type\": \"application/json\",\n \"User-Agent\": \"claude-cli/2.1.207 (external, cli)\",\n \"X-App\": \"cli\",\n \"X-Stainless-Arch\": \"<ARCH>\",\n \"X-Stainless-Helper-Method\": \"stream\",\n \"X-Stainless-Lang\": \"js\",\n \"X-Stainless-Os\": \"<OS>\",\n \"X-Stainless-Package-Version\": \"0.94.0\",\n \"X-Stainless-Retry-Count\": \"0\",\n \"X-Stainless-Runtime\": \"node\",\n \"X-Stainless-Runtime-Version\": \"v24.3.0\",\n \"X-Stainless-Timeout\": \"600\",\n \"x-api-key\": \"<CRED>\"\n },\n \"nonStream\": {\n \"Anthropic-Beta\": \"claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,fine-grained-tool-streaming-2025-05-14,context-management-2025-06-27,prompt-caching-scope-2026-01-05,advanced-tool-use-2025-11-20,effort-2025-11-24,structured-outputs-2025-12-15,fast-mode-2026-02-01,redact-thinking-2026-02-12,token-efficient-tools-2026-03-28,advisor-tool-2026-03-01,extended-cache-ttl-2025-04-11,cache-diagnosis-2026-04-07\",\n \"Anthropic-Dangerous-Direct-Browser-Access\": \"true\",\n \"Anthropic-Version\": \"2023-06-01\",\n \"Content-Type\": \"application/json\",\n \"User-Agent\": \"claude-cli/2.1.207 (external, cli)\",\n \"X-App\": \"cli\",\n \"X-Stainless-Arch\": \"<ARCH>\",\n \"X-Stainless-Helper-Method\": \"stream\",\n \"X-Stainless-Lang\": \"js\",\n \"X-Stainless-Os\": \"<OS>\",\n \"X-Stainless-Package-Version\": \"0.94.0\",\n \"X-Stainless-Retry-Count\": \"0\",\n \"X-Stainless-Runtime\": \"node\",\n \"X-Stainless-Runtime-Version\": \"v24.3.0\",\n \"X-Stainless-Timeout\": \"600\",\n \"x-api-key\": \"<CRED>\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Anthropic-Beta\": \"claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,fine-grained-tool-streaming-2025-05-14,context-management-2025-06-27,prompt-caching-scope-2026-01-05,advanced-tool-use-2025-11-20,effort-2025-11-24,structured-outputs-2025-12-15,fast-mode-2026-02-01,redact-thinking-2026-02-12,token-efficient-tools-2026-03-28,advisor-tool-2026-03-01,extended-cache-ttl-2025-04-11,cache-diagnosis-2026-04-07\",\n \"Anthropic-Dangerous-Direct-Browser-Access\": \"true\",\n \"Anthropic-Version\": \"2023-06-01\",\n \"Content-Type\": \"application/json\",\n \"User-Agent\": \"claude-cli/2.1.207 (external, cli)\",\n \"X-App\": \"cli\",\n \"X-Stainless-Arch\": \"<ARCH>\",\n \"X-Stainless-Helper-Method\": \"stream\",\n \"X-Stainless-Lang\": \"js\",\n \"X-Stainless-Os\": \"<OS>\",\n \"X-Stainless-Package-Version\": \"0.94.0\",\n \"X-Stainless-Retry-Count\": \"0\",\n \"X-Stainless-Runtime\": \"node\",\n \"X-Stainless-Runtime-Version\": \"v24.3.0\",\n \"X-Stainless-Timeout\": \"600\",\n \"x-api-key\": \"<CRED>\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.anthropic.com/v1/messages?beta=true\",\n \"stream\": \"https://api.anthropic.com/v1/messages?beta=true\"\n }\n },\n \"claude-web\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://claude.ai/api/organizations\",\n \"stream\": \"https://claude.ai/api/organizations\"\n }\n },\n \"cline\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"HTTP-Referer\": \"https://cline.bot\",\n \"User-Agent\": \"OmniRoute/<APP>\",\n \"X-CLIENT-TYPE\": \"omniroute\",\n \"X-CLIENT-VERSION\": \"<APP>\",\n \"X-CORE-VERSION\": \"<APP>\",\n \"X-IS-MULTIROOT\": \"false\",\n \"X-PLATFORM\": \"<PLATFORM>\",\n \"X-PLATFORM-VERSION\": \"<NODE>\",\n \"X-Title\": \"Cline\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"HTTP-Referer\": \"https://cline.bot\",\n \"User-Agent\": \"OmniRoute/<APP>\",\n \"X-CLIENT-TYPE\": \"omniroute\",\n \"X-CLIENT-VERSION\": \"<APP>\",\n \"X-CORE-VERSION\": \"<APP>\",\n \"X-IS-MULTIROOT\": \"false\",\n \"X-PLATFORM\": \"<PLATFORM>\",\n \"X-PLATFORM-VERSION\": \"<NODE>\",\n \"X-Title\": \"Cline\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"HTTP-Referer\": \"https://cline.bot\",\n \"User-Agent\": \"OmniRoute/<APP>\",\n \"X-CLIENT-TYPE\": \"omniroute\",\n \"X-CLIENT-VERSION\": \"<APP>\",\n \"X-CORE-VERSION\": \"<APP>\",\n \"X-IS-MULTIROOT\": \"false\",\n \"X-PLATFORM\": \"<PLATFORM>\",\n \"X-PLATFORM-VERSION\": \"<NODE>\",\n \"X-Title\": \"Cline\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.cline.bot/api/v1/chat/completions\",\n \"stream\": \"https://api.cline.bot/api/v1/chat/completions\"\n }\n },\n \"clinepass\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"HTTP-Referer\": \"https://cline.bot\",\n \"X-Title\": \"Cline\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"HTTP-Referer\": \"https://cline.bot\",\n \"X-Title\": \"Cline\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"HTTP-Referer\": \"https://cline.bot\",\n \"X-Title\": \"Cline\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.cline.bot/api/v1/chat/completions\",\n \"stream\": \"https://api.cline.bot/api/v1/chat/completions\"\n }\n },\n \"cloudflare-ai\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.cloudflare.com/client/v4/accounts\",\n \"stream\": \"https://api.cloudflare.com/client/v4/accounts\"\n }\n },\n \"codebuddy-cn\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"User-Agent\": \"CLI/2.108.1 CodeBuddy/2.108.1\",\n \"X-IDE-Name\": \"CLI\",\n \"X-IDE-Type\": \"CLI\",\n \"X-Product\": \"SaaS\",\n \"x-codebuddy-request\": \"1\",\n \"x-requested-with\": \"XMLHttpRequest\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"User-Agent\": \"CLI/2.108.1 CodeBuddy/2.108.1\",\n \"X-IDE-Name\": \"CLI\",\n \"X-IDE-Type\": \"CLI\",\n \"X-Product\": \"SaaS\",\n \"x-codebuddy-request\": \"1\",\n \"x-requested-with\": \"XMLHttpRequest\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"User-Agent\": \"CLI/2.108.1 CodeBuddy/2.108.1\",\n \"X-IDE-Name\": \"CLI\",\n \"X-IDE-Type\": \"CLI\",\n \"X-Product\": \"SaaS\",\n \"x-codebuddy-request\": \"1\",\n \"x-requested-with\": \"XMLHttpRequest\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://copilot.tencent.com/v2/chat/completions\",\n \"stream\": \"https://copilot.tencent.com/v2/chat/completions\"\n }\n },\n \"codestral\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://codestral.mistral.ai/v1/chat/completions\",\n \"stream\": \"https://codestral.mistral.ai/v1/chat/completions\"\n }\n },\n \"codex\": {\n \"format\": \"openai-responses\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"Openai-Beta\": \"responses=experimental\",\n \"User-Agent\": \"codex-cli/0.144.1 (<OS>; <ARCH>)\",\n \"Version\": \"0.144.1\",\n \"X-Codex-Beta-Features\": \"responses_websockets\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"Openai-Beta\": \"responses=experimental\",\n \"User-Agent\": \"codex-cli/0.144.1 (<OS>; <ARCH>)\",\n \"Version\": \"0.144.1\",\n \"X-Codex-Beta-Features\": \"responses_websockets\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"Openai-Beta\": \"responses=experimental\",\n \"User-Agent\": \"codex-cli/0.144.1 (<OS>; <ARCH>)\",\n \"Version\": \"0.144.1\",\n \"X-Codex-Beta-Features\": \"responses_websockets\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://chatgpt.com/backend-api/codex/responses\",\n \"stream\": \"https://chatgpt.com/backend-api/codex/responses\"\n }\n },\n \"cohere\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.cohere.com/compatibility/v1/chat/completions\",\n \"stream\": \"https://api.cohere.com/compatibility/v1/chat/completions\"\n }\n },\n \"command-code\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.commandcode.ai\",\n \"stream\": \"https://api.commandcode.ai\"\n }\n },\n \"copilot-m365-web\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"wss://substrate.office.com/m365Copilot/Chathub\",\n \"stream\": \"wss://substrate.office.com/m365Copilot/Chathub\"\n }\n },\n \"copilot-web\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"wss://copilot.microsoft.com/c/api/chat?api-version=2\",\n \"stream\": \"wss://copilot.microsoft.com/c/api/chat?api-version=2\"\n }\n },\n \"coze\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.coze.com/v1/chat/completions\",\n \"stream\": \"https://api.coze.com/v1/chat/completions\"\n }\n },\n \"crof\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://crof.ai/v1/chat/completions\",\n \"stream\": \"https://crof.ai/v1/chat/completions\"\n }\n },\n \"cursor\": {\n \"format\": \"cursor\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/connect+proto\",\n \"User-Agent\": \"Cursor/3.9\",\n \"connect-accept-encoding\": \"gzip\",\n \"connect-protocol-version\": \"1\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/connect+proto\",\n \"User-Agent\": \"Cursor/3.9\",\n \"connect-accept-encoding\": \"gzip\",\n \"connect-protocol-version\": \"1\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/connect+proto\",\n \"User-Agent\": \"Cursor/3.9\",\n \"connect-accept-encoding\": \"gzip\",\n \"connect-protocol-version\": \"1\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api2.cursor.sh\",\n \"stream\": \"https://api2.cursor.sh\"\n }\n },\n \"dahl\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://inference.dahl.global/v1/chat/completions\",\n \"stream\": \"https://inference.dahl.global/v1/chat/completions\"\n }\n },\n \"databricks\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://adb-0000000000000000.0.azuredatabricks.net/serving-endpoints\",\n \"stream\": \"https://adb-0000000000000000.0.azuredatabricks.net/serving-endpoints\"\n }\n },\n \"deepinfra\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.deepinfra.com/v1/openai/chat/completions\",\n \"stream\": \"https://api.deepinfra.com/v1/openai/chat/completions\"\n }\n },\n \"deepseek\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.deepseek.com/v1/chat/completions\",\n \"stream\": \"https://api.deepseek.com/v1/chat/completions\"\n }\n },\n \"deepseek-web\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://chat.deepseek.com/api/v0/chat/completion\",\n \"stream\": \"https://chat.deepseek.com/api/v0/chat/completion\"\n }\n },\n \"devin-cli\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"devin://acp/stdio\",\n \"stream\": \"devin://acp/stdio\"\n }\n },\n \"dgrid\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.dgrid.ai/v1/chat/completions\",\n \"stream\": \"https://api.dgrid.ai/v1/chat/completions\"\n }\n },\n \"dify\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.dify.ai/v1/chat/completions\",\n \"stream\": \"https://api.dify.ai/v1/chat/completions\"\n }\n },\n \"digitalocean\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://inference.do-ai.run/v1/chat/completions\",\n \"stream\": \"https://inference.do-ai.run/v1/chat/completions\"\n }\n },\n \"dit\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.dit.ai/v1/chat/completions\",\n \"stream\": \"https://api.dit.ai/v1/chat/completions\"\n }\n },\n \"doubao\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://ark.cn-beijing.volces.com/api/v3/chat/completions\",\n \"stream\": \"https://ark.cn-beijing.volces.com/api/v3/chat/completions\"\n }\n },\n \"doubao-web\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://www.dola.com/chat/completion\",\n \"stream\": \"https://www.dola.com/chat/completion\"\n }\n },\n \"duckduckgo-web\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://duckduckgo.com/duckchat/v1/chat\",\n \"stream\": \"https://duckduckgo.com/duckchat/v1/chat\"\n }\n },\n \"factory\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.factory.ai/v1/chat/completions\",\n \"stream\": \"https://api.factory.ai/v1/chat/completions\"\n }\n },\n \"featherless-ai\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.featherless.ai/v1/chat/completions\",\n \"stream\": \"https://api.featherless.ai/v1/chat/completions\"\n }\n },\n \"felo-web\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://felo.ai/api-proxy/main/search/threads\",\n \"stream\": \"https://felo.ai/api-proxy/main/search/threads\"\n }\n },\n \"fireworks\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.fireworks.ai/inference/v1/chat/completions\",\n \"stream\": \"https://api.fireworks.ai/inference/v1/chat/completions\"\n }\n },\n \"freeaiapikey\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://freeaiapikey.com/v1/chat/completions\",\n \"stream\": \"https://freeaiapikey.com/v1/chat/completions\"\n }\n },\n \"freemodel-dev\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.freemodel.dev/v1/chat/completions\",\n \"stream\": \"https://api.freemodel.dev/v1/chat/completions\"\n }\n },\n \"freetheai\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.freetheai.xyz/v1/chat/completions\",\n \"stream\": \"https://api.freetheai.xyz/v1/chat/completions\"\n }\n },\n \"friendliai\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.friendli.ai/serverless/v1/chat/completions\",\n \"stream\": \"https://api.friendli.ai/serverless/v1/chat/completions\"\n }\n },\n \"g4f-gemini\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://g4f.space/api/gemini/v1/chat/completions\",\n \"stream\": \"https://g4f.space/api/gemini/v1/chat/completions\"\n }\n },\n \"g4f-groq\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://g4f.space/api/groq/v1/chat/completions\",\n \"stream\": \"https://g4f.space/api/groq/v1/chat/completions\"\n }\n },\n \"g4f-nvidia\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://g4f.space/api/nvidia/v1/chat/completions\",\n \"stream\": \"https://g4f.space/api/nvidia/v1/chat/completions\"\n }\n },\n \"g4f-ollama\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://g4f.space/api/ollama/v1/chat/completions\",\n \"stream\": \"https://g4f.space/api/ollama/v1/chat/completions\"\n }\n },\n \"g4f-pollinations\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://g4f.space/api/pollinations/v1/chat/completions\",\n \"stream\": \"https://g4f.space/api/pollinations/v1/chat/completions\"\n }\n },\n \"galadriel\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.galadriel.ai/v1/chat/completions\",\n \"stream\": \"https://api.galadriel.ai/v1/chat/completions\"\n }\n },\n \"gemini\": {\n \"format\": \"gemini\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Content-Type\": \"application/json\",\n \"x-goog-api-key\": \"<CRED>\"\n },\n \"nonStream\": {\n \"Content-Type\": \"application/json\",\n \"x-goog-api-key\": \"<CRED>\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://generativelanguage.googleapis.com/v1beta/models/test-model:generateContent\",\n \"stream\": \"https://generativelanguage.googleapis.com/v1beta/models/test-model:streamGenerateContent?alt=sse\"\n }\n },\n \"gemini-web\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://gemini.google.com/app\",\n \"stream\": \"https://gemini.google.com/app\"\n }\n },\n \"ghe-copilot\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"X-Initiator\": \"user\",\n \"copilot-integration-id\": \"vscode-chat\",\n \"editor-plugin-version\": \"copilot-chat/0.54.0\",\n \"editor-version\": \"vscode/1.126.0\",\n \"openai-intent\": \"conversation-panel\",\n \"user-agent\": \"GitHubCopilotChat/0.54.0\",\n \"x-github-api-version\": \"2026-06-01\",\n \"x-vscode-user-agent-library-version\": \"electron-fetch\"\n },\n \"nonStream\": {\n \"Accept\": \"application/json\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"X-Initiator\": \"user\",\n \"copilot-integration-id\": \"vscode-chat\",\n \"editor-plugin-version\": \"copilot-chat/0.54.0\",\n \"editor-version\": \"vscode/1.126.0\",\n \"openai-intent\": \"conversation-panel\",\n \"user-agent\": \"GitHubCopilotChat/0.54.0\",\n \"x-github-api-version\": \"2026-06-01\",\n \"x-vscode-user-agent-library-version\": \"electron-fetch\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"X-Initiator\": \"user\",\n \"copilot-integration-id\": \"vscode-chat\",\n \"editor-plugin-version\": \"copilot-chat/0.54.0\",\n \"editor-version\": \"vscode/1.126.0\",\n \"openai-intent\": \"conversation-panel\",\n \"user-agent\": \"GitHubCopilotChat/0.54.0\",\n \"x-github-api-version\": \"2026-06-01\",\n \"x-vscode-user-agent-library-version\": \"electron-fetch\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.githubcopilot.com/chat/completions\",\n \"stream\": \"https://api.githubcopilot.com/chat/completions\"\n }\n },\n \"gigachat\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://gigachat.devices.sberbank.ru/api/v1\",\n \"stream\": \"https://gigachat.devices.sberbank.ru/api/v1\"\n }\n },\n \"github\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"X-Initiator\": \"user\",\n \"copilot-integration-id\": \"vscode-chat\",\n \"editor-plugin-version\": \"copilot-chat/0.54.0\",\n \"editor-version\": \"vscode/1.126.0\",\n \"openai-intent\": \"conversation-panel\",\n \"user-agent\": \"GitHubCopilotChat/0.54.0\",\n \"x-github-api-version\": \"2026-06-01\",\n \"x-request-id\": \"<UUID>\",\n \"x-vscode-user-agent-library-version\": \"electron-fetch\"\n },\n \"nonStream\": {\n \"Accept\": \"application/json\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"X-Initiator\": \"user\",\n \"copilot-integration-id\": \"vscode-chat\",\n \"editor-plugin-version\": \"copilot-chat/0.54.0\",\n \"editor-version\": \"vscode/1.126.0\",\n \"openai-intent\": \"conversation-panel\",\n \"user-agent\": \"GitHubCopilotChat/0.54.0\",\n \"x-github-api-version\": \"2026-06-01\",\n \"x-request-id\": \"<UUID>\",\n \"x-vscode-user-agent-library-version\": \"electron-fetch\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"X-Initiator\": \"user\",\n \"copilot-integration-id\": \"vscode-chat\",\n \"editor-plugin-version\": \"copilot-chat/0.54.0\",\n \"editor-version\": \"vscode/1.126.0\",\n \"openai-intent\": \"conversation-panel\",\n \"user-agent\": \"GitHubCopilotChat/0.54.0\",\n \"x-github-api-version\": \"2026-06-01\",\n \"x-request-id\": \"<UUID>\",\n \"x-vscode-user-agent-library-version\": \"electron-fetch\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.githubcopilot.com/chat/completions\",\n \"stream\": \"https://api.githubcopilot.com/chat/completions\"\n }\n },\n \"github-models\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"X-GitHub-Api-Version\": \"2022-11-28\"\n },\n \"nonStream\": {\n \"Accept\": \"application/vnd.github+json\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"X-GitHub-Api-Version\": \"2022-11-28\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"X-GitHub-Api-Version\": \"2022-11-28\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://models.github.ai/inference/chat/completions\",\n \"stream\": \"https://models.github.ai/inference/chat/completions\"\n }\n },\n \"gitlab-duo\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://gitlab.com/api/v4/code_suggestions/completions\",\n \"stream\": \"https://gitlab.com/api/v4/code_suggestions/completions\"\n }\n },\n \"gitlawb\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"HTTP-Referer\": \"https://github.com/Gitlawb/openclaude\",\n \"User-Agent\": \"OpenClaude/1.0 (<OS>; <ARCH>)\",\n \"X-Title\": \"OpenClaude CLI\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"HTTP-Referer\": \"https://github.com/Gitlawb/openclaude\",\n \"User-Agent\": \"OpenClaude/1.0 (<OS>; <ARCH>)\",\n \"X-Title\": \"OpenClaude CLI\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"HTTP-Referer\": \"https://github.com/Gitlawb/openclaude\",\n \"User-Agent\": \"OpenClaude/1.0 (<OS>; <ARCH>)\",\n \"X-Title\": \"OpenClaude CLI\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://opengateway.gitlawb.com/v1/xiaomi-mimo\",\n \"stream\": \"https://opengateway.gitlawb.com/v1/xiaomi-mimo\"\n }\n },\n \"gitlawb-gmi\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"HTTP-Referer\": \"https://github.com/Gitlawb/openclaude\",\n \"User-Agent\": \"OpenClaude/1.0 (<OS>; <ARCH>)\",\n \"X-Title\": \"OpenClaude CLI\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"HTTP-Referer\": \"https://github.com/Gitlawb/openclaude\",\n \"User-Agent\": \"OpenClaude/1.0 (<OS>; <ARCH>)\",\n \"X-Title\": \"OpenClaude CLI\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"HTTP-Referer\": \"https://github.com/Gitlawb/openclaude\",\n \"User-Agent\": \"OpenClaude/1.0 (<OS>; <ARCH>)\",\n \"X-Title\": \"OpenClaude CLI\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://opengateway.gitlawb.com/v1/gmi-cloud\",\n \"stream\": \"https://opengateway.gitlawb.com/v1/gmi-cloud\"\n }\n },\n \"glm\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.z.ai/api/coding/paas/v4/chat/completions\",\n \"stream\": \"https://api.z.ai/api/coding/paas/v4/chat/completions\"\n }\n },\n \"glm-cn\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://open.bigmodel.cn/api/coding/paas/v4/chat/completions\",\n \"stream\": \"https://open.bigmodel.cn/api/coding/paas/v4/chat/completions\"\n }\n },\n \"glmt\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.z.ai/api/coding/paas/v4/chat/completions\",\n \"stream\": \"https://api.z.ai/api/coding/paas/v4/chat/completions\"\n }\n },\n \"grok-cli\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://cli-chat-proxy.grok.com/v1/chat/completions\",\n \"stream\": \"https://cli-chat-proxy.grok.com/v1/chat/completions\"\n }\n },\n \"grok-web\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://grok.com/rest/app-chat/conversations/new\",\n \"stream\": \"https://grok.com/rest/app-chat/conversations/new\"\n }\n },\n \"groq\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.groq.com/openai/v1/chat/completions\",\n \"stream\": \"https://api.groq.com/openai/v1/chat/completions\"\n }\n },\n \"hackclub\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://ai.hackclub.com/proxy/v1/chat/completions\",\n \"stream\": \"https://ai.hackclub.com/proxy/v1/chat/completions\"\n }\n },\n \"haiper\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.haiper.ai/v1\",\n \"stream\": \"https://api.haiper.ai/v1\"\n }\n },\n \"hcnsec\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.hcnsec.cn/v1/chat/completions\",\n \"stream\": \"https://api.hcnsec.cn/v1/chat/completions\"\n }\n },\n \"heroku\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://us.inference.heroku.com/v1/chat/completions\",\n \"stream\": \"https://us.inference.heroku.com/v1/chat/completions\"\n }\n },\n \"huggingchat\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://huggingface.co/chat/conversation\",\n \"stream\": \"https://huggingface.co/chat/conversation\"\n }\n },\n \"huggingface\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://router.huggingface.co/v1/chat/completions\",\n \"stream\": \"https://router.huggingface.co/v1/chat/completions\"\n }\n },\n \"hyperbolic\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.hyperbolic.xyz/v1/chat/completions\",\n \"stream\": \"https://api.hyperbolic.xyz/v1/chat/completions\"\n }\n },\n \"ideogram\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.ideogram.ai\",\n \"stream\": \"https://api.ideogram.ai\"\n }\n },\n \"iflytek\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://spark-api.xf-yun.com/v1/chat/completions\",\n \"stream\": \"https://spark-api.xf-yun.com/v1/chat/completions\"\n }\n },\n \"inference-net\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.inference.net/v1/chat/completions\",\n \"stream\": \"https://api.inference.net/v1/chat/completions\"\n }\n },\n \"inner-ai\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://chatapi.innerai.com/chat\",\n \"stream\": \"https://chatapi.innerai.com/chat\"\n }\n },\n \"kenari\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://kenari.id/v1/chat/completions\",\n \"stream\": \"https://kenari.id/v1/chat/completions\"\n }\n },\n \"kie\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.kie.ai/v1/chat/completions\",\n \"stream\": \"https://api.kie.ai/v1/chat/completions\"\n }\n },\n \"kilo-gateway\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.kilo.ai/api/gateway/chat/completions\",\n \"stream\": \"https://api.kilo.ai/api/gateway/chat/completions\"\n }\n },\n \"kilocode\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"X-KILOCODE-EDITORNAME\": \"OmniRoute\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"X-KILOCODE-EDITORNAME\": \"OmniRoute\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"X-KILOCODE-EDITORNAME\": \"OmniRoute\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.kilo.ai/api/openrouter/chat/completions\",\n \"stream\": \"https://api.kilo.ai/api/openrouter/chat/completions\"\n }\n },\n \"kimi\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.moonshot.ai/v1/chat/completions\",\n \"stream\": \"https://api.moonshot.ai/v1/chat/completions\"\n }\n },\n \"kimi-coding\": {\n \"format\": \"claude\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Anthropic-Version\": \"2023-06-01\",\n \"Content-Type\": \"application/json\",\n \"x-api-key\": \"<CRED>\"\n },\n \"nonStream\": {\n \"Anthropic-Version\": \"2023-06-01\",\n \"Content-Type\": \"application/json\",\n \"x-api-key\": \"<CRED>\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Anthropic-Version\": \"2023-06-01\",\n \"Content-Type\": \"application/json\",\n \"x-api-key\": \"<CRED>\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.kimi.com/coding/v1/messages?beta=true\",\n \"stream\": \"https://api.kimi.com/coding/v1/messages?beta=true\"\n }\n },\n \"kimi-coding-apikey\": {\n \"format\": \"claude\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Anthropic-Version\": \"2023-06-01\",\n \"Content-Type\": \"application/json\",\n \"x-api-key\": \"<CRED>\"\n },\n \"nonStream\": {\n \"Anthropic-Version\": \"2023-06-01\",\n \"Content-Type\": \"application/json\",\n \"x-api-key\": \"<CRED>\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Anthropic-Version\": \"2023-06-01\",\n \"Content-Type\": \"application/json\",\n \"x-api-key\": \"<CRED>\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.kimi.com/coding/v1/messages?beta=true\",\n \"stream\": \"https://api.kimi.com/coding/v1/messages?beta=true\"\n }\n },\n \"kimi-web\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://www.kimi.com\",\n \"stream\": \"https://www.kimi.com\"\n }\n },\n \"kiro\": {\n \"format\": \"kiro\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"User-Agent\": \"AWS-SDK-JS/3.0.0 kiro-ide/1.0.0\",\n \"X-Amz-Target\": \"AmazonCodeWhispererStreamingService.GenerateAssistantResponse\",\n \"X-Amz-User-Agent\": \"aws-sdk-js/3.0.0 kiro-ide/1.0.0\"\n },\n \"nonStream\": {\n \"Accept\": \"application/vnd.amazon.eventstream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"User-Agent\": \"AWS-SDK-JS/3.0.0 kiro-ide/1.0.0\",\n \"X-Amz-Target\": \"AmazonCodeWhispererStreamingService.GenerateAssistantResponse\",\n \"X-Amz-User-Agent\": \"aws-sdk-js/3.0.0 kiro-ide/1.0.0\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"User-Agent\": \"AWS-SDK-JS/3.0.0 kiro-ide/1.0.0\",\n \"X-Amz-Target\": \"AmazonCodeWhispererStreamingService.GenerateAssistantResponse\",\n \"X-Amz-User-Agent\": \"aws-sdk-js/3.0.0 kiro-ide/1.0.0\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://codewhisperer.us-east-1.amazonaws.com/generateAssistantResponse\",\n \"stream\": \"https://codewhisperer.us-east-1.amazonaws.com/generateAssistantResponse\"\n }\n },\n \"lambda-ai\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.lambda.ai/v1/chat/completions\",\n \"stream\": \"https://api.lambda.ai/v1/chat/completions\"\n }\n },\n \"leonardo\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://cloud.leonardo.ai/api/rest/v1\",\n \"stream\": \"https://cloud.leonardo.ai/api/rest/v1\"\n }\n },\n \"liquid\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://inference.liquid.ai/v1/chat/completions\",\n \"stream\": \"https://inference.liquid.ai/v1/chat/completions\"\n }\n },\n \"llamagate\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://llamagate.ai/v1/chat/completions\",\n \"stream\": \"https://llamagate.ai/v1/chat/completions\"\n }\n },\n \"llm7\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.llm7.io/v1/chat/completions\",\n \"stream\": \"https://api.llm7.io/v1/chat/completions\"\n }\n },\n \"lmarena\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://arena.ai/nextjs-api/stream/create-evaluation\",\n \"stream\": \"https://arena.ai/nextjs-api/stream/create-evaluation\"\n }\n },\n \"longcat\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.longcat.chat/openai/v1/chat/completions\",\n \"stream\": \"https://api.longcat.chat/openai/v1/chat/completions\"\n }\n },\n \"maritalk\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Key <CRED>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Key <CRED>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Key <CRED>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://chat.maritaca.ai/api\",\n \"stream\": \"https://chat.maritaca.ai/api\"\n }\n },\n \"meta-llama\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.llama.com/compat/v1/chat/completions\",\n \"stream\": \"https://api.llama.com/compat/v1/chat/completions\"\n }\n },\n \"mimocode\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.xiaomimimo.com\",\n \"stream\": \"https://api.xiaomimimo.com\"\n }\n },\n \"minimax\": {\n \"format\": \"claude\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Anthropic-Version\": \"2023-06-01\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Anthropic-Version\": \"2023-06-01\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Anthropic-Version\": \"2023-06-01\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.minimax.io/anthropic/v1/messages?beta=true\",\n \"stream\": \"https://api.minimax.io/anthropic/v1/messages?beta=true\"\n }\n },\n \"minimax-cn\": {\n \"format\": \"claude\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Anthropic-Version\": \"2023-06-01\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Anthropic-Version\": \"2023-06-01\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Anthropic-Version\": \"2023-06-01\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.minimaxi.com/anthropic/v1/messages?beta=true\",\n \"stream\": \"https://api.minimaxi.com/anthropic/v1/messages?beta=true\"\n }\n },\n \"mistral\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.mistral.ai/v1/chat/completions\",\n \"stream\": \"https://api.mistral.ai/v1/chat/completions\"\n }\n },\n \"modal\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.modal.ai/v1/chat/completions\",\n \"stream\": \"https://api.modal.ai/v1/chat/completions\"\n }\n },\n \"modelscope\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api-inference.modelscope.cn/v1/chat/completions\",\n \"stream\": \"https://api-inference.modelscope.cn/v1/chat/completions\"\n }\n },\n \"monsterapi\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.monsterapi.ai/v1/chat/completions\",\n \"stream\": \"https://api.monsterapi.ai/v1/chat/completions\"\n }\n },\n \"moonshot\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.moonshot.ai/v1/chat/completions\",\n \"stream\": \"https://api.moonshot.ai/v1/chat/completions\"\n }\n },\n \"morph\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.morphllm.com/v1/chat/completions\",\n \"stream\": \"https://api.morphllm.com/v1/chat/completions\"\n }\n },\n \"muse-spark-web\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://www.meta.ai/api/graphql\",\n \"stream\": \"https://www.meta.ai/api/graphql\"\n }\n },\n \"nanogpt\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://nano-gpt.com/api/v1/chat/completions\",\n \"stream\": \"https://nano-gpt.com/api/v1/chat/completions\"\n }\n },\n \"navy\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"User-Agent\": \"OmniRoute/1.0\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"User-Agent\": \"OmniRoute/1.0\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"User-Agent\": \"OmniRoute/1.0\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.navy/v1/chat/completions\",\n \"stream\": \"https://api.navy/v1/chat/completions\"\n }\n },\n \"nebius\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.tokenfactory.nebius.com/v1/chat/completions\",\n \"stream\": \"https://api.tokenfactory.nebius.com/v1/chat/completions\"\n }\n },\n \"nlpcloud\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.nlpcloud.io/v1/chat/completions\",\n \"stream\": \"https://api.nlpcloud.io/v1/chat/completions\"\n }\n },\n \"notion-web\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://app.notion.com/api/v3/runInferenceTranscript\",\n \"stream\": \"https://app.notion.com/api/v3/runInferenceTranscript\"\n }\n },\n \"nous-research\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://inference-api.nousresearch.com/v1/chat/completions\",\n \"stream\": \"https://inference-api.nousresearch.com/v1/chat/completions\"\n }\n },\n \"novita\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.novita.ai/openai/v1/chat/completions\",\n \"stream\": \"https://api.novita.ai/openai/v1/chat/completions\"\n }\n },\n \"nscale\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://inference.api.nscale.com/v1/chat/completions\",\n \"stream\": \"https://inference.api.nscale.com/v1/chat/completions\"\n }\n },\n \"nube\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://ai.nube.sh/api/v1/chat/completions\",\n \"stream\": \"https://ai.nube.sh/api/v1/chat/completions\"\n }\n },\n \"nvidia\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://integrate.api.nvidia.com/v1/chat/completions\",\n \"stream\": \"https://integrate.api.nvidia.com/v1/chat/completions\"\n }\n },\n \"ollama-cloud\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://ollama.com/v1/chat/completions\",\n \"stream\": \"https://ollama.com/v1/chat/completions\"\n }\n },\n \"openadapter\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.openadapter.in/v1/chat/completions\",\n \"stream\": \"https://api.openadapter.in/v1/chat/completions\"\n }\n },\n \"openai\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.openai.com/v1/chat/completions\",\n \"stream\": \"https://api.openai.com/v1/chat/completions\"\n }\n },\n \"opencode\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://opencode.ai/zen/v1\",\n \"stream\": \"https://opencode.ai/zen/v1\"\n }\n },\n \"opencode-go\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://opencode.ai/zen/go/v1\",\n \"stream\": \"https://opencode.ai/zen/go/v1\"\n }\n },\n \"opencode-zen\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://opencode.ai/zen/v1\",\n \"stream\": \"https://opencode.ai/zen/v1\"\n }\n },\n \"openrouter\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"HTTP-Referer\": \"https://endpoint-proxy.local\",\n \"X-Title\": \"Endpoint Proxy\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"HTTP-Referer\": \"https://endpoint-proxy.local\",\n \"X-Title\": \"Endpoint Proxy\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"HTTP-Referer\": \"https://endpoint-proxy.local\",\n \"X-Title\": \"Endpoint Proxy\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://openrouter.ai/api/v1/chat/completions\",\n \"stream\": \"https://openrouter.ai/api/v1/chat/completions\"\n }\n },\n \"openvecta\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.openvecta.com/v1/chat/completions\",\n \"stream\": \"https://api.openvecta.com/v1/chat/completions\"\n }\n },\n \"orcarouter\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"HTTP-Referer\": \"https://endpoint-proxy.local\",\n \"X-Title\": \"Endpoint Proxy\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"HTTP-Referer\": \"https://endpoint-proxy.local\",\n \"X-Title\": \"Endpoint Proxy\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"HTTP-Referer\": \"https://endpoint-proxy.local\",\n \"X-Title\": \"Endpoint Proxy\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.orcarouter.ai/v1\",\n \"stream\": \"https://api.orcarouter.ai/v1\"\n }\n },\n \"ovhcloud\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://oai.endpoints.kepler.ai.cloud.ovh.net/v1/chat/completions\",\n \"stream\": \"https://oai.endpoints.kepler.ai.cloud.ovh.net/v1/chat/completions\"\n }\n },\n \"perplexity\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.perplexity.ai/chat/completions\",\n \"stream\": \"https://api.perplexity.ai/chat/completions\"\n }\n },\n \"perplexity-web\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://www.perplexity.ai/rest/sse/perplexity_ask\",\n \"stream\": \"https://www.perplexity.ai/rest/sse/perplexity_ask\"\n }\n },\n \"pioneer\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Content-Type\": \"application/json\",\n \"x-api-key\": \"<CRED>\"\n },\n \"nonStream\": {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": \"<CRED>\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Content-Type\": \"application/json\",\n \"x-api-key\": \"<CRED>\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.pioneer.ai/v1/chat/completions\",\n \"stream\": \"https://api.pioneer.ai/v1/chat/completions\"\n }\n },\n \"pollinations\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://gen.pollinations.ai/v1/chat/completions\",\n \"stream\": \"https://gen.pollinations.ai/v1/chat/completions\"\n }\n },\n \"predibase\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://serving.app.predibase.com/v1/chat/completions\",\n \"stream\": \"https://serving.app.predibase.com/v1/chat/completions\"\n }\n },\n \"publicai\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.publicai.co/v1/chat/completions\",\n \"stream\": \"https://api.publicai.co/v1/chat/completions\"\n }\n },\n \"puter\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.puter.com/puterai/openai/v1/chat/completions\",\n \"stream\": \"https://api.puter.com/puterai/openai/v1/chat/completions\"\n }\n },\n \"qianfan\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://qianfan.baidubce.com/v2/chat/completions\",\n \"stream\": \"https://qianfan.baidubce.com/v2/chat/completions\"\n }\n },\n \"qiniu\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.qnaigc.com/v1/chat/completions\",\n \"stream\": \"https://api.qnaigc.com/v1/chat/completions\"\n }\n },\n \"qoder\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"User-Agent\": \"Qoder-Cli\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"User-Agent\": \"Qoder-Cli\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\",\n \"User-Agent\": \"Qoder-Cli\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.qoder.com/v1/chat/completions\",\n \"stream\": \"https://api.qoder.com/v1/chat/completions\"\n }\n },\n \"qwen-cloud\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://dashscope-intl.aliyuncs.com/compatible-mode/v1/chat/completions\",\n \"stream\": \"https://dashscope-intl.aliyuncs.com/compatible-mode/v1/chat/completions\"\n }\n },\n \"qwen-cloud-token-plan\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1/chat/completions\",\n \"stream\": \"https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1/chat/completions\"\n }\n },\n \"qwen-web\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://chat.qwen.ai/api/v2/chat/completions\",\n \"stream\": \"https://chat.qwen.ai/api/v2/chat/completions\"\n }\n },\n \"reka\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.reka.ai/v1/chat/completions\",\n \"stream\": \"https://api.reka.ai/v1/chat/completions\"\n }\n },\n \"requesty\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://router.requesty.ai/v1/chat/completions\",\n \"stream\": \"https://router.requesty.ai/v1/chat/completions\"\n }\n },\n \"sambanova\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.sambanova.ai/v1/chat/completions\",\n \"stream\": \"https://api.sambanova.ai/v1/chat/completions\"\n }\n },\n \"scaleway\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.scaleway.ai/v1/chat/completions\",\n \"stream\": \"https://api.scaleway.ai/v1/chat/completions\"\n }\n },\n \"sensenova\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://token.sensenova.cn/v1/chat/completions\",\n \"stream\": \"https://token.sensenova.cn/v1/chat/completions\"\n }\n },\n \"siliconflow\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.siliconflow.com/v1/chat/completions\",\n \"stream\": \"https://api.siliconflow.com/v1/chat/completions\"\n }\n },\n \"snowflake\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://{account}.snowflakecomputing.com/api/v2\",\n \"stream\": \"https://{account}.snowflakecomputing.com/api/v2\"\n }\n },\n \"sparkdesk\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://spark-api.xf-yun.com/v3.1/chat/completions\",\n \"stream\": \"https://spark-api.xf-yun.com/v3.1/chat/completions\"\n }\n },\n \"stepfun\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.stepfun.com/v1/chat/completions\",\n \"stream\": \"https://api.stepfun.com/v1/chat/completions\"\n }\n },\n \"sumopod\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://ai.sumopod.com/v1/chat/completions\",\n \"stream\": \"https://ai.sumopod.com/v1/chat/completions\"\n }\n },\n \"suno\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://studio-api.suno.ai/api/generate/v2/\",\n \"stream\": \"https://studio-api.suno.ai/api/generate/v2/\"\n }\n },\n \"synthetic\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.synthetic.new/openai/v1/chat/completions\",\n \"stream\": \"https://api.synthetic.new/openai/v1/chat/completions\"\n }\n },\n \"t3-web\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://t3.chat/api/chat\",\n \"stream\": \"https://t3.chat/api/chat\"\n }\n },\n \"tencent\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.hunyuan.cloud.tencent.com/v1/chat/completions\",\n \"stream\": \"https://api.hunyuan.cloud.tencent.com/v1/chat/completions\"\n }\n },\n \"theoldllm\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://theoldllm.vercel.app/api/chatgpt\",\n \"stream\": \"https://theoldllm.vercel.app/api/chatgpt\"\n }\n },\n \"together\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.together.xyz/v1/chat/completions\",\n \"stream\": \"https://api.together.xyz/v1/chat/completions\"\n }\n },\n \"tokenrouter\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.tokenrouter.com/v1/chat/completions\",\n \"stream\": \"https://api.tokenrouter.com/v1/chat/completions\"\n }\n },\n \"trae\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://core-normal.trae.ai/api/remote/v1\",\n \"stream\": \"https://core-normal.trae.ai/api/remote/v1\"\n }\n },\n \"udio\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://www.udio.com/api/generate-proxy\",\n \"stream\": \"https://www.udio.com/api/generate-proxy\"\n }\n },\n \"uncloseai\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://hermes.ai.unturf.com/v1/chat/completions\",\n \"stream\": \"https://hermes.ai.unturf.com/v1/chat/completions\"\n }\n },\n \"upstage\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.upstage.ai/v1/chat/completions\",\n \"stream\": \"https://api.upstage.ai/v1/chat/completions\"\n }\n },\n \"v0-vercel\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.v0.dev/v1/chat/completions\",\n \"stream\": \"https://api.v0.dev/v1/chat/completions\"\n }\n },\n \"venice\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.venice.ai/api/v1/chat/completions\",\n \"stream\": \"https://api.venice.ai/api/v1/chat/completions\"\n }\n },\n \"veoaifree-web\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://veoaifree.com/wp-admin/admin-ajax.php\",\n \"stream\": \"https://veoaifree.com/wp-admin/admin-ajax.php\"\n }\n },\n \"vercel-ai-gateway\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://ai-gateway.vercel.sh/v1/chat/completions\",\n \"stream\": \"https://ai-gateway.vercel.sh/v1/chat/completions\"\n }\n },\n \"vertex\": {\n \"format\": \"gemini\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://generativelanguage.googleapis.com/v1beta/models/test-model:generateContent\",\n \"stream\": \"https://generativelanguage.googleapis.com/v1beta/models/test-model:streamGenerateContent?alt=sse\"\n }\n },\n \"vertex-partner\": {\n \"format\": \"gemini\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://us-central1-aiplatform.googleapis.com/v1/projects\",\n \"stream\": \"https://us-central1-aiplatform.googleapis.com/v1/projects\"\n }\n },\n \"volcengine\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://ark.cn-beijing.volces.com/api/v3/chat/completions\",\n \"stream\": \"https://ark.cn-beijing.volces.com/api/v3/chat/completions\"\n }\n },\n \"wafer\": {\n \"format\": \"claude\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Anthropic-Version\": \"2023-06-01\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Anthropic-Version\": \"2023-06-01\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Anthropic-Version\": \"2023-06-01\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://pass.wafer.ai/v1/messages\",\n \"stream\": \"https://pass.wafer.ai/v1/messages\"\n }\n },\n \"wandb\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.inference.wandb.ai/v1/chat/completions\",\n \"stream\": \"https://api.inference.wandb.ai/v1/chat/completions\"\n }\n },\n \"windsurf\": {\n \"format\": \"windsurf\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://server.self-serve.windsurf.com\",\n \"stream\": \"https://server.self-serve.windsurf.com\"\n }\n },\n \"x5lab\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.x5lab.dev/v1/chat/completions\",\n \"stream\": \"https://api.x5lab.dev/v1/chat/completions\"\n }\n },\n \"xai\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.x.ai/v1/chat/completions\",\n \"stream\": \"https://api.x.ai/v1/chat/completions\"\n }\n },\n \"xai-oauth\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.x.ai/v1/chat/completions\",\n \"stream\": \"https://api.x.ai/v1/chat/completions\"\n }\n },\n \"xiaomi-mimo\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.xiaomimimo.com/v1\",\n \"stream\": \"https://api.xiaomimimo.com/v1\"\n }\n },\n \"yi\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.lingyiwanwu.com/v1/chat/completions\",\n \"stream\": \"https://api.lingyiwanwu.com/v1/chat/completions\"\n }\n },\n \"yuanbao-web\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://yuanbao.tencent.com/api/chat\",\n \"stream\": \"https://yuanbao.tencent.com/api/chat\"\n }\n },\n \"zai\": {\n \"format\": \"claude\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Anthropic-Version\": \"2023-06-01\",\n \"Content-Type\": \"application/json\",\n \"x-api-key\": \"<CRED>\"\n },\n \"nonStream\": {\n \"Anthropic-Version\": \"2023-06-01\",\n \"Content-Type\": \"application/json\",\n \"x-api-key\": \"<CRED>\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Anthropic-Version\": \"2023-06-01\",\n \"Content-Type\": \"application/json\",\n \"x-api-key\": \"<CRED>\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://api.z.ai/api/anthropic/v1/messages?beta=true\",\n \"stream\": \"https://api.z.ai/api/anthropic/v1/messages?beta=true\"\n }\n },\n \"zai-web\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://chat.z.ai\",\n \"stream\": \"https://chat.z.ai\"\n }\n },\n \"zed-hosted\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://cloud.zed.dev/completions\",\n \"stream\": \"https://cloud.zed.dev/completions\"\n }\n },\n \"zenmux\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://zenmux.ai/api/v1/chat/completions\",\n \"stream\": \"https://zenmux.ai/api/v1/chat/completions\"\n }\n },\n \"zenmux-free\": {\n \"format\": \"openai\",\n \"headers\": {\n \"apiKey\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"nonStream\": {\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n },\n \"oauth\": {\n \"Accept\": \"text/event-stream\",\n \"Authorization\": \"Bearer <TOK>\",\n \"Content-Type\": \"application/json\"\n }\n },\n \"url\": {\n \"nonStream\": \"https://zenmux.ai/api/anthropic/v1/messages\",\n \"stream\": \"https://zenmux.ai/api/anthropic/v1/messages\"\n }\n }\n}\n"}}, "strix/strix/config/models.py": {"6eea4894299d5371c00c11f1f6dec2f7c0076253": {"t": 1785746493.6189537, "n": 14904, "h": "5f2600dc1a7f4774", "c": "\"\"\"SDK model configuration helpers.\"\"\"\n\nfrom __future__ import annotations\n\nimport contextlib\nimport inspect\nimport os\nfrom typing import TYPE_CHECKING, Any\n\nfrom agents import (\n set_default_openai_api,\n set_default_openai_key,\n set_tracing_disabled,\n)\nfrom agents.model_settings import ModelSettings\nfrom agents.models.multi_provider import MultiProvider\nfrom agents.models.openai_responses import OpenAIResponsesModel\nfrom agents.retry import (\n ModelRetryBackoffSettings,\n ModelRetrySettings,\n RetryPolicyContext,\n retry_policies,\n)\nfrom openai.types.shared import Reasoning\n\nfrom strix.config import codex\nfrom strix.config.loader import load_settings\n\n\nif TYPE_CHECKING:\n from collections.abc import AsyncIterator\n\n from agents.models.interface import Model, ModelProvider\n from openai import AsyncOpenAI\n\n from strix.config.settings import ReasoningEffort, Settings\n\n\ndef request_timeout_extra_args(timeout_s: float | None) -> dict[str, float] | None:\n \"\"\"Per-request model timeout; a plain float so ``ModelSettings.to_json_dict()`` stays serializable.\"\"\" # noqa: E501\n if not timeout_s or timeout_s <= 0:\n return None\n return {\"timeout\": timeout_s}\n\n\ndef _retry_statusless_provider_errors(context: RetryPolicyContext) -> bool:\n \"\"\"Retry statusless provider errors (e.g. mid-stream quota/billing), but not aborts.\"\"\"\n normalized = context.normalized\n if normalized.is_abort:\n return False\n if codex.is_content_guardrail_error(context.error):\n return False\n return normalized.status_code is None\n\n\nclass _CodexResponsesModel(OpenAIResponsesModel):\n \"\"\"Responses model for the ChatGPT subscription backend (always streamed, stateless).\"\"\"\n\n def __init__(\n self,\n model: str,\n openai_client: AsyncOpenAI,\n *,\n reasoning_effort: ReasoningEffort | None = None,\n ) -> None:\n super().__init__(model, openai_client)\n self._reasoning_effort = reasoning_effort\n\n def _codex_settings(self, model_settings: ModelSettings) -> ModelSettings:\n overrides = ModelSettings(store=False, response_include=[\"reasoning.encrypted_content\"])\n effort = self._reasoning_effort\n if effort and effort != \"none\":\n # Clamp to efforts the backend accepts.\n if effort == \"minimal\":\n effort = \"low\"\n elif effort == \"xhigh\":\n effort = \"high\"\n overrides = overrides.resolve(ModelSettings(reasoning=Reasoning(effort=effort)))\n return model_settings.resolve(overrides)\n\n async def _fetch_response(self, *args: Any, stream: bool = False, **kwargs: Any) -> Any:\n if len(args) >= 3: # model_settings is positional arg 2\n args = (*args[:2], self._codex_settings(args[2]), *args[3:])\n try:\n events = await super()._fetch_response(*args, stream=True, **kwargs) # type: ignore[call-overload]\n except Exception as exc:\n guardrail = self._as_guardrail(exc)\n if guardrail is not None:\n raise guardrail from exc\n raise\n guarded = self._guarded(events)\n if stream:\n return guarded\n final_response = None\n async for event in guarded:\n if getattr(event, \"type\", None) == \"response.completed\":\n final_response = event.response\n if final_response is None:\n msg = \"ChatGPT backend stream ended without a completed response\"\n raise RuntimeError(msg)\n return final_response\n\n def _as_guardrail(self, exc: BaseException) -> codex.CodexContentGuardrailError | None:\n if isinstance(exc, codex.CodexContentGuardrailError):\n return exc\n if codex.is_content_guardrail_error(exc):\n return codex.CodexContentGuardrailError(self.model, exc)\n return None\n\n async def _guarded(self, events: Any) -> AsyncIterator[Any]:\n \"\"\"Convert mid-stream guardrail rejections and close the stream on exit.\"\"\"\n try:\n async for event in events:\n yield event\n except Exception as exc:\n guardrail = self._as_guardrail(exc)\n if guardrail is not None:\n raise guardrail from exc\n raise\n finally:\n await self._aclose(events)\n\n @staticmethod\n async def _aclose(events: Any) -> None:\n aclose = getattr(events, \"aclose\", None)\n if callable(aclose):\n with contextlib.suppress(Exception):\n await aclose()\n return\n close = getattr(events, \"close\", None)\n if callable(close):\n with contextlib.suppress(Exception):\n result = close()\n if inspect.isawaitable(result):\n await result\n\n\nclass StrixProvider(MultiProvider):\n \"\"\"Route any non-OpenAI prefix through LiteLLM with the prefix preserved,\n so users type ``deepseek/deepseek-chat`` rather than\n ``litellm/deepseek/deepseek-chat``.\n \"\"\"\n\n def _resolve_prefixed_model(\n self,\n *,\n original_model_name: str,\n prefix: str,\n stripped_model_name: str | None,\n ) -> tuple[ModelProvider, str | None]:\n if prefix in {\"openai\", \"litellm\", \"any-llm\"}:\n return super()._resolve_prefixed_model(\n original_model_name=original_model_name,\n prefix=prefix,\n stripped_model_name=stripped_model_name,\n )\n if prefix == \"ollama\" and stripped_model_name:\n return self._get_fallback_provider(\"litellm\"), f\"ollama_chat/{stripped_model_name}\"\n return self._get_fallback_provider(\"litellm\"), original_model_name\n\n def get_model(self, model_name: str | None) -> Model:\n slug = codex.subscription_model(model_name)\n if slug:\n return _CodexResponsesModel(\n slug,\n codex.get_subscription_client(),\n reasoning_effort=load_settings().llm.reasoning_effort,\n )\n return super().get_model(model_name)\n\n\nDEFAULT_MODEL_RETRY = ModelRetrySettings(\n max_retries=5,\n backoff=ModelRetryBackoffSettings(\n initial_delay=2.0,\n max_delay=90.0,\n multiplier=2.0,\n jitter=False,\n ),\n policy=retry_policies.any(\n retry_policies.provider_suggested(),\n retry_policies.network_error(),\n retry_policies.http_status((429, 500, 502, 503, 504)),\n _retry_statusless_provider_errors,\n ),\n)\n\nRECOMMENDED_MODEL_NAMES = (\n \"openai/gpt-5.6-sol\",\n \"openai/gpt-5.6-terra\",\n \"openai/gpt-5.6-luna\",\n \"openai/gpt-5.6\",\n \"openai/gpt-5.5-pro\",\n \"openai/gpt-5.5\",\n \"openai/gpt-5.4\",\n \"openai/gpt-5.3-codex\",\n \"anthropic/claude-fable-5\",\n \"anthropic/claude-opus-5\",\n \"anthropic/claude-opus-4-8\",\n \"anthropic/claude-sonnet-5\",\n \"anthropic/claude-sonnet-4-6\",\n \"vertex_ai/gemini-3.1-pro-preview\",\n \"gemini/gemini-3.1-pro-preview\",\n \"gemini/gemini-3.6-flash\",\n \"deepseek/deepseek-v4-pro\",\n \"deepseek/deepseek-v4-flash\",\n \"dashscope/qwen3.8-max\",\n \"dashscope/qwen3.7-max-2026-06-08\",\n \"moonshot/kimi-k3\",\n \"moonshot/kimi-k2.7-code\",\n)\n\n_RECOMMENDED_MODEL_NAME_SET = frozenset(name.lower() for name in RECOMMENDED_MODEL_NAMES)\n\nFRONTIER_MODEL_FAMILIES = (\n ((\"azure\", \"azure_ai\", \"bedrock_mantle\", \"chatgpt\", \"openai\"), (\"gpt-5\",)),\n (\n (\"anthropic\", \"azure_ai\", \"bedrock\", \"claude\", \"databricks\", \"snowflake\", \"vertex_ai\"),\n (\"claude-fable-5\", \"claude-opus-5\", \"claude-opus-4\", \"claude-sonnet-5\", \"claude-sonnet-4\"),\n ),\n ((\"google\", \"gemini\", \"vertex_ai\"), (\"gemini-3\",)),\n ((\"deepseek\",), (\"deepseek-v4\", \"deepseek-r1\", \"deepseek-reasoner\")),\n ((\"alibaba\", \"dashscope\", \"qwen\"), (\"qwen3.8\", \"qwen3.7\", \"qwen3-max\")),\n ((\"moonshot\", \"moonshotai\", \"kimi\"), (\"kimi-k3\", \"kimi-k2.7\", \"kimi-k2.6\")),\n)\n\n\ndef configure_sdk_model_defaults(settings: Settings) -> None:\n \"\"\"Apply Strix config to SDK-native defaults.\"\"\"\n llm = settings.llm\n set_tracing_disabled(True)\n if codex.subscription_model(llm.model):\n return\n _configure_litellm_compatibility()\n _configure_openrouter_attribution(llm.model)\n if llm.api_key:\n set_default_openai_key(llm.api_key, use_for_tracing=False)\n _configure_litellm_default(\"api_key\", llm.api_key)\n _mirror_api_key_to_provider_env(llm.model, llm.api_key)\n if llm.api_base:\n os.environ[\"OPENAI_BASE_URL\"] = llm.api_base\n _configure_litellm_default(\"api_base\", llm.api_base)\n set_default_openai_api(\"chat_completions\")\n else:\n set_default_openai_api(\"responses\")\n\n\ndef _mirror_api_key_to_provider_env(model_name: str | None, api_key: str) -> None:\n if not model_name:\n return\n import litellm\n\n name = model_name.strip()\n for prefix in (\"litellm/\", \"any-llm/\"):\n if name.lower().startswith(prefix):\n name = name[len(prefix) :]\n break\n try:\n report = litellm.validate_environment(model=name.lower())\n except Exception: # noqa: BLE001\n return\n for env_key in report.get(\"missing_keys\") or []:\n if env_key.endswith(\"_API_KEY\"):\n os.environ.setdefault(env_key, api_key)\n\n\ndef _configure_litellm_compatibility() -> None:\n \"\"\"Apply LiteLLM compatibility, privacy, and callback settings.\"\"\"\n import litellm\n\n litellm.drop_params = True\n litellm.modify_params = True\n litellm.turn_off_message_logging = True\n # Strix uses LiteLLM's success callback to capture provider-reported cost.\n # Disabling streaming logging also disables that callback for streamed calls.\n litellm.disable_streaming_logging = False\n litellm.suppress_debug_info = True\n\n _register_litellm_cost_callback()\n\n\n_OPENROUTER_ATTRIBUTION_HEADERS = {\n \"HTTP-Referer\": \"https://strix.ai\",\n \"X-Title\": \"Strix\",\n \"X-OpenRouter-Categories\": \"cli-agent\",\n}\n\n\ndef _configure_openrouter_attribution(model_name: str | None) -> None:\n import litellm\n\n current: object = litellm.headers\n existing: dict[str, str] = current if isinstance(current, dict) else {}\n if not model_name or \"openrouter/\" not in model_name.strip().lower():\n if any(key in existing for key in _OPENROUTER_ATTRIBUTION_HEADERS):\n remaining = {\n k: v for k, v in existing.items() if k not in _OPENROUTER_ATTRIBUTION_HEADERS\n }\n litellm.headers = remaining or None # type: ignore[assignment]\n return\n\n litellm.headers = {**existing, **_OPENROUTER_ATTRIBUTION_HEADERS} # type: ignore[assignment]\n\n\ndef _register_litellm_cost_callback() -> None:\n import litellm\n\n from strix.report.state import litellm_cost_callback\n\n for bucket_name in (\"success_callback\", \"_async_success_callback\"):\n bucket = getattr(litellm, bucket_name, None)\n if not isinstance(bucket, list):\n continue\n if litellm_cost_callback in bucket:\n continue\n bucket.append(litellm_cost_callback)\n\n\ndef _configure_litellm_default(name: str, value: str) -> None:\n \"\"\"Set LiteLLM's module-level defaults without adding a provider wrapper.\"\"\"\n import litellm\n\n setattr(litellm, name, value)\n\n\ndef uses_chat_completions_tool_schema(model_name: str, settings: Settings) -> bool:\n \"\"\"Return whether the resolved SDK route can only receive JSON function tools.\"\"\"\n if codex.subscription_model(model_name):\n return False\n model = model_name.strip().lower()\n if \"/\" in model and not model.startswith(\"openai/\"):\n return True\n if settings.llm.api_base:\n return True\n return not model_supports_reasoning(model_name)\n\n\ndef model_supports_reasoning(model_name: str) -> bool:\n import litellm\n\n name = model_name.strip().lower()\n for prefix in (\"litellm/\", \"any-llm/\", \"openai/\"):\n if name.startswith(prefix):\n name = name[len(prefix) :]\n break\n entry = litellm.model_cost.get(name)\n if entry is None and \"/\" in name:\n entry = litellm.model_cost.get(name.rsplit(\"/\", 1)[1])\n return bool(entry and entry.get(\"supports_reasoning\"))\n\n\ndef is_recommended_or_frontier_model(model_name: str) -> bool:\n \"\"\"Return whether a model is recommended or in a frontier model family.\"\"\"\n name = _normalized_model_name(model_name)\n if not name:\n return False\n if name in _RECOMMENDED_MODEL_NAME_SET:\n return True\n provider_name, bare_model_name = _split_model_provider(name)\n return any(\n _matches_frontier_family(provider_name, bare_model_name, provider_markers, prefixes)\n for provider_markers, prefixes in FRONTIER_MODEL_FAMILIES\n )\n\n\ndef _normalized_model_name(model_name: str) -> str:\n name = model_name.strip().lower()\n for prefix in (\"litellm/\", \"any-llm/\"):\n if name.startswith(prefix):\n name = name[len(prefix) :]\n break\n return name\n\n\ndef _split_model_provider(model_name: str) -> tuple[str | None, str]:\n if \"/\" not in model_name:\n return None, model_name\n provider_name, bare_model_name = model_name.rsplit(\"/\", 1)\n return provider_name, bare_model_name\n\n\ndef _matches_frontier_family(\n provider_name: str | None,\n model_name: str,\n provider_markers: tuple[str, ...],\n model_prefixes: tuple[str, ...],\n) -> bool:\n if not _matches_model_prefix(model_name, model_prefixes):\n return False\n if provider_name is None:\n return True\n return _contains_provider_marker(\n provider_name, provider_markers, split_compound_names=True\n ) or _contains_provider_marker(model_name, provider_markers)\n\n\ndef _matches_model_prefix(model_name: str, model_prefixes: tuple[str, ...]) -> bool:\n return any(\n candidate.startswith(prefix)\n for candidate in _model_name_candidates(model_name)\n for prefix in model_prefixes\n )\n\n\ndef _model_name_candidates(model_name: str) -> tuple[str, ...]:\n if \".\" not in model_name:\n return (model_name,)\n suffixes = tuple(\n model_name.split(\".\", index)[-1] for index in range(1, model_name.count(\".\") + 1)\n )\n return (model_name, *suffixes)\n\n\ndef _contains_provider_marker(\n value: str, provider_markers: tuple[str, ...], *, split_compound_names: bool = False\n) -> bool:\n parts = set(value.replace(\".\", \"/\").split(\"/\"))\n if split_compound_names:\n for separator in (\"_\", \"-\"):\n parts.update(piece for part in tuple(parts) for piece in part.split(separator))\n return any(marker in parts for marker in provider_markers)\n\n\ndef is_known_openai_bare_model(model_name: str) -> bool:\n import litellm\n\n name = model_name.strip().lower()\n if not name or \"/\" in name:\n return False\n entry = litellm.model_cost.get(name)\n return bool(entry and entry.get(\"litellm_provider\") == \"openai\")\n"}, "1b7ecdf30a0be97010c251d8d48da182226b5715": {"t": 1785764933.321273, "n": 14904, "h": "5f2600dc1a7f4774", "c": "\"\"\"SDK model configuration helpers.\"\"\"\n\nfrom __future__ import annotations\n\nimport contextlib\nimport inspect\nimport os\nfrom typing import TYPE_CHECKING, Any\n\nfrom agents import (\n set_default_openai_api,\n set_default_openai_key,\n set_tracing_disabled,\n)\nfrom agents.model_settings import ModelSettings\nfrom agents.models.multi_provider import MultiProvider\nfrom agents.models.openai_responses import OpenAIResponsesModel\nfrom agents.retry import (\n ModelRetryBackoffSettings,\n ModelRetrySettings,\n RetryPolicyContext,\n retry_policies,\n)\nfrom openai.types.shared import Reasoning\n\nfrom strix.config import codex\nfrom strix.config.loader import load_settings\n\n\nif TYPE_CHECKING:\n from collections.abc import AsyncIterator\n\n from agents.models.interface import Model, ModelProvider\n from openai import AsyncOpenAI\n\n from strix.config.settings import ReasoningEffort, Settings\n\n\ndef request_timeout_extra_args(timeout_s: float | None) -> dict[str, float] | None:\n \"\"\"Per-request model timeout; a plain float so ``ModelSettings.to_json_dict()`` stays serializable.\"\"\" # noqa: E501\n if not timeout_s or timeout_s <= 0:\n return None\n return {\"timeout\": timeout_s}\n\n\ndef _retry_statusless_provider_errors(context: RetryPolicyContext) -> bool:\n \"\"\"Retry statusless provider errors (e.g. mid-stream quota/billing), but not aborts.\"\"\"\n normalized = context.normalized\n if normalized.is_abort:\n return False\n if codex.is_content_guardrail_error(context.error):\n return False\n return normalized.status_code is None\n\n\nclass _CodexResponsesModel(OpenAIResponsesModel):\n \"\"\"Responses model for the ChatGPT subscription backend (always streamed, stateless).\"\"\"\n\n def __init__(\n self,\n model: str,\n openai_client: AsyncOpenAI,\n *,\n reasoning_effort: ReasoningEffort | None = None,\n ) -> None:\n super().__init__(model, openai_client)\n self._reasoning_effort = reasoning_effort\n\n def _codex_settings(self, model_settings: ModelSettings) -> ModelSettings:\n overrides = ModelSettings(store=False, response_include=[\"reasoning.encrypted_content\"])\n effort = self._reasoning_effort\n if effort and effort != \"none\":\n # Clamp to efforts the backend accepts.\n if effort == \"minimal\":\n effort = \"low\"\n elif effort == \"xhigh\":\n effort = \"high\"\n overrides = overrides.resolve(ModelSettings(reasoning=Reasoning(effort=effort)))\n return model_settings.resolve(overrides)\n\n async def _fetch_response(self, *args: Any, stream: bool = False, **kwargs: Any) -> Any:\n if len(args) >= 3: # model_settings is positional arg 2\n args = (*args[:2], self._codex_settings(args[2]), *args[3:])\n try:\n events = await super()._fetch_response(*args, stream=True, **kwargs) # type: ignore[call-overload]\n except Exception as exc:\n guardrail = self._as_guardrail(exc)\n if guardrail is not None:\n raise guardrail from exc\n raise\n guarded = self._guarded(events)\n if stream:\n return guarded\n final_response = None\n async for event in guarded:\n if getattr(event, \"type\", None) == \"response.completed\":\n final_response = event.response\n if final_response is None:\n msg = \"ChatGPT backend stream ended without a completed response\"\n raise RuntimeError(msg)\n return final_response\n\n def _as_guardrail(self, exc: BaseException) -> codex.CodexContentGuardrailError | None:\n if isinstance(exc, codex.CodexContentGuardrailError):\n return exc\n if codex.is_content_guardrail_error(exc):\n return codex.CodexContentGuardrailError(self.model, exc)\n return None\n\n async def _guarded(self, events: Any) -> AsyncIterator[Any]:\n \"\"\"Convert mid-stream guardrail rejections and close the stream on exit.\"\"\"\n try:\n async for event in events:\n yield event\n except Exception as exc:\n guardrail = self._as_guardrail(exc)\n if guardrail is not None:\n raise guardrail from exc\n raise\n finally:\n await self._aclose(events)\n\n @staticmethod\n async def _aclose(events: Any) -> None:\n aclose = getattr(events, \"aclose\", None)\n if callable(aclose):\n with contextlib.suppress(Exception):\n await aclose()\n return\n close = getattr(events, \"close\", None)\n if callable(close):\n with contextlib.suppress(Exception):\n result = close()\n if inspect.isawaitable(result):\n await result\n\n\nclass StrixProvider(MultiProvider):\n \"\"\"Route any non-OpenAI prefix through LiteLLM with the prefix preserved,\n so users type ``deepseek/deepseek-chat`` rather than\n ``litellm/deepseek/deepseek-chat``.\n \"\"\"\n\n def _resolve_prefixed_model(\n self,\n *,\n original_model_name: str,\n prefix: str,\n stripped_model_name: str | None,\n ) -> tuple[ModelProvider, str | None]:\n if prefix in {\"openai\", \"litellm\", \"any-llm\"}:\n return super()._resolve_prefixed_model(\n original_model_name=original_model_name,\n prefix=prefix,\n stripped_model_name=stripped_model_name,\n )\n if prefix == \"ollama\" and stripped_model_name:\n return self._get_fallback_provider(\"litellm\"), f\"ollama_chat/{stripped_model_name}\"\n return self._get_fallback_provider(\"litellm\"), original_model_name\n\n def get_model(self, model_name: str | None) -> Model:\n slug = codex.subscription_model(model_name)\n if slug:\n return _CodexResponsesModel(\n slug,\n codex.get_subscription_client(),\n reasoning_effort=load_settings().llm.reasoning_effort,\n )\n return super().get_model(model_name)\n\n\nDEFAULT_MODEL_RETRY = ModelRetrySettings(\n max_retries=5,\n backoff=ModelRetryBackoffSettings(\n initial_delay=2.0,\n max_delay=90.0,\n multiplier=2.0,\n jitter=False,\n ),\n policy=retry_policies.any(\n retry_policies.provider_suggested(),\n retry_policies.network_error(),\n retry_policies.http_status((429, 500, 502, 503, 504)),\n _retry_statusless_provider_errors,\n ),\n)\n\nRECOMMENDED_MODEL_NAMES = (\n \"openai/gpt-5.6-sol\",\n \"openai/gpt-5.6-terra\",\n \"openai/gpt-5.6-luna\",\n \"openai/gpt-5.6\",\n \"openai/gpt-5.5-pro\",\n \"openai/gpt-5.5\",\n \"openai/gpt-5.4\",\n \"openai/gpt-5.3-codex\",\n \"anthropic/claude-fable-5\",\n \"anthropic/claude-opus-5\",\n \"anthropic/claude-opus-4-8\",\n \"anthropic/claude-sonnet-5\",\n \"anthropic/claude-sonnet-4-6\",\n \"vertex_ai/gemini-3.1-pro-preview\",\n \"gemini/gemini-3.1-pro-preview\",\n \"gemini/gemini-3.6-flash\",\n \"deepseek/deepseek-v4-pro\",\n \"deepseek/deepseek-v4-flash\",\n \"dashscope/qwen3.8-max\",\n \"dashscope/qwen3.7-max-2026-06-08\",\n \"moonshot/kimi-k3\",\n \"moonshot/kimi-k2.7-code\",\n)\n\n_RECOMMENDED_MODEL_NAME_SET = frozenset(name.lower() for name in RECOMMENDED_MODEL_NAMES)\n\nFRONTIER_MODEL_FAMILIES = (\n ((\"azure\", \"azure_ai\", \"bedrock_mantle\", \"chatgpt\", \"openai\"), (\"gpt-5\",)),\n (\n (\"anthropic\", \"azure_ai\", \"bedrock\", \"claude\", \"databricks\", \"snowflake\", \"vertex_ai\"),\n (\"claude-fable-5\", \"claude-opus-5\", \"claude-opus-4\", \"claude-sonnet-5\", \"claude-sonnet-4\"),\n ),\n ((\"google\", \"gemini\", \"vertex_ai\"), (\"gemini-3\",)),\n ((\"deepseek\",), (\"deepseek-v4\", \"deepseek-r1\", \"deepseek-reasoner\")),\n ((\"alibaba\", \"dashscope\", \"qwen\"), (\"qwen3.8\", \"qwen3.7\", \"qwen3-max\")),\n ((\"moonshot\", \"moonshotai\", \"kimi\"), (\"kimi-k3\", \"kimi-k2.7\", \"kimi-k2.6\")),\n)\n\n\ndef configure_sdk_model_defaults(settings: Settings) -> None:\n \"\"\"Apply Strix config to SDK-native defaults.\"\"\"\n llm = settings.llm\n set_tracing_disabled(True)\n if codex.subscription_model(llm.model):\n return\n _configure_litellm_compatibility()\n _configure_openrouter_attribution(llm.model)\n if llm.api_key:\n set_default_openai_key(llm.api_key, use_for_tracing=False)\n _configure_litellm_default(\"api_key\", llm.api_key)\n _mirror_api_key_to_provider_env(llm.model, llm.api_key)\n if llm.api_base:\n os.environ[\"OPENAI_BASE_URL\"] = llm.api_base\n _configure_litellm_default(\"api_base\", llm.api_base)\n set_default_openai_api(\"chat_completions\")\n else:\n set_default_openai_api(\"responses\")\n\n\ndef _mirror_api_key_to_provider_env(model_name: str | None, api_key: str) -> None:\n if not model_name:\n return\n import litellm\n\n name = model_name.strip()\n for prefix in (\"litellm/\", \"any-llm/\"):\n if name.lower().startswith(prefix):\n name = name[len(prefix) :]\n break\n try:\n report = litellm.validate_environment(model=name.lower())\n except Exception: # noqa: BLE001\n return\n for env_key in report.get(\"missing_keys\") or []:\n if env_key.endswith(\"_API_KEY\"):\n os.environ.setdefault(env_key, api_key)\n\n\ndef _configure_litellm_compatibility() -> None:\n \"\"\"Apply LiteLLM compatibility, privacy, and callback settings.\"\"\"\n import litellm\n\n litellm.drop_params = True\n litellm.modify_params = True\n litellm.turn_off_message_logging = True\n # Strix uses LiteLLM's success callback to capture provider-reported cost.\n # Disabling streaming logging also disables that callback for streamed calls.\n litellm.disable_streaming_logging = False\n litellm.suppress_debug_info = True\n\n _register_litellm_cost_callback()\n\n\n_OPENROUTER_ATTRIBUTION_HEADERS = {\n \"HTTP-Referer\": \"https://strix.ai\",\n \"X-Title\": \"Strix\",\n \"X-OpenRouter-Categories\": \"cli-agent\",\n}\n\n\ndef _configure_openrouter_attribution(model_name: str | None) -> None:\n import litellm\n\n current: object = litellm.headers\n existing: dict[str, str] = current if isinstance(current, dict) else {}\n if not model_name or \"openrouter/\" not in model_name.strip().lower():\n if any(key in existing for key in _OPENROUTER_ATTRIBUTION_HEADERS):\n remaining = {\n k: v for k, v in existing.items() if k not in _OPENROUTER_ATTRIBUTION_HEADERS\n }\n litellm.headers = remaining or None # type: ignore[assignment]\n return\n\n litellm.headers = {**existing, **_OPENROUTER_ATTRIBUTION_HEADERS} # type: ignore[assignment]\n\n\ndef _register_litellm_cost_callback() -> None:\n import litellm\n\n from strix.report.state import litellm_cost_callback\n\n for bucket_name in (\"success_callback\", \"_async_success_callback\"):\n bucket = getattr(litellm, bucket_name, None)\n if not isinstance(bucket, list):\n continue\n if litellm_cost_callback in bucket:\n continue\n bucket.append(litellm_cost_callback)\n\n\ndef _configure_litellm_default(name: str, value: str) -> None:\n \"\"\"Set LiteLLM's module-level defaults without adding a provider wrapper.\"\"\"\n import litellm\n\n setattr(litellm, name, value)\n\n\ndef uses_chat_completions_tool_schema(model_name: str, settings: Settings) -> bool:\n \"\"\"Return whether the resolved SDK route can only receive JSON function tools.\"\"\"\n if codex.subscription_model(model_name):\n return False\n model = model_name.strip().lower()\n if \"/\" in model and not model.startswith(\"openai/\"):\n return True\n if settings.llm.api_base:\n return True\n return not model_supports_reasoning(model_name)\n\n\ndef model_supports_reasoning(model_name: str) -> bool:\n import litellm\n\n name = model_name.strip().lower()\n for prefix in (\"litellm/\", \"any-llm/\", \"openai/\"):\n if name.startswith(prefix):\n name = name[len(prefix) :]\n break\n entry = litellm.model_cost.get(name)\n if entry is None and \"/\" in name:\n entry = litellm.model_cost.get(name.rsplit(\"/\", 1)[1])\n return bool(entry and entry.get(\"supports_reasoning\"))\n\n\ndef is_recommended_or_frontier_model(model_name: str) -> bool:\n \"\"\"Return whether a model is recommended or in a frontier model family.\"\"\"\n name = _normalized_model_name(model_name)\n if not name:\n return False\n if name in _RECOMMENDED_MODEL_NAME_SET:\n return True\n provider_name, bare_model_name = _split_model_provider(name)\n return any(\n _matches_frontier_family(provider_name, bare_model_name, provider_markers, prefixes)\n for provider_markers, prefixes in FRONTIER_MODEL_FAMILIES\n )\n\n\ndef _normalized_model_name(model_name: str) -> str:\n name = model_name.strip().lower()\n for prefix in (\"litellm/\", \"any-llm/\"):\n if name.startswith(prefix):\n name = name[len(prefix) :]\n break\n return name\n\n\ndef _split_model_provider(model_name: str) -> tuple[str | None, str]:\n if \"/\" not in model_name:\n return None, model_name\n provider_name, bare_model_name = model_name.rsplit(\"/\", 1)\n return provider_name, bare_model_name\n\n\ndef _matches_frontier_family(\n provider_name: str | None,\n model_name: str,\n provider_markers: tuple[str, ...],\n model_prefixes: tuple[str, ...],\n) -> bool:\n if not _matches_model_prefix(model_name, model_prefixes):\n return False\n if provider_name is None:\n return True\n return _contains_provider_marker(\n provider_name, provider_markers, split_compound_names=True\n ) or _contains_provider_marker(model_name, provider_markers)\n\n\ndef _matches_model_prefix(model_name: str, model_prefixes: tuple[str, ...]) -> bool:\n return any(\n candidate.startswith(prefix)\n for candidate in _model_name_candidates(model_name)\n for prefix in model_prefixes\n )\n\n\ndef _model_name_candidates(model_name: str) -> tuple[str, ...]:\n if \".\" not in model_name:\n return (model_name,)\n suffixes = tuple(\n model_name.split(\".\", index)[-1] for index in range(1, model_name.count(\".\") + 1)\n )\n return (model_name, *suffixes)\n\n\ndef _contains_provider_marker(\n value: str, provider_markers: tuple[str, ...], *, split_compound_names: bool = False\n) -> bool:\n parts = set(value.replace(\".\", \"/\").split(\"/\"))\n if split_compound_names:\n for separator in (\"_\", \"-\"):\n parts.update(piece for part in tuple(parts) for piece in part.split(separator))\n return any(marker in parts for marker in provider_markers)\n\n\ndef is_known_openai_bare_model(model_name: str) -> bool:\n import litellm\n\n name = model_name.strip().lower()\n if not name or \"/\" in name:\n return False\n entry = litellm.model_cost.get(name)\n return bool(entry and entry.get(\"litellm_provider\") == \"openai\")\n"}}}} |