merge: pull mhiqrambg/9router-mibp-version into master
Merge the MIBP fork (v1.0.14, synced to decolua v0.5.81) into our master
(0.5.86) at merge-base a8c9d380. Keep HEAD's infra policy (untracked
lockfile, mirror-configurable Dockerfile, decolua GHCR/DockerHub, README)
while absorbing the fork's engine features:
- feat(providers): freebuff provider + executor + OAuth + usage tracking
- feat(providers): cline free-tier models, Freebuff catalog sync
- feat(proxy-pools): pool egress geo probe, proxy-pool fitness + retry
- fix(usage): hide noAuth providers (devin-cli, mimo-free) from usage list
- test(harness): DATA_DIR isolation so tests never write the real DB
- fix(codebuddy-intl): probe token in connection test, OAuth by identity
- chore(guards): durable markers so fixes aren't silently dropped
Resolutions:
- registry/index.js regenerated deterministically (122 providers, alpha
order). trae/windsurf/devin-cli stay hidden per HEAD security posture
(no tool-calling / local-agent shell access) — not re-enabled.
- nonStreamingHandler: drop the generic unconditional unwrapDataEnvelope
call; envelope unwrap stays scoped to clineEnvelope-quirk providers
(unwrapClineEnvelope), fixing a latent mibp bug where non-opted-in
providers ({success,data} bodies) were stripped.
- Drop fork-local Docker lockfile policy (package-lock.json, AGENTS.md,
.npmrc verify scripts): this repo keeps package-lock untracked (nix
build deploy). .npmrc (audit=false/fund=false) kept.
- Keep gitbook-pages workflow enabled (ours); mibp disabled it.
- Restore 13 upstream tests mibp deleted (they cover features we keep).
Verified: 2841 tests, 2687 pass, fail set byte-identical to HEAD (zero
new regressions); providers/alias/oauth baselines regenerated to merged
code and all green.
This commit is contained in:
@@ -149,6 +149,7 @@
|
||||
"deepseek": "deepseek",
|
||||
"featherless": "featherless",
|
||||
"fireworks": "fireworks",
|
||||
"freebuff": "fb",
|
||||
"gemini": "gemini",
|
||||
"gemini-cli": "gc",
|
||||
"github": "gh",
|
||||
@@ -234,6 +235,7 @@
|
||||
"edge-tts",
|
||||
"elevenlabs-tts-models",
|
||||
"fal-ai",
|
||||
"fb",
|
||||
"featherless",
|
||||
"fireworks",
|
||||
"gc",
|
||||
|
||||
@@ -15,6 +15,22 @@
|
||||
},
|
||||
"format": "openai"
|
||||
},
|
||||
"alims-intl": {
|
||||
"baseUrl": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1/chat/completions",
|
||||
"headers": {},
|
||||
"quirks": {
|
||||
"preserveCacheControl": true
|
||||
},
|
||||
"format": "openai"
|
||||
},
|
||||
"alitp-intl": {
|
||||
"baseUrl": "https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1/chat/completions",
|
||||
"headers": {},
|
||||
"quirks": {
|
||||
"preserveCacheControl": true
|
||||
},
|
||||
"format": "openai"
|
||||
},
|
||||
"anthropic": {
|
||||
"baseUrl": "https://api.anthropic.com/v1/messages",
|
||||
"format": "claude",
|
||||
@@ -52,6 +68,16 @@
|
||||
"clientSecret": "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",
|
||||
"tokenUrl": "https://oauth2.googleapis.com/token"
|
||||
},
|
||||
"api-airforce": {
|
||||
"baseUrl": "https://api.airforce/v1/chat/completions",
|
||||
"validateUrl": "https://api.airforce/v1/models",
|
||||
"headers": {
|
||||
"HTTP-Referer": "https://endpoint-proxy.local",
|
||||
"X-Title": "Endpoint Proxy"
|
||||
},
|
||||
"forceStream": true,
|
||||
"format": "openai"
|
||||
},
|
||||
"assemblyai": {
|
||||
"baseUrl": "https://api.assemblyai.com/v1/audio/transcriptions",
|
||||
"validateUrl": "https://api.assemblyai.com/v1/account",
|
||||
@@ -62,11 +88,26 @@
|
||||
"headers": {},
|
||||
"format": "openai"
|
||||
},
|
||||
"baidu": {
|
||||
"baseUrl": "https://qianfan.baidubce.com/v2/chat/completions",
|
||||
"validateUrl": "https://qianfan.baidubce.com/v2/models",
|
||||
"format": "openai"
|
||||
},
|
||||
"bazaarlink": {
|
||||
"baseUrl": "https://bazaarlink.ai/api/v1/chat/completions",
|
||||
"validateUrl": "https://bazaarlink.ai/api/v1/models",
|
||||
"format": "openai"
|
||||
},
|
||||
"blackbox": {
|
||||
"baseUrl": "https://api.blackbox.ai/v1/chat/completions",
|
||||
"thinkingFormat": "openai",
|
||||
"format": "openai"
|
||||
},
|
||||
"bluesminds": {
|
||||
"baseUrl": "https://api.bluesminds.com/v1/chat/completions",
|
||||
"validateUrl": "https://api.bluesminds.com/v1/models",
|
||||
"format": "openai"
|
||||
},
|
||||
"byteplus": {
|
||||
"baseUrl": "https://ark.ap-southeast.bytepluses.com/api/coding/v3/chat/completions",
|
||||
"headers": {},
|
||||
@@ -93,7 +134,7 @@
|
||||
"Anthropic-Version": "2023-06-01",
|
||||
"Anthropic-Beta": "claude-code-20250219,oauth-2025-04-20,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",
|
||||
"Anthropic-Dangerous-Direct-Browser-Access": "true",
|
||||
"User-Agent": "claude-cli/2.1.258 (external, sdk-cli)",
|
||||
"User-Agent": "claude-cli/2.1.280 (external, sdk-cli)",
|
||||
"X-App": "cli",
|
||||
"X-Stainless-Helper-Method": "stream",
|
||||
"X-Stainless-Retry-Count": "0",
|
||||
@@ -141,6 +182,7 @@
|
||||
"combined": true,
|
||||
"header": "Authorization",
|
||||
"scheme": "bearer",
|
||||
"preserveHookAuth": true,
|
||||
"hooks": [
|
||||
"clineHeaders"
|
||||
]
|
||||
@@ -160,6 +202,7 @@
|
||||
"combined": true,
|
||||
"header": "Authorization",
|
||||
"scheme": "bearer",
|
||||
"preserveHookAuth": true,
|
||||
"hooks": [
|
||||
"clineHeaders"
|
||||
]
|
||||
@@ -195,6 +238,29 @@
|
||||
"format": "openai",
|
||||
"tokenUrl": "https://copilot.tencent.com/v2/plugin/auth/token"
|
||||
},
|
||||
"codebuddy-intl": {
|
||||
"baseUrl": "https://www.codebuddy.ai/v2/chat/completions",
|
||||
"forceStream": true,
|
||||
"thinkingFormat": "openai",
|
||||
"headers": {
|
||||
"User-Agent": "IDE/2.108.1 CodeBuddy/2.108.1",
|
||||
"X-Product": "SaaS",
|
||||
"X-IDE-Type": "IDE",
|
||||
"X-IDE-Name": "IDE",
|
||||
"x-requested-with": "XMLHttpRequest",
|
||||
"x-codebuddy-request": "1"
|
||||
},
|
||||
"auth": {
|
||||
"combined": true,
|
||||
"header": "Authorization",
|
||||
"scheme": "bearer"
|
||||
},
|
||||
"usage": {
|
||||
"url": "https://www.codebuddy.ai/v2/billing/meter/get-user-resource"
|
||||
},
|
||||
"format": "openai",
|
||||
"tokenUrl": "https://www.codebuddy.ai/v2/plugin/auth/token"
|
||||
},
|
||||
"codex": {
|
||||
"baseUrl": "https://chatgpt.com/backend-api/codex/responses",
|
||||
"format": "openai-responses",
|
||||
@@ -290,6 +356,26 @@
|
||||
"validateUrl": "https://api.fireworks.ai/inference/v1/models",
|
||||
"format": "openai"
|
||||
},
|
||||
"freebuff": {
|
||||
"baseUrl": "https://www.codebuff.com/api/v1/chat/completions",
|
||||
"format": "openai",
|
||||
"headers": {
|
||||
"User-Agent": "ai-sdk/openai-compatible/1.0/codebuff"
|
||||
},
|
||||
"retry": {
|
||||
"429": {
|
||||
"attempts": 2,
|
||||
"delayMs": 2000
|
||||
},
|
||||
"503": {
|
||||
"attempts": 2,
|
||||
"delayMs": 1500
|
||||
}
|
||||
},
|
||||
"usage": {
|
||||
"url": "https://www.codebuff.com/api/v1/freebuff/session"
|
||||
}
|
||||
},
|
||||
"gemini-cli": {
|
||||
"baseUrl": "https://cloudcode-pa.googleapis.com/v1internal",
|
||||
"format": "gemini-cli",
|
||||
@@ -472,6 +558,11 @@
|
||||
"clientSecret": "4Z3YjXycVsQvyGF1etiNlIBB4RsqSDtW",
|
||||
"tokenUrl": "https://iflow.cn/oauth/token"
|
||||
},
|
||||
"kilo-gateway": {
|
||||
"baseUrl": "https://api.kilo.ai/api/gateway/chat/completions",
|
||||
"validateUrl": "https://api.kilo.ai/api/gateway/models",
|
||||
"format": "openai"
|
||||
},
|
||||
"kilocode": {
|
||||
"baseUrl": "https://api.kilo.ai/api/openrouter/chat/completions",
|
||||
"headers": {},
|
||||
@@ -573,6 +664,11 @@
|
||||
"limitsPath": "/getUsageLimits"
|
||||
}
|
||||
},
|
||||
"llm7": {
|
||||
"baseUrl": "https://api.llm7.io/v1/chat/completions",
|
||||
"validateUrl": "https://api.llm7.io/v1/models",
|
||||
"format": "openai"
|
||||
},
|
||||
"mimo-free": {
|
||||
"baseUrl": "https://api.xiaomimimo.com/api/free-ai/openai/chat",
|
||||
"noAuth": true,
|
||||
@@ -695,6 +791,11 @@
|
||||
"noAuth": true,
|
||||
"format": "openai"
|
||||
},
|
||||
"morph": {
|
||||
"baseUrl": "https://api.morphllm.com/v1/chat/completions",
|
||||
"validateUrl": "https://api.morphllm.com/v1/models",
|
||||
"format": "openai"
|
||||
},
|
||||
"nanobanana": {
|
||||
"baseUrl": "https://api.nanobananaapi.ai/v1/chat/completions",
|
||||
"validateUrl": "https://api.nanobananaapi.ai/v1/models",
|
||||
@@ -719,16 +820,6 @@
|
||||
"validateUrl": "https://ollama.com/api/tags",
|
||||
"format": "ollama"
|
||||
},
|
||||
"qoder-cn": {
|
||||
"baseUrl": "https://gateway.qoder.com.cn/algo/api/v2/service/pro/sse/agent_chat_generation",
|
||||
"headers": {},
|
||||
"timeoutMs": 120000,
|
||||
"stallTimeoutMs": 120000,
|
||||
"usage": {
|
||||
"url": "https://openapi.qoder.com.cn/api/v2/quota/usage"
|
||||
},
|
||||
"format": "openai"
|
||||
},
|
||||
"openai": {
|
||||
"baseUrl": "https://api.openai.com/v1/chat/completions",
|
||||
"forceStream": true,
|
||||
@@ -833,6 +924,11 @@
|
||||
},
|
||||
"format": "openai"
|
||||
},
|
||||
"perplexity-agent": {
|
||||
"baseUrl": "https://api.perplexity.ai/v1/responses",
|
||||
"validateUrl": "https://api.perplexity.ai/v1/models",
|
||||
"format": "openai-responses"
|
||||
},
|
||||
"perplexity-web": {
|
||||
"baseUrl": "https://www.perplexity.ai/rest/sse/perplexity_ask",
|
||||
"format": "perplexity-web",
|
||||
@@ -843,10 +939,20 @@
|
||||
"validateUrl": "https://api.perplexity.ai/models",
|
||||
"format": "openai"
|
||||
},
|
||||
"perplexity-agent": {
|
||||
"baseUrl": "https://api.perplexity.ai/v1/responses",
|
||||
"validateUrl": "https://api.perplexity.ai/v1/models",
|
||||
"format": "openai-responses"
|
||||
"poolside": {
|
||||
"baseUrl": "https://inference.poolside.ai/v1/chat/completions",
|
||||
"validateUrl": "https://inference.poolside.ai/v1/models",
|
||||
"format": "openai"
|
||||
},
|
||||
"qoder-cn": {
|
||||
"baseUrl": "https://gateway.qoder.com.cn/algo/api/v2/service/pro/sse/agent_chat_generation",
|
||||
"headers": {},
|
||||
"timeoutMs": 120000,
|
||||
"stallTimeoutMs": 120000,
|
||||
"usage": {
|
||||
"url": "https://openapi.qoder.com.cn/api/v2/quota/usage"
|
||||
},
|
||||
"format": "openai"
|
||||
},
|
||||
"qoder": {
|
||||
"baseUrl": "https://api3.qoder.sh/algo/api/v2/service/pro/sse/agent_chat_generation",
|
||||
@@ -858,17 +964,33 @@
|
||||
},
|
||||
"format": "openai"
|
||||
},
|
||||
"sambanova": {
|
||||
"baseUrl": "https://api.sambanova.ai/v1/chat/completions",
|
||||
"validateUrl": "https://api.sambanova.ai/v1/models",
|
||||
"format": "openai"
|
||||
},
|
||||
"siliconflow": {
|
||||
"baseUrl": "https://api.siliconflow.com/v1/chat/completions",
|
||||
"validateUrl": "https://api.siliconflow.com/v1/models",
|
||||
"thinkingFormat": "openai",
|
||||
"format": "openai"
|
||||
},
|
||||
"tencent": {
|
||||
"baseUrl": "https://api.hunyuan.cloud.tencent.com/v1/chat/completions",
|
||||
"validateUrl": "https://api.hunyuan.cloud.tencent.com/v1/models",
|
||||
"format": "openai"
|
||||
},
|
||||
"together": {
|
||||
"baseUrl": "https://api.together.xyz/v1/chat/completions",
|
||||
"validateUrl": "https://api.together.xyz/v1/models",
|
||||
"format": "openai"
|
||||
},
|
||||
"tokenrouter": {
|
||||
"baseUrl": "https://api.tokenrouter.com/v1/chat/completions",
|
||||
"validateUrl": "https://api.tokenrouter.com/v1/models",
|
||||
"thinkingFormat": "tokenrouter",
|
||||
"format": "openai"
|
||||
},
|
||||
"venice": {
|
||||
"baseUrl": "https://api.venice.ai/api/v1/chat/completions",
|
||||
"validateUrl": "https://api.venice.ai/api/v1/models",
|
||||
@@ -969,37 +1091,6 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"alims-intl": {
|
||||
"baseUrl": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1/chat/completions",
|
||||
"headers": {},
|
||||
"quirks": {
|
||||
"preserveCacheControl": true
|
||||
},
|
||||
"format": "openai"
|
||||
},
|
||||
"codebuddy-intl": {
|
||||
"baseUrl": "https://www.codebuddy.ai/v2/chat/completions",
|
||||
"forceStream": true,
|
||||
"thinkingFormat": "openai",
|
||||
"headers": {
|
||||
"User-Agent": "IDE/2.108.1 CodeBuddy/2.108.1",
|
||||
"X-Product": "SaaS",
|
||||
"X-IDE-Type": "IDE",
|
||||
"X-IDE-Name": "IDE",
|
||||
"x-requested-with": "XMLHttpRequest",
|
||||
"x-codebuddy-request": "1"
|
||||
},
|
||||
"auth": {
|
||||
"combined": true,
|
||||
"header": "Authorization",
|
||||
"scheme": "bearer"
|
||||
},
|
||||
"usage": {
|
||||
"url": "https://www.codebuddy.ai/v2/billing/meter/get-user-resource"
|
||||
},
|
||||
"format": "openai",
|
||||
"tokenUrl": "https://www.codebuddy.ai/v2/plugin/auth/token"
|
||||
},
|
||||
"zed": {
|
||||
"baseUrl": "https://cloud.zed.dev/completions",
|
||||
"format": "openai",
|
||||
@@ -1016,74 +1107,5 @@
|
||||
"url": "https://cloud.zed.dev/client/users/me"
|
||||
},
|
||||
"modelsUrl": "https://cloud.zed.dev/models"
|
||||
},
|
||||
"api-airforce": {
|
||||
"baseUrl": "https://api.airforce/v1/chat/completions",
|
||||
"validateUrl": "https://api.airforce/v1/models",
|
||||
"headers": {
|
||||
"HTTP-Referer": "https://endpoint-proxy.local",
|
||||
"X-Title": "Endpoint Proxy"
|
||||
},
|
||||
"forceStream": true,
|
||||
"format": "openai"
|
||||
},
|
||||
"baidu": {
|
||||
"baseUrl": "https://qianfan.baidubce.com/v2/chat/completions",
|
||||
"validateUrl": "https://qianfan.baidubce.com/v2/models",
|
||||
"format": "openai"
|
||||
},
|
||||
"bazaarlink": {
|
||||
"baseUrl": "https://bazaarlink.ai/api/v1/chat/completions",
|
||||
"validateUrl": "https://bazaarlink.ai/api/v1/models",
|
||||
"format": "openai"
|
||||
},
|
||||
"bluesminds": {
|
||||
"baseUrl": "https://api.bluesminds.com/v1/chat/completions",
|
||||
"validateUrl": "https://api.bluesminds.com/v1/models",
|
||||
"format": "openai"
|
||||
},
|
||||
"kilo-gateway": {
|
||||
"baseUrl": "https://api.kilo.ai/api/gateway/chat/completions",
|
||||
"validateUrl": "https://api.kilo.ai/api/gateway/models",
|
||||
"format": "openai"
|
||||
},
|
||||
"llm7": {
|
||||
"baseUrl": "https://api.llm7.io/v1/chat/completions",
|
||||
"validateUrl": "https://api.llm7.io/v1/models",
|
||||
"format": "openai"
|
||||
},
|
||||
"sambanova": {
|
||||
"baseUrl": "https://api.sambanova.ai/v1/chat/completions",
|
||||
"validateUrl": "https://api.sambanova.ai/v1/models",
|
||||
"format": "openai"
|
||||
},
|
||||
"tencent": {
|
||||
"baseUrl": "https://api.hunyuan.cloud.tencent.com/v1/chat/completions",
|
||||
"validateUrl": "https://api.hunyuan.cloud.tencent.com/v1/models",
|
||||
"format": "openai"
|
||||
},
|
||||
"morph": {
|
||||
"baseUrl": "https://api.morphllm.com/v1/chat/completions",
|
||||
"validateUrl": "https://api.morphllm.com/v1/models",
|
||||
"format": "openai"
|
||||
},
|
||||
"poolside": {
|
||||
"baseUrl": "https://inference.poolside.ai/v1/chat/completions",
|
||||
"validateUrl": "https://inference.poolside.ai/v1/models",
|
||||
"format": "openai"
|
||||
},
|
||||
"tokenrouter": {
|
||||
"baseUrl": "https://api.tokenrouter.com/v1/chat/completions",
|
||||
"validateUrl": "https://api.tokenrouter.com/v1/models",
|
||||
"thinkingFormat": "tokenrouter",
|
||||
"format": "openai"
|
||||
},
|
||||
"alitp-intl": {
|
||||
"baseUrl": "https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1/chat/completions",
|
||||
"headers": {},
|
||||
"quirks": {
|
||||
"preserveCacheControl": true
|
||||
},
|
||||
"format": "openai"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user