@@ -152,50 +152,6 @@ static common_chat_msg parse_prefixed_json_tool_call_array(const std::string& in
152152 return result;
153153}
154154
155- class text_chat_parser : public common_chat_parser {
156- public:
157- std::optional<common_chat_msg> parse_partial (const std::string & input) override {
158- return parse_final (input);
159- }
160-
161- common_chat_msg parse_final (const std::string & input) override {
162- return {
163- /* .role = */ " assistant" ,
164- /* .content = */ input,
165- /* .tool_calls = */ {},
166- };
167- }
168-
169- std::unique_ptr<common_chat_parser> clone () const override {
170- return std::make_unique<text_chat_parser>();
171- }
172- };
173-
174- class monolithic_chat_parser : public common_chat_parser {
175-
176- std::string input_buffer_;
177- std::function<common_chat_msg(const std::string & input)> parse_final_;
178-
179- public:
180- monolithic_chat_parser (const std::function<common_chat_msg(const std::string & input)> & parse_final) : parse_final_(parse_final) {}
181-
182- std::optional<common_chat_msg> parse_partial (const std::string & input) override {
183- input_buffer_ += input;
184- return std::nullopt ;
185- }
186-
187- common_chat_msg parse_final (const std::string & input) override {
188- input_buffer_ += input;
189- auto out = parse_final_ (input_buffer_);
190- input_buffer_.clear ();
191- return out;
192- }
193-
194- std::unique_ptr<common_chat_parser> clone () const override {
195- return std::make_unique<monolithic_chat_parser>(parse_final_);
196- }
197- };
198-
199155static void foreach_function (const json & tools, const std::function<void (const json &)> & fn) {
200156 for (const auto & tool : tools) {
201157 if (!tool.contains (" type" ) || tool[" type" ] != " function" || !tool.contains (" function" )) {
@@ -289,7 +245,7 @@ static common_chat_data common_chat_init_generic_tool_call(const common_chat_tem
289245
290246 data.prompt = tmpl.apply (tweaked_messages, params.tools .empty () ? json () : params.tools , params.add_generation_prompt );
291247 data.format = " generic tool calls" ;
292- data.parser = std::make_unique<monolithic_chat_parser>( [&](const std::string & input) {
248+ data.parser = [&](const std::string & input) {
293249 json data = json::parse (input);
294250 common_chat_msg result;
295251 result.role = " assistant" ;
@@ -312,7 +268,7 @@ static common_chat_data common_chat_init_generic_tool_call(const common_chat_tem
312268 result.content = response.is_string () ? response.get <std::string>() : response.dump (2 );
313269 }
314270 return result;
315- }) ;
271+ };
316272 return data;
317273}
318274
@@ -355,9 +311,9 @@ static common_chat_data common_chat_init_mistral_nemo_tool_call(const common_cha
355311 data.grammar_triggers .push_back ({" [TOOL_CALLS]" , /* .at_start = */ true });
356312 data.prompt = tmpl.apply (params.messages , params.tools .empty () ? json () : params.tools , params.add_generation_prompt );
357313 data.format = " mistral nemo tool calls" ;
358- data.parser = std::make_unique<monolithic_chat_parser>( [](const std::string & input) {
314+ data.parser = [](const std::string & input) {
359315 return parse_prefixed_json_tool_call_array (input, " [TOOL_CALLS]" );
360- }) ;
316+ };
361317 return data;
362318}
363319
@@ -441,7 +397,7 @@ static common_chat_data common_chat_init_llama_3_1_python_tag_tool_calls(const c
441397 {" builtin_tools" , builtin_tools.empty () ? json () : builtin_tools},
442398 });
443399 data.format = " llama 3.1 tool calls" ;
444- data.parser = std::make_unique<monolithic_chat_parser>( [params](const std::string & input) -> common_chat_msg {
400+ data.parser = [params](const std::string & input) -> common_chat_msg {
445401 static std::regex function_regex (" \\ {\" name\" : \" ([^\" ]+)\" , \" parameters\" : " );
446402 static std::regex close_regex (" \\ }" );
447403 static std::regex builtin_call_regex (" <\\ |python_tag\\ |>([^.(]+)\\ .call\\ ((.*)\\ )" );
@@ -472,7 +428,7 @@ static common_chat_data common_chat_init_llama_3_1_python_tag_tool_calls(const c
472428 };
473429 }
474430 return parse_json_tool_calls (params.tools , input, std::nullopt , function_regex, close_regex, /* check_names= */ true );
475- }) ;
431+ };
476432 return data;
477433}
478434
@@ -505,12 +461,12 @@ static common_chat_data common_chat_init_llama_3_2_tool_calls(const common_chat_
505461 data.additional_stops .push_back (" <|eom_id|>" );
506462 data.prompt = tmpl.apply (params.messages , params.tools .empty () ? json () : params.tools , params.add_generation_prompt , {});
507463 data.format = " llama 3.2 tool calls" ;
508- data.parser = std::make_unique<monolithic_chat_parser>( [params](const std::string & input) {
464+ data.parser = [params](const std::string & input) {
509465 static std::regex function_regex (" \\ {[\\ s\\ n\\ r]*(?:\" type\" [\\ s\\ n\\ r]*:[\\ s\\ n\\ r]*\" function\" [\\ s\\ n\\ r]*,[\\ s\\ n\\ r]*|[\\ s\\ n\\ r]*)\" name\" [\\ s\\ n\\ r]*:[\\ s\\ n\\ r]*\" ([^\" ]+)\" [\\ s\\ n\\ r]*,[\\ s\\ n\\ r]*\" parameters\" : " );
510466 static std::regex close_regex (" \\ }" );
511467 auto res = parse_json_tool_calls (params.tools , input, std::nullopt , function_regex, close_regex, /* check_names= */ true );
512468 return res;
513- }) ;
469+ };
514470 return data;
515471}
516472
@@ -532,12 +488,12 @@ static common_chat_data common_chat_init_deepseek_r1_tool_call(const common_chat
532488 }, grammar_options);
533489 data.prompt = tmpl.apply (params.messages , params.tools .empty () ? json () : params.tools , params.add_generation_prompt );
534490 data.format = " deepseek r1 tool calls" ;
535- data.parser = std::make_unique<monolithic_chat_parser>( [params](const std::string & input) {
491+ data.parser = [params](const std::string & input) {
536492 static std::regex trigger_regex (" <|tool▁calls▁begin|>" );
537493 static std::regex function_regex (" <|tool▁call▁begin|>function<|tool▁sep|>([^\n ]+)\n ```json\n " );
538494 static std::regex close_regex (" ```<|tool▁call▁end|>" );
539495 return parse_json_tool_calls (params.tools , input, trigger_regex, function_regex, close_regex, /* check_names= */ true );
540- }) ;
496+ };
541497 return data;
542498}
543499
@@ -573,9 +529,9 @@ static common_chat_data common_chat_init_firefunction_v2_tool_call(const common_
573529 data.grammar_triggers .push_back ({" functools[" , /* .at_start = */ false });
574530 data.prompt = tmpl.apply (params.messages , params.tools .empty () ? json () : params.tools , params.add_generation_prompt );
575531 data.format = " firefunction v2 tool calls" ;
576- data.parser = std::make_unique<monolithic_chat_parser>( [](const std::string & input) {
532+ data.parser = [](const std::string & input) {
577533 return parse_prefixed_json_tool_call_array (input, " functools[" , /* rstrip_prefix= */ 1 );
578- }) ;
534+ };
579535 return data;
580536}
581537
@@ -610,7 +566,7 @@ static common_chat_data common_chat_init_functionary_v3_2_tool_call(const common
610566
611567 data.prompt = tmpl.apply (params.messages , params.tools .empty () ? json () : params.tools , params.add_generation_prompt );
612568 data.format = " functionary v3.2 tool calls" ;
613- data.parser = std::make_unique<monolithic_chat_parser>( [params](const std::string & input) {
569+ data.parser = [params](const std::string & input) {
614570 static std::regex function_regex (R"( (?:>>>)?(\w+)\n)" );
615571 static std::regex close_regex (R"( $|(?=>>>))" );
616572
@@ -619,7 +575,7 @@ static common_chat_data common_chat_init_functionary_v3_2_tool_call(const common
619575 res.content = res.content .substr (4 );
620576 }
621577 return res;
622- }) ;
578+ };
623579 return data;
624580}
625581
@@ -674,7 +630,7 @@ static common_chat_data common_chat_init_functionary_v3_1_llama_3_1_tool_call(co
674630
675631 data.prompt = tmpl.apply (params.messages , params.tools .empty () ? json () : params.tools , params.add_generation_prompt );
676632 data.format = " functionary v3.1 llama 3.1 tool calls" ;
677- data.parser = std::make_unique<monolithic_chat_parser>( [params, has_raw_python, python_code_argument_name](const std::string & input) -> common_chat_msg {
633+ data.parser = [params, has_raw_python, python_code_argument_name](const std::string & input) -> common_chat_msg {
678634 // This version of Functionary still supports the llama 3.1 tool call format for the python tool.
679635 static std::regex python_tag_regex (R"( <\|python_tag\|>([\s\S\n]*)$)" );
680636 std::smatch match;
@@ -695,7 +651,7 @@ static common_chat_data common_chat_init_functionary_v3_1_llama_3_1_tool_call(co
695651 static std::regex function_regex (R"( <function=(\w+)>)" );
696652 static std::regex close_regex (R"( </function>)" );
697653 return parse_json_tool_calls (params.tools , input, std::nullopt , function_regex, close_regex, /* check_names= */ false , has_raw_python);
698- }) ;
654+ };
699655 return data;
700656}
701657
@@ -726,7 +682,7 @@ static common_chat_data common_chat_init_hermes_2_pro_tool_call(const common_cha
726682
727683 data.prompt = tmpl.apply (params.messages , params.tools .empty () ? json () : params.tools , params.add_generation_prompt );
728684 data.format = " hermes 2 pro tool calls" ;
729- data.parser = std::make_unique<monolithic_chat_parser>( [&](const std::string & input) -> common_chat_msg {
685+ data.parser = [&](const std::string & input) -> common_chat_msg {
730686 try {
731687 std::regex start_pattern (R"( [\n\s]*<tool_call>)" );
732688 std::regex middle_pattern (R"( [\n\s]*</tool_call>[\n\s]*<tool_call>)" );
@@ -779,15 +735,21 @@ static common_chat_data common_chat_init_hermes_2_pro_tool_call(const common_cha
779735 /* .tool_calls = */ {},
780736 };
781737 }
782- }) ;
738+ };
783739 return data;
784740}
785741
786742static common_chat_data common_chat_init_without_tools (const common_chat_template & tmpl, const struct common_chat_params & params) {
787743 common_chat_data data;
788744 data.prompt = tmpl.apply (params.messages , params.tools .empty () ? json () : params.tools , params.add_generation_prompt );
789745 data.format = " content-only" ;
790- data.parser = std::make_unique<text_chat_parser>();
746+ data.parser = [](const std::string & input) -> common_chat_msg {
747+ return {
748+ /* .role = */ " assistant" ,
749+ /* .content = */ input,
750+ /* .tool_calls = */ {},
751+ };
752+ };
791753 data.grammar_lazy = false ;
792754 if (!params.json_schema .is_null ()) {
793755 if (!params.grammar .empty ()) {
0 commit comments