From 940a35e009353849d2b886287cbc4fe11afec6f2 Mon Sep 17 00:00:00 2001 From: suryacagur Date: Fri, 26 Jun 2026 11:58:29 +0700 Subject: [PATCH] feat(blackbox): overhaul provider catalog + WebUI test support - registry: baseUrl -> /v1/chat/completions, 10 latest models with upstreamModelId prefix, add thinkingConfig + serviceKinds - capabilities: rename claude-opus-4.6 -> 4.8, bump claude-sonnet-4.6 maxOutput 64k -> 128k - testUtils: add blackbox case to testApiKeyConnection (GET /models) - ollama: add minimax-m3 model Co-authored-by: Cursor --- open-sse/providers/capabilities.js | 4 +-- open-sse/providers/registry/blackbox.js | 34 +++++++++----------- open-sse/providers/registry/ollama.js | 1 + src/app/api/providers/[id]/test/testUtils.js | 7 ++++ 4 files changed, 26 insertions(+), 20 deletions(-) diff --git a/open-sse/providers/capabilities.js b/open-sse/providers/capabilities.js index b8c326c1..23268f08 100644 --- a/open-sse/providers/capabilities.js +++ b/open-sse/providers/capabilities.js @@ -80,8 +80,8 @@ export const MODEL_CAPABILITIES = { "claude-opus-4-8": { vision: true, reasoning: true, search: true, thinkingFormat: "claude-adaptive", contextWindow: 1000000, maxOutput: 128000 }, "claude-opus-4.8-thinking": { vision: true, reasoning: true, search: true, thinkingFormat: "claude-adaptive", contextWindow: 1000000, maxOutput: 128000 }, "claude-opus-4-8-thinking": { vision: true, reasoning: true, search: true, thinkingFormat: "claude-adaptive", contextWindow: 1000000, maxOutput: 128000 }, - "claude-sonnet-4.6": { vision: true, reasoning: true, search: true, thinkingFormat: "claude-adaptive", contextWindow: 1000000, maxOutput: 64000 }, - "claude-sonnet-4-6": { vision: true, reasoning: true, search: true, thinkingFormat: "claude-adaptive", contextWindow: 1000000, maxOutput: 64000 }, + "claude-sonnet-4.6": { vision: true, reasoning: true, search: true, thinkingFormat: "claude-adaptive", contextWindow: 1000000, maxOutput: 128000 }, + "claude-sonnet-4-6": { vision: true, reasoning: true, search: true, thinkingFormat: "claude-adaptive", contextWindow: 1000000, maxOutput: 128000 }, // Gemini image-gen / OpenAI image / xai image variants "gpt-image-1": { imageOutput: true, tools: false }, diff --git a/open-sse/providers/registry/blackbox.js b/open-sse/providers/registry/blackbox.js index bb5a70b7..2764cdf9 100644 --- a/open-sse/providers/registry/blackbox.js +++ b/open-sse/providers/registry/blackbox.js @@ -17,27 +17,25 @@ export default { }, }, category: "apikey", + serviceKinds: ["llm"], + thinkingConfig: { + options: ["auto", "none", "low", "medium", "high", "xhigh"], + defaultMode: "auto", + }, transport: { - baseUrl: "https://api.blackbox.ai/chat/completions", + baseUrl: "https://api.blackbox.ai/v1/chat/completions", thinkingFormat: "openai", }, models: [ - { id: "gpt-4o", name: "GPT-4o" }, - { id: "gpt-4o-mini", name: "GPT-4o mini" }, - { id: "claude-sonnet-4.6", name: "Claude Sonnet 4.6" }, - { id: "claude-sonnet-4.5", name: "Claude Sonnet 4.5" }, - { id: "claude-opus-4.6", name: "Claude Opus 4.6" }, - { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6 (Legacy)" }, - { id: "claude-opus-4-6", name: "Claude Opus 4.6 (Legacy)" }, - { id: "deepseek-chat", name: "DeepSeek Chat" }, - { id: "deepseek-v3-671b", name: "DeepSeek V3 671B" }, - { id: "deepseek-r1", name: "DeepSeek R1" }, - { id: "o1", name: "OpenAI o1" }, - { id: "o3-mini", name: "OpenAI o3-mini" }, - { id: "gemini-2.5-flash", name: "Gemini 2.5 Flash" }, - { id: "gemini-3-flash-preview", name: "Gemini 3 Flash Preview" }, - { id: "qwen3-coder-plus", name: "Qwen3 Coder Plus" }, - { id: "qwen3-max", name: "Qwen3 Max" }, - { id: "qwen3-vl-plus", name: "Qwen3 VL Plus" }, + { id: "claude-fable-5", name: "Claude Fable 5", upstreamModelId: "blackboxai/anthropic/claude-fable-5" }, + { id: "claude-opus-4.8", name: "Claude Opus 4.8", upstreamModelId: "blackboxai/anthropic/claude-opus-4.8" }, + { id: "claude-sonnet-4.6", name: "Claude Sonnet 4.6", upstreamModelId: "blackboxai/anthropic/claude-sonnet-4.6" }, + { id: "gpt-5.5", name: "GPT-5.5", upstreamModelId: "blackboxai/openai/gpt-5.5" }, + { id: "gpt-5.4-pro", name: "GPT-5.4 Pro", upstreamModelId: "blackboxai/openai/gpt-5.4-pro" }, + { id: "gpt-5.4", name: "GPT-5.4", upstreamModelId: "blackboxai/openai/gpt-5.4" }, + { id: "gpt-5.3-codex", name: "GPT-5.3 Codex", upstreamModelId: "blackboxai/openai/gpt-5.3-codex" }, + { id: "gpt-5.4-nano", name: "GPT-5.4 Nano", upstreamModelId: "blackboxai/openai/gpt-5.4-nano" }, + { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", upstreamModelId: "blackboxai/deepseek/deepseek-v4-flash" }, + { id: "grok-4.3", name: "Grok 4.3", upstreamModelId: "blackboxai/x-ai/grok-4.3" }, ], }; diff --git a/open-sse/providers/registry/ollama.js b/open-sse/providers/registry/ollama.js index 0c3978bf..69923aa1 100644 --- a/open-sse/providers/registry/ollama.js +++ b/open-sse/providers/registry/ollama.js @@ -27,6 +27,7 @@ export default { { id: "minimax-m2.5", name: "MiniMax M2.5" }, { id: "glm-4.7-flash", name: "GLM 4.7 Flash" }, { id: "qwen3.5", name: "Qwen3.5" }, + { id: "minimax-m3", name: "MiniMax M3" }, ], serviceKinds: ["llm"], features: { diff --git a/src/app/api/providers/[id]/test/testUtils.js b/src/app/api/providers/[id]/test/testUtils.js index 4b1797cb..cebd50a4 100644 --- a/src/app/api/providers/[id]/test/testUtils.js +++ b/src/app/api/providers/[id]/test/testUtils.js @@ -692,6 +692,13 @@ async function testApiKeyConnection(connection, effectiveProxy = null) { }, effectiveProxy); return { valid: res.ok, error: res.ok ? null : "Invalid API key" }; } + case "blackbox": { + const baseUrl = PROVIDERS["blackbox"]?.baseUrl?.replace(/\/chat\/completions$/, "") || "https://api.blackbox.ai/v1"; + const res = await fetchWithConnectionProxy(`${baseUrl}/models`, { + headers: { Authorization: `Bearer ${connection.apiKey}` }, + }, effectiveProxy); + return { valid: res.ok, error: res.ok ? null : "Invalid API key" }; + } default: return { valid: false, error: "Provider test not supported" }; }