Skip to content
Open
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
11 changes: 7 additions & 4 deletions doc/generic-providers.md
Original file line number Diff line number Diff line change
Expand Up @@ -277,12 +277,13 @@ MiniMax rejects several fields that OpenAI / MiMo / DeepSeek accept. Use the `mi
```json
{
"id": "minimax",
"displayName": "MiniMax M2.7",
"baseUrl": "https://api.minimaxi.com/v1",
"displayName": "MiniMax M3",
"baseUrl": "https://api.minimax.io/v1",
"envKey": "MINIMAX_API_KEY",
"defaultModel": "MiniMax-M2.7",
"defaultModel": "MiniMax-M3",
"models": [
{ "id": "MiniMax-M2.7", "contextWindow": 245760 }
{ "id": "MiniMax-M3", "contextWindow": 1000000 },
{ "id": "MiniMax-M2.7", "contextWindow": 204800 }
],
"features": {
"minimaxCompat": true,
Expand All @@ -291,6 +292,8 @@ MiniMax rejects several fields that OpenAI / MiMo / DeepSeek accept. Use the `mi
}
```

The same preset also matches `https://api.minimaxi.com/v1`. `MiniMax-M3` is the 1,000,000-token default; keep `MiniMax-M2.7` if you still need the 204,800-token catalog entry.

See [minimax.md](./minimax.md) for the full breakdown and the env-var single-instance flow (`GENERIC_FORCE_DEFAULT_MODEL=1`).

## Default provider & routing rules (important)
Expand Down
11 changes: 7 additions & 4 deletions doc/generic-providers.zh.md
Original file line number Diff line number Diff line change
Expand Up @@ -277,12 +277,13 @@ MiniMax 拒绝若干 OpenAI / MiMo / DeepSeek 都接受的字段。开 `minimaxC
```json
{
"id": "minimax",
"displayName": "MiniMax M2.7",
"baseUrl": "https://api.minimaxi.com/v1",
"displayName": "MiniMax M3",
"baseUrl": "https://api.minimax.io/v1",
"envKey": "MINIMAX_API_KEY",
"defaultModel": "MiniMax-M2.7",
"defaultModel": "MiniMax-M3",
"models": [
{ "id": "MiniMax-M2.7", "contextWindow": 245760 }
{ "id": "MiniMax-M3", "contextWindow": 1000000 },
{ "id": "MiniMax-M2.7", "contextWindow": 204800 }
],
"features": {
"minimaxCompat": true,
Expand All @@ -291,6 +292,8 @@ MiniMax 拒绝若干 OpenAI / MiMo / DeepSeek 都接受的字段。开 `minimaxC
}
```

同一份预设也会匹配 `https://api.minimaxi.com/v1`。`MiniMax-M3` 是 1,000,000 token 默认档;如果还要 204,800 token 的 `MiniMax-M2.7`,就保留它的模型项。

详见 [minimax.zh.md](./minimax.zh.md)(含 env-var 单实例写法 `GENERIC_FORCE_DEFAULT_MODEL=1`)。

## 默认 provider 与路由规则(重要)
Expand Down
26 changes: 14 additions & 12 deletions doc/minimax.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

> 中文版: [minimax.zh.md](./minimax.zh.md)

MiniMax (`https://api.minimaxi.com/v1`) speaks the OpenAI Chat Completions wire format, but its request validation is stricter than OpenAI / MiMo / DeepSeek. Connecting it through mimo2codex's generic provider hits a handful of non-obvious 400s. This doc explains how the MiniMax compat switches (v0.2.8+) resolve them in one shot.
MiniMax (`https://api.minimax.io/v1` / `https://api.minimaxi.com/v1`) speaks the OpenAI Chat Completions wire format, but its request validation is stricter than OpenAI / MiMo / DeepSeek. Connecting it through mimo2codex's generic provider hits a handful of non-obvious 400s. This doc explains how the MiniMax compat switches (v0.2.8+) resolve them in one shot.

Source: [issue #7](https://github.com/7as0nch/mimo2codex/issues/7).

Expand Down Expand Up @@ -41,22 +41,22 @@ In `~/.mimo2codex/providers.json`:
"providers": [
{
"id": "minimax",
"displayName": "MiniMax M2.7",
"baseUrl": "https://api.minimaxi.com/v1",
"displayName": "MiniMax M3",
"baseUrl": "https://api.minimax.io/v1",
"envKey": "MINIMAX_API_KEY",
"defaultModel": "MiniMax-M2.7",
"defaultModel": "MiniMax-M3",
"models": [
{ "id": "MiniMax-M2.7", "contextWindow": 245760 }
{ "id": "MiniMax-M3", "contextWindow": 1000000 },
{ "id": "MiniMax-M2.7", "contextWindow": 204800 }
],
"features": {
"minimaxCompat": true,
"forceParallelToolCalls": true
}
"features": { "minimaxCompat": true, "forceParallelToolCalls": true }
}
]
}
```

The same preset also matches `https://api.minimaxi.com/v1`. `MiniMax-M3` is the 1,000,000-token default; keep `MiniMax-M2.7` if you still need the 204,800-token catalog entry.

Then:
```bash
export MINIMAX_API_KEY=<your_key>
Expand All @@ -70,15 +70,17 @@ Open the webui (`http://127.0.0.1:8788/admin/`) and click **Probe** on the MiniM
If MiniMax is the only upstream you need:

```bash
export GENERIC_BASE_URL=https://api.minimaxi.com/v1
export GENERIC_BASE_URL=https://api.minimax.io/v1
export GENERIC_API_KEY=<your_key>
export GENERIC_DEFAULT_MODEL=MiniMax-M2.7
export GENERIC_FORCE_DEFAULT_MODEL=1 # key bit: unknown client models (e.g. "gpt-5.5") rewrite to MiniMax-M2.7
export GENERIC_DEFAULT_MODEL=MiniMax-M3
export GENERIC_FORCE_DEFAULT_MODEL=1 # key bit: unknown client models (e.g. "gpt-5.5") rewrite to MiniMax-M3
mimo2codex
```

⚠️ **The env-var path cannot carry `features.minimaxCompat`** — switch to providers.json if you need the strict-mode sanitizers.

Need the 204,800-token `MiniMax-M2.7` catalog entry instead? Use providers.json and set the model id there.

## Field reference

### Top-level
Expand Down
26 changes: 14 additions & 12 deletions doc/minimax.zh.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

> English: [minimax.md](./minimax.md)

MiniMax (`https://api.minimaxi.com/v1`) 兼容 OpenAI Chat Completions 规范,但对请求字段的校验比 OpenAI 自家 / MiMo / DeepSeek 都更严格。直连 mimo2codex 的通用 generic provider 时会撞到几个非显然的报错。本文档说明如何用 v0.2.8+ 的 MiniMax 适配开关一键解决。
MiniMax(`https://api.minimax.io/v1` / `https://api.minimaxi.com/v1`兼容 OpenAI Chat Completions 规范,但对请求字段的校验比 OpenAI 自家 / MiMo / DeepSeek 都更严格。直连 mimo2codex 的通用 generic provider 时会撞到几个非显然的报错。本文档说明如何用 v0.2.8+ 的 MiniMax 适配开关一键解决。

来源:[issue #7](https://github.com/7as0nch/mimo2codex/issues/7)

Expand Down Expand Up @@ -41,22 +41,22 @@ Codex 还会以请求里 `config.toml` 配置的 model 名(如 `gpt-5.5`)作
"providers": [
{
"id": "minimax",
"displayName": "MiniMax M2.7",
"baseUrl": "https://api.minimaxi.com/v1",
"displayName": "MiniMax M3",
"baseUrl": "https://api.minimax.io/v1",
"envKey": "MINIMAX_API_KEY",
"defaultModel": "MiniMax-M2.7",
"defaultModel": "MiniMax-M3",
"models": [
{ "id": "MiniMax-M2.7", "contextWindow": 245760 }
{ "id": "MiniMax-M3", "contextWindow": 1000000 },
{ "id": "MiniMax-M2.7", "contextWindow": 204800 }
],
"features": {
"minimaxCompat": true,
"forceParallelToolCalls": true
}
"features": { "minimaxCompat": true, "forceParallelToolCalls": true }
}
]
}
```

同一份配置也会匹配 `https://api.minimaxi.com/v1`。`MiniMax-M3` 是 1,000,000 token 默认档;如果还要用 204,800 token 的 `MiniMax-M2.7`,就保留它的模型项。

设环境变量并启动:
```bash
export MINIMAX_API_KEY=<your_key>
Expand All @@ -70,15 +70,17 @@ mimo2codex --model minimax
如果只想跑 MiniMax,不打算 providers.json:

```bash
export GENERIC_BASE_URL=https://api.minimaxi.com/v1
export GENERIC_BASE_URL=https://api.minimax.io/v1
export GENERIC_API_KEY=<your_key>
export GENERIC_DEFAULT_MODEL=MiniMax-M2.7
export GENERIC_FORCE_DEFAULT_MODEL=1 # 关键:未知模型名(如 "gpt-5.5")自动改写到 MiniMax-M2.7
export GENERIC_DEFAULT_MODEL=MiniMax-M3
export GENERIC_FORCE_DEFAULT_MODEL=1 # 关键:未知模型名(如 "gpt-5.5")自动改写到 MiniMax-M3
mimo2codex
```

⚠️ **env-var 模式无法传 `features.minimaxCompat`**——想用严格模式开关请改用 providers.json。

如果你还要 204,800 token 的 `MiniMax-M2.7`,请改用 providers.json 并在其中声明该模型项。

## 字段说明

### 顶层
Expand Down
4 changes: 2 additions & 2 deletions docweb/src/docs/catalog.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,8 @@ export const DOC_CATALOG: DocMeta[] = [
group: "providers",
title: { en: "MiniMax", zh: "接入 MiniMax" },
summary: {
en: "Configure MiniMax M2 with its API quirks handled automatically.",
zh: "配置 MiniMax M2,API 兼容性细节自动处理。",
en: "Configure MiniMax M3 / M2.7 with the current context windows and both API hosts handled automatically.",
zh: "配置 MiniMax M3 / M2.7,并自动处理当前上下文长度与全球 / 中国 API 主机。",
},
},
{
Expand Down
2 changes: 1 addition & 1 deletion docweb/src/pages/Landing.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ const PROVIDER_GRID: Provider[] = [
{ slug: "env-setup", name: "MiMo V2.5", tag: "Xiaomi · default" },
{ slug: "env-setup", name: "DeepSeek", tag: "V3.2" },
{ slug: "kimi", name: "Kimi", tag: "Moonshot K2" },
{ slug: "minimax", name: "MiniMax", tag: "M2" },
{ slug: "minimax", name: "MiniMax", tag: "M3" },
{ slug: "sensenova", name: "SenseNova", tag: "Flash-Lite" },
];

Expand Down
8 changes: 4 additions & 4 deletions src/providers/presets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,12 +57,12 @@ export const PROVIDER_PRESETS: readonly ProviderPreset[] = [
{
id: "minimax",
displayName: "MiniMax",
matchBaseUrl: ["minimaxi.com", "api.minimax.chat"],
matchBaseUrl: ["minimax.io", "minimaxi.com", "api.minimax.chat"],
matchModelPrefix: ["minimax-", "abab"],
recommendedSpec: {
baseUrl: "https://api.minimaxi.com/v1",
defaultModel: "MiniMax-M2",
docsUrl: "https://platform.minimaxi.com/document",
baseUrl: "https://api.minimax.io/v1",
defaultModel: "MiniMax-M3",
docsUrl: "https://platform.minimax.io/docs",
features: {
// 一键预设涵盖 dropNullStrict / dropNullContent / dropToolChoiceAuto /
// mergeSystemMessages / extractThinkTags。
Expand Down
12 changes: 11 additions & 1 deletion test/providers.presets.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,14 @@ describe("PROVIDER_PRESETS", () => {
expect(ids).toEqual(["kimi", "minimax", "sensenova"]);
});

it("minimax preset uses M3 and the global docs host", () => {
const mm = PROVIDER_PRESETS.find((p) => p.id === "minimax");
expect(mm).toBeDefined();
expect(mm!.recommendedSpec.defaultModel).toBe("MiniMax-M3");
expect(mm!.recommendedSpec.baseUrl).toBe("https://api.minimax.io/v1");
expect(mm!.recommendedSpec.docsUrl).toBe("https://platform.minimax.io/docs");
});

it("kimi preset has dropReasoningEffort + moonshot baseUrl", () => {
const k = PROVIDER_PRESETS.find((p) => p.id === "kimi");
expect(k).toBeDefined();
Expand Down Expand Up @@ -48,11 +56,13 @@ describe("matchPreset", () => {
expect(matchPreset("", "deepseek-v4-flash")?.id).toBe("sensenova");
});

it("matches minimax by baseUrl", () => {
it("matches minimax by global and CN baseUrl", () => {
expect(matchPreset("https://api.minimax.io/v1", "")?.id).toBe("minimax");
expect(matchPreset("https://api.minimaxi.com/v1", "")?.id).toBe("minimax");
});

it("matches minimax by model prefix", () => {
expect(matchPreset("", "MiniMax-M3")?.id).toBe("minimax");
expect(matchPreset("", "MiniMax-M2.7")?.id).toBe("minimax");
expect(matchPreset("", "abab6.5")?.id).toBe("minimax");
});
Expand Down