fix(ai-proxy): preserve Bedrock Claude reasoning blocks (#3788)

Signed-off-by: Betula-L <6059935+Betula-L@users.noreply.github.com>
Co-authored-by: Betula-L <6059935+Betula-L@users.noreply.github.com>
This commit is contained in:
Betula-L
2026-05-07 19:27:48 -07:00
committed by GitHub
parent 6199fe414d
commit b77a074831
8 changed files with 1420 additions and 142 deletions

View File

@@ -46,6 +46,9 @@ type chatCompletionRequest struct {
Model string `json:"model"`
Store bool `json:"store,omitempty"`
ReasoningEffort string `json:"reasoning_effort,omitempty"`
ClaudeThinking *claudeThinkingConfig `json:"claude_thinking,omitempty"`
ClaudeOutputConfig *claudeOutputConfig `json:"claude_output_config,omitempty"`
ClaudeAnthropicBeta []string `json:"claude_anthropic_beta,omitempty"`
Metadata map[string]string `json:"metadata,omitempty"`
FrequencyPenalty float64 `json:"frequency_penalty,omitempty"`
LogitBias map[string]int `json:"logit_bias,omitempty"`
@@ -202,17 +205,22 @@ type completionTokensDetails struct {
}
type chatMessage struct {
Id string `json:"id,omitempty"`
Audio map[string]interface{} `json:"audio,omitempty"`
Name string `json:"name,omitempty"`
Role string `json:"role,omitempty"`
Content any `json:"content,omitempty"`
ReasoningContent string `json:"reasoning_content,omitempty"`
Reasoning string `json:"reasoning,omitempty"` // For streaming responses
ToolCalls []toolCall `json:"tool_calls,omitempty"`
FunctionCall *functionCall `json:"function_call,omitempty"` // For legacy OpenAI format
Refusal string `json:"refusal,omitempty"`
ToolCallId string `json:"tool_call_id,omitempty"`
Id string `json:"id,omitempty"`
Audio map[string]interface{} `json:"audio,omitempty"`
Name string `json:"name,omitempty"`
Role string `json:"role,omitempty"`
Content any `json:"content,omitempty"`
ReasoningContent string `json:"reasoning_content,omitempty"`
Reasoning string `json:"reasoning,omitempty"` // For streaming responses
ReasoningSignature string `json:"reasoning_signature,omitempty"`
ReasoningRedactedContent string `json:"reasoning_redacted_content,omitempty"`
ClaudeContentBlocks []claudeChatMessageContent `json:"claude_content_blocks,omitempty"`
ClaudeContentBlockIndex *int `json:"claude_content_block_index,omitempty"`
ClaudeContentBlockStop *int `json:"claude_content_block_stop,omitempty"`
ToolCalls []toolCall `json:"tool_calls,omitempty"`
FunctionCall *functionCall `json:"function_call,omitempty"` // For legacy OpenAI format
Refusal string `json:"refusal,omitempty"`
ToolCallId string `json:"tool_call_id,omitempty"`
}
func (m *chatMessage) handleNonStreamingReasoningContent(reasoningContentMode string) {