diff --git a/tools/tools.go b/tools/tools.go index 80fc6e0d0c..f9a2d3b9b6 100644 --- a/tools/tools.go +++ b/tools/tools.go @@ -273,9 +273,21 @@ func findArguments(buffer []byte) (map[string]any, int) { if args, ok := obj["arguments"].(map[string]any); ok { return args, true } + if argsStr, ok := obj["arguments"].(string); ok { + var argsData map[string]interface{} + if err := json.Unmarshal([]byte(argsStr), &argsData); err == nil { + return argsData, ok + } + } if args, ok := obj["parameters"].(map[string]any); ok { return args, true } + if argsStr, ok := obj["parameters"].(string); ok { + var argsData map[string]interface{} + if err := json.Unmarshal([]byte(argsStr), &argsData); err == nil { + return argsData, ok + } + } return nil, true } diff --git a/tools/tools_test.go b/tools/tools_test.go index 2a449a0eac..288fa73c55 100644 --- a/tools/tools_test.go +++ b/tools/tools_test.go @@ -1274,6 +1274,22 @@ func TestFindArguments(t *testing.T) { "items": []any{"{", "}", map[string]any{"key": "value"}}, }, }, + { + name: "stringified arguments", + buffer: []byte(`{"name": "get_temperature", "arguments": "{\"format\": \"fahrenheit\", \"location\": \"San Francisco, CA\"}"}`), + want: map[string]any{ + "format": "fahrenheit", + "location": "San Francisco, CA", + }, + }, + { + name: "stringified parameters", + buffer: []byte(`{"name": "get_temperature", "parameters": "{\"format\": \"fahrenheit\", \"location\": \"San Francisco, CA\"}"}`), + want: map[string]any{ + "format": "fahrenheit", + "location": "San Francisco, CA", + }, + }, } for _, tt := range tests {