summaryrefslogtreecommitdiff
path: root/internal/llm
diff options
context:
space:
mode:
authorPaul Buetow <pbuetow@mimecast.com>2026-01-30 12:16:31 +0200
committerPaul Buetow <pbuetow@mimecast.com>2026-01-30 12:16:31 +0200
commit3f1ab18cbc996c9467dae6d8deb2c26798aff30e (patch)
treec1a6cdaad61a37bbdd70ddbe161c05aaf13d09ab /internal/llm
parentd3e0edbe16459f07506f70611b639d0a0a7f054e (diff)
feat: add completion_wait_all config and fix Anthropic system messages
- Add completion_wait_all config option (default true) to wait for all backends before returning results, or return first result immediately - Fix Anthropic API: extract system messages to top-level system field as required by Messages API (was causing 400 errors) - Add anthropic case to server.go clientFor() for model overrides
Diffstat (limited to 'internal/llm')
-rw-r--r--internal/llm/anthropic.go19
1 files changed, 15 insertions, 4 deletions
diff --git a/internal/llm/anthropic.go b/internal/llm/anthropic.go
index ebb6826..c0cdc9a 100644
--- a/internal/llm/anthropic.go
+++ b/internal/llm/anthropic.go
@@ -230,8 +230,21 @@ func buildAnthropicChatRequest(o Options, messages []Message, defaultModel strin
Stream: stream,
MaxTokens: 4096, // Anthropic requires max_tokens
}
- req.Messages = make([]anthropicMessage, len(messages))
- for i, m := range messages {
+ // Anthropic requires system messages in a top-level "system" field, not in messages array
+ var systemParts []string
+ var nonSystemMessages []Message
+ for _, m := range messages {
+ if m.Role == "system" {
+ systemParts = append(systemParts, m.Content)
+ } else {
+ nonSystemMessages = append(nonSystemMessages, m)
+ }
+ }
+ if len(systemParts) > 0 {
+ req.System = strings.Join(systemParts, "\n\n")
+ }
+ req.Messages = make([]anthropicMessage, len(nonSystemMessages))
+ for i, m := range nonSystemMessages {
req.Messages[i] = anthropicMessage{
Role: m.Role,
Content: m.Content,
@@ -246,8 +259,6 @@ func buildAnthropicChatRequest(o Options, messages []Message, defaultModel strin
if o.MaxTokens > 0 {
req.MaxTokens = o.MaxTokens
}
- // Note: Anthropic's API doesn't support stop sequences in the same way as OpenAI,
- // but we keep them in the request for future compatibility.
return req
}