fix(ai-proxy): preserve empty Claude tool inputs (#3799)

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-09 06:35:35 -07:00
committed by GitHub
parent b77a074831
commit 6d50e2da42
4 changed files with 77 additions and 5 deletions

View File

@@ -251,6 +251,35 @@ func TestBedrockRequestPreservesClaudeNativeThinkingAndToolResult(t *testing.T)
assert.Equal(t, "failed", *request.Messages[1].Content[0].ToolResult.Content[0].Text)
}
func TestBedrockRequestPreservesClaudeNoArgToolUseInput(t *testing.T) {
provider := &bedrockProvider{}
openaiBody, err := (&ClaudeToOpenAIConverter{}).ConvertClaudeRequestToOpenAI([]byte(`{
"model":"claude",
"messages":[{
"role":"assistant",
"content":[
{"type":"thinking","thinking":"reasoning","signature":"sig"},
{"type":"tool_use","id":"toolu_1","name":"list_items","input":{}}
]
}]
}`))
require.NoError(t, err)
var openaiRequest chatCompletionRequest
require.NoError(t, json.Unmarshal(openaiBody, &openaiRequest))
body, err := provider.buildBedrockTextGenerationRequest(&openaiRequest, nil)
require.NoError(t, err)
require.Contains(t, string(body), `"input":{}`)
var request bedrockTextGenRequest
require.NoError(t, json.Unmarshal(body, &request))
require.Len(t, request.Messages, 1)
require.Len(t, request.Messages[0].Content, 2)
require.NotNil(t, request.Messages[0].Content[1].ToolUse)
assert.Empty(t, request.Messages[0].Content[1].ToolUse.Input)
}
func TestBedrockRequestToolResultWithTrailingTextDoesNotDuplicateToolResult(t *testing.T) {
provider := &bedrockProvider{}
openaiBody, err := (&ClaudeToOpenAIConverter{}).ConvertClaudeRequestToOpenAI([]byte(`{