Fix XML tool call parsing: try JSON parse for parameter values

Parameter values like ["key1", "key2"] were being wrapped as strings
instead of parsed as JSON arrays. Tools expecting array arguments
(like memory_search) got a string containing the array literal.

Now tries serde_json::from_str first, falls back to String.

Co-Authored-By: Proof of Concept <poc@bcachefs.org>
This commit is contained in:
Kent Overstreet 2026-04-08 18:52:10 -04:00
parent 785dea9b9b
commit d451b69196

View file

@ -449,7 +449,9 @@ fn parse_xml_tool_call(body: &str) -> Option<(String, String)> {
let mut args = serde_json::Map::new(); let mut args = serde_json::Map::new();
let mut rest = func_body; let mut rest = func_body;
while let Some((key, val, remainder)) = parse_qwen_tag(rest, "parameter") { while let Some((key, val, remainder)) = parse_qwen_tag(rest, "parameter") {
args.insert(key.to_string(), serde_json::Value::String(val.to_string())); let value = serde_json::from_str(val)
.unwrap_or(serde_json::Value::String(val.to_string()));
args.insert(key.to_string(), value);
rest = remainder; rest = remainder;
} }
Some((func_name.to_string(), serde_json::to_string(&args).unwrap_or_default())) Some((func_name.to_string(), serde_json::to_string(&args).unwrap_or_default()))