mirror of
https://github.com/openclaw/openclaw.git
synced 2026-10-03 01:29:56 +00:00
feat(xiaomi): add MiMo V2.6 support
This commit is contained in:
parent
baad196d1c
commit
35b95b2aa6
16 changed files with 239 additions and 84 deletions
|
|
@ -185,36 +185,36 @@ messages and normalizes `stats.cached` into `cacheRead`; legacy
|
|||
|
||||
### Other bundled provider plugins
|
||||
|
||||
| Provider | Id | Auth env | Example model |
|
||||
| --------------------------------------- | -------------------------------- | ---------------------------------------------- | ------------------------------------------------------ |
|
||||
| [Arcee](/providers/arcee) | `arcee` | `ARCEEAI_API_KEY` or `OPENROUTER_API_KEY` | `arcee/trinity-large-thinking` |
|
||||
| BytePlus | `byteplus` / `byteplus-plan` | `BYTEPLUS_API_KEY` | `byteplus-plan/ark-code-latest` |
|
||||
| Cerebras | `cerebras` | `CEREBRAS_API_KEY` | `cerebras/zai-glm-4.7` |
|
||||
| Chutes | `chutes` | `CHUTES_API_KEY` or `CHUTES_OAUTH_TOKEN` | `chutes/zai-org/GLM-5-TEE` |
|
||||
| ClawRouter | `clawrouter` | `CLAWROUTER_API_KEY` | `clawrouter/anthropic/claude-sonnet-4-6` |
|
||||
| Cohere | `cohere` | `COHERE_API_KEY` | `cohere/command-a-plus-05-2026` |
|
||||
| DeepInfra | `deepinfra` | `DEEPINFRA_API_KEY` | `deepinfra/deepseek-ai/DeepSeek-V4-Flash` |
|
||||
| DeepSeek | `deepseek` | `DEEPSEEK_API_KEY` | `deepseek/deepseek-v4-flash` |
|
||||
| Featherless AI | `featherless` | `FEATHERLESS_API_KEY` | `featherless/Qwen/Qwen3-32B` |
|
||||
| GitHub Copilot | `github-copilot` | `COPILOT_GITHUB_TOKEN` | - |
|
||||
| GMI Cloud | `gmi` | `GMI_API_KEY` | `gmi/google/gemini-3.1-flash-lite` |
|
||||
| Groq | `groq` | `GROQ_API_KEY` | `groq/llama-3.3-70b-versatile` |
|
||||
| Hugging Face Inference | `huggingface` | `HUGGINGFACE_HUB_TOKEN` or `HF_TOKEN` | `huggingface/deepseek-ai/DeepSeek-R1` |
|
||||
| MiniMax | `minimax` / `minimax-portal` | `MINIMAX_API_KEY` / `MINIMAX_OAUTH_TOKEN` | `minimax/MiniMax-M3` |
|
||||
| Mistral | `mistral` | `MISTRAL_API_KEY` | `mistral/mistral-large-latest` |
|
||||
| Moonshot | `moonshot` | `MOONSHOT_API_KEY` | `moonshot/kimi-k2.6` |
|
||||
| NVIDIA | `nvidia` | `NVIDIA_API_KEY` | `nvidia/nvidia/nemotron-3-ultra-550b-a55b` |
|
||||
| NovitaAI | `novita` | `NOVITA_API_KEY` | `novita/deepseek/deepseek-v3-0324` |
|
||||
| [Ollama Cloud](/providers/ollama-cloud) | `ollama-cloud` | `OLLAMA_API_KEY` | `ollama-cloud/kimi-k2.6` |
|
||||
| OpenRouter | `openrouter` | OpenRouter OAuth or `OPENROUTER_API_KEY` | `openrouter/auto` |
|
||||
| Qianfan | `qianfan` | `QIANFAN_API_KEY` | `qianfan/deepseek-v3.2` |
|
||||
| Tencent TokenHub | `tencent-tokenhub` | `TOKENHUB_API_KEY` | `tencent-tokenhub/hy3-preview` |
|
||||
| Together | `together` | `TOGETHER_API_KEY` | `together/meta-llama/Llama-3.3-70B-Instruct-Turbo` |
|
||||
| Venice | `venice` | `VENICE_API_KEY` | - |
|
||||
| Vercel AI Gateway | `vercel-ai-gateway` | `AI_GATEWAY_API_KEY` | `vercel-ai-gateway/anthropic/claude-opus-4.6` |
|
||||
| Volcano Engine (Doubao) | `volcengine` / `volcengine-plan` | `VOLCANO_ENGINE_API_KEY` | `volcengine-plan/ark-code-latest` |
|
||||
| xAI | `xai` | SuperGrok/X Premium OAuth or `XAI_API_KEY` | `xai/grok-4.7` |
|
||||
| Xiaomi | `xiaomi` / `xiaomi-token-plan` | `XIAOMI_API_KEY` / `XIAOMI_TOKEN_PLAN_API_KEY` | `xiaomi/mimo-v2.5` / `xiaomi-token-plan/mimo-v2.5-pro` |
|
||||
| Provider | Id | Auth env | Example model |
|
||||
| --------------------------------------- | -------------------------------- | ---------------------------------------------- | ---------------------------------------------------------- |
|
||||
| [Arcee](/providers/arcee) | `arcee` | `ARCEEAI_API_KEY` or `OPENROUTER_API_KEY` | `arcee/trinity-large-thinking` |
|
||||
| BytePlus | `byteplus` / `byteplus-plan` | `BYTEPLUS_API_KEY` | `byteplus-plan/ark-code-latest` |
|
||||
| Cerebras | `cerebras` | `CEREBRAS_API_KEY` | `cerebras/zai-glm-4.7` |
|
||||
| Chutes | `chutes` | `CHUTES_API_KEY` or `CHUTES_OAUTH_TOKEN` | `chutes/zai-org/GLM-5-TEE` |
|
||||
| ClawRouter | `clawrouter` | `CLAWROUTER_API_KEY` | `clawrouter/anthropic/claude-sonnet-4-6` |
|
||||
| Cohere | `cohere` | `COHERE_API_KEY` | `cohere/command-a-plus-05-2026` |
|
||||
| DeepInfra | `deepinfra` | `DEEPINFRA_API_KEY` | `deepinfra/deepseek-ai/DeepSeek-V4-Flash` |
|
||||
| DeepSeek | `deepseek` | `DEEPSEEK_API_KEY` | `deepseek/deepseek-v4-flash` |
|
||||
| Featherless AI | `featherless` | `FEATHERLESS_API_KEY` | `featherless/Qwen/Qwen3-32B` |
|
||||
| GitHub Copilot | `github-copilot` | `COPILOT_GITHUB_TOKEN` | - |
|
||||
| GMI Cloud | `gmi` | `GMI_API_KEY` | `gmi/google/gemini-3.1-flash-lite` |
|
||||
| Groq | `groq` | `GROQ_API_KEY` | `groq/llama-3.3-70b-versatile` |
|
||||
| Hugging Face Inference | `huggingface` | `HUGGINGFACE_HUB_TOKEN` or `HF_TOKEN` | `huggingface/deepseek-ai/DeepSeek-R1` |
|
||||
| MiniMax | `minimax` / `minimax-portal` | `MINIMAX_API_KEY` / `MINIMAX_OAUTH_TOKEN` | `minimax/MiniMax-M3` |
|
||||
| Mistral | `mistral` | `MISTRAL_API_KEY` | `mistral/mistral-large-latest` |
|
||||
| Moonshot | `moonshot` | `MOONSHOT_API_KEY` | `moonshot/kimi-k2.6` |
|
||||
| NVIDIA | `nvidia` | `NVIDIA_API_KEY` | `nvidia/nvidia/nemotron-3-ultra-550b-a55b` |
|
||||
| NovitaAI | `novita` | `NOVITA_API_KEY` | `novita/deepseek/deepseek-v3-0324` |
|
||||
| [Ollama Cloud](/providers/ollama-cloud) | `ollama-cloud` | `OLLAMA_API_KEY` | `ollama-cloud/kimi-k2.6` |
|
||||
| OpenRouter | `openrouter` | OpenRouter OAuth or `OPENROUTER_API_KEY` | `openrouter/auto` |
|
||||
| Qianfan | `qianfan` | `QIANFAN_API_KEY` | `qianfan/deepseek-v3.2` |
|
||||
| Tencent TokenHub | `tencent-tokenhub` | `TOKENHUB_API_KEY` | `tencent-tokenhub/hy3-preview` |
|
||||
| Together | `together` | `TOGETHER_API_KEY` | `together/meta-llama/Llama-3.3-70B-Instruct-Turbo` |
|
||||
| Venice | `venice` | `VENICE_API_KEY` | - |
|
||||
| Vercel AI Gateway | `vercel-ai-gateway` | `AI_GATEWAY_API_KEY` | `vercel-ai-gateway/anthropic/claude-opus-4.6` |
|
||||
| Volcano Engine (Doubao) | `volcengine` / `volcengine-plan` | `VOLCANO_ENGINE_API_KEY` | `volcengine-plan/ark-code-latest` |
|
||||
| xAI | `xai` | SuperGrok/X Premium OAuth or `XAI_API_KEY` | `xai/grok-4.7` |
|
||||
| Xiaomi | `xiaomi` / `xiaomi-token-plan` | `XIAOMI_API_KEY` / `XIAOMI_TOKEN_PLAN_API_KEY` | `xiaomi/mimo-v2.6-pro` / `xiaomi-token-plan/mimo-v2.6-pro` |
|
||||
|
||||
#### Quirks worth knowing
|
||||
|
||||
|
|
|
|||
|
|
@ -37,12 +37,12 @@ read_when:
|
|||
ownership: "explicit",
|
||||
entries: {
|
||||
coder: {
|
||||
model: "xiaomi/mimo-v2.5-pro",
|
||||
model: "xiaomi/mimo-v2.6-pro",
|
||||
thinkingDefault: "high",
|
||||
params: { temperature: 0.1 },
|
||||
},
|
||||
chat: {
|
||||
model: "xiaomi/mimo-v2.5-pro",
|
||||
model: "xiaomi/mimo-v2.6-pro",
|
||||
thinkingDefault: "off",
|
||||
params: { temperature: 0.8 },
|
||||
},
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ Xiaomi MiMo is the API platform for **MiMo** models. The official external
|
|||
| API | OpenAI-compatible chat completions (`openai-completions`) |
|
||||
| Speech contract | `speechProviders: ["xiaomi"]` |
|
||||
| Base URLs | Pay-as-you-go: `https://api.xiaomimimo.com/v1`; Token Plan: `token-plan-{cn,sgp,ams}.xiaomimimo.com/v1` |
|
||||
| Default models | `xiaomi/mimo-v2.5`, `xiaomi-token-plan/mimo-v2.5-pro` |
|
||||
| Default models | `xiaomi/mimo-v2.6-pro`, `xiaomi-token-plan/mimo-v2.6-pro` |
|
||||
| TTS default | `mimo-v2.5-tts`, voice `mimo_default`; voicedesign model `mimo-v2.5-tts-voicedesign` |
|
||||
|
||||
## Getting started
|
||||
|
|
@ -76,10 +76,13 @@ Onboarding validates the key shape and warns when a `tp-...` key is entered into
|
|||
|
||||
## Pay-as-you-go catalog
|
||||
|
||||
| Model ref | Input | Context | Max output | Reasoning | Notes |
|
||||
| ---------------------- | ----------- | --------- | ---------- | --------- | ------------- |
|
||||
| `xiaomi/mimo-v2.5` | text, image | 1,048,576 | 131,072 | Yes | Default model |
|
||||
| `xiaomi/mimo-v2.5-pro` | text | 1,048,576 | 131,072 | Yes | Flagship |
|
||||
| Model ref | Input | Context | Max output | Reasoning | Notes |
|
||||
| --------------------------------- | ----------- | --------- | ---------- | --------- | ---------------------- |
|
||||
| `xiaomi/mimo-v2.6-pro` | text, image | 1,048,576 | 131,072 | Yes | Default flagship |
|
||||
| `xiaomi/mimo-v2.6-flash` | text, image | 1,048,576 | 131,072 | Yes | Efficient model |
|
||||
| `xiaomi/mimo-v2.6-pro-ultraspeed` | text, image | 1,048,576 | 131,072 | Yes | Up to 20x output speed |
|
||||
| `xiaomi/mimo-v2.5` | text, image | 1,048,576 | 131,072 | Yes | Previous generation |
|
||||
| `xiaomi/mimo-v2.5-pro` | text | 1,048,576 | 131,072 | Yes | Previous generation |
|
||||
|
||||
## Token Plan catalog
|
||||
|
||||
|
|
@ -94,10 +97,12 @@ Choose the Token Plan auth choice that matches the regional base URL shown in Xi
|
|||
| `xiaomi-token-plan-sgp` | `https://token-plan-sgp.xiaomimimo.com/v1` |
|
||||
| `xiaomi-token-plan-ams` | `https://token-plan-ams.xiaomimimo.com/v1` |
|
||||
|
||||
| Model ref | Input | Context | Max output | Reasoning | Notes |
|
||||
| --------------------------------- | ----------- | --------- | ---------- | --------- | ------------- |
|
||||
| `xiaomi-token-plan/mimo-v2.5-pro` | text | 1,048,576 | 131,072 | Yes | Default model |
|
||||
| `xiaomi-token-plan/mimo-v2.5` | text, image | 1,048,576 | 131,072 | Yes | Multimodal |
|
||||
| Model ref | Input | Context | Max output | Reasoning | Notes |
|
||||
| ----------------------------------- | ----------- | --------- | ---------- | --------- | ------------------- |
|
||||
| `xiaomi-token-plan/mimo-v2.6-pro` | text, image | 1,048,576 | 131,072 | Yes | Default model |
|
||||
| `xiaomi-token-plan/mimo-v2.6-flash` | text, image | 1,048,576 | 131,072 | Yes | Efficient model |
|
||||
| `xiaomi-token-plan/mimo-v2.5-pro` | text | 1,048,576 | 131,072 | Yes | Previous generation |
|
||||
| `xiaomi-token-plan/mimo-v2.5` | text, image | 1,048,576 | 131,072 | Yes | Previous generation |
|
||||
|
||||
`xiaomi-token-plan` needs a regional base URL to resolve. The supported path
|
||||
is a Token Plan onboarding choice or an explicit
|
||||
|
|
@ -106,7 +111,7 @@ provider is not offered without one of those.
|
|||
|
||||
## Reasoning models
|
||||
|
||||
`mimo-v2.5` and `mimo-v2.5-pro` support
|
||||
The MiMo V2.5 and V2.6 text models support
|
||||
OpenClaw's [`/think` directive](/tools/thinking) with levels `off`,
|
||||
`minimal`, `low`, `medium`, `high`, `xhigh`, and `max` (default `high`).
|
||||
|
||||
|
|
@ -177,7 +182,7 @@ mono Opus with `ffmpeg` before delivery.
|
|||
```json5
|
||||
{
|
||||
env: { vars: { XIAOMI_API_KEY: "your-key" } },
|
||||
agents: { defaults: { model: { primary: "xiaomi/mimo-v2.5" } } },
|
||||
agents: { defaults: { model: { primary: "xiaomi/mimo-v2.6-pro" } } },
|
||||
models: {
|
||||
mode: "merge",
|
||||
providers: {
|
||||
|
|
@ -187,18 +192,18 @@ mono Opus with `ffmpeg` before delivery.
|
|||
apiKey: "XIAOMI_API_KEY",
|
||||
models: [
|
||||
{
|
||||
id: "mimo-v2.5",
|
||||
name: "Xiaomi MiMo V2.5",
|
||||
id: "mimo-v2.6-pro",
|
||||
name: "Xiaomi MiMo V2.6 Pro",
|
||||
reasoning: true,
|
||||
input: ["text", "image"],
|
||||
contextWindow: 1048576,
|
||||
maxTokens: 131072,
|
||||
},
|
||||
{
|
||||
id: "mimo-v2.5-pro",
|
||||
name: "Xiaomi MiMo V2.5 Pro",
|
||||
id: "mimo-v2.6-flash",
|
||||
name: "Xiaomi MiMo V2.6 Flash",
|
||||
reasoning: true,
|
||||
input: ["text"],
|
||||
input: ["text", "image"],
|
||||
contextWindow: 1048576,
|
||||
maxTokens: 131072,
|
||||
},
|
||||
|
|
@ -217,7 +222,7 @@ Token Plan:
|
|||
```json5
|
||||
{
|
||||
env: { vars: { XIAOMI_TOKEN_PLAN_API_KEY: "tp-your-key" } },
|
||||
agents: { defaults: { model: { primary: "xiaomi-token-plan/mimo-v2.5-pro" } } },
|
||||
agents: { defaults: { model: { primary: "xiaomi-token-plan/mimo-v2.6-pro" } } },
|
||||
models: {
|
||||
mode: "merge",
|
||||
providers: {
|
||||
|
|
@ -227,16 +232,16 @@ Token Plan:
|
|||
apiKey: "XIAOMI_TOKEN_PLAN_API_KEY",
|
||||
models: [
|
||||
{
|
||||
id: "mimo-v2.5-pro",
|
||||
name: "Xiaomi MiMo V2.5 Pro",
|
||||
id: "mimo-v2.6-pro",
|
||||
name: "Xiaomi MiMo V2.6 Pro",
|
||||
reasoning: true,
|
||||
input: ["text"],
|
||||
input: ["text", "image"],
|
||||
contextWindow: 1048576,
|
||||
maxTokens: 131072,
|
||||
},
|
||||
{
|
||||
id: "mimo-v2.5",
|
||||
name: "Xiaomi MiMo V2.5",
|
||||
id: "mimo-v2.6-flash",
|
||||
name: "Xiaomi MiMo V2.6 Flash",
|
||||
reasoning: true,
|
||||
input: ["text", "image"],
|
||||
contextWindow: 1048576,
|
||||
|
|
@ -259,8 +264,10 @@ USD pricing, so its catalog rows use zero USD cost and the config example omits
|
|||
</Accordion>
|
||||
|
||||
<Accordion title="Model details">
|
||||
- **mimo-v2.5** - pay-as-you-go default and Token Plan multimodal V2.5 route.
|
||||
- **mimo-v2.5-pro** - flagship reasoning model and Token Plan default.
|
||||
- **mimo-v2.6-pro** - flagship reasoning model and default for both providers.
|
||||
- **mimo-v2.6-flash** - efficient pay-as-you-go and Token Plan route.
|
||||
- **mimo-v2.6-pro-ultraspeed** - pay-as-you-go flagship route with up to 20x output speed.
|
||||
- **mimo-v2.5** and **mimo-v2.5-pro** - previous-generation compatibility routes.
|
||||
|
||||
<Note>
|
||||
Pay-as-you-go models use the `xiaomi/` prefix. Token Plan models use the `xiaomi-token-plan/` prefix.
|
||||
|
|
|
|||
|
|
@ -96,7 +96,7 @@ Bundled provider catalogs currently flag these models as `"preferred"`:
|
|||
| minimax | `MiniMax-M3` |
|
||||
| moonshot | `kimi-k3` |
|
||||
| openai | `gpt-5.6`, `gpt-5.6-sol`, `gpt-5.6-terra`, `gpt-5.6-luna`, `gpt-5.5`, `gpt-5.5-pro` |
|
||||
| xiaomi | `mimo-v2.5` |
|
||||
| xiaomi | `mimo-v2.6-pro`, `mimo-v2.6-flash` |
|
||||
| zai | `glm-5.3`, `glm-5.2`, `glm-5.1` |
|
||||
|
||||
Everything else, including all Ollama-served local models, stays unflagged and
|
||||
|
|
|
|||
|
|
@ -69,7 +69,12 @@ async function getXiaomiTokenPlanProvider() {
|
|||
}
|
||||
|
||||
function mimoReasoningModel(
|
||||
id: "mimo-v2.5" | "mimo-v2.5-pro" | "mimo-v2.6-pro",
|
||||
id:
|
||||
| "mimo-v2.5"
|
||||
| "mimo-v2.5-pro"
|
||||
| "mimo-v2.6-flash"
|
||||
| "mimo-v2.6-pro"
|
||||
| "mimo-v2.6-pro-ultraspeed",
|
||||
provider: "xiaomi" | "xiaomi-token-plan" = "xiaomi",
|
||||
): OpenAICompletionsModel {
|
||||
return {
|
||||
|
|
@ -255,18 +260,46 @@ describe("xiaomi provider plugin", () => {
|
|||
expect(catalogProvider.baseUrl).toBe("https://api.xiaomimimo.com/v1");
|
||||
|
||||
expect(catalogProvider.models?.map((model) => model.id)).toEqual([
|
||||
"mimo-v2.6-pro",
|
||||
"mimo-v2.6-flash",
|
||||
"mimo-v2.6-pro-ultraspeed",
|
||||
"mimo-v2.5",
|
||||
"mimo-v2.5-pro",
|
||||
]);
|
||||
expect(catalogProvider.models?.find((m) => m.id === "mimo-v2.5")?.input).toEqual([
|
||||
expect(catalogProvider.models?.find((m) => m.id === "mimo-v2.6-flash")?.input).toEqual([
|
||||
"text",
|
||||
"image",
|
||||
]);
|
||||
expect(catalogProvider.models?.find((m) => m.id === "mimo-v2.6-flash")?.cost).toEqual({
|
||||
input: 0.14,
|
||||
output: 0.28,
|
||||
cacheRead: 0.0028,
|
||||
cacheWrite: 0,
|
||||
});
|
||||
expect(catalogProvider.models?.find((m) => m.id === "mimo-v2.6-pro")?.cost).toEqual({
|
||||
input: 0.435,
|
||||
output: 0.87,
|
||||
cacheRead: 0.0036,
|
||||
cacheWrite: 0,
|
||||
});
|
||||
expect(catalogProvider.models?.find((m) => m.id === "mimo-v2.6-pro-ultraspeed")?.cost).toEqual({
|
||||
input: 4.35,
|
||||
output: 8.7,
|
||||
cacheRead: 0.036,
|
||||
cacheWrite: 0,
|
||||
});
|
||||
expect(catalogProvider.models?.every((model) => model.reasoning)).toBe(true);
|
||||
});
|
||||
|
||||
it("exposes Token Plan v2.5 catalog rows only after a provider config selects a region", async () => {
|
||||
const response = Response.json({ data: [{ id: "mimo-v2.5" }, { id: "mimo-v2.5-pro" }] });
|
||||
it("exposes Token Plan catalog rows only after a provider config selects a region", async () => {
|
||||
const response = Response.json({
|
||||
data: [
|
||||
{ id: "mimo-v2.6-pro" },
|
||||
{ id: "mimo-v2.6-flash" },
|
||||
{ id: "mimo-v2.5" },
|
||||
{ id: "mimo-v2.5-pro" },
|
||||
],
|
||||
});
|
||||
const release = vi.fn(async () => undefined);
|
||||
const guardedFetch = vi.spyOn(ssrfRuntime, "fetchWithSsrFGuard").mockResolvedValue({
|
||||
response,
|
||||
|
|
@ -317,11 +350,12 @@ describe("xiaomi provider plugin", () => {
|
|||
expect(configured.provider.models?.map((model) => model.id)).toEqual([
|
||||
"mimo-v2.5",
|
||||
"mimo-v2.5-pro",
|
||||
"mimo-v2.6-flash",
|
||||
"mimo-v2.6-pro",
|
||||
]);
|
||||
expect(configured.provider.models?.find((model) => model.id === "mimo-v2.5")?.input).toEqual([
|
||||
"text",
|
||||
"image",
|
||||
]);
|
||||
expect(
|
||||
configured.provider.models?.find((model) => model.id === "mimo-v2.6-flash")?.input,
|
||||
).toEqual(["text", "image"]);
|
||||
for (const model of configured.provider.models ?? []) {
|
||||
expect(model.cost).toEqual({ input: 0, output: 0, cacheRead: 0, cacheWrite: 0 });
|
||||
}
|
||||
|
|
@ -474,7 +508,13 @@ describe("xiaomi provider plugin", () => {
|
|||
);
|
||||
const expectedLevels = ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
|
||||
|
||||
for (const modelId of ["mimo-v2.5", "mimo-v2.5-pro", "mimo-v2.6-pro"]) {
|
||||
for (const modelId of [
|
||||
"mimo-v2.5",
|
||||
"mimo-v2.5-pro",
|
||||
"mimo-v2.6-flash",
|
||||
"mimo-v2.6-pro",
|
||||
"mimo-v2.6-pro-ultraspeed",
|
||||
]) {
|
||||
const profile = resolveThinkingProfile({ provider: "xiaomi", modelId } as never);
|
||||
expect(profile?.levels.map((l) => l.id)).toEqual(expectedLevels);
|
||||
expect(profile?.defaultLevel).toBe("high");
|
||||
|
|
@ -494,6 +534,12 @@ describe("xiaomi provider plugin", () => {
|
|||
expect(
|
||||
provider.isModernModelRef?.({ provider: "xiaomi", modelId: "mimo-v2.6-pro" } as never),
|
||||
).toBe(true);
|
||||
expect(
|
||||
provider.isModernModelRef?.({
|
||||
provider: "xiaomi",
|
||||
modelId: "mimo-v2.6-pro-ultraspeed",
|
||||
} as never),
|
||||
).toBe(true);
|
||||
expect(
|
||||
provider.isModernModelRef?.({ provider: "xiaomi", modelId: "custom-model" } as never),
|
||||
).toBe(false);
|
||||
|
|
|
|||
|
|
@ -16,9 +16,17 @@ describe("xiaomi onboard", () => {
|
|||
const cfg = applyXiaomiConfig({});
|
||||
const provider = cfg.models?.providers?.xiaomi;
|
||||
expect(provider).toEqual(buildXiaomiProvider());
|
||||
expect(provider?.models.map((m) => m.id)).toEqual(["mimo-v2.5", "mimo-v2.5-pro"]);
|
||||
expect(cfg.agents?.defaults?.models?.["xiaomi/mimo-v2.5"]).toEqual({ alias: "Xiaomi" });
|
||||
expect(cfg.agents?.defaults?.model).toEqual({ primary: "xiaomi/mimo-v2.5" });
|
||||
expect(provider?.models.map((m) => m.id)).toEqual([
|
||||
"mimo-v2.6-pro",
|
||||
"mimo-v2.6-flash",
|
||||
"mimo-v2.6-pro-ultraspeed",
|
||||
"mimo-v2.5",
|
||||
"mimo-v2.5-pro",
|
||||
]);
|
||||
expect(cfg.agents?.defaults?.models?.["xiaomi/mimo-v2.6-pro"]).toEqual({
|
||||
alias: "Xiaomi",
|
||||
});
|
||||
expect(cfg.agents?.defaults?.model).toEqual({ primary: "xiaomi/mimo-v2.6-pro" });
|
||||
});
|
||||
|
||||
it("merges Xiaomi models and keeps existing provider overrides", () => {
|
||||
|
|
@ -33,6 +41,9 @@ describe("xiaomi onboard", () => {
|
|||
});
|
||||
expect(provider?.models.map((m) => m.id)).toEqual([
|
||||
"custom-model",
|
||||
"mimo-v2.6-pro",
|
||||
"mimo-v2.6-flash",
|
||||
"mimo-v2.6-pro-ultraspeed",
|
||||
"mimo-v2.5",
|
||||
"mimo-v2.5-pro",
|
||||
]);
|
||||
|
|
@ -45,14 +56,19 @@ describe("xiaomi onboard", () => {
|
|||
...buildXiaomiTokenPlanProvider(),
|
||||
baseUrl: "https://token-plan-ams.xiaomimimo.com/v1",
|
||||
});
|
||||
expect(provider?.models.map((m) => m.id)).toEqual(["mimo-v2.5-pro", "mimo-v2.5"]);
|
||||
expect(cfg.agents?.defaults?.models?.["xiaomi-token-plan/mimo-v2.5-pro"]).toEqual({
|
||||
alias: "Xiaomi MiMo V2.5 Pro",
|
||||
expect(provider?.models.map((m) => m.id)).toEqual([
|
||||
"mimo-v2.6-pro",
|
||||
"mimo-v2.6-flash",
|
||||
"mimo-v2.5-pro",
|
||||
"mimo-v2.5",
|
||||
]);
|
||||
expect(cfg.agents?.defaults?.models?.["xiaomi-token-plan/mimo-v2.6-pro"]).toEqual({
|
||||
alias: "Xiaomi MiMo V2.6 Pro",
|
||||
});
|
||||
expect(cfg.agents?.defaults?.model).toEqual({ primary: "xiaomi-token-plan/mimo-v2.5-pro" });
|
||||
expect(cfg.agents?.defaults?.model).toEqual({ primary: "xiaomi-token-plan/mimo-v2.6-pro" });
|
||||
expectProviderOnboardPrimaryModel({
|
||||
applyConfig: (config) => applyXiaomiTokenPlanConfig(config, "ams"),
|
||||
modelRef: "xiaomi-token-plan/mimo-v2.5-pro",
|
||||
modelRef: "xiaomi-token-plan/mimo-v2.6-pro",
|
||||
});
|
||||
});
|
||||
|
||||
|
|
@ -75,8 +91,8 @@ describe("xiaomi onboard", () => {
|
|||
for (const mode of [undefined, "merge"] as const) {
|
||||
const cfg = applyXiaomiTokenPlanConfig({ models: { mode } }, region);
|
||||
expect(cfg.models?.providers?.["xiaomi-token-plan"]?.models).toEqual([]);
|
||||
expect(cfg.agents?.defaults?.models?.["xiaomi-token-plan/mimo-v2.5-pro"]).toEqual({
|
||||
alias: "Xiaomi MiMo V2.5 Pro",
|
||||
expect(cfg.agents?.defaults?.models?.["xiaomi-token-plan/mimo-v2.6-pro"]).toEqual({
|
||||
alias: "Xiaomi MiMo V2.6 Pro",
|
||||
});
|
||||
expect(applyXiaomiTokenPlanConfig(cfg, region)).toEqual(cfg);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ const xiaomiTokenPlanPresetAppliers = createDefaultModelsPresetAppliers<[]>({
|
|||
return [
|
||||
{
|
||||
modelRef: XIAOMI_TOKEN_PLAN_DEFAULT_MODEL_REF,
|
||||
alias: defaultModel?.name ?? "MiMo V2.5 Pro",
|
||||
alias: defaultModel?.name ?? "Xiaomi MiMo V2.6 Pro",
|
||||
},
|
||||
];
|
||||
})(),
|
||||
|
|
|
|||
|
|
@ -30,6 +30,50 @@
|
|||
"baseUrl": "https://api.xiaomimimo.com/v1",
|
||||
"api": "openai-completions",
|
||||
"models": [
|
||||
{
|
||||
"id": "mimo-v2.6-pro",
|
||||
"name": "Xiaomi MiMo V2.6 Pro",
|
||||
"input": ["text", "image"],
|
||||
"reasoning": true,
|
||||
"contextWindow": 1048576,
|
||||
"maxTokens": 131072,
|
||||
"cost": {
|
||||
"input": 0.435,
|
||||
"output": 0.87,
|
||||
"cacheRead": 0.0036,
|
||||
"cacheWrite": 0
|
||||
},
|
||||
"compat": { "codeMode": "preferred" }
|
||||
},
|
||||
{
|
||||
"id": "mimo-v2.6-flash",
|
||||
"name": "Xiaomi MiMo V2.6 Flash",
|
||||
"input": ["text", "image"],
|
||||
"reasoning": true,
|
||||
"contextWindow": 1048576,
|
||||
"maxTokens": 131072,
|
||||
"cost": {
|
||||
"input": 0.14,
|
||||
"output": 0.28,
|
||||
"cacheRead": 0.0028,
|
||||
"cacheWrite": 0
|
||||
},
|
||||
"compat": { "codeMode": "preferred" }
|
||||
},
|
||||
{
|
||||
"id": "mimo-v2.6-pro-ultraspeed",
|
||||
"name": "Xiaomi MiMo V2.6 Pro UltraSpeed",
|
||||
"input": ["text", "image"],
|
||||
"reasoning": true,
|
||||
"contextWindow": 1048576,
|
||||
"maxTokens": 131072,
|
||||
"cost": {
|
||||
"input": 4.35,
|
||||
"output": 8.7,
|
||||
"cacheRead": 0.036,
|
||||
"cacheWrite": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "mimo-v2.5",
|
||||
"name": "Xiaomi MiMo V2.5",
|
||||
|
|
@ -65,6 +109,26 @@
|
|||
"baseUrl": "https://token-plan-sgp.xiaomimimo.com/v1",
|
||||
"api": "openai-completions",
|
||||
"models": [
|
||||
{
|
||||
"id": "mimo-v2.6-pro",
|
||||
"name": "Xiaomi MiMo V2.6 Pro",
|
||||
"input": ["text", "image"],
|
||||
"reasoning": true,
|
||||
"contextWindow": 1048576,
|
||||
"maxTokens": 131072,
|
||||
"cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 },
|
||||
"compat": { "codeMode": "preferred" }
|
||||
},
|
||||
{
|
||||
"id": "mimo-v2.6-flash",
|
||||
"name": "Xiaomi MiMo V2.6 Flash",
|
||||
"input": ["text", "image"],
|
||||
"reasoning": true,
|
||||
"contextWindow": 1048576,
|
||||
"maxTokens": 131072,
|
||||
"cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 },
|
||||
"compat": { "codeMode": "preferred" }
|
||||
},
|
||||
{
|
||||
"id": "mimo-v2.5-pro",
|
||||
"name": "Xiaomi MiMo V2.5 Pro",
|
||||
|
|
|
|||
|
|
@ -5,8 +5,8 @@ import manifest from "./openclaw.plugin.json" with { type: "json" };
|
|||
|
||||
export const XIAOMI_PROVIDER_ID = "xiaomi";
|
||||
export const XIAOMI_TOKEN_PLAN_PROVIDER_ID = "xiaomi-token-plan";
|
||||
export const XIAOMI_DEFAULT_MODEL_ID = "mimo-v2.5";
|
||||
export const XIAOMI_TOKEN_PLAN_DEFAULT_MODEL_ID = "mimo-v2.5-pro";
|
||||
export const XIAOMI_DEFAULT_MODEL_ID = "mimo-v2.6-pro";
|
||||
export const XIAOMI_TOKEN_PLAN_DEFAULT_MODEL_ID = "mimo-v2.6-pro";
|
||||
|
||||
const XIAOMI_TOKEN_PLAN_BASE_URLS = {
|
||||
ams: "https://token-plan-ams.xiaomimimo.com/v1",
|
||||
|
|
|
|||
|
|
@ -2,7 +2,13 @@
|
|||
import type { ProviderThinkingProfile } from "openclaw/plugin-sdk/plugin-entry";
|
||||
import { XIAOMI_PROVIDER_ID, XIAOMI_TOKEN_PLAN_PROVIDER_ID } from "./provider-catalog.js";
|
||||
|
||||
const MIMO_REASONING_MODEL_IDS = new Set(["mimo-v2.5", "mimo-v2.5-pro", "mimo-v2.6-pro"]);
|
||||
const MIMO_REASONING_MODEL_IDS = new Set([
|
||||
"mimo-v2.5",
|
||||
"mimo-v2.5-pro",
|
||||
"mimo-v2.6-flash",
|
||||
"mimo-v2.6-pro",
|
||||
"mimo-v2.6-pro-ultraspeed",
|
||||
]);
|
||||
|
||||
function isMiMoReasoningModelId(modelId: string): boolean {
|
||||
return MIMO_REASONING_MODEL_IDS.has(modelId.toLowerCase());
|
||||
|
|
|
|||
|
|
@ -161,10 +161,20 @@ describe("buildOpenAICompletionsParams sanitizes reasoning replay fields", () =>
|
|||
assertSanitizedFields: true,
|
||||
},
|
||||
{
|
||||
label: "preserves reasoning_content replay for custom MiMo V2.6 proxy routes",
|
||||
label: "preserves reasoning_content replay for custom MiMo V2.6 Pro proxy routes",
|
||||
model: { ...customMiMoProxyModel, id: "xiaomi/mimo-v2.6-pro" },
|
||||
assertSanitizedFields: true,
|
||||
},
|
||||
{
|
||||
label: "preserves reasoning_content replay for custom MiMo V2.6 Flash proxy routes",
|
||||
model: { ...customMiMoProxyModel, id: "xiaomi/mimo-v2.6-flash" },
|
||||
assertSanitizedFields: true,
|
||||
},
|
||||
{
|
||||
label: "preserves reasoning_content replay for custom MiMo V2.6 UltraSpeed proxy routes",
|
||||
model: { ...customMiMoProxyModel, id: "xiaomi/mimo-v2.6-pro-ultraspeed" },
|
||||
assertSanitizedFields: true,
|
||||
},
|
||||
{
|
||||
label: "preserves reasoning_content replay for custom Kimi K2 proxy routes",
|
||||
model: customKimiProxyModel,
|
||||
|
|
|
|||
|
|
@ -185,7 +185,9 @@ const REASONING_CONTENT_REPLAY_MODEL_IDS = new Set([
|
|||
"mimo-v2-omni",
|
||||
"mimo-v2.5",
|
||||
"mimo-v2.5-pro",
|
||||
"mimo-v2.6-flash",
|
||||
"mimo-v2.6-pro",
|
||||
"mimo-v2.6-pro-ultraspeed",
|
||||
]);
|
||||
|
||||
// Tier/access suffixes that some providers append to otherwise identical model
|
||||
|
|
|
|||
|
|
@ -828,12 +828,12 @@ describe("applyExtraParamsToAgent", () => {
|
|||
it("fills MiMo V2.6 reasoning_content for unowned OpenAI-compatible proxy models", () => {
|
||||
const payload = runResponsesPayloadMutationCase({
|
||||
applyProvider: "opencode",
|
||||
applyModelId: "xiaomi/mimo-v2.6-pro",
|
||||
applyModelId: "xiaomi/mimo-v2.6-flash",
|
||||
thinkingLevel: "high",
|
||||
model: {
|
||||
api: "openai-completions",
|
||||
provider: "opencode",
|
||||
id: "xiaomi/mimo-v2.6-pro",
|
||||
id: "xiaomi/mimo-v2.6-flash",
|
||||
} as Model<"openai-completions">,
|
||||
payload: {
|
||||
messages: [
|
||||
|
|
|
|||
|
|
@ -914,7 +914,7 @@ const MIMO_REASONING_OPENAI_COMPATIBLE_MODEL_IDS = new Set([
|
|||
"mimo-v2-omni",
|
||||
"mimo-v2.5",
|
||||
"mimo-v2.5-pro",
|
||||
"mimo-v2.6-pro",
|
||||
...["flash", "pro", "pro-ultraspeed"].map((variant) => `mimo-v2.6-${variant}`),
|
||||
]);
|
||||
const MIMO_REASONING_AS_VISIBLE_TEXT_MODEL_IDS = new Set(["mimo-v2-pro", "mimo-v2-omni"]);
|
||||
|
||||
|
|
|
|||
|
|
@ -395,7 +395,9 @@ describe("resolveTranscriptPolicy", () => {
|
|||
"moonshot/kimi-k3",
|
||||
"kimi-k2-thinking",
|
||||
"hf:moonshotai/kimi-k2-thinking",
|
||||
"xiaomi/mimo-v2.6-flash",
|
||||
"xiaomi/mimo-v2.6-pro",
|
||||
"xiaomi/mimo-v2.6-pro-ultraspeed",
|
||||
"xiaomi/mimo-v2.6-pro:cloud",
|
||||
])(
|
||||
"preserves historical reasoning for %s replay-required OpenAI-compatible models",
|
||||
|
|
|
|||
|
|
@ -177,7 +177,9 @@ const REASONING_CONTENT_REPLAY_MODEL_IDS = new Set([
|
|||
"mimo-v2-omni",
|
||||
"mimo-v2.5",
|
||||
"mimo-v2.5-pro",
|
||||
"mimo-v2.6-flash",
|
||||
"mimo-v2.6-pro",
|
||||
"mimo-v2.6-pro-ultraspeed",
|
||||
]);
|
||||
|
||||
function requiresReasoningContentReplay(modelId: string | null | undefined): boolean {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue