@@ -656,7 +656,6 @@ static void parse_json_tool_calls(
656656 }
657657 from = std::string::npos;
658658
659- builder.add_content (res->prelude );
660659 auto maybe_raw_python = name == " python" && allow_raw_python;
661660 if (builder.input ()[builder.pos ()] == ' {' || !maybe_raw_python) {
662661 if (auto arguments = builder.try_consume_json_with_dumped_args ({{}})) {
@@ -686,7 +685,6 @@ static void parse_json_tool_calls(
686685 };
687686 if (block_open) {
688687 if (auto res = builder.try_find_regex (*block_open)) {
689- builder.add_content (res->prelude );
690688 parse_tool_calls ();
691689 } else {
692690 builder.add_content (builder.consume_rest ());
@@ -699,7 +697,6 @@ static void parse_json_tool_calls(
699697static void parse_prefixed_json_tool_call_array (common_chat_msg_parser & builder, const common_regex & prefix, size_t rstrip_prefix = 0 ) {
700698 static const std::vector<std::vector<std::string>> args_paths = {{" arguments" }};
701699 if (auto res = builder.try_find_regex (prefix)) {
702- builder.add_content (res->prelude );
703700 builder.move_back (rstrip_prefix);
704701 auto tool_calls = builder.consume_json_with_dumped_args (args_paths);
705702 if (!builder.add_tool_calls (tool_calls.value ) || tool_calls.is_partial ) {
@@ -835,6 +832,10 @@ static common_chat_params common_chat_params_init_generic(const common_chat_temp
835832 return data;
836833}
837834static void common_chat_parse_generic (common_chat_msg_parser & builder) {
835+ if (!builder.syntax ().parse_tool_calls ) {
836+ builder.add_content (builder.consume_rest ());
837+ return ;
838+ }
838839 static const std::vector<std::vector<std::string>> content_paths = {
839840 {" response" },
840841 };
@@ -907,6 +908,11 @@ static common_chat_params common_chat_params_init_mistral_nemo(const common_chat
907908 return data;
908909}
909910static void common_chat_parse_mistral_nemo (common_chat_msg_parser & builder) {
911+ if (!builder.syntax ().parse_tool_calls ) {
912+ builder.add_content (builder.consume_rest ());
913+ return ;
914+ }
915+
910916 static const common_regex prefix (regex_escape (" [TOOL_CALLS]" ));
911917 parse_prefixed_json_tool_call_array (builder, prefix);
912918}
@@ -1001,7 +1007,6 @@ static void common_chat_parse_command_r7b(common_chat_msg_parser & builder) {
10011007
10021008 if (auto res = builder.try_find_regex (start_action_regex)) {
10031009 // If we didn't extract thoughts, prelude includes them.
1004- builder.add_content (res->prelude );
10051010 auto tool_calls = builder.consume_json_with_dumped_args ({{" parameters" }});
10061011 for (const auto & tool_call : tool_calls.value ) {
10071012 std::string name = tool_call.contains (" tool_name" ) ? tool_call.at (" tool_name" ) : " " ;
@@ -1016,11 +1021,7 @@ static void common_chat_parse_command_r7b(common_chat_msg_parser & builder) {
10161021 }
10171022 builder.consume_regex (end_action_regex);
10181023 } else if (auto res = builder.try_find_regex (start_response_regex)) {
1019- // If we didn't extract thoughts, prelude includes them.
1020- builder.add_content (res->prelude );
1021- if (auto res = builder.try_find_regex (end_response_regex)) {
1022- builder.add_content (res->prelude );
1023- } else {
1024+ if (!builder.try_find_regex (end_response_regex)) {
10241025 builder.add_content (builder.consume_rest ());
10251026 throw common_chat_msg_partial_exception (end_response_regex.str ());
10261027 }
@@ -1128,6 +1129,11 @@ static common_chat_params common_chat_params_init_llama_3_x(const common_chat_te
11281129 return data;
11291130}
11301131static void common_chat_parse_llama_3_1 (common_chat_msg_parser & builder, bool with_builtin_tools = false ) {
1132+ if (!builder.syntax ().parse_tool_calls ) {
1133+ builder.add_content (builder.consume_rest ());
1134+ return ;
1135+ }
1136+
11311137 static const common_regex function_regex (
11321138 " \\ s*\\ {\\ s*(?:\" type\"\\ s*:\\ s*\" function\"\\ s*,\\ s*)?\" name\"\\ s*:\\ s*\" ([^\" ]+)\"\\ s*,\\ s*\" parameters\"\\ s*: " );
11331139 static const common_regex close_regex (" \\ }\\ s*" );
@@ -1138,8 +1144,6 @@ static void common_chat_parse_llama_3_1(common_chat_msg_parser & builder, bool w
11381144 if (with_builtin_tools) {
11391145 static const common_regex builtin_call_regex (" <\\ |python_tag\\ |>" );
11401146 if (auto res = builder.try_find_regex (builtin_call_regex)) {
1141- builder.add_content (res->prelude );
1142-
11431147 auto fun_res = builder.consume_regex (function_name_regex);
11441148 auto function_name = builder.str (fun_res.groups [1 ]);
11451149
@@ -1255,6 +1259,10 @@ static common_chat_params common_chat_params_init_deepseek_r1(const common_chat_
12551259}
12561260static void common_chat_parse_deepseek_r1 (common_chat_msg_parser & builder) {
12571261 builder.try_parse_reasoning (" <think>" , " </think>" );
1262+ if (!builder.syntax ().parse_tool_calls ) {
1263+ builder.add_content (builder.consume_rest ());
1264+ return ;
1265+ }
12581266
12591267 static const common_regex tool_calls_begin (" (?:<|tool▁calls▁begin|>|<|tool_calls_begin|>|<|tool calls begin|>|<|tool\\\\ _calls\\\\ _begin|>|<|tool▁calls|>)" );
12601268 static const common_regex tool_calls_end (" <|tool▁calls▁end|>" );
@@ -1316,6 +1324,10 @@ static common_chat_params common_chat_params_init_firefunction_v2(const common_c
13161324 return data;
13171325}
13181326static void common_chat_parse_firefunction_v2 (common_chat_msg_parser & builder) {
1327+ if (!builder.syntax ().parse_tool_calls ) {
1328+ builder.add_content (builder.consume_rest ());
1329+ return ;
1330+ }
13191331 static const common_regex prefix (regex_escape (" functools[" ));
13201332 parse_prefixed_json_tool_call_array (builder, prefix, /* rstrip_prefix= */ 1 );
13211333}
@@ -1457,15 +1469,12 @@ static common_chat_params common_chat_params_init_functionary_v3_1_llama_3_1(con
14571469 return data;
14581470}
14591471static void common_chat_parse_functionary_v3_1_llama_3_1 (common_chat_msg_parser & builder) {
1460- // This version of Functionary still supports the llama 3.1 tool call format for the python tool.
1461- static const common_regex python_tag_regex (regex_escape (" <|python_tag|>" ));
1462-
1463- if (auto res = builder.try_find_regex (python_tag_regex)) {
1464- builder.add_content (res->prelude );
1465- auto arguments = wrap_code_as_arguments (builder, builder.consume_rest ());
1466- builder.add_tool_call (" python" , " " , arguments);
1472+ if (!builder.syntax ().parse_tool_calls ) {
1473+ builder.add_content (builder.consume_rest ());
14671474 return ;
14681475 }
1476+ // This version of Functionary still supports the llama 3.1 tool call format for the python tool.
1477+ static const common_regex python_tag_regex (regex_escape (" <|python_tag|>" ));
14691478
14701479 static const common_regex function_regex (R"( <function=(\w+)>)" );
14711480 static const common_regex close_regex (R"( </function>)" );
@@ -1477,6 +1486,12 @@ static void common_chat_parse_functionary_v3_1_llama_3_1(common_chat_msg_parser
14771486 function_regex,
14781487 close_regex,
14791488 std::nullopt );
1489+
1490+ if (auto res = builder.try_find_regex (python_tag_regex)) {
1491+ auto arguments = wrap_code_as_arguments (builder, builder.consume_rest ());
1492+ builder.add_tool_call (" python" , " " , arguments);
1493+ return ;
1494+ }
14801495}
14811496
14821497static common_chat_params common_chat_params_init_hermes_2_pro (const common_chat_template & tmpl, const struct templates_params & inputs) {
@@ -1595,6 +1610,10 @@ static common_chat_params common_chat_params_init_hermes_2_pro(const common_chat
15951610}
15961611static void common_chat_parse_hermes_2_pro (common_chat_msg_parser & builder) {
15971612 builder.try_parse_reasoning (" <think>" , " </think>" );
1613+ if (!builder.syntax ().parse_tool_calls ) {
1614+ builder.add_content (builder.consume_rest ());
1615+ return ;
1616+ }
15981617
15991618 static const common_regex open_regex (
16001619 " (?:"
@@ -1616,8 +1635,6 @@ static void common_chat_parse_hermes_2_pro(common_chat_msg_parser & builder) {
16161635 );
16171636
16181637 if (auto res = builder.try_find_regex (open_regex)) {
1619- builder.add_content (res->prelude );
1620-
16211638 const auto & block_start = res->groups [1 ];
16221639 std::string block_end = block_start.empty () ? " " : " ```" ;
16231640
@@ -1853,10 +1870,10 @@ static void common_chat_parse_content_only(common_chat_msg_parser & builder) {
18531870 builder.add_content (builder.consume_rest ());
18541871}
18551872
1856- static void common_chat_parse (common_chat_msg_parser & builder, common_chat_format format ) {
1857- LOG_DBG (" Parsing input with format %s: %s\n " , common_chat_format_name (format), builder.input ().c_str ());
1873+ static void common_chat_parse (common_chat_msg_parser & builder) {
1874+ LOG_DBG (" Parsing input with format %s: %s\n " , common_chat_format_name (builder. syntax (). format ), builder.input ().c_str ());
18581875
1859- switch (format) {
1876+ switch (builder. syntax (). format ) {
18601877 case COMMON_CHAT_FORMAT_CONTENT_ONLY:
18611878 common_chat_parse_content_only (builder);
18621879 break ;
@@ -1891,15 +1908,15 @@ static void common_chat_parse(common_chat_msg_parser & builder, common_chat_form
18911908 common_chat_parse_command_r7b (builder);
18921909 break ;
18931910 default :
1894- throw std::runtime_error (std::string (" Unsupported format: " ) + common_chat_format_name (format));
1911+ throw std::runtime_error (std::string (" Unsupported format: " ) + common_chat_format_name (builder. syntax (). format ));
18951912 }
18961913 builder.finish ();
18971914}
18981915
18991916common_chat_msg common_chat_parse (const std::string & input, bool is_partial, const common_chat_syntax & syntax) {
19001917 common_chat_msg_parser builder (input, is_partial, syntax);
19011918 try {
1902- common_chat_parse (builder, syntax. format );
1919+ common_chat_parse (builder);
19031920 } catch (const common_chat_msg_partial_exception & ex) {
19041921 LOG_DBG (" Partial parse: %s\n " , ex.what ());
19051922 if (!is_partial) {
0 commit comments