From 3f1ab18cbc996c9467dae6d8deb2c26798aff30e Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Fri, 30 Jan 2026 12:16:31 +0200 Subject: 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 --- internal/llm/anthropic.go | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'internal/llm') 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 } -- cgit v1.2.3