mirror of
https://github.com/router-for-me/CLIProxyAPI.git
synced 2026-02-03 04:50:52 +08:00
fix(translator): separate tool calls from content in OpenAI Claude requests
This commit is contained in:
@@ -133,27 +133,16 @@ func ConvertClaudeRequestToOpenAI(modelName string, inputRawJSON []byte, stream
|
|||||||
return true
|
return true
|
||||||
})
|
})
|
||||||
|
|
||||||
// Create main message if there's text content or tool calls
|
// Emit text/image content as one message
|
||||||
if len(contentItems) > 0 || len(toolCalls) > 0 {
|
if len(contentItems) > 0 {
|
||||||
msgJSON := `{"role":"","content":""}`
|
msgJSON := `{"role":"","content":""}`
|
||||||
msgJSON, _ = sjson.Set(msgJSON, "role", role)
|
msgJSON, _ = sjson.Set(msgJSON, "role", role)
|
||||||
|
|
||||||
// Set content
|
contentArrayJSON := "[]"
|
||||||
if len(contentItems) > 0 {
|
for _, contentItem := range contentItems {
|
||||||
contentArrayJSON := "[]"
|
contentArrayJSON, _ = sjson.SetRaw(contentArrayJSON, "-1", contentItem)
|
||||||
for _, contentItem := range contentItems {
|
|
||||||
contentArrayJSON, _ = sjson.SetRaw(contentArrayJSON, "-1", contentItem)
|
|
||||||
}
|
|
||||||
msgJSON, _ = sjson.SetRaw(msgJSON, "content", contentArrayJSON)
|
|
||||||
} else {
|
|
||||||
msgJSON, _ = sjson.Set(msgJSON, "content", "")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set tool calls for assistant messages
|
|
||||||
if role == "assistant" && len(toolCalls) > 0 {
|
|
||||||
toolCallsJSON, _ := json.Marshal(toolCalls)
|
|
||||||
msgJSON, _ = sjson.SetRaw(msgJSON, "tool_calls", string(toolCallsJSON))
|
|
||||||
}
|
}
|
||||||
|
msgJSON, _ = sjson.SetRaw(msgJSON, "content", contentArrayJSON)
|
||||||
|
|
||||||
contentValue := gjson.Get(msgJSON, "content")
|
contentValue := gjson.Get(msgJSON, "content")
|
||||||
hasContent := false
|
hasContent := false
|
||||||
@@ -168,11 +157,19 @@ func ConvertClaudeRequestToOpenAI(modelName string, inputRawJSON []byte, stream
|
|||||||
hasContent = contentValue.Raw != "" && contentValue.Raw != "null"
|
hasContent = contentValue.Raw != "" && contentValue.Raw != "null"
|
||||||
}
|
}
|
||||||
|
|
||||||
if hasContent || len(toolCalls) != 0 {
|
if hasContent {
|
||||||
messagesJSON, _ = sjson.Set(messagesJSON, "-1", gjson.Parse(msgJSON).Value())
|
messagesJSON, _ = sjson.Set(messagesJSON, "-1", gjson.Parse(msgJSON).Value())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Emit tool calls in a separate assistant message
|
||||||
|
if role == "assistant" && len(toolCalls) > 0 {
|
||||||
|
toolCallMsgJSON := `{"role":"assistant","tool_calls":[]}`
|
||||||
|
toolCallsJSON, _ := json.Marshal(toolCalls)
|
||||||
|
toolCallMsgJSON, _ = sjson.SetRaw(toolCallMsgJSON, "tool_calls", string(toolCallsJSON))
|
||||||
|
messagesJSON, _ = sjson.Set(messagesJSON, "-1", gjson.Parse(toolCallMsgJSON).Value())
|
||||||
|
}
|
||||||
|
|
||||||
} else if contentResult.Exists() && contentResult.Type == gjson.String {
|
} else if contentResult.Exists() && contentResult.Type == gjson.String {
|
||||||
// Simple string content
|
// Simple string content
|
||||||
msgJSON := `{"role":"","content":""}`
|
msgJSON := `{"role":"","content":""}`
|
||||||
|
|||||||
Reference in New Issue
Block a user