feat: add Xiaomi MiMo Token Plan presets (#2803)

* feat: add Xiaomi MiMo token plan presets

* fix: update Xiaomi MiMo provider presets

* fix: align MiMo V2.5 model specs with official documentation

- Update maxTokens from 32000 to 131072 (128K) for mimo-v2.5-pro and mimo-v2.5
- Update contextWindow from 262144 to 1048576 (1M) for mimo-v2.5
- Aligns with official specs from Xiaomi MiMo documentation
- Ensures consistency between OpenClaw and OpenCode presets

---------

Co-authored-by: Jason <farion1231@gmail.com>
This commit is contained in:
BlueOcean
2026-05-18 10:38:03 +08:00
committed by GitHub
Unverified
parent 5c79cf64a4
commit 0fb7fd12e5
8 changed files with 288 additions and 16 deletions
@@ -34,6 +34,7 @@ import {
} from "@/config/opencodeProviderPresets";
import {
openclawProviderPresets,
rebaseOpenClawSuggestedDefaults,
type OpenClawProviderPreset,
type OpenClawSuggestedDefaults,
} from "@/config/openclawProviderPresets";
@@ -1130,9 +1131,15 @@ function ProviderFormFull({
if (activePreset.isPartner) {
payload.isPartner = activePreset.isPartner;
}
// OpenClaw: 传递预设的 suggestedDefaults 到提交数据
// OpenClaw: align preset model refs with the actual submitted provider key.
if (activePreset.suggestedDefaults) {
payload.suggestedDefaults = activePreset.suggestedDefaults;
payload.suggestedDefaults =
appId === "openclaw" && payload.providerKey
? rebaseOpenClawSuggestedDefaults(
activePreset.suggestedDefaults,
payload.providerKey,
)
: activePreset.suggestedDefaults;
}
}
+21 -1
View File
@@ -928,7 +928,27 @@ export const claudeDesktopProviderPresets: ClaudeDesktopProviderPreset[] = [
baseUrl: "https://api.xiaomimimo.com/anthropic",
mode: "proxy",
apiFormat: "anthropic",
modelRoutes: brandedRoutes("mimo-v2-pro", "mimo-v2-pro", "mimo-v2-pro"),
modelRoutes: brandedRoutes(
"mimo-v2.5-pro",
"mimo-v2.5-pro",
"mimo-v2.5-pro",
),
icon: "xiaomimimo",
iconColor: "#000000",
},
{
name: "Xiaomi MiMo Token Plan (China)",
websiteUrl: "https://platform.xiaomimimo.com/#/token-plan",
apiKeyUrl: "https://platform.xiaomimimo.com/#/console/plan-manage",
category: "cn_official",
baseUrl: "https://token-plan-cn.xiaomimimo.com/anthropic",
mode: "proxy",
apiFormat: "anthropic",
modelRoutes: brandedRoutes(
"mimo-v2.5-pro",
"mimo-v2.5-pro",
"mimo-v2.5-pro",
),
icon: "xiaomimimo",
iconColor: "#000000",
},
+22 -4
View File
@@ -1056,10 +1056,28 @@ export const providerPresets: ProviderPreset[] = [
env: {
ANTHROPIC_BASE_URL: "https://api.xiaomimimo.com/anthropic",
ANTHROPIC_AUTH_TOKEN: "",
ANTHROPIC_MODEL: "mimo-v2-pro",
ANTHROPIC_DEFAULT_HAIKU_MODEL: "mimo-v2-pro",
ANTHROPIC_DEFAULT_SONNET_MODEL: "mimo-v2-pro",
ANTHROPIC_DEFAULT_OPUS_MODEL: "mimo-v2-pro",
ANTHROPIC_MODEL: "mimo-v2.5-pro",
ANTHROPIC_DEFAULT_HAIKU_MODEL: "mimo-v2.5-pro",
ANTHROPIC_DEFAULT_SONNET_MODEL: "mimo-v2.5-pro",
ANTHROPIC_DEFAULT_OPUS_MODEL: "mimo-v2.5-pro",
},
},
category: "cn_official",
icon: "xiaomimimo",
iconColor: "#000000",
},
{
name: "Xiaomi MiMo Token Plan (China)",
websiteUrl: "https://platform.xiaomimimo.com/#/token-plan",
apiKeyUrl: "https://platform.xiaomimimo.com/#/console/plan-manage",
settingsConfig: {
env: {
ANTHROPIC_BASE_URL: "https://token-plan-cn.xiaomimimo.com/anthropic",
ANTHROPIC_AUTH_TOKEN: "",
ANTHROPIC_MODEL: "mimo-v2.5-pro",
ANTHROPIC_DEFAULT_HAIKU_MODEL: "mimo-v2.5-pro",
ANTHROPIC_DEFAULT_SONNET_MODEL: "mimo-v2.5-pro",
ANTHROPIC_DEFAULT_OPUS_MODEL: "mimo-v2.5-pro",
},
},
category: "cn_official",
+23 -2
View File
@@ -1221,13 +1221,34 @@ export const hermesProviderPresets: HermesProviderPreset[] = [
base_url: "https://api.xiaomimimo.com/v1",
api_key: "",
api_mode: "chat_completions",
models: [{ id: "mimo-v2-pro", name: "MiMo v2 Pro" }],
models: [{ id: "mimo-v2.5-pro", name: "MiMo v2.5 Pro" }],
},
category: "cn_official",
icon: "xiaomimimo",
iconColor: "#000000",
suggestedDefaults: {
model: { default: "mimo-v2-pro", provider: "xiaomi_mimo" },
model: { default: "mimo-v2.5-pro", provider: "xiaomi_mimo" },
},
},
{
name: "Xiaomi MiMo Token Plan (China)",
websiteUrl: "https://platform.xiaomimimo.com/#/token-plan",
apiKeyUrl: "https://platform.xiaomimimo.com/#/console/plan-manage",
settingsConfig: {
name: "xiaomi_mimo_token_plan",
base_url: "https://token-plan-cn.xiaomimimo.com/v1",
api_key: "",
api_mode: "chat_completions",
models: [
{ id: "mimo-v2.5-pro", name: "MiMo v2.5 Pro" },
{ id: "mimo-v2.5", name: "MiMo v2.5" },
],
},
category: "cn_official",
icon: "xiaomimimo",
iconColor: "#000000",
suggestedDefaults: {
model: { default: "mimo-v2.5-pro", provider: "xiaomi_mimo_token_plan" },
},
},
];
+98 -6
View File
@@ -42,6 +42,46 @@ export interface OpenClawProviderPreset {
suggestedDefaults?: OpenClawSuggestedDefaults;
}
function rebaseOpenClawModelRef(modelRef: string, providerKey: string): string {
const slashIndex = modelRef.indexOf("/");
return slashIndex === -1
? `${providerKey}/${modelRef}`
: `${providerKey}${modelRef.slice(slashIndex)}`;
}
/**
* OpenClaw default model refs are stored as "<provider-key>/<model-id>".
* Presets carry stable built-in keys for display/tests, but the real key is
* chosen in the add-provider form, so rewrite refs right before submission.
*/
export function rebaseOpenClawSuggestedDefaults(
defaults: OpenClawSuggestedDefaults,
providerKey: string,
): OpenClawSuggestedDefaults {
const key = providerKey.trim();
if (!key) return defaults;
return {
model: defaults.model
? {
...defaults.model,
primary: rebaseOpenClawModelRef(defaults.model.primary, key),
fallbacks: defaults.model.fallbacks?.map((modelRef) =>
rebaseOpenClawModelRef(modelRef, key),
),
}
: undefined,
modelCatalog: defaults.modelCatalog
? Object.fromEntries(
Object.entries(defaults.modelCatalog).map(([modelRef, entry]) => [
rebaseOpenClawModelRef(modelRef, key),
entry,
]),
)
: undefined,
};
}
/**
* OpenClaw API protocol options
* @see https://github.com/openclaw/openclaw/blob/main/docs/gateway/configuration.md
@@ -740,10 +780,13 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [
api: "openai-completions",
models: [
{
id: "mimo-v2-pro",
name: "MiMo V2 Pro",
contextWindow: 128000,
cost: { input: 0.001, output: 0.004 },
id: "mimo-v2.5-pro",
name: "MiMo V2.5 Pro",
reasoning: true,
input: ["text"],
contextWindow: 1048576,
maxTokens: 131072,
cost: { input: 1, output: 3, cacheRead: 0.2, cacheWrite: 0 },
},
],
},
@@ -758,8 +801,57 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [
},
},
suggestedDefaults: {
model: { primary: "xiaomimimo/mimo-v2-pro" },
modelCatalog: { "xiaomimimo/mimo-v2-pro": { alias: "MiMo" } },
model: { primary: "xiaomimimo/mimo-v2.5-pro" },
modelCatalog: { "xiaomimimo/mimo-v2.5-pro": { alias: "MiMo" } },
},
},
{
name: "Xiaomi MiMo Token Plan (China)",
websiteUrl: "https://platform.xiaomimimo.com/#/token-plan",
apiKeyUrl: "https://platform.xiaomimimo.com/#/console/plan-manage",
settingsConfig: {
baseUrl: "https://token-plan-cn.xiaomimimo.com/v1",
apiKey: "",
api: "openai-completions",
models: [
{
id: "mimo-v2.5-pro",
name: "MiMo V2.5 Pro",
reasoning: true,
input: ["text"],
contextWindow: 1048576,
maxTokens: 131072,
},
{
id: "mimo-v2.5",
name: "MiMo V2.5",
reasoning: true,
input: ["text", "image"],
contextWindow: 1048576,
maxTokens: 131072,
},
],
},
category: "cn_official",
icon: "xiaomimimo",
iconColor: "#000000",
templateValues: {
apiKey: {
label: "Token Plan API Key",
placeholder: "tp-...",
editorValue: "",
},
},
suggestedDefaults: {
model: { primary: "xiaomi-mimo-token-plan/mimo-v2.5-pro" },
modelCatalog: {
"xiaomi-mimo-token-plan/mimo-v2.5-pro": {
alias: "MiMo Token Plan (China)",
},
"xiaomi-mimo-token-plan/mimo-v2.5": {
alias: "MiMo Token Plan (China) Multimodal",
},
},
},
},
+46 -1
View File
@@ -919,7 +919,16 @@ export const opencodeProviderPresets: OpenCodeProviderPreset[] = [
setCacheKey: true,
},
models: {
"mimo-v2-pro": { name: "MiMo V2 Pro" },
"mimo-v2.5-pro": {
name: "MiMo V2.5 Pro",
limit: { context: 1048576, output: 131072 },
modalities: { input: ["text"], output: ["text"] },
},
"mimo-v2.5": {
name: "MiMo V2.5",
limit: { context: 1048576, output: 131072 },
modalities: { input: ["text", "image"], output: ["text"] },
},
},
},
category: "cn_official",
@@ -933,6 +942,42 @@ export const opencodeProviderPresets: OpenCodeProviderPreset[] = [
},
},
},
{
name: "Xiaomi MiMo Token Plan (China)",
websiteUrl: "https://platform.xiaomimimo.com/#/token-plan",
apiKeyUrl: "https://platform.xiaomimimo.com/#/console/plan-manage",
settingsConfig: {
npm: "@ai-sdk/openai-compatible",
name: "Xiaomi MiMo Token Plan (China)",
options: {
baseURL: "https://token-plan-cn.xiaomimimo.com/v1",
apiKey: "",
setCacheKey: true,
},
models: {
"mimo-v2.5-pro": {
name: "MiMo V2.5 Pro",
limit: { context: 1048576, output: 131072 },
modalities: { input: ["text"], output: ["text"] },
},
"mimo-v2.5": {
name: "MiMo V2.5",
limit: { context: 1048576, output: 131072 },
modalities: { input: ["text", "image"], output: ["text"] },
},
},
},
category: "cn_official",
icon: "xiaomimimo",
iconColor: "#000000",
templateValues: {
apiKey: {
label: "Token Plan API Key",
placeholder: "tp-...",
editorValue: "",
},
},
},
{
name: "AiHubMix",
+51
View File
@@ -0,0 +1,51 @@
import { describe, expect, it } from "vitest";
import {
openclawProviderPresets,
rebaseOpenClawSuggestedDefaults,
} from "@/config/openclawProviderPresets";
describe("Xiaomi MiMo Token Plan presets", () => {
it("uses a separate OpenClaw provider namespace from pay-as-you-go MiMo", () => {
const payAsYouGo = openclawProviderPresets.find(
(item) => item.name === "Xiaomi MiMo",
);
const tokenPlan = openclawProviderPresets.find(
(item) => item.name === "Xiaomi MiMo Token Plan (China)",
);
expect(payAsYouGo?.suggestedDefaults?.model?.primary).toBe(
"xiaomimimo/mimo-v2.5-pro",
);
expect(tokenPlan?.suggestedDefaults?.model?.primary).toBe(
"xiaomi-mimo-token-plan/mimo-v2.5-pro",
);
expect(tokenPlan?.suggestedDefaults?.modelCatalog).toHaveProperty(
"xiaomi-mimo-token-plan/mimo-v2.5-pro",
);
expect(tokenPlan?.suggestedDefaults?.modelCatalog).toHaveProperty(
"xiaomi-mimo-token-plan/mimo-v2.5",
);
});
it("rebases OpenClaw defaults to the submitted provider key", () => {
const tokenPlan = openclawProviderPresets.find(
(item) => item.name === "Xiaomi MiMo Token Plan (China)",
);
expect(tokenPlan?.suggestedDefaults).toBeDefined();
const rebased = rebaseOpenClawSuggestedDefaults(
tokenPlan!.suggestedDefaults!,
"my-mimo-plan",
);
expect(rebased.model?.primary).toBe("my-mimo-plan/mimo-v2.5-pro");
expect(rebased.modelCatalog).toHaveProperty(
"my-mimo-plan/mimo-v2.5-pro",
);
expect(rebased.modelCatalog).toHaveProperty("my-mimo-plan/mimo-v2.5");
expect(rebased.modelCatalog).not.toHaveProperty(
"xiaomi-mimo-token-plan/mimo-v2.5-pro",
);
});
});
@@ -80,4 +80,22 @@ describe("AWS Bedrock OpenCode Provider Presets", () => {
"https://api.kimi.com/coding/v1",
);
});
it("Xiaomi MiMo presets should include official OpenCode model metadata", () => {
const presets = ["Xiaomi MiMo", "Xiaomi MiMo Token Plan (China)"].map(
(name) => opencodeProviderPresets.find((preset) => preset.name === name),
);
for (const preset of presets) {
expect(preset).toBeDefined();
expect(preset!.settingsConfig.models["mimo-v2.5-pro"]).toMatchObject({
limit: { context: 1048576, output: 131072 },
modalities: { input: ["text"], output: ["text"] },
});
expect(preset!.settingsConfig.models["mimo-v2.5"]).toMatchObject({
limit: { context: 1048576, output: 131072 },
modalities: { input: ["text", "image"], output: ["text"] },
});
}
});
});