bugfix: map bedrock tool-call indexes and tool_choice (#3786)

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-06 04:48:42 -07:00
committed by GitHub
parent 4aba4a9860
commit 6199fe414d
7 changed files with 557 additions and 34 deletions

View File

@@ -35,6 +35,66 @@ func init() {
func TestClaudeToOpenAIConverter_ConvertClaudeRequestToOpenAI(t *testing.T) {
converter := &ClaudeToOpenAIConverter{}
t.Run("convert_tool_choice_any_to_required", func(t *testing.T) {
claudeRequest := `{
"model": "claude-sonnet-4",
"max_tokens": 1000,
"messages": [{"role": "user", "content": "Run a search."}],
"tools": [{
"name": "web_search",
"description": "Search the web.",
"input_schema": {
"type": "object",
"properties": {"query": {"type": "string"}},
"required": ["query"]
}
}],
"tool_choice": {"type": "any"}
}`
result, err := converter.ConvertClaudeRequestToOpenAI([]byte(claudeRequest))
require.NoError(t, err)
var openaiRequest chatCompletionRequest
err = json.Unmarshal(result, &openaiRequest)
require.NoError(t, err)
require.Equal(t, "required", openaiRequest.ToolChoice)
require.NotNil(t, openaiRequest.ParallelToolCalls)
require.True(t, *openaiRequest.ParallelToolCalls)
require.Contains(t, string(result), `"parallel_tool_calls":true`)
})
t.Run("convert_tool_choice_any_preserves_disable_parallel_tool_use", func(t *testing.T) {
claudeRequest := `{
"model": "claude-sonnet-4",
"max_tokens": 1000,
"messages": [{"role": "user", "content": "Run a search."}],
"tools": [{
"name": "web_search",
"description": "Search the web.",
"input_schema": {
"type": "object",
"properties": {"query": {"type": "string"}},
"required": ["query"]
}
}],
"tool_choice": {"type": "any", "disable_parallel_tool_use": true}
}`
result, err := converter.ConvertClaudeRequestToOpenAI([]byte(claudeRequest))
require.NoError(t, err)
var openaiRequest chatCompletionRequest
err = json.Unmarshal(result, &openaiRequest)
require.NoError(t, err)
require.Equal(t, "required", openaiRequest.ToolChoice)
require.NotNil(t, openaiRequest.ParallelToolCalls)
require.False(t, *openaiRequest.ParallelToolCalls)
require.Contains(t, string(result), `"parallel_tool_calls":false`)
})
t.Run("convert_multiple_text_content_blocks", func(t *testing.T) {
// Test case: multiple text content blocks should remain as separate array elements with cache control support
// Both system and user messages should handle array content format