diff --git a/open-sse/config/providerModels.js b/open-sse/config/providerModels.js index a2a49ca..a3e76d3 100644 --- a/open-sse/config/providerModels.js +++ b/open-sse/config/providerModels.js @@ -527,6 +527,16 @@ export const PROVIDER_MODELS = { { id: "mimo-v2-omni", name: "MiMo V2 Omni" }, { id: "mimo-v2-flash", name: "MiMo V2 Flash" }, ], + "xiaomi-tokenplan": [ + { id: "mimo-v2.5-pro", name: "MiMo V2.5 Pro" }, + { id: "mimo-v2.5", name: "MiMo V2.5" }, + { id: "mimo-v2-pro", name: "MiMo V2 Pro" }, + { id: "mimo-v2-omni", name: "MiMo V2 Omni" }, + { id: "mimo-v2-tts", name: "MiMo V2 TTS" }, + { id: "mimo-v2.5-tts", name: "MiMo V2.5 TTS" }, + { id: "mimo-v2.5-tts-voiceclone", name: "MiMo V2.5 TTS Voice Clone" }, + { id: "mimo-v2.5-tts-voicedesign", name: "MiMo V2.5 TTS Voice Design" }, + ], hyperbolic: [ { id: "Qwen/QwQ-32B", name: "QwQ 32B" }, { id: "deepseek-ai/DeepSeek-R1", name: "DeepSeek R1" }, diff --git a/open-sse/config/providers.js b/open-sse/config/providers.js index 0997be7..6c9b130 100644 --- a/open-sse/config/providers.js +++ b/open-sse/config/providers.js @@ -387,6 +387,10 @@ export const PROVIDERS = { baseUrl: "https://api.xiaomimimo.com/v1/chat/completions", format: "openai" }, + "xiaomi-tokenplan": { + baseUrl: "https://token-plan-sgp.xiaomimimo.com/v1/chat/completions", + format: "openai" + }, // === Free-tier providers (synced from OmniRoute) === // Claude-format with Claude CLI header spoofing (auth: x-api-key) agentrouter: { baseUrl: "https://agentrouter.org/v1/messages", format: "claude", headers: { ...CLAUDE_CLI_SPOOF_HEADERS } }, diff --git a/open-sse/services/model.js b/open-sse/services/model.js index c791b5e..1ec86fd 100644 --- a/open-sse/services/model.js +++ b/open-sse/services/model.js @@ -67,6 +67,8 @@ const ALIAS_TO_PROVIDER_ID = { "perplexity-web": "perplexity-web", mimo: "xiaomi-mimo", "xiaomi-mimo": "xiaomi-mimo", + xmtp: "xiaomi-tokenplan", + "xiaomi-tokenplan": "xiaomi-tokenplan", cf: "cloudflare-ai", "cloudflare-ai": "cloudflare-ai", // Image/video providers diff --git a/public/providers/xiaomi-tokenplan.png b/public/providers/xiaomi-tokenplan.png new file mode 100644 index 0000000..1752aa9 Binary files /dev/null and b/public/providers/xiaomi-tokenplan.png differ diff --git a/src/app/api/providers/validate/route.js b/src/app/api/providers/validate/route.js index 5b396c1..ffd968f 100644 --- a/src/app/api/providers/validate/route.js +++ b/src/app/api/providers/validate/route.js @@ -353,6 +353,7 @@ export async function POST(request) { case "nanobanana": case "chutes": case "xiaomi-mimo": + case "xiaomi-tokenplan": case "nvidia": { const endpoints = { deepseek: "https://api.deepseek.com/models", @@ -373,7 +374,8 @@ export async function POST(request) { nanobanana: "https://api.nanobananaapi.ai/v1/models", chutes: "https://llm.chutes.ai/v1/models", nvidia: "https://integrate.api.nvidia.com/v1/models", - "xiaomi-mimo": "https://api.xiaomimimo.com/v1/models" + "xiaomi-mimo": "https://api.xiaomimimo.com/v1/models", + "xiaomi-tokenplan": "https://token-plan-sgp.xiaomimimo.com/v1/models" }; const headers = {}; if (apiKey) headers["Authorization"] = `Bearer ${apiKey}`; diff --git a/src/shared/constants/providers.js b/src/shared/constants/providers.js index afa6a96..2b56886 100644 --- a/src/shared/constants/providers.js +++ b/src/shared/constants/providers.js @@ -73,6 +73,7 @@ export const APIKEY_PROVIDERS = { alicode: { id: "alicode", alias: "alicode", name: "Alibaba", icon: "cloud", color: "#FF6A00", textIcon: "ALi", website: "https://bailian.console.aliyun.com", notice: { apiKeyUrl: "https://bailian.console.aliyun.com/?apiKey=1" } }, "alicode-intl": { id: "alicode-intl", alias: "alicode-intl", name: "Alibaba Intl", icon: "cloud", color: "#FF6A00", textIcon: "ALi", website: "https://modelstudio.console.alibabacloud.com", notice: { apiKeyUrl: "https://modelstudio.console.alibabacloud.com/?apiKey=1" } }, "xiaomi-mimo": { id: "xiaomi-mimo", alias: "mimo", name: "Xiaomi MiMo", icon: "smart_toy", color: "#FF6900", textIcon: "XM", website: "https://xiaomimimo.com", notice: { apiKeyUrl: "https://xiaomimimo.com" } }, + "xiaomi-tokenplan": { id: "xiaomi-tokenplan", alias: "xmtp", name: "Xiaomi MiMo (Token Plan)", icon: "smart_toy", color: "#FF6700", textIcon: "XT", website: "https://mimo.xiaomi.com", notice: { text: "Xiaomi MiMo Token Plan subscription (API key starts with tp-). Uses Singapore endpoint.", apiKeyUrl: "https://mimo.xiaomi.com" } }, "volcengine-ark": { id: "volcengine-ark", alias: "ark", name: "Volcengine Ark", icon: "cloud", color: "#1677FF", textIcon: "ARK", website: "https://ark.cn-beijing.volces.com", notice: { apiKeyUrl: "https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey" } }, openai: { id: "openai", alias: "openai", name: "OpenAI", icon: "auto_awesome", color: "#10A37F", textIcon: "OA", website: "https://platform.openai.com", notice: { apiKeyUrl: "https://platform.openai.com/api-keys" }, serviceKinds: ["llm", "embedding", "tts", "stt", "image", "imageToText", "webSearch"], thinkingConfig: THINKING_CONFIG.effort, searchViaChat: { defaultModel: "gpt-4o-mini", pricingUrl: "https://openai.com/api/pricing" }, ttsConfig: { baseUrl: "https://api.openai.com/v1/audio/speech", authType: "apikey", authHeader: "bearer", format: "openai", models: [{ id: "tts-1", name: "TTS-1" }, { id: "tts-1-hd", name: "TTS-1 HD" }, { id: "gpt-4o-mini-tts", name: "GPT-4o Mini TTS" }] }, sttConfig: { baseUrl: "https://api.openai.com/v1/audio/transcriptions", authType: "apikey", authHeader: "bearer", format: "openai", models: [{ id: "whisper-1", name: "Whisper 1" }, { id: "gpt-4o-transcribe", name: "GPT-4o Transcribe" }, { id: "gpt-4o-mini-transcribe", name: "GPT-4o Mini Transcribe" }] }, embeddingConfig: { baseUrl: "https://api.openai.com/v1/embeddings", authType: "apikey", authHeader: "bearer", models: [{ id: "text-embedding-3-small", name: "Text Embedding 3 Small", dimensions: 1536 }, { id: "text-embedding-3-large", name: "Text Embedding 3 Large", dimensions: 3072 }, { id: "text-embedding-ada-002", name: "Text Embedding Ada 002", dimensions: 1536 }] } }, anthropic: { id: "anthropic", alias: "anthropic", name: "Anthropic", icon: "smart_toy", color: "#D97757", textIcon: "AN", website: "https://console.anthropic.com", notice: { apiKeyUrl: "https://console.anthropic.com/settings/keys" }, serviceKinds: ["llm", "imageToText"] }, diff --git a/src/sse/services/model.js b/src/sse/services/model.js index a6ab3fc..d426e4f 100644 --- a/src/sse/services/model.js +++ b/src/sse/services/model.js @@ -1,8 +1,20 @@ // Re-export from open-sse with localDb integration import { getModelAliases, getComboByName, getProviderNodes } from "@/lib/localDb"; -import { parseModel, resolveModelAliasFromMap, getModelInfoCore } from "open-sse/services/model.js"; +import { parseModel as parseModelCore, resolveModelAliasFromMap, getModelInfoCore } from "open-sse/services/model.js"; -export { parseModel }; +// Local provider alias overrides (HMR-friendly, applied on top of open-sse map) +const LOCAL_PROVIDER_ALIASES = { + xmtp: "xiaomi-tokenplan", + "xiaomi-tokenplan": "xiaomi-tokenplan", +}; + +export function parseModel(modelStr) { + const parsed = parseModelCore(modelStr); + if (parsed?.providerAlias && LOCAL_PROVIDER_ALIASES[parsed.providerAlias]) { + return { ...parsed, provider: LOCAL_PROVIDER_ALIASES[parsed.providerAlias] }; + } + return parsed; +} /** * Resolve model alias from localDb