From f1e3885cf7cf2563c85f419998228621c29fb095 Mon Sep 17 00:00:00 2001 From: dataCenter430 Date: Fri, 13 Mar 2026 04:55:25 +0100 Subject: [PATCH] feat(provider): add ModelScope as OpenAI-compatible provider --- pkg/config/config.go | 4 +++- pkg/config/defaults.go | 8 ++++++++ pkg/config/migration.go | 17 +++++++++++++++++ pkg/providers/factory_provider.go | 4 +++- 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/pkg/config/config.go b/pkg/config/config.go index 7a7edb489..4665ef318 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -528,6 +528,7 @@ type ProvidersConfig struct { Avian ProviderConfig `json:"avian"` Minimax ProviderConfig `json:"minimax"` LongCat ProviderConfig `json:"longcat"` + ModelScope ProviderConfig `json:"modelscope"` } // IsEmpty checks if all provider configs are empty (no API keys or API bases set) @@ -555,7 +556,8 @@ func (p ProvidersConfig) IsEmpty() bool { p.Mistral.APIKey == "" && p.Mistral.APIBase == "" && p.Avian.APIKey == "" && p.Avian.APIBase == "" && p.Minimax.APIKey == "" && p.Minimax.APIBase == "" && - p.LongCat.APIKey == "" && p.LongCat.APIBase == "" + p.LongCat.APIKey == "" && p.LongCat.APIBase == "" && + p.ModelScope.APIKey == "" && p.ModelScope.APIBase == "" } // MarshalJSON implements custom JSON marshaling for ProvidersConfig diff --git a/pkg/config/defaults.go b/pkg/config/defaults.go index 2a3e66043..189af0a84 100644 --- a/pkg/config/defaults.go +++ b/pkg/config/defaults.go @@ -369,6 +369,14 @@ func DefaultConfig() *Config { APIKey: "", }, + // ModelScope (魔搭社区) - https://modelscope.cn/my/tokens + { + ModelName: "modelscope-qwen", + Model: "modelscope/Qwen/Qwen3-235B-A22B-Instruct-2507", + APIBase: "https://api-inference.modelscope.cn/v1", + APIKey: "", + }, + // VLLM (local) - http://localhost:8000 { ModelName: "local-model", diff --git a/pkg/config/migration.go b/pkg/config/migration.go index af6391651..c7fc214d5 100644 --- a/pkg/config/migration.go +++ b/pkg/config/migration.go @@ -424,6 +424,23 @@ func ConvertProvidersToModelList(cfg *Config) []ModelConfig { }, true }, }, + { + providerNames: []string{"modelscope"}, + protocol: "modelscope", + buildConfig: func(p ProvidersConfig) (ModelConfig, bool) { + if p.ModelScope.APIKey == "" && p.ModelScope.APIBase == "" { + return ModelConfig{}, false + } + return ModelConfig{ + ModelName: "modelscope", + Model: "modelscope/Qwen/Qwen3-235B-A22B-Instruct-2507", + APIKey: p.ModelScope.APIKey, + APIBase: p.ModelScope.APIBase, + Proxy: p.ModelScope.Proxy, + RequestTimeout: p.ModelScope.RequestTimeout, + }, true + }, + }, } // Process each provider migration diff --git a/pkg/providers/factory_provider.go b/pkg/providers/factory_provider.go index 9749e7a15..535ff5839 100644 --- a/pkg/providers/factory_provider.go +++ b/pkg/providers/factory_provider.go @@ -95,7 +95,7 @@ func CreateProviderFromConfig(cfg *config.ModelConfig) (LLMProvider, string, err case "litellm", "openrouter", "groq", "zhipu", "gemini", "nvidia", "ollama", "moonshot", "shengsuanyun", "deepseek", "cerebras", "vivgrid", "volcengine", "vllm", "qwen", "mistral", "avian", - "minimax", "longcat": + "minimax", "longcat", "modelscope": // All other OpenAI-compatible HTTP providers if cfg.APIKey == "" && cfg.APIBase == "" { return nil, "", fmt.Errorf("api_key or api_base is required for HTTP-based protocol %q", protocol) @@ -217,6 +217,8 @@ func getDefaultAPIBase(protocol string) string { return "https://api.minimaxi.com/v1" case "longcat": return "https://api.longcat.chat/openai" + case "modelscope": + return "https://api-inference.modelscope.cn/v1" default: return "" }