mirror of
https://github.com/alibaba/higress.git
synced 2026-06-06 11:17:29 +08:00
fix(ai-proxy): preserve text content alongside tool_result in Claude to OpenAI conversion (#3503)
This commit is contained in:
@@ -119,6 +119,15 @@ func (c *ClaudeToOpenAIConverter) ConvertClaudeRequestToOpenAI(body []byte) ([]b
|
|||||||
}
|
}
|
||||||
openaiRequest.Messages = append(openaiRequest.Messages, toolMsg)
|
openaiRequest.Messages = append(openaiRequest.Messages, toolMsg)
|
||||||
}
|
}
|
||||||
|
// Also add text content if present alongside tool results
|
||||||
|
// This handles cases like: [tool_result, tool_result, text]
|
||||||
|
if len(conversionResult.textParts) > 0 {
|
||||||
|
textMsg := chatMessage{
|
||||||
|
Role: claudeMsg.Role,
|
||||||
|
Content: strings.Join(conversionResult.textParts, "\n\n"),
|
||||||
|
}
|
||||||
|
openaiRequest.Messages = append(openaiRequest.Messages, textMsg)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle regular content if no tool calls or tool results
|
// Handle regular content if no tool calls or tool results
|
||||||
|
|||||||
@@ -388,6 +388,7 @@ func TestClaudeToOpenAIConverter_ConvertClaudeRequestToOpenAI(t *testing.T) {
|
|||||||
|
|
||||||
t.Run("convert_tool_result_with_actual_error_data", func(t *testing.T) {
|
t.Run("convert_tool_result_with_actual_error_data", func(t *testing.T) {
|
||||||
// Test using the actual JSON data from the error log to ensure our fix works
|
// Test using the actual JSON data from the error log to ensure our fix works
|
||||||
|
// This tests the fix for issue #3344 - text content alongside tool_result should be preserved
|
||||||
claudeRequest := `{
|
claudeRequest := `{
|
||||||
"model": "anthropic/claude-sonnet-4",
|
"model": "anthropic/claude-sonnet-4",
|
||||||
"messages": [{
|
"messages": [{
|
||||||
@@ -415,14 +416,20 @@ func TestClaudeToOpenAIConverter_ConvertClaudeRequestToOpenAI(t *testing.T) {
|
|||||||
err = json.Unmarshal(result, &openaiRequest)
|
err = json.Unmarshal(result, &openaiRequest)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// Should have one tool message (the text content is included in the same message array)
|
// Should have two messages: tool message + user message with text content
|
||||||
require.Len(t, openaiRequest.Messages, 1)
|
// This is the fix for issue #3344 - text content alongside tool_result is preserved
|
||||||
|
require.Len(t, openaiRequest.Messages, 2)
|
||||||
|
|
||||||
// Should be tool message
|
// First should be tool message
|
||||||
toolMsg := openaiRequest.Messages[0]
|
toolMsg := openaiRequest.Messages[0]
|
||||||
assert.Equal(t, "tool", toolMsg.Role)
|
assert.Equal(t, "tool", toolMsg.Role)
|
||||||
assert.Contains(t, toolMsg.Content, "three.js")
|
assert.Contains(t, toolMsg.Content, "three.js")
|
||||||
assert.Equal(t, "toolu_vrtx_01UbCfwoTgoDBqbYEwkVaxd5", toolMsg.ToolCallId)
|
assert.Equal(t, "toolu_vrtx_01UbCfwoTgoDBqbYEwkVaxd5", toolMsg.ToolCallId)
|
||||||
|
|
||||||
|
// Second should be user message with text content
|
||||||
|
userMsg := openaiRequest.Messages[1]
|
||||||
|
assert.Equal(t, "user", userMsg.Role)
|
||||||
|
assert.Equal(t, "继续", userMsg.Content)
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("convert_multiple_tool_calls", func(t *testing.T) {
|
t.Run("convert_multiple_tool_calls", func(t *testing.T) {
|
||||||
|
|||||||
Reference in New Issue
Block a user