diff options
| author | Paul Buetow <paul@buetow.org> | 2026-03-02 13:42:06 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-03-02 13:42:06 +0200 |
| commit | 021785d750de2cd8d1f94334282a2b110b77c0fd (patch) | |
| tree | 06c1e4942af0e1885e4c872cbb99d4653a3ec8a6 /internal/lsp | |
| parent | 8a70afb354d0050f3f8e1142753284859036fa1c (diff) | |
llmutils: centralize provider normalization and client setup (task 410)
Diffstat (limited to 'internal/lsp')
| -rw-r--r-- | internal/lsp/handlers_utils.go | 18 | ||||
| -rw-r--r-- | internal/lsp/server.go | 64 |
2 files changed, 9 insertions, 73 deletions
diff --git a/internal/lsp/handlers_utils.go b/internal/lsp/handlers_utils.go index 1ea36c8..1f6acfe 100644 --- a/internal/lsp/handlers_utils.go +++ b/internal/lsp/handlers_utils.go @@ -9,6 +9,7 @@ import ( "codeberg.org/snonux/hexai/internal/appconfig" "codeberg.org/snonux/hexai/internal/llm" + "codeberg.org/snonux/hexai/internal/llmutils" "codeberg.org/snonux/hexai/internal/logging" "codeberg.org/snonux/hexai/internal/stats" "codeberg.org/snonux/hexai/internal/textutil" @@ -99,24 +100,11 @@ func (s *Server) buildRequestSpec(surface surfaceKind) requestSpec { } func canonicalProvider(name string) string { - p := strings.ToLower(strings.TrimSpace(name)) - if p == "" { - return "openai" - } - return p + return llmutils.CanonicalProvider(name) } func resolveDefaultModel(cfg appconfig.App, provider string) string { - switch provider { - case "ollama": - return strings.TrimSpace(cfg.OllamaModel) - case "anthropic": - return strings.TrimSpace(cfg.AnthropicModel) - case "openrouter": - return strings.TrimSpace(cfg.OpenRouterModel) - default: - return strings.TrimSpace(cfg.OpenAIModel) - } + return llmutils.DefaultModelForProvider(cfg, provider) } func surfaceConfigsFor(cfg appconfig.App, surface surfaceKind) []appconfig.SurfaceConfig { diff --git a/internal/lsp/server.go b/internal/lsp/server.go index a5a8a2a..385f5ce 100644 --- a/internal/lsp/server.go +++ b/internal/lsp/server.go @@ -6,7 +6,6 @@ import ( "encoding/json" "io" "log" - "os" "strings" "sync" "time" @@ -14,6 +13,7 @@ import ( "codeberg.org/snonux/hexai/internal/appconfig" "codeberg.org/snonux/hexai/internal/ignore" "codeberg.org/snonux/hexai/internal/llm" + "codeberg.org/snonux/hexai/internal/llmutils" "codeberg.org/snonux/hexai/internal/logging" "codeberg.org/snonux/hexai/internal/runtimeconfig" ) @@ -227,36 +227,8 @@ func (s *Server) currentLLMClient() llm.Client { return s.llmClient } -func newClientForProvider(cfg appconfig.App, provider string) (llm.Client, error) { - llmCfg := llm.Config{ - Provider: provider, - RequestTimeout: cfg.RequestTimeout, - OpenAIBaseURL: cfg.OpenAIBaseURL, - OpenAIModel: cfg.OpenAIModel, - OpenAITemperature: cfg.OpenAITemperature, - OpenRouterBaseURL: cfg.OpenRouterBaseURL, - OpenRouterModel: cfg.OpenRouterModel, - OpenRouterTemperature: cfg.OpenRouterTemperature, - OllamaBaseURL: cfg.OllamaBaseURL, - OllamaModel: cfg.OllamaModel, - OllamaTemperature: cfg.OllamaTemperature, - AnthropicBaseURL: cfg.AnthropicBaseURL, - AnthropicModel: cfg.AnthropicModel, - AnthropicTemperature: cfg.AnthropicTemperature, - } - oaKey := strings.TrimSpace(os.Getenv("HEXAI_OPENAI_API_KEY")) - if oaKey == "" { - oaKey = strings.TrimSpace(os.Getenv("OPENAI_API_KEY")) - } - orKey := strings.TrimSpace(os.Getenv("HEXAI_OPENROUTER_API_KEY")) - if orKey == "" { - orKey = strings.TrimSpace(os.Getenv("OPENROUTER_API_KEY")) - } - anKey := strings.TrimSpace(os.Getenv("HEXAI_ANTHROPIC_API_KEY")) - if anKey == "" { - anKey = strings.TrimSpace(os.Getenv("ANTHROPIC_API_KEY")) - } - return llm.NewFromConfig(llmCfg, oaKey, orKey, anKey) +func newClientForProvider(cfg appconfig.App, provider, modelOverride string) (llm.Client, error) { + return llmutils.NewClientFromAppForProvider(cfg, provider, modelOverride) } func (s *Server) clientFor(spec requestSpec) llm.Client { @@ -284,35 +256,11 @@ func (s *Server) clientFor(spec requestSpec) llm.Client { if store != nil { cfg = store.Snapshot() } - cfg.Provider = provider modelOverride := strings.TrimSpace(spec.entry.Model) - switch provider { - case "openai": - if modelOverride != "" { - cfg.OpenAIModel = modelOverride - } else if spec.fallbackModel != "" { - cfg.OpenAIModel = spec.fallbackModel - } - case "openrouter": - if modelOverride != "" { - cfg.OpenRouterModel = modelOverride - } else if spec.fallbackModel != "" { - cfg.OpenRouterModel = spec.fallbackModel - } - case "ollama": - if modelOverride != "" { - cfg.OllamaModel = modelOverride - } else if spec.fallbackModel != "" { - cfg.OllamaModel = spec.fallbackModel - } - case "anthropic": - if modelOverride != "" { - cfg.AnthropicModel = modelOverride - } else if spec.fallbackModel != "" { - cfg.AnthropicModel = spec.fallbackModel - } + if modelOverride == "" { + modelOverride = strings.TrimSpace(spec.fallbackModel) } - client, err := newClientForProvider(cfg, provider) + client, err := newClientForProvider(cfg, provider, modelOverride) if err != nil { logging.Logf("lsp ", "failed to build client for provider=%s: %v", provider, err) if baseClient != nil { |
