openai: fix tool call ID mapping (#12988)

This commit is contained in:
Jeffrey Morgan
2025-11-06 15:26:25 -08:00
committed by GitHub
parent 6c79e6c09a
commit 565b802a6b
2 changed files with 18 additions and 15 deletions

View File

@@ -218,6 +218,7 @@ func TestChatMiddleware(t *testing.T) {
Role: "assistant", Role: "assistant",
ToolCalls: []api.ToolCall{ ToolCalls: []api.ToolCall{
{ {
ID: "id",
Function: api.ToolCallFunction{ Function: api.ToolCallFunction{
Name: "get_current_weather", Name: "get_current_weather",
Arguments: map[string]any{ Arguments: map[string]any{
@@ -257,6 +258,7 @@ func TestChatMiddleware(t *testing.T) {
Content: "Let's see what the weather is like in Paris", Content: "Let's see what the weather is like in Paris",
ToolCalls: []api.ToolCall{ ToolCalls: []api.ToolCall{
{ {
ID: "id",
Function: api.ToolCallFunction{ Function: api.ToolCallFunction{
Name: "get_current_weather", Name: "get_current_weather",
Arguments: map[string]any{ Arguments: map[string]any{
@@ -295,6 +297,7 @@ func TestChatMiddleware(t *testing.T) {
Role: "assistant", Role: "assistant",
ToolCalls: []api.ToolCall{ ToolCalls: []api.ToolCall{
{ {
ID: "id",
Function: api.ToolCallFunction{ Function: api.ToolCallFunction{
Name: "get_current_weather", Name: "get_current_weather",
Arguments: map[string]any{ Arguments: map[string]any{
@@ -334,6 +337,7 @@ func TestChatMiddleware(t *testing.T) {
Thinking: "Let's see what the weather is like in Paris", Thinking: "Let's see what the weather is like in Paris",
ToolCalls: []api.ToolCall{ ToolCalls: []api.ToolCall{
{ {
ID: "id",
Function: api.ToolCallFunction{ Function: api.ToolCallFunction{
Name: "get_current_weather", Name: "get_current_weather",
Arguments: map[string]any{ Arguments: map[string]any{
@@ -373,6 +377,7 @@ func TestChatMiddleware(t *testing.T) {
Role: "assistant", Role: "assistant",
ToolCalls: []api.ToolCall{ ToolCalls: []api.ToolCall{
{ {
ID: "id_abc",
Function: api.ToolCallFunction{ Function: api.ToolCallFunction{
Name: "get_current_weather", Name: "get_current_weather",
Arguments: map[string]any{ Arguments: map[string]any{
@@ -387,6 +392,7 @@ func TestChatMiddleware(t *testing.T) {
Role: "tool", Role: "tool",
Content: "The weather in Paris is 20 degrees Celsius", Content: "The weather in Paris is 20 degrees Celsius",
ToolName: "get_current_weather", ToolName: "get_current_weather",
ToolCallID: "id_abc",
}, },
}, },
Options: map[string]any{ Options: map[string]any{
@@ -417,6 +423,7 @@ func TestChatMiddleware(t *testing.T) {
Role: "assistant", Role: "assistant",
ToolCalls: []api.ToolCall{ ToolCalls: []api.ToolCall{
{ {
ID: "id",
Function: api.ToolCallFunction{ Function: api.ToolCallFunction{
Name: "get_current_weather", Name: "get_current_weather",
Arguments: map[string]any{ Arguments: map[string]any{

View File

@@ -437,7 +437,7 @@ func FromChatRequest(r ChatCompletionRequest) (*api.ChatRequest, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
messages = append(messages, api.Message{Role: msg.Role, Content: content, Thinking: msg.Reasoning, ToolCalls: toolCalls, ToolName: toolName}) messages = append(messages, api.Message{Role: msg.Role, Content: content, Thinking: msg.Reasoning, ToolCalls: toolCalls, ToolName: toolName, ToolCallID: msg.ToolCallID})
case []any: case []any:
for _, c := range content { for _, c := range content {
data, ok := c.(map[string]any) data, ok := c.(map[string]any)
@@ -501,9 +501,8 @@ func FromChatRequest(r ChatCompletionRequest) (*api.ChatRequest, error) {
return nil, err return nil, err
} }
messages[len(messages)-1].ToolCalls = toolCalls messages[len(messages)-1].ToolCalls = toolCalls
if toolName != "" {
messages[len(messages)-1].ToolName = toolName messages[len(messages)-1].ToolName = toolName
} messages[len(messages)-1].ToolCallID = msg.ToolCallID
messages[len(messages)-1].Thinking = msg.Reasoning messages[len(messages)-1].Thinking = msg.Reasoning
} }
default: default:
@@ -512,15 +511,11 @@ func FromChatRequest(r ChatCompletionRequest) (*api.ChatRequest, error) {
return nil, fmt.Errorf("invalid message content type: %T", content) return nil, fmt.Errorf("invalid message content type: %T", content)
} }
toolCalls := make([]api.ToolCall, len(msg.ToolCalls)) toolCalls, err := FromCompletionToolCall(msg.ToolCalls)
for i, tc := range msg.ToolCalls {
toolCalls[i].Function.Name = tc.Function.Name
err := json.Unmarshal([]byte(tc.Function.Arguments), &toolCalls[i].Function.Arguments)
if err != nil { if err != nil {
return nil, errors.New("invalid tool call arguments") return nil, err
} }
} messages = append(messages, api.Message{Role: msg.Role, Thinking: msg.Reasoning, ToolCalls: toolCalls, ToolCallID: msg.ToolCallID})
messages = append(messages, api.Message{Role: msg.Role, Thinking: msg.Reasoning, ToolCalls: toolCalls})
} }
} }
@@ -631,6 +626,7 @@ func nameFromToolCallID(messages []Message, toolCallID string) string {
func FromCompletionToolCall(toolCalls []ToolCall) ([]api.ToolCall, error) { func FromCompletionToolCall(toolCalls []ToolCall) ([]api.ToolCall, error) {
apiToolCalls := make([]api.ToolCall, len(toolCalls)) apiToolCalls := make([]api.ToolCall, len(toolCalls))
for i, tc := range toolCalls { for i, tc := range toolCalls {
apiToolCalls[i].ID = tc.ID
apiToolCalls[i].Function.Name = tc.Function.Name apiToolCalls[i].Function.Name = tc.Function.Name
err := json.Unmarshal([]byte(tc.Function.Arguments), &apiToolCalls[i].Function.Arguments) err := json.Unmarshal([]byte(tc.Function.Arguments), &apiToolCalls[i].Function.Arguments)
if err != nil { if err != nil {