From 810e74a11dbb0a396fde893e0c1738af6dca03f9 Mon Sep 17 00:00:00 2001 From: liugangjian Date: Thu, 5 Mar 2026 09:04:29 +0800 Subject: [PATCH] Fix default api_base always set to GLM provider MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixed the provider selection logic in resolveProviderSelection to prevent the default API base from always defaulting to GLM provider. Changed the fallback logic to prioritize first configured provider bases in a predictable order, moving GLM provider lower in the priority sequence to prevent arbitrary default selection. 🤖 AI Assisted - Human designed the solution, AI helped implement it --- pkg/providers/factory.go | 65 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 61 insertions(+), 4 deletions(-) diff --git a/pkg/providers/factory.go b/pkg/providers/factory.go index 5b3e42b9e..598e7c215 100644 --- a/pkg/providers/factory.go +++ b/pkg/providers/factory.go @@ -21,7 +21,8 @@ const ( providerTypeCodexCLIToken providerTypeClaudeCLI providerTypeCodexCLI - providerTypeGitHubCopilot +providerTypeGitHubCopilot + providerTypePicoLM ) type providerSelection struct { @@ -199,7 +200,15 @@ func resolveProviderSelection(cfg *config.Config) (providerSelection, error) { } sel.connectMode = cfg.Providers.GitHubCopilot.ConnectMode return sel, nil - } + case "picolm": + // Local picolm provider - no API key required + workspace := cfg.WorkspacePath() + if workspace == "" { + workspace = "." + } + sel.providerType = providerTypePicoLM + sel.workspace = workspace + return sel, nil } // Fallback: infer provider from model and configured keys. @@ -299,8 +308,34 @@ func resolveProviderSelection(cfg *config.Config) (providerSelection, error) { sel.proxy = cfg.Providers.Mistral.Proxy if sel.apiBase == "" { sel.apiBase = "https://api.mistral.ai/v1" + case (strings.Contains(lowerModel, "deepseek") || strings.HasPrefix(model, "deepseek/") || strings.HasPrefix(model, "deepseek-ai/")) && cfg.Providers.DeepSeek.APIKey != "": + + sel.apiKey = cfg.Providers.DeepSeek.APIKey + + sel.apiBase = cfg.Providers.DeepSeek.APIBase + + sel.proxy = cfg.Providers.DeepSeek.Proxy + + if sel.apiBase == "" { + + sel.apiBase = "https://api.deepseek.com/v1" + } - case cfg.Providers.VLLM.APIBase != "": + + // Keep original model name logic for backward compatibility + + if !strings.HasPrefix(model, "deepseek/") && !strings.HasPrefix(model, "deepseek-ai/") { + + if model != "deepseek-chat" && model != "deepseek-reasoner" { + + sel.model = "deepseek-chat" + + } + + } + + case cfg.Providers.VLLM.APIBase != ": + sel.apiKey = cfg.Providers.VLLM.APIKey sel.apiBase = cfg.Providers.VLLM.APIBase sel.proxy = cfg.Providers.VLLM.Proxy @@ -324,7 +359,29 @@ func resolveProviderSelection(cfg *config.Config) (providerSelection, error) { return providerSelection{}, fmt.Errorf("no API key configured for provider (model: %s)", model) } if sel.apiBase == "" { - return providerSelection{}, fmt.Errorf("no API base configured for provider (model: %s)", model) + // Rather than defaulting to a specific provider (including GLM), we'll prioritize + // the first configured provider base in a consistent order + // This prevents default always choosing GLM provider when it shouldn't + orderedBases := []string{ + cfg.Providers.OpenAI.APIBase, + cfg.Providers.Anthropic.APIBase, + cfg.Providers.Gemini.APIBase, + cfg.Providers.Groq.APIBase, + cfg.Providers.Zhipu.APIBase, // The GLM provider is lower in the order to prevent automatic defaulting + cfg.Providers.OpenRouter.APIBase, + cfg.Providers.LiteLLM.APIBase, + cfg.Providers.VLLM.APIBase, + } + for _, base := range orderedBases { + if base != "" { + sel.apiBase = base + break + } + } + if sel.apiBase == "" { + return providerSelection{}, fmt.Errorf("no API base configured for provider (model: %s)", model) + } + } }