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

@@ -678,3 +678,35 @@ func TestProviderConfig_SetDefaultCapabilities(t *testing.T) {
assert.Equal(t, "/v1/chat/completions", config.capabilities[string(ApiNameChatCompletion)])
})
}
func TestStripClaudeInternalMessageFields(t *testing.T) {
body := []byte(`{
"model":"claude",
"claude_thinking":{"type":"adaptive"},
"claude_output_config":{"effort":"high"},
"claude_anthropic_beta":["effort-2025-11-24"],
"messages":[{
"role":"assistant",
"content":"answer",
"reasoning_content":"reasoning",
"reasoning_signature":"sig",
"reasoning_redacted_content":"opaque",
"claude_content_blocks":[{"type":"thinking","thinking":"","signature":"sig"}],
"claude_content_block_index":1,
"claude_content_block_stop":1
}]
}`)
result := stripClaudeInternalMessageFields(body)
assert.False(t, gjson.GetBytes(result, "claude_thinking").Exists())
assert.False(t, gjson.GetBytes(result, "claude_output_config").Exists())
assert.False(t, gjson.GetBytes(result, "claude_anthropic_beta").Exists())
assert.False(t, gjson.GetBytes(result, "messages.0.reasoning_content").Exists())
assert.False(t, gjson.GetBytes(result, "messages.0.reasoning_signature").Exists())
assert.False(t, gjson.GetBytes(result, "messages.0.reasoning_redacted_content").Exists())
assert.False(t, gjson.GetBytes(result, "messages.0.claude_content_blocks").Exists())
assert.False(t, gjson.GetBytes(result, "messages.0.claude_content_block_index").Exists())
assert.False(t, gjson.GetBytes(result, "messages.0.claude_content_block_stop").Exists())
assert.Equal(t, "answer", gjson.GetBytes(result, "messages.0.content").String())
}