"|<function name=\"([^\"]+)\">" // match 5 (function name again)
);
- if (auto res = builder.try_find_regex(open_regex)) {
+ while (auto res = builder.try_find_regex(open_regex)) {
const auto & block_start = res->groups[1];
std::string block_end = block_start.empty() ? "" : "```";
builder.consume_literal(block_end);
builder.consume_spaces();
}
- builder.add_content(builder.consume_rest());
} else {
throw common_chat_msg_partial_exception("failed to parse tool call");
}
builder.consume_spaces();
}
}
- builder.add_content(builder.consume_rest());
}
- } else {
- builder.add_content(builder.consume_rest());
}
+
+ builder.add_content(builder.consume_rest());
}
static common_chat_params common_chat_params_init_without_tools(const common_chat_template & tmpl, const struct templates_params & inputs) {
/* is_partial= */ false,
{COMMON_CHAT_FORMAT_HERMES_2_PRO}));
+ // Test multiple tool calls
+ common_chat_msg message_assist_multiple_calls;
+ message_assist_multiple_calls.role = "assistant";
+ message_assist_multiple_calls.content = "";
+ message_assist_multiple_calls.tool_calls.push_back({"special_function", "{\"arg1\": 1}", ""});
+ message_assist_multiple_calls.tool_calls.push_back({"python", "{\"code\":\"print('hello')\"}", ""});
+
+ assert_msg_equals(
+ message_assist_multiple_calls,
+ common_chat_parse(
+ "<tool_call>\n"
+ "{\"name\": \"special_function\", \"arguments\": {\"arg1\": 1}}\n"
+ "</tool_call>\n"
+ "<tool_call>\n"
+ "{\"name\": \"python\", \"arguments\": {\"code\":\"print('hello')\"}}\n"
+ "</tool_call>",
+ /* is_partial= */ false,
+ {COMMON_CHAT_FORMAT_HERMES_2_PRO}));
+
+ assert_msg_equals(
+ message_assist_multiple_calls,
+ common_chat_parse(
+ "<function=special_function>{\"arg1\": 1}</function>\n"
+ "<function=python>{\"code\":\"print('hello')\"}</function>",
+ /* is_partial= */ false,
+ {COMMON_CHAT_FORMAT_HERMES_2_PRO}));
+
assert_msg_equals(
simple_assist_msg(
"This is not a tool call:",
"<tool_call>\n"
"{\"name\": \"special_function\", \"arguments\": {\"arg1\": 1}}\n"
"</tool_call>");
+
+ // Test multiple tool calls with template
+ common_chat_msg message_assist_multiple_calls_template;
+ message_assist_multiple_calls_template.role = "assistant";
+ message_assist_multiple_calls_template.content = "";
+ message_assist_multiple_calls_template.tool_calls.push_back({"special_function", "{\"arg1\": 1}", ""});
+ message_assist_multiple_calls_template.tool_calls.push_back({"python", "{\"code\":\"print('test')\"}", ""});
+
+ test_templates(tmpls.get(), end_tokens, message_assist_multiple_calls_template, tools,
+ "<tool_call>\n"
+ "{\"name\": \"special_function\", \"arguments\": {\"arg1\": 1}}\n"
+ "</tool_call>\n"
+ "<tool_call>\n"
+ "{\"name\": \"python\", \"arguments\": {\"code\":\"print('test')\"}}\n"
+ "</tool_call>");
+
test_templates(tmpls.get(), end_tokens, message_assist_call_python_lines, tools,
"<tool_call>\n"
"{\"name\": \"python\", \"arguments\": {\"code\":\"# This is a program:\\nprint('hey')\"}}\n"