From ac0260b7afa06c38588f21fee9dadfadb09ce2d3 Mon Sep 17 00:00:00 2001 From: latemonk <63733683+latemonk@users.noreply.github.com> Date: Fri, 24 Jul 2026 14:21:44 +0900 Subject: [PATCH] feat(providers): add BizRouter preset to the provider registry BizRouter (api.bizrouter.ai) is a Korean enterprise LLM gateway with an OpenAI-compatible surface. Model ids are vendor-namespaced (`/`) and pass through to the upstream as-is. Live-verified 2026-07-24 against api.bizrouter.ai: - POST /v1/chat/completions accepts the `tools` field and streams SSE - GET /v1/models returns the per-API-key allowed catalog in the OpenAI list shape, so live model discovery narrows to what the key can use - End-to-end through the proxy: Codex CLI `/v1/responses` request routed to `bizrouter/anthropic/claude-haiku-4.5` returned the expected completion (non-streaming and streaming) Also adds "bizrouter" to EXPECTED_KEY_PROVIDER_IDS in the registry parity test. Co-Authored-By: Claude Fable 5 --- src/providers/registry.ts | 12 ++++++++++++ tests/provider-registry-parity.test.ts | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/providers/registry.ts b/src/providers/registry.ts index bdf09f52b..71140fa72 100644 --- a/src/providers/registry.ts +++ b/src/providers/registry.ts @@ -644,6 +644,18 @@ export const PROVIDER_REGISTRY: readonly ProviderRegistryEntry[] = [ preserveReasoningContentModels: ["deepseek/deepseek-v4-pro"], note: "OpenAI-compatible adaptive router. Default is a tool-capable model; orcarouter/auto (adaptive routing) is also selectable. Full catalog: https://www.orcarouter.ai/models", }, + { + // BizRouter: Korean enterprise LLM gateway (api.bizrouter.ai). Model ids are + // vendor-namespaced (`/`) and pass through to the upstream as-is. + // Live-verified 2026-07-24: /v1/chat/completions accepts the `tools` field and + // streams, and GET /v1/models returns the per-API-key allowed catalog in the + // OpenAI list shape, so live model discovery narrows to what the key can use. + id: "bizrouter", label: "BizRouter", adapter: "openai-chat", baseUrl: "https://api.bizrouter.ai/v1", + authKind: "key", dashboardUrl: "https://bizrouter.ai/settings/keys", + defaultModel: "openai/gpt-5.6-sol", + models: ["openai/gpt-5.6-sol", "anthropic/claude-sonnet-5", "google/gemini-3.5-flash"], + note: "Korean enterprise LLM gateway. Per-key allowed models are discovered live from /v1/models. Full catalog: https://bizrouter.ai/models", + }, { id: "groq", label: "Groq", adapter: "openai-chat", baseUrl: "https://api.groq.com/openai/v1", authKind: "key", featured: true, dashboardUrl: "https://console.groq.com/keys" }, // 2026-07-10 Gemini API refresh: Tier-2 ai.google.dev evidence recorded in // devlog/_plan/260710_provider_hardening/001_research_frontier.md. diff --git a/tests/provider-registry-parity.test.ts b/tests/provider-registry-parity.test.ts index 14d840e8f..71b0fb624 100644 --- a/tests/provider-registry-parity.test.ts +++ b/tests/provider-registry-parity.test.ts @@ -29,7 +29,7 @@ function nativeTemplate(): Record { } const EXPECTED_KEY_PROVIDER_IDS = [ - "anthropic-apikey", "openai-apikey", "umans", "opencode-go", "neuralwatt", "openrouter", "orcarouter", "groq", "google", "google-vertex", "azure-openai", + "anthropic-apikey", "openai-apikey", "umans", "opencode-go", "neuralwatt", "openrouter", "orcarouter", "bizrouter", "groq", "google", "google-vertex", "azure-openai", "deepseek", "cerebras", "together", "fireworks", "firepass", "moonshot", "huggingface", "nvidia", "venice", "zai", "nanogpt", "synthetic", "siliconflow", "qwen-cloud", "tencent-coding-plan", "qianfan", "alibaba", "alibaba-token-plan", "alibaba-token-plan-intl", "parallel", "zenmux", "litellm", "ollama-cloud", "mistral",