diff --git a/frontend/src/i18n/locales/en-US.ts b/frontend/src/i18n/locales/en-US.ts index 4e4b7855..d6bb0bf5 100755 --- a/frontend/src/i18n/locales/en-US.ts +++ b/frontend/src/i18n/locales/en-US.ts @@ -1697,6 +1697,10 @@ export default { label: 'Google Gemini', description: 'gemini-3-flash-preview, gemini-2.5-pro, etc.', }, + gpustack: { + label: 'GPUStack', + description: 'Self-hosted GPU cluster platform, OpenAI-compatible API', + }, }, } }, diff --git a/frontend/src/i18n/locales/ru-RU.ts b/frontend/src/i18n/locales/ru-RU.ts index a78b42bc..3af1d433 100755 --- a/frontend/src/i18n/locales/ru-RU.ts +++ b/frontend/src/i18n/locales/ru-RU.ts @@ -947,6 +947,10 @@ export default { label: 'Google Gemini', description: 'gemini-3-flash-preview, gemini-2.5-pro, etc.', }, + gpustack: { + label: 'GPUStack', + description: 'Приватная платформа GPU-кластеров, OpenAI-совместимый API', + }, }, } }, diff --git a/frontend/src/i18n/locales/zh-CN.ts b/frontend/src/i18n/locales/zh-CN.ts index 516fce3f..10021481 100755 --- a/frontend/src/i18n/locales/zh-CN.ts +++ b/frontend/src/i18n/locales/zh-CN.ts @@ -1207,6 +1207,34 @@ export default { label: "Jina AI", description: "专注于 Embedding 和 Rerank", }, + volcengine: { + label: "火山引擎", + description: "doubao-1-5-pro-32k, doubao-embedding-vision 等", + }, + deepseek: { + label: "DeepSeek", + description: "deepseek-chat, deepseek-reasoner 等", + }, + hunyuan: { + label: "腾讯混元", + description: "hunyuan-pro, hunyuan-standard, hunyuan-embedding 等", + }, + minimax: { + label: "MiniMax", + description: "MiniMax-M2.1, MiniMax-M2.1-lightning 等", + }, + mimo: { + label: "小米 MiMo", + description: "mimo-v2-flash", + }, + gemini: { + label: "Google Gemini", + description: "gemini-3-flash-preview, gemini-2.5-pro 等", + }, + gpustack: { + label: "GPUStack", + description: "私有化 GPU 集群部署平台,OpenAI 兼容 API", + }, }, }, }, diff --git a/internal/models/provider/gpustack.go b/internal/models/provider/gpustack.go new file mode 100644 index 00000000..9bbfc7e7 --- /dev/null +++ b/internal/models/provider/gpustack.go @@ -0,0 +1,57 @@ +package provider + +import ( + "fmt" + + "github.com/Tencent/WeKnora/internal/types" +) + +const ( + // GPUStackBaseURL GPUStack API BaseURL (OpenAI 兼容模式) + GPUStackBaseURL = "http://your_gpustack_server_url/v1-openai" + GPUStackEmbeddingBaseURL = "http://your_gpustack_server_url/v1-openai/embeddings" + GPUStackRerankBaseURL = "http://your_gpustack_server_url/v1/rerank" +) + +// GPUStackProvider 实现 GPUStack 的 Provider 接口 +type GPUStackProvider struct{} + +func init() { + Register(&GPUStackProvider{}) +} + +// Info 返回 GPUStack provider 的元数据 +func (p *GPUStackProvider) Info() ProviderInfo { + return ProviderInfo{ + Name: ProviderGPUStack, + DisplayName: "GPUStack", + Description: "Choose your deployed model on GPUStack", + DefaultURLs: map[types.ModelType]string{ + types.ModelTypeKnowledgeQA: GPUStackBaseURL, + types.ModelTypeEmbedding: GPUStackEmbeddingBaseURL, + types.ModelTypeRerank: GPUStackRerankBaseURL, + types.ModelTypeVLLM: GPUStackBaseURL, + }, + ModelTypes: []types.ModelType{ + types.ModelTypeKnowledgeQA, + types.ModelTypeEmbedding, + types.ModelTypeRerank, + types.ModelTypeVLLM, + }, + RequiresAuth: true, // GPUStack 需要 API Key + } +} + +// ValidateConfig 验证 GPUStack provider 配置 +func (p *GPUStackProvider) ValidateConfig(config *Config) error { + if config.BaseURL == "" { + return fmt.Errorf("base URL is required for GPUStack provider") + } + if config.APIKey == "" { + return fmt.Errorf("API key is required for GPUStack provider") + } + if config.ModelName == "" { + return fmt.Errorf("model name is required") + } + return nil +} diff --git a/internal/models/provider/provider.go b/internal/models/provider/provider.go index a8f72b30..1d35892f 100644 --- a/internal/models/provider/provider.go +++ b/internal/models/provider/provider.go @@ -39,6 +39,8 @@ const ( ProviderMiniMax ProviderName = "minimax" // 小米 Mimo ProviderMimo ProviderName = "mimo" + // GPUStack (私有化部署) + ProviderGPUStack ProviderName = "gpustack" ) // AllProviders 返回所有注册的提供者名称 @@ -57,6 +59,7 @@ func AllProviders() []ProviderName { ProviderOpenRouter, ProviderJina, ProviderMimo, + ProviderGPUStack, } } @@ -208,6 +211,8 @@ func DetectProvider(baseURL string) ProviderName { return ProviderMiniMax case containsAny(baseURL, "xiaomimimo.com"): return ProviderMimo + case containsAny(baseURL, "gpustack"): + return ProviderGPUStack default: return ProviderGeneric }