@@ -265,86 +265,3 @@ inline void common_chat_build_peg_grammar(const struct templates_params & inputs
265265 }
266266}
267267
268- // Format struct for XML-style tool calls with individual parameters
269- // Example: <tool_call><function=name><parameter=key>value</parameter></function></tool_call>
270- struct generic_tool_call_format {
271- // Tool calls array wrapper (all default to eps if not set)
272- std::optional<common_peg_parser> tool_calls_start;
273- std::optional<common_peg_parser> tool_calls_sep;
274- std::optional<common_peg_parser> tool_calls_end;
275-
276- // Individual tool call structure (required)
277- std::optional<common_peg_parser> tool_call_start; // e.g., <tool_call><function=
278- std::optional<common_peg_parser> tool_call_name_params_sep; // e.g., >
279- std::optional<common_peg_parser> tool_call_end; // e.g., </function></tool_call>
280-
281- // Parameter structure (required)
282- std::optional<common_peg_parser> param_start; // e.g., <parameter=
283- std::optional<common_peg_parser> param_name_value_sep; // e.g., >
284- std::string param_end; // e.g., </parameter> (string for schema_or_raw_string_until)
285-
286- bool allow_raw_string_param_value = true ;
287- };
288-
289- inline common_peg_parser build_generic_tool_calls_peg_parser (
290- common_chat_peg_builder & p,
291- const struct templates_params & inputs,
292- const generic_tool_call_format & format
293- )
294- {
295- using Tag = common_chat_peg_tag;
296-
297- // Validate required fields
298- if (!format.tool_call_start || !format.tool_call_name_params_sep || !format.tool_call_end ) {
299- throw std::runtime_error (" tool_call_start, tool_call_name_params_sep, and tool_call_end are required" );
300- }
301- if (!format.param_start || !format.param_name_value_sep || format.param_end .empty ()) {
302- throw std::runtime_error (" param_start, param_name_value_sep, and param_end are required" );
303- }
304-
305- // Default to eps() if not set
306- auto tool_calls_start = format.tool_calls_start ? *format.tool_calls_start : p.eps ();
307- auto tool_calls_sep = format.tool_calls_sep ? *format.tool_calls_sep : p.eps ();
308- auto tool_calls_end = format.tool_calls_end ? *format.tool_calls_end : p.eps ();
309-
310- auto tool_call = p.choice ();
311- foreach_function (inputs.tools , [&](const auto &, const auto & name, const json & parameters, const auto & schema_info) {
312- auto args = p.sequence ();
313- foreach_parameter (p, parameters, [&](const std::string & param_name, const common_peg_parser & param_p, const json & param_schema, ParameterType param_type) {
314- auto arg = p.rule (" tool-" + name + " -arg-" + param_name,
315- p.tag (Tag::TOOL_ARG_OPEN , *format.param_start )
316- + p.tag (Tag::TOOL_ARG_NAME , param_p)
317- + *format.param_name_value_sep
318- + (format.allow_raw_string_param_value
319- ? p.schema_or_raw_string_until (" tool-" + name + " -arg-" + param_name + " -schema" , param_schema, format.param_end ,
320- schema_info, Tag::TOOL_ARG_STRING_VALUE , Tag::TOOL_ARG_JSON_VALUE , true )
321- : p.schema (p.json (), " tool-" + name + " -arg-" + param_name, param_schema))
322- + p.literal_tag (Tag::TOOL_ARG_CLOSE , format.param_end ));
323- switch (param_type) {
324- case ParameterType::Required:
325- args += arg;
326- break ;
327- case ParameterType::Optional:
328- args += p.optional (arg);
329- break ;
330- case ParameterType::Additional:
331- args += p.repeat (arg, 0 , -1 );
332- break ;
333- default :
334- throw std::runtime_error (" Unhandled param type" );
335- }
336- });
337-
338- tool_call |= p.rule (" tool-" + name,
339- p.tag (Tag::TOOL_OPEN , *format.tool_call_start )
340- + p.literal_tag (Tag::TOOL_NAME , name)
341- + *format.tool_call_name_params_sep
342- + args
343- + p.tag (Tag::TOOL_CLOSE , *format.tool_call_end ));
344- });
345-
346- return
347- tool_calls_start
348- + tool_call + p.repeat (tool_calls_sep + tool_call, 0 , inputs.parallel_tool_calls ? -1 : 0 )
349- + tool_calls_end;
350- }
0 commit comments