Add MiniMax as an Anthropic-compatible AI provider

MiniMax-M3[1m] via api.minimaxi.com/anthropic per the official
Claude Code token-plan docs; the claude-code combo enters the
compatibility matrix as stable with mock regression coverage,
including the Haiku-slot fallback to the single model.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QKxGW1raAWaqeU8WdHsMsp
This commit is contained in:
2026-08-25 10:49:53 -04:00
co-authored by Claude Fable 5
parent e57d2a3424
commit 6b491d52be
3 changed files with 129 additions and 15 deletions
+6 -1
View File
@@ -1,5 +1,5 @@
{ {
"_verified": "2026-08-24. level=stable: adapter 渲染由 test/shell.d/omarchycn-ai-test.sh mock 回归覆盖; level=official-doc: 官方集成文档存在,native CLI 自管配置", "_verified": "2026-08-25. level=stable: adapter 渲染由 test/shell.d/omarchycn-ai-test.sh mock 回归覆盖; level=official-doc: 官方集成文档存在,native CLI 自管配置",
"combos": { "combos": {
"claude-code": { "claude-code": {
"deepseek": { "deepseek": {
@@ -16,6 +16,11 @@
"level": "stable", "level": "stable",
"doc": "https://docs.z.ai/devpack/tool/claude", "doc": "https://docs.z.ai/devpack/tool/claude",
"adapter": true "adapter": true
},
"minimax": {
"level": "stable",
"doc": "https://platform.minimax.io/docs/token-plan/claude-code",
"adapter": true
} }
}, },
"codex": { "codex": {
+118 -12
View File
@@ -1,44 +1,150 @@
{ {
"_verified": "2026-08-24, from official docs (see OmarchyCN PRD §27)", "_verified": "2026-08-25, from official docs (see OmarchyCN PRD §27; minimax: platform.minimax.io/docs/token-plan/claude-code)",
"providers": { "providers": {
"deepseek": { "deepseek": {
"display_name": "DeepSeek", "display_name": "DeepSeek",
"auth": ["api_key"], "auth": [
"api_key"
],
"key_url": "https://platform.deepseek.com/api_keys", "key_url": "https://platform.deepseek.com/api_keys",
"endpoints": { "endpoints": {
"anthropic": "https://api.deepseek.com/anthropic", "anthropic": "https://api.deepseek.com/anthropic",
"openai": "https://api.deepseek.com" "openai": "https://api.deepseek.com"
}, },
"models": [ "models": [
{ "id": "deepseek-v4-pro[1m]", "aliases": ["default-coding"], "capabilities": ["tools", "streaming", "reasoning"] }, {
{ "id": "deepseek-v4-flash", "aliases": ["fast"], "capabilities": ["tools", "streaming"] } "id": "deepseek-v4-pro[1m]",
"aliases": [
"default-coding"
],
"capabilities": [
"tools",
"streaming",
"reasoning"
]
},
{
"id": "deepseek-v4-flash",
"aliases": [
"fast"
],
"capabilities": [
"tools",
"streaming"
]
}
] ]
}, },
"kimi": { "kimi": {
"display_name": "Kimi (Moonshot)", "display_name": "Kimi (Moonshot)",
"auth": ["api_key"], "auth": [
"api_key"
],
"key_url": "https://www.kimi.com/code", "key_url": "https://www.kimi.com/code",
"endpoints": { "endpoints": {
"anthropic": "https://api.kimi.com/coding/", "anthropic": "https://api.kimi.com/coding/",
"openai": "https://api.moonshot.cn/v1" "openai": "https://api.moonshot.cn/v1"
}, },
"models": [ "models": [
{ "id": "kimi-for-coding", "aliases": ["default-coding"], "capabilities": ["tools", "streaming", "reasoning"] }, {
{ "id": "kimi-for-coding-highspeed", "aliases": ["fast"], "capabilities": ["tools", "streaming"] }, "id": "kimi-for-coding",
{ "id": "kimi-k2.6", "aliases": ["general"], "capabilities": ["tools", "streaming"], "protocol": "openai" } "aliases": [
"default-coding"
],
"capabilities": [
"tools",
"streaming",
"reasoning"
]
},
{
"id": "kimi-for-coding-highspeed",
"aliases": [
"fast"
],
"capabilities": [
"tools",
"streaming"
]
},
{
"id": "kimi-k2.6",
"aliases": [
"general"
],
"capabilities": [
"tools",
"streaming"
],
"protocol": "openai"
}
] ]
}, },
"zai": { "zai": {
"display_name": "Z.AI / GLM", "display_name": "Z.AI / GLM",
"auth": ["api_key"], "auth": [
"api_key"
],
"key_url": "https://z.ai/manage-apikey/apikey-list", "key_url": "https://z.ai/manage-apikey/apikey-list",
"endpoints": { "endpoints": {
"anthropic": "https://api.z.ai/api/anthropic" "anthropic": "https://api.z.ai/api/anthropic"
}, },
"models": [ "models": [
{ "id": "glm-5.2[1m]", "aliases": ["default-coding"], "capabilities": ["tools", "streaming", "reasoning"] }, {
{ "id": "GLM-5.3", "aliases": ["latest"], "capabilities": ["tools", "streaming", "reasoning"] }, "id": "glm-5.2[1m]",
{ "id": "GLM-4.7", "aliases": ["fast"], "capabilities": ["tools", "streaming"] } "aliases": [
"default-coding"
],
"capabilities": [
"tools",
"streaming",
"reasoning"
]
},
{
"id": "GLM-5.3",
"aliases": [
"latest"
],
"capabilities": [
"tools",
"streaming",
"reasoning"
]
},
{
"id": "GLM-4.7",
"aliases": [
"fast"
],
"capabilities": [
"tools",
"streaming"
]
}
]
},
"minimax": {
"display_name": "MiniMax",
"auth": [
"api_key"
],
"key_url": "https://platform.minimaxi.com/user-center/payment/token-plan",
"endpoints": {
"anthropic": "https://api.minimaxi.com/anthropic"
},
"models": [
{
"id": "MiniMax-M3[1m]",
"aliases": [
"default-coding"
],
"capabilities": [
"tools",
"streaming",
"reasoning"
]
}
] ]
} }
} }
+5 -2
View File
@@ -34,7 +34,7 @@ export PATH="$TEST_HOME/stubs:$PATH"
for reg in ai-providers ai-harnesses ai-compatibility; do for reg in ai-providers ai-harnesses ai-compatibility; do
jq -e . "$ROOT/cn/registry/$reg.json" > /dev/null || fail "$reg.json parses" jq -e . "$ROOT/cn/registry/$reg.json" > /dev/null || fail "$reg.json parses"
done done
for p in deepseek kimi zai; do for p in deepseek kimi zai minimax; do
jq -e --arg p "$p" '.providers[$p].endpoints.anthropic // .providers[$p].endpoints.openai' \ jq -e --arg p "$p" '.providers[$p].endpoints.anthropic // .providers[$p].endpoints.openai' \
"$ROOT/cn/registry/ai-providers.json" > /dev/null || fail "provider $p has an endpoint" "$ROOT/cn/registry/ai-providers.json" > /dev/null || fail "provider $p has an endpoint"
done done
@@ -67,13 +67,16 @@ declare -A bases=(
[deepseek]="https://api.deepseek.com/anthropic" [deepseek]="https://api.deepseek.com/anthropic"
[kimi]="https://api.kimi.com/coding/" [kimi]="https://api.kimi.com/coding/"
[zai]="https://api.z.ai/api/anthropic" [zai]="https://api.z.ai/api/anthropic"
[minimax]="https://api.minimaxi.com/anthropic"
) )
for p in deepseek kimi zai; do for p in deepseek kimi zai minimax; do
out=$(cn_ai_render_env claude-code "$p" test-model sk-x) out=$(cn_ai_render_env claude-code "$p" test-model sk-x)
grep -qF "ANTHROPIC_BASE_URL=${bases[$p]}" <<<"$out" || fail "claude-code $p base url" "$out" grep -qF "ANTHROPIC_BASE_URL=${bases[$p]}" <<<"$out" || fail "claude-code $p base url" "$out"
grep -q "ANTHROPIC_AUTH_TOKEN=sk-x" <<<"$out" || fail "claude-code $p auth token" grep -q "ANTHROPIC_AUTH_TOKEN=sk-x" <<<"$out" || fail "claude-code $p auth token"
grep -q "ANTHROPIC_API_KEY=sk-x" <<<"$out" || fail "claude-code $p api key" grep -q "ANTHROPIC_API_KEY=sk-x" <<<"$out" || fail "claude-code $p api key"
done done
out=$(cn_ai_render_env claude-code minimax "MiniMax-M3[1m]" sk-x)
grep -qF "ANTHROPIC_DEFAULT_HAIKU_MODEL=MiniMax-M3" <<<"$out" || fail "minimax haiku slot falls back to default-coding"
out=$(cn_ai_render_env opencode deepseek test-model sk-x) out=$(cn_ai_render_env opencode deepseek test-model sk-x)
grep -q "DEEPSEEK_API_KEY=sk-x" <<<"$out" || fail "opencode deepseek env" grep -q "DEEPSEEK_API_KEY=sk-x" <<<"$out" || fail "opencode deepseek env"
if cn_ai_render_env opencode zai m k > /dev/null 2>&1; then if cn_ai_render_env opencode zai m k > /dev/null 2>&1; then