From e71b8759bb08cea4f695f62954d5f6341278ff5c Mon Sep 17 00:00:00 2001 From: AN Long Date: Sat, 30 May 2026 23:43:03 +0900 Subject: [PATCH 1/2] add xiaomi mimo providers --- .github/workflows/update.yml | 4 + cmd/xiaomi-mimo/main.go | 165 ++++++++++++++++++ .../configs/xiaomi-mimo-token-plan-ams.json | 65 +++++++ .../configs/xiaomi-mimo-token-plan-cn.json | 65 +++++++ .../configs/xiaomi-mimo-token-plan-sgp.json | 65 +++++++ internal/providers/configs/xiaomi-mimo.json | 65 +++++++ internal/providers/providers.go | 32 ++++ pkg/catwalk/provider.go | 76 ++++---- 8 files changed, 503 insertions(+), 34 deletions(-) create mode 100644 cmd/xiaomi-mimo/main.go create mode 100644 internal/providers/configs/xiaomi-mimo-token-plan-ams.json create mode 100644 internal/providers/configs/xiaomi-mimo-token-plan-cn.json create mode 100644 internal/providers/configs/xiaomi-mimo-token-plan-sgp.json create mode 100644 internal/providers/configs/xiaomi-mimo.json diff --git a/.github/workflows/update.yml b/.github/workflows/update.yml index 892aacf2..8114ea93 100644 --- a/.github/workflows/update.yml +++ b/.github/workflows/update.yml @@ -83,6 +83,10 @@ jobs: env: XAI_API_KEY: ${{ secrets.XAI_API_KEY }} + - name: Xiaomi MiMo + run: go run ./cmd/xiaomi-mimo/main.go + continue-on-error: true + - name: Create Pull Request uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1 with: diff --git a/cmd/xiaomi-mimo/main.go b/cmd/xiaomi-mimo/main.go new file mode 100644 index 00000000..7f1e8395 --- /dev/null +++ b/cmd/xiaomi-mimo/main.go @@ -0,0 +1,165 @@ +// Package main provides a command-line tool to generate Xiaomi MiMo provider +// configuration files. +package main + +import ( + "encoding/json" + "fmt" + "log" + "os" + + "charm.land/catwalk/pkg/catwalk" +) + +type providerConfig struct { + name string + id catwalk.InferenceProvider + apiKey string + apiEndpoint string + tokenPlan bool +} + +type providerFile struct { + path string + config providerConfig +} + +var reasoningLevels = []string{"low", "medium", "high"} + +func payAsYouGoModels() []catwalk.Model { + return []catwalk.Model{ + { + ID: "mimo-v2.5-pro", + Name: "MiMo V2.5 Pro", + CostPer1MIn: 0.435, + CostPer1MOut: 0.87, + CostPer1MInCached: 0.0036, + CostPer1MOutCached: 0, + ContextWindow: 1048576, + DefaultMaxTokens: 131072, + CanReason: true, + ReasoningLevels: reasoningLevels, + DefaultReasoningEffort: "medium", + SupportsImages: false, + }, + { + ID: "mimo-v2.5", + Name: "MiMo V2.5", + CostPer1MIn: 0.14, + CostPer1MOut: 0.28, + CostPer1MInCached: 0.0028, + CostPer1MOutCached: 0, + ContextWindow: 1048576, + DefaultMaxTokens: 131072, + CanReason: true, + ReasoningLevels: reasoningLevels, + DefaultReasoningEffort: "medium", + SupportsImages: true, + }, + { + ID: "mimo-v2-flash", + Name: "MiMo V2 Flash", + CostPer1MIn: 0.1, + CostPer1MOut: 0.3, + CostPer1MInCached: 0.01, + CostPer1MOutCached: 0, + ContextWindow: 262144, + DefaultMaxTokens: 65536, + CanReason: true, + ReasoningLevels: reasoningLevels, + DefaultReasoningEffort: "medium", + SupportsImages: false, + }, + } +} + +func tokenPlanModels() []catwalk.Model { + models := payAsYouGoModels() + for i := range models { + models[i].CostPer1MIn = 0 + models[i].CostPer1MOut = 0 + models[i].CostPer1MInCached = 0 + models[i].CostPer1MOutCached = 0 + } + return models +} + +func provider(config providerConfig) catwalk.Provider { + models := payAsYouGoModels() + if config.tokenPlan { + models = tokenPlanModels() + } + + return catwalk.Provider{ + Name: config.name, + ID: config.id, + APIKey: config.apiKey, + APIEndpoint: config.apiEndpoint, + Type: catwalk.TypeOpenAICompat, + DefaultLargeModelID: "mimo-v2.5-pro", + DefaultSmallModelID: "mimo-v2-flash", + Models: models, + } +} + +func writeProvider(path string, provider catwalk.Provider) { + data, err := json.MarshalIndent(provider, "", " ") + if err != nil { + log.Fatalf("Error marshaling %s: %v", provider.Name, err) + } + data = append(data, '\n') + + if err := os.WriteFile(path, data, 0o600); err != nil { + log.Fatalf("Error writing %s: %v", path, err) + } + + fmt.Printf("Generated %s with %d models\n", path, len(provider.Models)) +} + +func main() { + providers := []providerFile{ + { + path: "internal/providers/configs/xiaomi-mimo.json", + config: providerConfig{ + name: "Xiaomi MiMo", + id: catwalk.InferenceProviderXiaomiMiMo, + apiKey: "$MIMO_API_KEY", + apiEndpoint: "https://api.xiaomimimo.com/v1", + }, + }, + { + path: "internal/providers/configs/xiaomi-mimo-token-plan-ams.json", + config: providerConfig{ + name: "Xiaomi MiMo Token Plan (Europe)", + id: catwalk.InferenceProviderXiaomiMiMoTokenPlanAMS, + apiKey: "$MIMO_TOKEN_PLAN_API_KEY", + apiEndpoint: "https://token-plan-ams.xiaomimimo.com/v1", + tokenPlan: true, + }, + }, + { + path: "internal/providers/configs/xiaomi-mimo-token-plan-cn.json", + config: providerConfig{ + name: "Xiaomi MiMo Token Plan (China)", + id: catwalk.InferenceProviderXiaomiMiMoTokenPlanCN, + apiKey: "$MIMO_TOKEN_PLAN_API_KEY", + apiEndpoint: "https://token-plan-cn.xiaomimimo.com/v1", + tokenPlan: true, + }, + }, + { + path: "internal/providers/configs/xiaomi-mimo-token-plan-sgp.json", + config: providerConfig{ + name: "Xiaomi MiMo Token Plan (Singapore)", + id: catwalk.InferenceProviderXiaomiMiMoTokenPlanSGP, + apiKey: "$MIMO_TOKEN_PLAN_API_KEY", + apiEndpoint: "https://token-plan-sgp.xiaomimimo.com/v1", + tokenPlan: true, + }, + }, + } + + for _, providerFile := range providers { + writeProvider(providerFile.path, provider(providerFile.config)) + } +} diff --git a/internal/providers/configs/xiaomi-mimo-token-plan-ams.json b/internal/providers/configs/xiaomi-mimo-token-plan-ams.json new file mode 100644 index 00000000..63745c90 --- /dev/null +++ b/internal/providers/configs/xiaomi-mimo-token-plan-ams.json @@ -0,0 +1,65 @@ +{ + "name": "Xiaomi MiMo Token Plan (Europe)", + "id": "xiaomi-mimo-token-plan-ams", + "api_key": "$MIMO_TOKEN_PLAN_API_KEY", + "api_endpoint": "https://token-plan-ams.xiaomimimo.com/v1", + "type": "openai-compat", + "default_large_model_id": "mimo-v2.5-pro", + "default_small_model_id": "mimo-v2-flash", + "models": [ + { + "id": "mimo-v2.5-pro", + "name": "MiMo V2.5 Pro", + "cost_per_1m_in": 0, + "cost_per_1m_out": 0, + "cost_per_1m_in_cached": 0, + "cost_per_1m_out_cached": 0, + "context_window": 1048576, + "default_max_tokens": 131072, + "can_reason": true, + "reasoning_levels": [ + "low", + "medium", + "high" + ], + "default_reasoning_effort": "medium", + "supports_attachments": false + }, + { + "id": "mimo-v2.5", + "name": "MiMo V2.5", + "cost_per_1m_in": 0, + "cost_per_1m_out": 0, + "cost_per_1m_in_cached": 0, + "cost_per_1m_out_cached": 0, + "context_window": 1048576, + "default_max_tokens": 131072, + "can_reason": true, + "reasoning_levels": [ + "low", + "medium", + "high" + ], + "default_reasoning_effort": "medium", + "supports_attachments": true + }, + { + "id": "mimo-v2-flash", + "name": "MiMo V2 Flash", + "cost_per_1m_in": 0, + "cost_per_1m_out": 0, + "cost_per_1m_in_cached": 0, + "cost_per_1m_out_cached": 0, + "context_window": 262144, + "default_max_tokens": 65536, + "can_reason": true, + "reasoning_levels": [ + "low", + "medium", + "high" + ], + "default_reasoning_effort": "medium", + "supports_attachments": false + } + ] +} diff --git a/internal/providers/configs/xiaomi-mimo-token-plan-cn.json b/internal/providers/configs/xiaomi-mimo-token-plan-cn.json new file mode 100644 index 00000000..b2bb306d --- /dev/null +++ b/internal/providers/configs/xiaomi-mimo-token-plan-cn.json @@ -0,0 +1,65 @@ +{ + "name": "Xiaomi MiMo Token Plan (China)", + "id": "xiaomi-mimo-token-plan-cn", + "api_key": "$MIMO_TOKEN_PLAN_API_KEY", + "api_endpoint": "https://token-plan-cn.xiaomimimo.com/v1", + "type": "openai-compat", + "default_large_model_id": "mimo-v2.5-pro", + "default_small_model_id": "mimo-v2-flash", + "models": [ + { + "id": "mimo-v2.5-pro", + "name": "MiMo V2.5 Pro", + "cost_per_1m_in": 0, + "cost_per_1m_out": 0, + "cost_per_1m_in_cached": 0, + "cost_per_1m_out_cached": 0, + "context_window": 1048576, + "default_max_tokens": 131072, + "can_reason": true, + "reasoning_levels": [ + "low", + "medium", + "high" + ], + "default_reasoning_effort": "medium", + "supports_attachments": false + }, + { + "id": "mimo-v2.5", + "name": "MiMo V2.5", + "cost_per_1m_in": 0, + "cost_per_1m_out": 0, + "cost_per_1m_in_cached": 0, + "cost_per_1m_out_cached": 0, + "context_window": 1048576, + "default_max_tokens": 131072, + "can_reason": true, + "reasoning_levels": [ + "low", + "medium", + "high" + ], + "default_reasoning_effort": "medium", + "supports_attachments": true + }, + { + "id": "mimo-v2-flash", + "name": "MiMo V2 Flash", + "cost_per_1m_in": 0, + "cost_per_1m_out": 0, + "cost_per_1m_in_cached": 0, + "cost_per_1m_out_cached": 0, + "context_window": 262144, + "default_max_tokens": 65536, + "can_reason": true, + "reasoning_levels": [ + "low", + "medium", + "high" + ], + "default_reasoning_effort": "medium", + "supports_attachments": false + } + ] +} diff --git a/internal/providers/configs/xiaomi-mimo-token-plan-sgp.json b/internal/providers/configs/xiaomi-mimo-token-plan-sgp.json new file mode 100644 index 00000000..318c694f --- /dev/null +++ b/internal/providers/configs/xiaomi-mimo-token-plan-sgp.json @@ -0,0 +1,65 @@ +{ + "name": "Xiaomi MiMo Token Plan (Singapore)", + "id": "xiaomi-mimo-token-plan-sgp", + "api_key": "$MIMO_TOKEN_PLAN_API_KEY", + "api_endpoint": "https://token-plan-sgp.xiaomimimo.com/v1", + "type": "openai-compat", + "default_large_model_id": "mimo-v2.5-pro", + "default_small_model_id": "mimo-v2-flash", + "models": [ + { + "id": "mimo-v2.5-pro", + "name": "MiMo V2.5 Pro", + "cost_per_1m_in": 0, + "cost_per_1m_out": 0, + "cost_per_1m_in_cached": 0, + "cost_per_1m_out_cached": 0, + "context_window": 1048576, + "default_max_tokens": 131072, + "can_reason": true, + "reasoning_levels": [ + "low", + "medium", + "high" + ], + "default_reasoning_effort": "medium", + "supports_attachments": false + }, + { + "id": "mimo-v2.5", + "name": "MiMo V2.5", + "cost_per_1m_in": 0, + "cost_per_1m_out": 0, + "cost_per_1m_in_cached": 0, + "cost_per_1m_out_cached": 0, + "context_window": 1048576, + "default_max_tokens": 131072, + "can_reason": true, + "reasoning_levels": [ + "low", + "medium", + "high" + ], + "default_reasoning_effort": "medium", + "supports_attachments": true + }, + { + "id": "mimo-v2-flash", + "name": "MiMo V2 Flash", + "cost_per_1m_in": 0, + "cost_per_1m_out": 0, + "cost_per_1m_in_cached": 0, + "cost_per_1m_out_cached": 0, + "context_window": 262144, + "default_max_tokens": 65536, + "can_reason": true, + "reasoning_levels": [ + "low", + "medium", + "high" + ], + "default_reasoning_effort": "medium", + "supports_attachments": false + } + ] +} diff --git a/internal/providers/configs/xiaomi-mimo.json b/internal/providers/configs/xiaomi-mimo.json new file mode 100644 index 00000000..5dcd0c17 --- /dev/null +++ b/internal/providers/configs/xiaomi-mimo.json @@ -0,0 +1,65 @@ +{ + "name": "Xiaomi MiMo", + "id": "xiaomi-mimo", + "api_key": "$MIMO_API_KEY", + "api_endpoint": "https://api.xiaomimimo.com/v1", + "type": "openai-compat", + "default_large_model_id": "mimo-v2.5-pro", + "default_small_model_id": "mimo-v2-flash", + "models": [ + { + "id": "mimo-v2.5-pro", + "name": "MiMo V2.5 Pro", + "cost_per_1m_in": 0.435, + "cost_per_1m_out": 0.87, + "cost_per_1m_in_cached": 0.0036, + "cost_per_1m_out_cached": 0, + "context_window": 1048576, + "default_max_tokens": 131072, + "can_reason": true, + "reasoning_levels": [ + "low", + "medium", + "high" + ], + "default_reasoning_effort": "medium", + "supports_attachments": false + }, + { + "id": "mimo-v2.5", + "name": "MiMo V2.5", + "cost_per_1m_in": 0.14, + "cost_per_1m_out": 0.28, + "cost_per_1m_in_cached": 0.0028, + "cost_per_1m_out_cached": 0, + "context_window": 1048576, + "default_max_tokens": 131072, + "can_reason": true, + "reasoning_levels": [ + "low", + "medium", + "high" + ], + "default_reasoning_effort": "medium", + "supports_attachments": true + }, + { + "id": "mimo-v2-flash", + "name": "MiMo V2 Flash", + "cost_per_1m_in": 0.1, + "cost_per_1m_out": 0.3, + "cost_per_1m_in_cached": 0.01, + "cost_per_1m_out_cached": 0, + "context_window": 262144, + "default_max_tokens": 65536, + "can_reason": true, + "reasoning_levels": [ + "low", + "medium", + "high" + ], + "default_reasoning_effort": "medium", + "supports_attachments": false + } + ] +} diff --git a/internal/providers/providers.go b/internal/providers/providers.go index f73d9717..d787f2c5 100644 --- a/internal/providers/providers.go +++ b/internal/providers/providers.go @@ -102,6 +102,18 @@ var vertexAIConfig []byte //go:embed configs/xai.json var xAIConfig []byte +//go:embed configs/xiaomi-mimo.json +var xiaomiMiMoConfig []byte + +//go:embed configs/xiaomi-mimo-token-plan-ams.json +var xiaomiMiMoTokenPlanAMSConfig []byte + +//go:embed configs/xiaomi-mimo-token-plan-cn.json +var xiaomiMiMoTokenPlanCNConfig []byte + +//go:embed configs/xiaomi-mimo-token-plan-sgp.json +var xiaomiMiMoTokenPlanSGPConfig []byte + //go:embed configs/zai.json var zAIConfig []byte @@ -150,6 +162,10 @@ var providerRegistry = []ProviderFunc{ vercelProvider, veniceProvider, vertexAIProvider, + xiaomiMiMoProvider, + xiaomiMiMoTokenPlanAMSProvider, + xiaomiMiMoTokenPlanCNProvider, + xiaomiMiMoTokenPlanSGPProvider, zhipuProvider, zhipuCodingProvider, } @@ -296,6 +312,22 @@ func xAIProvider() catwalk.Provider { return loadProviderFromConfig(xAIConfig) } +func xiaomiMiMoProvider() catwalk.Provider { + return loadProviderFromConfig(xiaomiMiMoConfig) +} + +func xiaomiMiMoTokenPlanAMSProvider() catwalk.Provider { + return loadProviderFromConfig(xiaomiMiMoTokenPlanAMSConfig) +} + +func xiaomiMiMoTokenPlanCNProvider() catwalk.Provider { + return loadProviderFromConfig(xiaomiMiMoTokenPlanCNConfig) +} + +func xiaomiMiMoTokenPlanSGPProvider() catwalk.Provider { + return loadProviderFromConfig(xiaomiMiMoTokenPlanSGPConfig) +} + func zAIProvider() catwalk.Provider { return loadProviderFromConfig(zAIConfig) } diff --git a/pkg/catwalk/provider.go b/pkg/catwalk/provider.go index 55835825..dd5526e1 100644 --- a/pkg/catwalk/provider.go +++ b/pkg/catwalk/provider.go @@ -21,40 +21,44 @@ type InferenceProvider string // All the inference providers supported by the system. const ( - InferenceProviderOpenAI InferenceProvider = "openai" - InferenceProviderAnthropic InferenceProvider = "anthropic" - InferenceProviderSynthetic InferenceProvider = "synthetic" - InferenceProviderGemini InferenceProvider = "gemini" - InferenceProviderAzure InferenceProvider = "azure" - InferenceProviderBedrock InferenceProvider = "bedrock" - InferenceProviderBedrockEurope InferenceProvider = "bedrock-europe" - InferenceProviderVertexAI InferenceProvider = "vertexai" - InferenceProviderXAI InferenceProvider = "xai" - InferenceProviderZAI InferenceProvider = "zai" - InferenceProviderDeepSeek InferenceProvider = "deepseek" - InferenceProviderZhipu InferenceProvider = "zhipu" - InferenceProviderZhipuCoding InferenceProvider = "zhipu-coding" - InferenceProviderGROQ InferenceProvider = "groq" - InferenceProviderOpenRouter InferenceProvider = "openrouter" - InferenceProviderCerebras InferenceProvider = "cerebras" - InferenceProviderVenice InferenceProvider = "venice" - InferenceProviderChutes InferenceProvider = "chutes" - InferenceProviderHuggingFace InferenceProvider = "huggingface" - InferenceAIHubMix InferenceProvider = "aihubmix" - InferenceKimiCoding InferenceProvider = "kimi-coding" - InferenceProviderCopilot InferenceProvider = "copilot" - InferenceProviderCortecs InferenceProvider = "cortecs" - InferenceProviderVercel InferenceProvider = "vercel" - InferenceProviderMiniMax InferenceProvider = "minimax" - InferenceProviderMiniMaxChina InferenceProvider = "minimax-china" - InferenceProviderIoNet InferenceProvider = "ionet" - InferenceProviderQiniuCloud InferenceProvider = "qiniucloud" - InferenceProviderAvian InferenceProvider = "avian" - InferenceProviderNebius InferenceProvider = "nebius" - InferenceProviderNeuralwatt InferenceProvider = "neuralwatt" - InferenceProviderOpenCodeZen InferenceProvider = "opencode-zen" - InferenceProviderOpenCodeGo InferenceProvider = "opencode-go" - InferenceProviderAlibabaSingapore InferenceProvider = "alibaba-singapore" + InferenceProviderOpenAI InferenceProvider = "openai" + InferenceProviderAnthropic InferenceProvider = "anthropic" + InferenceProviderSynthetic InferenceProvider = "synthetic" + InferenceProviderGemini InferenceProvider = "gemini" + InferenceProviderAzure InferenceProvider = "azure" + InferenceProviderBedrock InferenceProvider = "bedrock" + InferenceProviderBedrockEurope InferenceProvider = "bedrock-europe" + InferenceProviderVertexAI InferenceProvider = "vertexai" + InferenceProviderXAI InferenceProvider = "xai" + InferenceProviderZAI InferenceProvider = "zai" + InferenceProviderDeepSeek InferenceProvider = "deepseek" + InferenceProviderZhipu InferenceProvider = "zhipu" + InferenceProviderZhipuCoding InferenceProvider = "zhipu-coding" + InferenceProviderGROQ InferenceProvider = "groq" + InferenceProviderOpenRouter InferenceProvider = "openrouter" + InferenceProviderCerebras InferenceProvider = "cerebras" + InferenceProviderVenice InferenceProvider = "venice" + InferenceProviderChutes InferenceProvider = "chutes" + InferenceProviderHuggingFace InferenceProvider = "huggingface" + InferenceAIHubMix InferenceProvider = "aihubmix" + InferenceKimiCoding InferenceProvider = "kimi-coding" + InferenceProviderCopilot InferenceProvider = "copilot" + InferenceProviderCortecs InferenceProvider = "cortecs" + InferenceProviderVercel InferenceProvider = "vercel" + InferenceProviderMiniMax InferenceProvider = "minimax" + InferenceProviderMiniMaxChina InferenceProvider = "minimax-china" + InferenceProviderIoNet InferenceProvider = "ionet" + InferenceProviderQiniuCloud InferenceProvider = "qiniucloud" + InferenceProviderAvian InferenceProvider = "avian" + InferenceProviderNebius InferenceProvider = "nebius" + InferenceProviderNeuralwatt InferenceProvider = "neuralwatt" + InferenceProviderOpenCodeZen InferenceProvider = "opencode-zen" + InferenceProviderOpenCodeGo InferenceProvider = "opencode-go" + InferenceProviderAlibabaSingapore InferenceProvider = "alibaba-singapore" + InferenceProviderXiaomiMiMo InferenceProvider = "xiaomi-mimo" + InferenceProviderXiaomiMiMoTokenPlanAMS InferenceProvider = "xiaomi-mimo-token-plan-ams" + InferenceProviderXiaomiMiMoTokenPlanCN InferenceProvider = "xiaomi-mimo-token-plan-cn" + InferenceProviderXiaomiMiMoTokenPlanSGP InferenceProvider = "xiaomi-mimo-token-plan-sgp" ) // Provider represents an AI provider configuration. @@ -131,6 +135,10 @@ func KnownProviders() []InferenceProvider { InferenceProviderNeuralwatt, InferenceProviderOpenCodeZen, InferenceProviderOpenCodeGo, + InferenceProviderXiaomiMiMo, + InferenceProviderXiaomiMiMoTokenPlanAMS, + InferenceProviderXiaomiMiMoTokenPlanCN, + InferenceProviderXiaomiMiMoTokenPlanSGP, } } From c1994f00d2a9a71fa5c75d7c8363146c0997c750 Mon Sep 17 00:00:00 2001 From: AN Long Date: Sun, 31 May 2026 00:38:56 +0900 Subject: [PATCH 2/2] fix xiaomi mimo token plan lint --- pkg/catwalk/provider.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/catwalk/provider.go b/pkg/catwalk/provider.go index dd5526e1..5b3a5c1e 100644 --- a/pkg/catwalk/provider.go +++ b/pkg/catwalk/provider.go @@ -56,9 +56,9 @@ const ( InferenceProviderOpenCodeGo InferenceProvider = "opencode-go" InferenceProviderAlibabaSingapore InferenceProvider = "alibaba-singapore" InferenceProviderXiaomiMiMo InferenceProvider = "xiaomi-mimo" - InferenceProviderXiaomiMiMoTokenPlanAMS InferenceProvider = "xiaomi-mimo-token-plan-ams" - InferenceProviderXiaomiMiMoTokenPlanCN InferenceProvider = "xiaomi-mimo-token-plan-cn" - InferenceProviderXiaomiMiMoTokenPlanSGP InferenceProvider = "xiaomi-mimo-token-plan-sgp" + InferenceProviderXiaomiMiMoTokenPlanAMS InferenceProvider = "xiaomi-mimo-token-plan-ams" // #nosec G101 -- provider ID, not a credential. + InferenceProviderXiaomiMiMoTokenPlanCN InferenceProvider = "xiaomi-mimo-token-plan-cn" // #nosec G101 -- provider ID, not a credential. + InferenceProviderXiaomiMiMoTokenPlanSGP InferenceProvider = "xiaomi-mimo-token-plan-sgp" // #nosec G101 -- provider ID, not a credential. ) // Provider represents an AI provider configuration.