made changes to JSON tool parser, wraps the TollCallFunction with a TollCall object

This commit is contained in:
Grace Guo 2025-10-06 12:08:38 -07:00
parent c3fa8b2f54
commit a27397e55c
3 changed files with 45 additions and 15 deletions

View File

@ -59,7 +59,9 @@ func (p *Qwen3VLParser) Add(s string, done bool) (content string, thinking strin
for _, event := range events {
switch event := event.(type) {
case qwenEventRawToolCall:
toolCall, err := parseToolCall(event, p.tools)
fmt.Print("[qwen3vl parser] qwenEventRawToolCall ", event.raw)
fmt.Print("[qwen3vl parser] p.tools ", p.tools)
toolCall, err := parseJSONToolCall(event, p.tools)
if err != nil {
slog.Warn("qwen tool call parsing failed", "error", err)
return "", "", nil, err
@ -238,23 +240,17 @@ func parseJSONToolCall(raw qwenEventRawToolCall, tools []api.Tool) (api.ToolCall
// Name string `json:"name"`
// Arguments json.RawMessage `json:"arguments"`
// }
fmt.Println(raw.raw)
fmt.Printf("[qwen3vl parseJSONToolCall] raw.raw %s\n", raw.raw)
var toolCall api.ToolCall
if err := json.Unmarshal([]byte(raw.raw), &toolCall); err != nil {
var toolCallFunction api.ToolCallFunction
if err := json.Unmarshal([]byte(raw.raw), &toolCallFunction); err != nil {
return api.ToolCall{}, err
}
// args := make(api.ToolCallFunctionArguments)
// if len(in.Arguments) > 0 && string(in.Arguments) != "null" {
// var obj map[string]any
// if err := json.Unmarshal(in.Arguments, &obj); err == nil {
// for k, v := range obj {
// args[k] = v
// }
// }
// }
fmt.Println(toolCall)
toolCall := api.ToolCall{}
toolCall.Function = toolCallFunction
fmt.Printf("[qwen3vl parser] toolCall %#v\n", toolCall)
return toolCall, nil
}

View File

@ -184,6 +184,39 @@ func TestQwen3VLParserStreaming(t *testing.T) {
}
}
func TestQwen3VLComplex(t *testing.T) {
type step struct {
input string
wantEvents []qwenEvent
}
cases := []struct {
desc string
steps []step
only bool
}{
{
desc: "simple tool call",
steps: []step{
{
input: "Here are 30 distinct and popular emojis for you! 😊\n\n1. 😂 \n2. ❤️ \n3. 🌟 \n4. 🐶 \n5. 🍕 \n6. ✨ \n7. 🌈 \n8. 🎉 \n9. 🌎 \n10. 🦁 \n11. 💯 \n12. 🥰 \n13. 🌸 \n14. 🚀 \n15. 🌊 \n16. 🍦 \n17. 🌙 \n18. 🌞 \n19. 🌻 \n20. 🦋 \n21. 🍃 \n22. 🏆 \n23. 🌮 \n24. 🧸 \n25. 🎮 \n26. 📚 \n27. ✈️ \n28. 🌟 (sparkles) \n29. 🌈 (rainbow) \n30. 🥳 \n\n*Bonus fun fact:* The 😂 (Face with Tears of Joy) was Oxford Dictionaries' Word of the Year in 2015! 🎉 \nLet me know if you'd like themed emojis (e.g., animals, food, or emotions)! 🐱🍕📚",
wantEvents: []qwenEvent{qwenEventContent{content: "bruh"}},
},
},
},
}
for _, tc := range cases {
for i, step := range tc.steps {
parser := Qwen3VLParser{}
parser.buffer.WriteString(step.input)
gotEvents := parser.parseEvents()
if !reflect.DeepEqual(gotEvents, step.wantEvents) {
t.Errorf("step %d: input %q: got events %#v, want %#v", i, step.input, gotEvents, step.wantEvents)
}
}
}
}
// TODO: devin was saying something about json cant figure out types?
// do we need to test for
func TestQwen3VLToolParser(t *testing.T) {

View File

@ -187,7 +187,8 @@ func Qwen3VLRenderer(messages []api.Message, tools []api.Tool, _ *api.ThinkValue
}
sb.WriteString("<|im_start|>assistant\n<think>\n")
// sb.WriteString("<|im_start|>assistant\n<think>\n")
sb.WriteString("<|im_start|>assistant\n")
return sb.String(), nil
}