summaryrefslogtreecommitdiff
path: root/internal/lsp/handlers_completion.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/lsp/handlers_completion.go')
-rw-r--r--internal/lsp/handlers_completion.go56
1 files changed, 32 insertions, 24 deletions
diff --git a/internal/lsp/handlers_completion.go b/internal/lsp/handlers_completion.go
index f7f41ef..d115741 100644
--- a/internal/lsp/handlers_completion.go
+++ b/internal/lsp/handlers_completion.go
@@ -95,11 +95,16 @@ func (s *Server) tryLLMCompletion(p CompletionParams, above, current, below, fun
return items, true
}
- if items, ok := s.tryProviderNativeCompletion(current, p, above, below, funcCtx, docStr, hasExtra, extraText, plan.inParams); ok {
+ spec := s.buildRequestSpec(surfaceCompletion)
+ client := s.clientFor(spec)
+ if client == nil {
+ return nil, false
+ }
+ if items, ok := s.tryProviderNativeCompletion(spec, client, current, p, above, below, funcCtx, docStr, hasExtra, extraText, plan.inParams); ok {
return items, true
}
- return s.executeChatCompletion(ctx, plan)
+ return s.executeChatCompletion(ctx, plan, spec, client)
}
func (s *Server) prepareCompletionPlan(p CompletionParams, above, current, below, funcCtx, docStr string, hasExtra bool, extraText string) (completionPlan, []CompletionItem, bool) {
@@ -142,31 +147,31 @@ func (s *Server) prepareCompletionPlan(p CompletionParams, above, current, below
return plan, nil, false
}
-func (s *Server) executeChatCompletion(ctx context.Context, plan completionPlan) ([]CompletionItem, bool) {
+func (s *Server) executeChatCompletion(ctx context.Context, plan completionPlan, spec requestSpec, client llm.Client) ([]CompletionItem, bool) {
messages := s.buildCompletionMessages(plan.inlinePrompt, plan.hasExtra, plan.extraText, plan.inParams, plan.params, plan.above, plan.current, plan.below, plan.funcCtx)
sentSize := 0
for _, m := range messages {
sentSize += len(m.Content)
}
s.incSentCounters(sentSize)
- opts := s.llmRequestOpts()
+ opts := spec.options
s.waitForDebounce(ctx)
if !s.waitForThrottle(ctx) {
return nil, false
}
- client := s.currentLLMClient()
- if client == nil {
- return nil, false
+ modelUsed := spec.effectiveModel()
+ if strings.TrimSpace(modelUsed) == "" {
+ modelUsed = client.DefaultModel()
}
- logging.Logf("lsp ", "completion llm=requesting model=%s", client.DefaultModel())
+ logging.Logf("lsp ", "completion llm=requesting model=%s", modelUsed)
text, err := client.Chat(ctx, messages, opts...)
if err != nil {
logging.Logf("lsp ", "llm completion error: %v", err)
- s.logLLMStats()
+ s.logLLMStats(modelUsed)
return nil, false
}
s.incRecvCounters(len(text))
- s.logLLMStats()
+ s.logLLMStats(modelUsed)
trimmed := strings.TrimSpace(text)
cleaned := s.postProcessCompletion(trimmed, plan.current[:plan.params.Position.Character], plan.current)
if cleaned == "" {
@@ -255,8 +260,7 @@ func (s *Server) prefixHeuristicAllows(inlinePrompt bool, current string, p Comp
}
// tryProviderNativeCompletion attempts provider-native completion and returns items when successful.
-func (s *Server) tryProviderNativeCompletion(current string, p CompletionParams, above, below, funcCtx, docStr string, hasExtra bool, extraText string, inParams bool) ([]CompletionItem, bool) {
- client := s.currentLLMClient()
+func (s *Server) tryProviderNativeCompletion(spec requestSpec, client llm.Client, current string, p CompletionParams, above, below, funcCtx, docStr string, hasExtra bool, extraText string, inParams bool) ([]CompletionItem, bool) {
cc, ok := client.(llm.CodeCompleter)
if !ok {
return nil, false
@@ -271,15 +275,11 @@ func (s *Server) tryProviderNativeCompletion(current string, p CompletionParams,
"before": before,
})
lang := ""
- temp := 0.0
- if cfg.CodingTemperature != nil {
- temp = *cfg.CodingTemperature
- }
- prov := ""
- if client != nil {
- prov = client.Name()
+ provider := spec.provider
+ if provider == "" {
+ provider = canonicalProvider(cfg.Provider)
}
- logging.Logf("lsp ", "completion path=codex provider=%s uri=%s", prov, path)
+ logging.Logf("lsp ", "completion path=codex provider=%s uri=%s", provider, path)
ctx2, cancel2 := context.WithTimeout(context.Background(), 15*time.Second)
defer cancel2()
@@ -290,16 +290,24 @@ func (s *Server) tryProviderNativeCompletion(current string, p CompletionParams,
}
// Count approximate payload sizes: prompt+after sent; first suggestion received
sentBytes := len(prompt) + len(after)
- suggestions, err := cc.CodeCompletion(ctx2, prompt, after, 1, lang, temp)
+ modelUsed := spec.effectiveModel()
+ if strings.TrimSpace(modelUsed) == "" {
+ modelUsed = client.DefaultModel()
+ }
+ tempVal := 0.0
+ if val, ok := chooseSurfaceTemperature(surfaceCompletion, cfg, provider, spec.modelOverride, spec.fallbackModel); ok {
+ tempVal = val
+ }
+ suggestions, err := cc.CodeCompletion(ctx2, prompt, after, 1, lang, tempVal)
if err == nil && len(suggestions) > 0 {
// Update counters and heartbeat
s.incSentCounters(sentBytes)
s.incRecvCounters(len(suggestions[0]))
// Contribute to global stats (provider-native path)
if client != nil {
- _ = stats.Update(ctx2, client.Name(), client.DefaultModel(), sentBytes, len(suggestions[0]))
+ _ = stats.Update(ctx2, client.Name(), modelUsed, sentBytes, len(suggestions[0]))
}
- s.logLLMStats()
+ s.logLLMStats(modelUsed)
cleaned := strings.TrimSpace(suggestions[0])
if cleaned != "" {
cleaned = stripDuplicateAssignmentPrefix(current[:p.Position.Character], cleaned)
@@ -322,7 +330,7 @@ func (s *Server) tryProviderNativeCompletion(current string, p CompletionParams,
logging.Logf("lsp ", "completion path=codex error=%v (falling back to chat)", err)
// Still emit a heartbeat for visibility, even on error
s.incSentCounters(sentBytes)
- s.logLLMStats()
+ s.logLLMStats(modelUsed)
}
return nil, false
}