fix(local-inference): keep XML snippets inside JSON as data (#10606)

This commit is contained in:
Jasper
2026-07-27 15:26:03 -05:00
committed by GitHub
parent af6437ac03
commit b7542f2544
@@ -18,6 +18,8 @@ pub(crate) fn message_from_native_tool_text(
append_tool_calls(&mut content, message.get("tool_calls"));
} else if let Some(tool_calls) = parse_tool_calls_json(generated_text) {
append_tool_calls(&mut content, Some(&tool_calls));
} else if serde_json::from_str::<Value>(generated_text.trim()).is_ok() {
return Ok(None);
} else if generated_text.contains("<function=") {
let (prefix, tool_calls) = parse_xml_tool_calls(generated_text);
if let Some(prefix) = prefix {
@@ -320,4 +322,22 @@ mod tests {
let message = message_from_native_tool_text(text, "msg").unwrap().unwrap();
assert_eq!(tool_count(&message), 1);
}
#[test]
fn ignores_xml_tool_call_inside_json_string() {
let text = r#"{"example":"<function=developer__shell><parameter=command>pwd</parameter></function>"}"#;
assert!(message_from_native_tool_text(text, "msg")
.unwrap()
.is_none());
}
#[test]
fn parses_json_tool_call_with_xml_text_in_arguments() {
let text =
r#"{"name":"developer__shell","arguments":{"command":"echo <function=example>"}}"#;
let message = message_from_native_tool_text(text, "msg").unwrap().unwrap();
assert_eq!(tool_count(&message), 1);
}
}