summaryrefslogtreecommitdiff
path: root/internal/lsp
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-03-02 13:42:06 +0200
committerPaul Buetow <paul@buetow.org>2026-03-02 13:42:06 +0200
commit021785d750de2cd8d1f94334282a2b110b77c0fd (patch)
tree06c1e4942af0e1885e4c872cbb99d4653a3ec8a6 /internal/lsp
parent8a70afb354d0050f3f8e1142753284859036fa1c (diff)
llmutils: centralize provider normalization and client setup (task 410)
Diffstat (limited to 'internal/lsp')
-rw-r--r--internal/lsp/handlers_utils.go18
-rw-r--r--internal/lsp/server.go64
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 {