From 01c6c5206840ecbb71b57b7ba1acb3294cc5b3ac Mon Sep 17 00:00:00 2001 From: octo-patch <266937838+octo-patch@users.noreply.github.com> Date: Thu, 9 Jul 2026 09:49:25 +0000 Subject: [PATCH] feat(onboard): add MiniMax provider Register MiniMax as a first-class OpenAI-compatible onboarding provider. This lets setup and sandbox routing select MiniMax-M3 directly. Co-Authored-By: Claude Opus 4.7 --- src/lib/inference/config.test.ts | 12 ++++++++++++ src/lib/inference/config.ts | 7 +++++++ src/lib/onboard/provider-menu.test.ts | 3 +++ src/lib/onboard/provider-menu.ts | 1 + src/lib/onboard/providers.test.ts | 20 ++++++++++++++++++++ src/lib/onboard/providers.ts | 15 ++++++++++++++- 6 files changed, 57 insertions(+), 1 deletion(-) diff --git a/src/lib/inference/config.test.ts b/src/lib/inference/config.test.ts index e3f9a494c3d..2a16d8374f7 100644 --- a/src/lib/inference/config.test.ts +++ b/src/lib/inference/config.test.ts @@ -210,6 +210,16 @@ describe("inference selection config", () => { provider: "openrouter-api", providerLabel: "OpenRouter", }); + expect(getProviderSelectionConfig("minimax-api", "MiniMax-M3")).toEqual({ + endpointType: "custom", + endpointUrl: INFERENCE_ROUTE_URL, + ncpPartner: null, + model: "MiniMax-M3", + profile: DEFAULT_ROUTE_PROFILE, + credentialEnv: "MINIMAX_API_KEY", + provider: "minimax-api", + providerLabel: "MiniMax", + }); expect(getProviderSelectionConfig("anthropic-prod", "claude-sonnet-4-6")).toEqual( expect.objectContaining({ model: "claude-sonnet-4-6", providerLabel: "Anthropic" }), ); @@ -263,6 +273,7 @@ describe("inference selection config", () => { "nvidia-prod", "nvidia-nim", "openai-api", + "minimax-api", "openrouter-api", "anthropic-prod", "compatible-anthropic-endpoint", @@ -298,6 +309,7 @@ describe("inference selection config", () => { it("falls back to provider defaults when model is omitted", () => { expect(getProviderSelectionConfig("openai-api")?.model).toBe("gpt-5.4"); + expect(getProviderSelectionConfig("minimax-api")?.model).toBe("MiniMax-M3"); expect(getProviderSelectionConfig("openrouter-api")?.model).toBe(DEFAULT_CLOUD_MODEL); expect(getProviderSelectionConfig("anthropic-prod")?.model).toBe("claude-sonnet-4-6"); expect(getProviderSelectionConfig("gemini-api")?.model).toBe("gemini-2.5-flash"); diff --git a/src/lib/inference/config.ts b/src/lib/inference/config.ts index 5b6e0d90d00..78103c4a14d 100644 --- a/src/lib/inference/config.ts +++ b/src/lib/inference/config.ts @@ -159,6 +159,13 @@ export function getProviderSelectionConfig( credentialEnv: "OPENAI_API_KEY", providerLabel: "OpenAI", }; + case "minimax-api": + return { + ...base, + model: model || "MiniMax-M3", + credentialEnv: "MINIMAX_API_KEY", + providerLabel: "MiniMax", + }; case OPENROUTER_PROVIDER_NAME: return { ...base, diff --git a/src/lib/onboard/provider-menu.test.ts b/src/lib/onboard/provider-menu.test.ts index e1fcf94d899..6a89d2ba10b 100644 --- a/src/lib/onboard/provider-menu.test.ts +++ b/src/lib/onboard/provider-menu.test.ts @@ -9,6 +9,7 @@ const REMOTE_PROVIDER_CONFIG = { build: { label: "NVIDIA Endpoints" }, openrouter: { label: "OpenRouter" }, openai: { label: "OpenAI" }, + minimax: { label: "MiniMax" }, custom: { label: "Other OpenAI-compatible endpoint" }, anthropic: { label: "Anthropic" }, anthropicCompatible: { label: "Other Anthropic-compatible endpoint" }, @@ -50,6 +51,7 @@ describe("buildInferenceProviderMenu", () => { "build", "openrouter", "openai", + "minimax", "custom", "anthropic", "anthropicCompatible", @@ -76,6 +78,7 @@ describe("buildInferenceProviderMenu", () => { "build", "openrouter", "openai", + "minimax", "custom", "anthropic", "anthropicCompatible", diff --git a/src/lib/onboard/provider-menu.ts b/src/lib/onboard/provider-menu.ts index ebaecfa13fb..90c6737083b 100644 --- a/src/lib/onboard/provider-menu.ts +++ b/src/lib/onboard/provider-menu.ts @@ -45,6 +45,7 @@ const BASE_REMOTE_PROVIDER_OPTIONS: readonly ProviderMenuChoice[] = [ { key: "build", label: "NVIDIA Endpoints" }, { key: "openrouter", label: "OpenRouter" }, { key: "openai", label: "OpenAI" }, + { key: "minimax", label: "MiniMax" }, { key: "custom", label: "Other OpenAI-compatible endpoint" }, { key: "anthropic", label: "Anthropic" }, { key: "anthropicCompatible", label: "Other Anthropic-compatible endpoint" }, diff --git a/src/lib/onboard/providers.test.ts b/src/lib/onboard/providers.test.ts index b6953b7476b..a9b295923ee 100644 --- a/src/lib/onboard/providers.test.ts +++ b/src/lib/onboard/providers.test.ts @@ -136,6 +136,26 @@ describe("onboard provider helpers", () => { ).toContain("OPENAI_BASE_URL=https://openrouter.ai/api/v1"); }); + it("registers MiniMax as a first-class OpenAI-compatible provider", () => { + const provider = REMOTE_PROVIDER_CONFIG.minimax; + + expect(provider).toMatchObject({ + providerName: "minimax-api", + providerType: "openai", + credentialEnv: "MINIMAX_API_KEY", + }); + expect(NON_INTERACTIVE_PROVIDER_KEYS.has("minimax")).toBe(true); + expect( + buildProviderArgs( + "create", + provider.providerName, + provider.providerType, + provider.credentialEnv, + "https://api.minimax.io/v1", + ), + ).toContain("OPENAI_BASE_URL=https://api.minimax.io/v1"); + }); + it("keeps the discovery profile Anthropic before agent-specific surface selection (#6289)", () => { const provider = REMOTE_PROVIDER_CONFIG.anthropicCompatible; diff --git a/src/lib/onboard/providers.ts b/src/lib/onboard/providers.ts index b9e6125140e..5fb978a7e8f 100644 --- a/src/lib/onboard/providers.ts +++ b/src/lib/onboard/providers.ts @@ -25,6 +25,7 @@ const OPENAI_ENDPOINT_URL = "https://api.openai.com/v1"; const ANTHROPIC_ENDPOINT_URL = "https://api.anthropic.com"; const GEMINI_ENDPOINT_URL = "https://generativelanguage.googleapis.com/v1beta/openai/"; const HERMES_INFERENCE_ENDPOINT_URL = "https://inference-api.nousresearch.com/v1"; +const MINIMAX_ENDPOINT_URL = "https://api.minimax.io/v1"; const HOSTED_INFERENCE_SOURCE_ENV = "NVIDIA_INFERENCE_API_KEY"; const HOSTED_INFERENCE_PROVIDER_KEY_ENV = "NEMOCLAW_PROVIDER_KEY"; const HOSTED_INFERENCE_CREDENTIAL_ENV = "COMPATIBLE_API_KEY"; @@ -50,6 +51,7 @@ const NON_INTERACTIVE_PROVIDER_KEYS = new Set([ "build", "openrouter", "openai", + "minimax", "anthropic", "anthropicCompatible", "gemini", @@ -65,7 +67,7 @@ const NON_INTERACTIVE_PROVIDER_KEYS = new Set([ "start-windows-ollama", ]); const NON_INTERACTIVE_PROVIDER_VALID_VALUES = - "Valid values: build, openrouter, openai, anthropic, anthropicCompatible, gemini, hermes-provider, ollama, custom, nim-local, vllm, routed, install-vllm, install-ollama, install-windows-ollama, start-windows-ollama"; + "Valid values: build, openrouter, openai, minimax, anthropic, anthropicCompatible, gemini, hermes-provider, ollama, custom, nim-local, vllm, routed, install-vllm, install-ollama, install-windows-ollama, start-windows-ollama"; const PROVIDER_KEY_ROUTE_VALUES = new Set( [ "inference", @@ -108,6 +110,17 @@ const REMOTE_PROVIDER_CONFIG = { defaultModel: "gpt-5.4", skipVerify: true, }, + minimax: { + label: "MiniMax", + providerName: "minimax-api", + providerType: "openai", + credentialEnv: "MINIMAX_API_KEY", + endpointUrl: MINIMAX_ENDPOINT_URL, + helpUrl: "https://platform.minimax.io/docs/api-reference/api-overview", + modelMode: "curated", + defaultModel: "MiniMax-M3", + skipVerify: true, + }, anthropic: { label: "Anthropic", providerName: "anthropic-prod",