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) + } + } }