diff --git a/model/parsers/qwen3coder.go b/model/parsers/qwen3coder.go index 84636bdc6a..bfa9762c1c 100644 --- a/model/parsers/qwen3coder.go +++ b/model/parsers/qwen3coder.go @@ -276,7 +276,14 @@ func parseToolCall(raw qwenEventRawToolCall, tools []api.Tool) (api.ToolCall, er var paramType api.PropertyType if matchedTool != nil && matchedTool.Function.Parameters.Properties != nil { if prop, ok := matchedTool.Function.Parameters.Properties[parameter.Name]; ok { - paramType = prop.Type + // Handle anyOf by collecting all types from the union + if len(prop.AnyOf) > 0 { + for _, anyOfProp := range prop.AnyOf { + paramType = append(paramType, anyOfProp.Type...) + } + } else { + paramType = prop.Type + } } } diff --git a/model/parsers/qwen3coder_test.go b/model/parsers/qwen3coder_test.go index 3756b4bac7..e4246abcd1 100644 --- a/model/parsers/qwen3coder_test.go +++ b/model/parsers/qwen3coder_test.go @@ -977,6 +977,21 @@ func TestQwenToolCallValueParsing(t *testing.T) { raw: "123", want: 123, // Integer has higher precedence than string }, + { + desc: "anyOf array or string - with array of objects", + paramType: api.PropertyType{"array", "string"}, + raw: `[{"content": "task 1", "status": "pending", "priority": "high", "id": "1"}, {"content": "task 2", "status": "completed", "priority": "low", "id": "2"}]`, + want: []any{ + map[string]any{"content": "task 1", "status": "pending", "priority": "high", "id": "1"}, + map[string]any{"content": "task 2", "status": "completed", "priority": "low", "id": "2"}, + }, + }, + { + desc: "anyOf array or string - with plain string", + paramType: api.PropertyType{"array", "string"}, + raw: "Error: could not load data", + want: "Error: could not load data", + }, } for _, tc := range cases {