Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions src/lib/inference/config.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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" }),
);
Expand Down Expand Up @@ -263,6 +273,7 @@ describe("inference selection config", () => {
"nvidia-prod",
"nvidia-nim",
"openai-api",
"minimax-api",
"openrouter-api",
"anthropic-prod",
"compatible-anthropic-endpoint",
Expand Down Expand Up @@ -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");
Expand Down
7 changes: 7 additions & 0 deletions src/lib/inference/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
3 changes: 3 additions & 0 deletions src/lib/onboard/provider-menu.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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" },
Expand Down Expand Up @@ -50,6 +51,7 @@ describe("buildInferenceProviderMenu", () => {
"build",
"openrouter",
"openai",
"minimax",
"custom",
"anthropic",
"anthropicCompatible",
Expand All @@ -76,6 +78,7 @@ describe("buildInferenceProviderMenu", () => {
"build",
"openrouter",
"openai",
"minimax",
"custom",
"anthropic",
"anthropicCompatible",
Expand Down
1 change: 1 addition & 0 deletions src/lib/onboard/provider-menu.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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" },
Expand Down
20 changes: 20 additions & 0 deletions src/lib/onboard/providers.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
15 changes: 14 additions & 1 deletion src/lib/onboard/providers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand All @@ -50,6 +51,7 @@ const NON_INTERACTIVE_PROVIDER_KEYS = new Set([
"build",
"openrouter",
"openai",
"minimax",
"anthropic",
"anthropicCompatible",
"gemini",
Expand All @@ -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",
Expand Down Expand Up @@ -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",
Expand Down
Loading