From 4984be82a1652d5935562101a3538497d9398e49 Mon Sep 17 00:00:00 2001 From: CharlesJay01 <38678594+CharlesJay01@users.noreply.github.com> Date: Sun, 12 Jul 2026 08:10:12 +0800 Subject: [PATCH] feat: add MiMo (Xiaomi) as AI provider (#887) * feat: add MiMo (Xiaomi) as AI provider * fix: correct MiMo default base URL, suggested models, and reasoning support - Default base URL was the China Token Plan endpoint (tp- keys only); switch to https://api.xiaomimimo.com/v1 which works with standard pay-as-you-go sk- keys. Token Plan users can override in settings. - Replace deprecated mimo-v2-flash suggestion with mimo-v2.5 (v2 series was deprecated on 2026-06-30). - Use createDeepSeek instead of createOpenAI so reasoning_content is passed back during multi-turn tool calls (MiMo returns 400 without it), matching the existing Kimi implementation. - Add mimo to SINGLE_SYSTEM_PROVIDERS so system messages are merged. - Fold validate-model case into the shared OpenAI-compatible group. - Drop the Bot icon special case; models.dev serves a real xiaomi logo via PROVIDER_LOGO_MAP. - Document MIMO_API_KEY/MIMO_BASE_URL in env.example and docs/{en,cn,ja}/ai-providers.md. * feat: show base URL hint for MiMo in provider settings MiMo has two endpoints tied to key type: pay-as-you-go keys (sk-...) use the default api.xiaomimimo.com/v1, while Token Plan keys (tp-...) require token-plan-cn.xiaomimimo.com/v1. Surface this under the Base URL field like the existing MiniMax hint, in all four locales. --------- Co-authored-by: mapengfei Co-authored-by: dayuan.jiang --- app/api/validate-model/route.ts | 5 +++-- components/provider-credentials-fields.tsx | 5 +++++ docs/cn/ai-providers.md | 15 ++++++++++++- docs/en/ai-providers.md | 15 ++++++++++++- docs/ja/ai-providers.md | 15 ++++++++++++- env.example | 5 +++++ lib/ai-providers.ts | 25 ++++++++++++++++++++-- lib/i18n/dictionaries/en.json | 4 +++- lib/i18n/dictionaries/ja.json | 4 +++- lib/i18n/dictionaries/zh-Hant.json | 4 +++- lib/i18n/dictionaries/zh.json | 4 +++- lib/types/model-config.ts | 7 ++++++ 12 files changed, 97 insertions(+), 11 deletions(-) diff --git a/app/api/validate-model/route.ts b/app/api/validate-model/route.ts index 6f3b5b9..9622b29 100644 --- a/app/api/validate-model/route.ts +++ b/app/api/validate-model/route.ts @@ -372,12 +372,13 @@ export async function POST(req: Request) { break } - // GLM, Qwen, Kimi, Qiniu, Novita - OpenAI compatible + // GLM, Qwen, Kimi, Qiniu, Novita, MiMo - OpenAI compatible case "glm": case "qwen": case "kimi": case "qiniu": - case "novita": { + case "novita": + case "mimo": { const baseURL = baseUrl || PROVIDER_INFO[provider as ProviderName]?.defaultBaseUrl || diff --git a/components/provider-credentials-fields.tsx b/components/provider-credentials-fields.tsx index 9a83020..8a9bf0d 100644 --- a/components/provider-credentials-fields.tsx +++ b/components/provider-credentials-fields.tsx @@ -249,6 +249,11 @@ export function ProviderCredentialsFields({ {dict.modelConfig.minimaxBaseUrlHint}

)} + {provider === "mimo" && ( +

+ {dict.modelConfig.mimoBaseUrlHint} +

+ )} )} diff --git a/docs/cn/ai-providers.md b/docs/cn/ai-providers.md index c221cd0..d963e68 100644 --- a/docs/cn/ai-providers.md +++ b/docs/cn/ai-providers.md @@ -308,6 +308,19 @@ AI_MODEL=your_model_id QINIU_BASE_URL=https://your-custom-endpoint ``` +### MiMo (小米) + +```bash +MIMO_API_KEY=your_api_key +AI_MODEL=mimo-v2.5-pro +``` + +可选的自定义端点(Token Plan 订阅用户请设置专属 Base URL): + +```bash +MIMO_BASE_URL=https://token-plan-cn.xiaomimimo.com/v1 +``` + ## 自动检测 如果您只配置了**一个**提供商的 API 密钥,系统将自动检测并使用该提供商。无需设置 `AI_PROVIDER`。 @@ -315,7 +328,7 @@ QINIU_BASE_URL=https://your-custom-endpoint 如果您配置了**多个** API 密钥,则必须显式设置 `AI_PROVIDER`: ```bash -AI_PROVIDER=google # 或:openai, anthropic, aihubmix, deepseek, siliconflow, doubao, azure, bedrock, openrouter, ollama, gateway, sglang, modelscope, minimax, glm, qwen, kimi, qiniu +AI_PROVIDER=google # 或:openai, anthropic, aihubmix, deepseek, siliconflow, doubao, azure, bedrock, openrouter, ollama, gateway, sglang, modelscope, minimax, glm, qwen, kimi, qiniu, mimo ``` ## 服务端多模型配置 diff --git a/docs/en/ai-providers.md b/docs/en/ai-providers.md index b89ef60..c23bf9c 100644 --- a/docs/en/ai-providers.md +++ b/docs/en/ai-providers.md @@ -323,6 +323,19 @@ Optional custom endpoint: QINIU_BASE_URL=https://your-custom-endpoint ``` +### MiMo (Xiaomi) + +```bash +MIMO_API_KEY=your_api_key +AI_MODEL=mimo-v2.5-pro +``` + +Optional custom endpoint (Token Plan subscribers should set their dedicated Base URL): + +```bash +MIMO_BASE_URL=https://token-plan-cn.xiaomimimo.com/v1 +``` + ## Auto-Detection If you only configure **one** provider's API key, the system will automatically detect and use that provider. No need to set `AI_PROVIDER`. @@ -330,7 +343,7 @@ If you only configure **one** provider's API key, the system will automatically If you configure **multiple** API keys, you must explicitly set `AI_PROVIDER`: ```bash -AI_PROVIDER=google # or: openai, anthropic, aihubmix, deepseek, siliconflow, doubao, azure, bedrock, openrouter, ollama, gateway, sglang, modelscope, minimax, glm, qwen, kimi, qiniu +AI_PROVIDER=google # or: openai, anthropic, aihubmix, deepseek, siliconflow, doubao, azure, bedrock, openrouter, ollama, gateway, sglang, modelscope, minimax, glm, qwen, kimi, qiniu, mimo ``` ## Server-Side Multi-Model Configuration diff --git a/docs/ja/ai-providers.md b/docs/ja/ai-providers.md index aeaffb2..b09a8bb 100644 --- a/docs/ja/ai-providers.md +++ b/docs/ja/ai-providers.md @@ -308,6 +308,19 @@ AI_MODEL=your_model_id QINIU_BASE_URL=https://your-custom-endpoint ``` +### MiMo (Xiaomi) + +```bash +MIMO_API_KEY=your_api_key +AI_MODEL=mimo-v2.5-pro +``` + +オプションのカスタムエンドポイント(Token Plan 加入者は専用の Base URL を設定してください): + +```bash +MIMO_BASE_URL=https://token-plan-cn.xiaomimimo.com/v1 +``` + ## 自動検出 **1つ**のプロバイダーの API キーのみを設定した場合、システムはそのプロバイダーを自動的に検出して使用します。`AI_PROVIDER` を設定する必要はありません。 @@ -315,7 +328,7 @@ QINIU_BASE_URL=https://your-custom-endpoint **複数**の API キーを設定する場合は、`AI_PROVIDER` を明示的に設定する必要があります: ```bash -AI_PROVIDER=google # または: openai, anthropic, aihubmix, deepseek, siliconflow, doubao, azure, bedrock, openrouter, ollama, gateway, sglang, modelscope, minimax, glm, qwen, kimi, qiniu +AI_PROVIDER=google # または: openai, anthropic, aihubmix, deepseek, siliconflow, doubao, azure, bedrock, openrouter, ollama, gateway, sglang, modelscope, minimax, glm, qwen, kimi, qiniu, mimo ``` ## サーバーサイドマルチモデル設定 diff --git a/env.example b/env.example index fbf1d49..d1fafb5 100644 --- a/env.example +++ b/env.example @@ -189,3 +189,8 @@ AI_MODEL=global.anthropic.claude-sonnet-4-5-20250929-v1:0 # Get your API key from: https://novita.ai/dashboard/key # NOVITA_API_KEY=your_novita_api_key # NOVITA_BASE_URL=https://api.novita.ai/openai # Optional, default + +# MiMo (Xiaomi) Configuration (Optional) +# Get your API key from: https://platform.xiaomimimo.com/ +# MIMO_API_KEY=your_mimo_api_key +# MIMO_BASE_URL=https://api.xiaomimimo.com/v1 # Optional, default. Token Plan users: https://token-plan-cn.xiaomimimo.com/v1 diff --git a/lib/ai-providers.ts b/lib/ai-providers.ts index 14798f5..61e19e7 100644 --- a/lib/ai-providers.ts +++ b/lib/ai-providers.ts @@ -32,6 +32,7 @@ export const SINGLE_SYSTEM_PROVIDERS = new Set([ "kimi", "qiniu", "novita", + "mimo", ]) /** @@ -116,6 +117,7 @@ const ALLOWED_CLIENT_PROVIDERS: ProviderName[] = [ "kimi", "minimax", "novita", + "mimo", ] // Bedrock provider options for Anthropic beta features @@ -540,7 +542,8 @@ function buildProviderOptions( case "qwen": case "kimi": case "qiniu": - case "novita": { + case "novita": + case "mimo": { // These providers don't have reasoning configs in AI SDK yet // Gateway passes through to underlying providers which handle their own configs break @@ -577,6 +580,7 @@ export const PROVIDER_ENV_VARS: Record = { kimi: "KIMI_API_KEY", minimax: "MINIMAX_API_KEY", novita: "NOVITA_API_KEY", + mimo: "MIMO_API_KEY", } /** @@ -1346,6 +1350,23 @@ export function getAIModel(overrides?: ClientOverrides): ModelConfig { break } + case "mimo": { + const apiKey = resolveApiKey(overrides, "MIMO_API_KEY") + const baseURL = resolveBaseURL( + overrides?.apiKey, + overrides?.baseUrl, + resolveBaseUrlEnv(overrides, "MIMO_BASE_URL"), + PROVIDER_INFO.mimo?.defaultBaseUrl, + ) + // Use createDeepSeek to properly handle reasoning_content for MiMo + // thinking models (e.g., mimo-v2.5-pro). MiMo's API requires + // reasoning_content to be passed back during multi-turn tool calls + // (returns 400 otherwise), same convention as DeepSeek and Kimi. + const mimoProvider = createDeepSeek({ apiKey, baseURL }) + model = mimoProvider(modelId) + break + } + case "glm": case "qwen": case "qiniu": @@ -1393,7 +1414,7 @@ export function getAIModel(overrides?: ClientOverrides): ModelConfig { default: throw new Error( - `Unknown AI provider: ${provider}. Supported providers: bedrock, openai, anthropic, google, azure, ollama, openrouter, aihubmix, deepseek, siliconflow, sglang, gateway, edgeone, doubao, modelscope, glm, qwen, qiniu, kimi, minimax, novita`, + `Unknown AI provider: ${provider}. Supported providers: bedrock, openai, anthropic, google, azure, ollama, openrouter, aihubmix, deepseek, siliconflow, sglang, gateway, edgeone, doubao, modelscope, glm, qwen, qiniu, kimi, minimax, novita, mimo`, ) } diff --git a/lib/i18n/dictionaries/en.json b/lib/i18n/dictionaries/en.json index 0de5b7b..e9ed6ac 100644 --- a/lib/i18n/dictionaries/en.json +++ b/lib/i18n/dictionaries/en.json @@ -34,7 +34,8 @@ "glm": "GLM", "qwen": "Qwen", "kimi": "Kimi", - "qiniu": "Qiniu" + "qiniu": "Qiniu", + "mimo": "MiMo (Xiaomi)" }, "chat": { "placeholder": "Describe your diagram or upload a file...", @@ -371,6 +372,7 @@ "baseUrlWithExample": "Base URL (optional, e.g. {example})", "customEndpoint": "Custom endpoint URL", "minimaxBaseUrlHint": "Use /anthropic for Anthropic-compatible API (recommended), or /v1 for OpenAI-compatible API", + "mimoBaseUrlHint": "Default works with pay-as-you-go keys (sk-...). Token Plan subscribers (tp-... keys) must set https://token-plan-cn.xiaomimimo.com/v1", "models": "Models", "customModelId": "Custom model ID...", "allAdded": "All added", diff --git a/lib/i18n/dictionaries/ja.json b/lib/i18n/dictionaries/ja.json index 262d7c6..0b7da83 100644 --- a/lib/i18n/dictionaries/ja.json +++ b/lib/i18n/dictionaries/ja.json @@ -34,7 +34,8 @@ "glm": "GLM", "qwen": "Qwen", "kimi": "Kimi", - "qiniu": "Qiniu" + "qiniu": "Qiniu", + "mimo": "MiMo (Xiaomi)" }, "chat": { "placeholder": "ダイアグラムを説明するか、ファイルをアップロード...", @@ -325,6 +326,7 @@ "baseUrlWithExample": "ベース URL(オプション、例: {example})", "customEndpoint": "カスタムエンドポイント URL", "minimaxBaseUrlHint": "/anthropic で Anthropic 互換 API(推奨)、または /v1 で OpenAI 互換 API を使用", + "mimoBaseUrlHint": "デフォルトは従量課金キー(sk-...)用です。Token Plan 加入者(tp-... キー)は https://token-plan-cn.xiaomimimo.com/v1 を設定してください", "models": "モデル", "customModelId": "カスタムモデル ID...", "allAdded": "すべて追加済み", diff --git a/lib/i18n/dictionaries/zh-Hant.json b/lib/i18n/dictionaries/zh-Hant.json index 586dcc4..6b7aa89 100644 --- a/lib/i18n/dictionaries/zh-Hant.json +++ b/lib/i18n/dictionaries/zh-Hant.json @@ -34,7 +34,8 @@ "glm": "GLM", "qwen": "Qwen", "kimi": "Kimi", - "qiniu": "Qiniu" + "qiniu": "Qiniu", + "mimo": "MiMo (小米)" }, "chat": { "placeholder": "描述您的圖表或上傳檔案...", @@ -371,6 +372,7 @@ "baseUrlWithExample": "基礎 URL(可選,例如 {example})", "customEndpoint": "自訂端點 URL", "minimaxBaseUrlHint": "使用 /anthropic 端點為 Anthropic 相容 API(推薦),或使用 /v1 端點為 OpenAI 相容 API", + "mimoBaseUrlHint": "預設地址適用於按量付費金鑰(sk-...)。Token Plan 訂閱用戶(tp-... 金鑰)請設定為 https://token-plan-cn.xiaomimimo.com/v1", "models": "模型", "customModelId": "自訂模型 ID...", "allAdded": "已全部新增", diff --git a/lib/i18n/dictionaries/zh.json b/lib/i18n/dictionaries/zh.json index 38c6404..8f4a4e2 100644 --- a/lib/i18n/dictionaries/zh.json +++ b/lib/i18n/dictionaries/zh.json @@ -34,7 +34,8 @@ "glm": "GLM", "qwen": "Qwen", "kimi": "Kimi", - "qiniu": "Qiniu" + "qiniu": "Qiniu", + "mimo": "MiMo (小米)" }, "chat": { "placeholder": "描述您的图表或上传文件...", @@ -371,6 +372,7 @@ "baseUrlWithExample": "基础 URL(可选,例如 {example})", "customEndpoint": "自定义端点 URL", "minimaxBaseUrlHint": "使用 /anthropic 端点为 Anthropic 兼容 API(推荐),或使用 /v1 端点为 OpenAI 兼容 API", + "mimoBaseUrlHint": "默认地址适用于按量付费密钥(sk-...)。Token Plan 订阅用户(tp-... 密钥)请设置为 https://token-plan-cn.xiaomimimo.com/v1", "models": "模型", "customModelId": "自定义模型 ID...", "allAdded": "已全部添加", diff --git a/lib/types/model-config.ts b/lib/types/model-config.ts index c715b3f..810edd3 100644 --- a/lib/types/model-config.ts +++ b/lib/types/model-config.ts @@ -23,6 +23,7 @@ export type ProviderName = | "kimi" | "minimax" | "novita" + | "mimo" // Individual model configuration export interface ModelConfig { @@ -114,6 +115,7 @@ export const PROVIDER_LOGO_MAP: Record = { modelscope: "modelscope", minimax: "minimax", novita: "novita", + mimo: "xiaomi", } // Provider metadata @@ -200,6 +202,10 @@ export const PROVIDER_INFO: Record< label: "Novita AI", defaultBaseUrl: "https://api.novita.ai/openai", }, + mimo: { + label: "MiMo (Xiaomi)", + defaultBaseUrl: "https://api.xiaomimimo.com/v1", + }, } // Suggested models per provider for quick add @@ -437,6 +443,7 @@ export const SUGGESTED_MODELS: Partial> = { "moonshotai/kimi-k2.6", "deepseek/deepseek-v4-flash", ], + mimo: ["mimo-v2.5-pro", "mimo-v2.5"], } // Helper to generate UUID