diff --git a/common/tool-call.cpp b/common/tool-call.cpp index ad71fd9e2..0880a610f 100644 --- a/common/tool-call.cpp +++ b/common/tool-call.cpp @@ -185,7 +185,7 @@ static llama_tool_calls parse_llama_3_tool_calls(const json & tools, const std:: }; } } - static std::regex function_regex("\\{[\\s\\n\\r]*\"name\": \"([^\"]+)\", \"parameters\": "); + static std::regex function_regex("\\{(?:\"type\": \"function\", |[\\s\\n\\r]*)\"name\": \"([^\"]+)\", \"parameters\": "); static std::regex close_regex("\\}"); return parse_json_tool_calls(tools, input, function_regex, close_regex, /* check_names= */ true); } @@ -270,7 +270,7 @@ llama_tool_call_handler llama_tool_call_handler_init( tool_rules.push_back( builder.add_rule( name + "-call", - "\"\\n\"? \"{\" space \"\\\"name\\\": \\\"" + name + "\\\", \\\"parameters\\\": \" " + + "\"\\n\"? \"{\" ( \"\\\"type\\\": \\\"function\\\", \" | space ) \"\\\"name\\\": \\\"" + name + "\\\", \\\"parameters\\\": \" " + builder.add_schema(name + "-args", parameters) + " \"}\"")); if (allow_content && !eagerly_match_any_json) { @@ -281,6 +281,7 @@ llama_tool_call_handler llama_tool_call_handler_init( handler.grammar_trigger_words.push_back("{\n\t\"name\": \"" + name + "\""); handler.grammar_trigger_words.push_back("{\n \"name\": \"" + name + "\""); handler.grammar_trigger_words.push_back("{\n \"name\": \"" + name + "\""); + handler.grammar_trigger_words.push_back("{\"type\": \"function\", \"name\": \"" + name + "\""); } } } diff --git a/tests/test-tool-call.cpp b/tests/test-tool-call.cpp index f7e5e2027..18a4b052e 100644 --- a/tests/test-tool-call.cpp +++ b/tests/test-tool-call.cpp @@ -253,6 +253,11 @@ static void test_parsing() { "{\n \"name\": \"special_function\", \"parameters\": {\"arg1\": 1}}", "", just_special_function_call); + test_parse_tool_call(llama_tool_call_style::Llama31, tools, + "{\"type\": \"function\", \"name\": \"special_function\", \"parameters\": {\"arg1\": 1}}", + "", + just_special_function_call); + // No match: function unknown test_parse_tool_call(llama_tool_call_style::Llama31, tools, "{\"name\": \"unknown_function\", \"arguments\": {\"arg1\": 1}}",