From 41eec4622bee2fcdd32fc3ae93a7141f8a725cbf Mon Sep 17 00:00:00 2001 From: ochafik Date: Wed, 29 Jan 2025 16:50:54 +0000 Subject: [PATCH] rm unused templates, rename one --- examples/server/tests/unit/test_tool_call.py | 4 +- ...archHermes-2-Pro-Llama-3-8B-tool_use.jinja | 153 ------------------ tests/chat/templates/google-gemma-7b-it.jinja | 4 - ...eta-llama-Meta-Llama-3.1-8B-Instruct.jinja | 109 ------------- tests/test-chat-handler.cpp | 2 +- 5 files changed, 3 insertions(+), 269 deletions(-) delete mode 100644 tests/chat/templates/NousResearchHermes-2-Pro-Llama-3-8B-tool_use.jinja delete mode 100644 tests/chat/templates/google-gemma-7b-it.jinja delete mode 100644 tests/chat/templates/meta-llama-Meta-Llama-3.1-8B-Instruct.jinja diff --git a/examples/server/tests/unit/test_tool_call.py b/examples/server/tests/unit/test_tool_call.py index 117fd2da8..3626591d0 100644 --- a/examples/server/tests/unit/test_tool_call.py +++ b/examples/server/tests/unit/test_tool_call.py @@ -107,8 +107,8 @@ def test_completion_with_required_tool_tiny_fast(template_name: str, tool: dict, @pytest.mark.slow @pytest.mark.parametrize("template_name,tool,argument_key", [ - ("meta-llama-Meta-Llama-3.1-8B-Instruct", TEST_TOOL, "success"), - ("meta-llama-Meta-Llama-3.1-8B-Instruct", PYTHON_TOOL, "code"), + ("meta-llama-Llama-3.1-8B-Instruct", TEST_TOOL, "success"), + ("meta-llama-Llama-3.1-8B-Instruct", PYTHON_TOOL, "code"), ("meetkai-functionary-medium-v3.1", TEST_TOOL, "success"), ("meetkai-functionary-medium-v3.1", PYTHON_TOOL, "code"), ("meetkai-functionary-medium-v3.2", TEST_TOOL, "success"), diff --git a/tests/chat/templates/NousResearchHermes-2-Pro-Llama-3-8B-tool_use.jinja b/tests/chat/templates/NousResearchHermes-2-Pro-Llama-3-8B-tool_use.jinja deleted file mode 100644 index 144e079a5..000000000 --- a/tests/chat/templates/NousResearchHermes-2-Pro-Llama-3-8B-tool_use.jinja +++ /dev/null @@ -1,153 +0,0 @@ -{%- macro json_to_python_type(json_spec) %} -{%- set basic_type_map = { - "string": "str", - "number": "float", - "integer": "int", - "boolean": "bool" -} %} - -{%- if basic_type_map[json_spec.type] is defined %} - {{- basic_type_map[json_spec.type] }} -{%- elif json_spec.type == "array" %} - {{- "list[" + json_to_python_type(json_spec|items) + "]"}} -{%- elif json_spec.type == "object" %} - {%- if json_spec.additionalProperties is defined %} - {{- "dict[str, " + json_to_python_type(json_spec.additionalProperties) + ']'}} - {%- else %} - {{- "dict" }} - {%- endif %} -{%- elif json_spec.type is iterable %} - {{- "Union[" }} - {%- for t in json_spec.type %} - {{- json_to_python_type({"type": t}) }} - {%- if not loop.last %} - {{- "," }} - {%- endif %} - {%- endfor %} - {{- "]" }} -{%- else %} - {{- "Any" }} -{%- endif %} -{%- endmacro %} - - -{{- bos_token }} -{{- '<|im_start|>system -' }} -{{- "You are a function calling AI model. You are provided with function signatures within XML tags. You may call one or more functions to assist with the user query. Don't make assumptions about what values to plug into functions. Here are the available tools: " }} -{%- for tool in tools %} - {%- if tool.function is defined %} - {%- set tool = tool.function %} - {%- endif %} - {{- '{"type": "function", "function": ' }} - {{- '{"name": "' + tool.name + '", ' }} - {{- '"description": "' + tool.name + '(' }} - {%- for param_name, param_fields in tool.parameters.properties|items %} - {{- param_name + ": " + json_to_python_type(param_fields) }} - {%- if not loop.last %} - {{- ", " }} - {%- endif %} - {%- endfor %} - {{- ")" }} - {%- if tool.return is defined %} - {{- " -> " + json_to_python_type(tool.return) }} - {%- endif %} - {{- " - " + tool.description + " - -" }} - {%- for param_name, param_fields in tool.parameters.properties|items %} - {%- if loop.first %} - {{- " Args: -" }} - {%- endif %} - {{- " " + param_name + "(" + json_to_python_type(param_fields) + "): " + param_fields.description|trim }} - {%- endfor %} - {%- if tool.return is defined and tool.return.description is defined %} - {{- " - Returns: - " + tool.return.description }} - {%- endif %} - {{- '"' }} - {{- ', "parameters": ' }} - {%- if tool.parameters.properties | length == 0 %} - {{- "{}" }} - {%- else %} - {{- tool.parameters|tojson }} - {%- endif %} - {{- "}" }} - {%- if not loop.last %} - {{- " -" }} - {%- endif %} -{%- endfor %} -{{- " " }} -{{- 'Use the following pydantic model json schema for each tool call you will make: {"properties": {"name": {"title": "Name", "type": "string"}, "arguments": {"title": "Arguments", "type": "object"}}, "required": ["name", "arguments"], "title": "FunctionCall", "type": "object"}} -' }} -{{- "For each function call return a json object with function name and arguments within XML tags as follows: -" }} -{{- " -" }} -{{- '{"name": , "arguments": } -' }} -{{- '<|im_end|> -' }} -{%- for message in messages %} - {%- if message.role == "user" or message.role == "system" or (message.role == "assistant" and message.tool_calls is not defined) %} - {{- '<|im_start|>' + message.role + ' -' + message.content + '<|im_end|>' + ' -' }} - {%- elif message.role == "assistant" %} - {{- '<|im_start|>' + message.role }} - {%- for tool_call in message.tool_calls %} - {{- ' - -' }} {%- if tool_call.function is defined %} - {%- set tool_call = tool_call.function %} - {%- endif %} - {{- '{' }} - {{- '"name": "' }} - {{- tool_call.name }} - {{- '"' }} - {{- ', '}} - {%- if tool_call.arguments is defined %} - {{- '"arguments": ' }} - {%- if tool_call.arguments is string %} - {{- tool_call.arguments }} - {%- else %} - {{- tool_call.arguments|tojson }} - {%- endif %} - {%- endif %} - {{- '}' }} - {{- ' -' }} - {%- endfor %} - {{- '<|im_end|> -' }} - {%- elif message.role == "tool" %} - {%- if loop.previtem and loop.previtem.role != "tool" %} - {{- '<|im_start|>tool -' }} - {%- endif %} - {{- ' -' }} - {{- message.content }} - {%- if not loop.last %} - {{- ' - -' }} - {%- else %} - {{- ' -' }} - {%- endif %} - {%- if not loop.last and loop.nextitem.role != "tool" %} - {{- '<|im_end|>' }} - {%- elif loop.last %} - {{- '<|im_end|>' }} - {%- endif %} - {%- endif %} -{%- endfor %} -{%- if add_generation_prompt %} - {{- '<|im_start|>assistant -' }} -{%- endif %} - diff --git a/tests/chat/templates/google-gemma-7b-it.jinja b/tests/chat/templates/google-gemma-7b-it.jinja deleted file mode 100644 index 923ec253c..000000000 --- a/tests/chat/templates/google-gemma-7b-it.jinja +++ /dev/null @@ -1,4 +0,0 @@ -{{ bos_token }}{% if messages[0]['role'] == 'system' %}{{ raise_exception('System role not supported') }}{% endif %}{% for message in messages %}{% if (message['role'] == 'user') != (loop.index0 % 2 == 0) %}{{ raise_exception('Conversation roles must alternate user/assistant/user/assistant/...') }}{% endif %}{% if (message['role'] == 'assistant') %}{% set role = 'model' %}{% else %}{% set role = message['role'] %}{% endif %}{{ '' + role + ' -' + message['content'] | trim + ' -' }}{% endfor %}{% if add_generation_prompt %}{{'model -'}}{% endif %} \ No newline at end of file diff --git a/tests/chat/templates/meta-llama-Meta-Llama-3.1-8B-Instruct.jinja b/tests/chat/templates/meta-llama-Meta-Llama-3.1-8B-Instruct.jinja deleted file mode 100644 index 33089ace1..000000000 --- a/tests/chat/templates/meta-llama-Meta-Llama-3.1-8B-Instruct.jinja +++ /dev/null @@ -1,109 +0,0 @@ -{{- bos_token }} -{%- if custom_tools is defined %} - {%- set tools = custom_tools %} -{%- endif %} -{%- if not tools_in_user_message is defined %} - {%- set tools_in_user_message = true %} -{%- endif %} -{%- if not date_string is defined %} - {%- set date_string = "26 Jul 2024" %} -{%- endif %} -{%- if not tools is defined %} - {%- set tools = none %} -{%- endif %} - -{#- This block extracts the system message, so we can slot it into the right place. #} -{%- if messages[0]['role'] == 'system' %} - {%- set system_message = messages[0]['content']|trim %} - {%- set messages = messages[1:] %} -{%- else %} - {%- set system_message = "" %} -{%- endif %} - -{#- System message + builtin tools #} -{{- "<|start_header_id|>system<|end_header_id|>\n\n" }} -{%- if builtin_tools is defined or tools is not none %} - {{- "Environment: ipython\n" }} -{%- endif %} -{%- if builtin_tools is defined %} - {{- "Tools: " + builtin_tools | reject('equalto', 'code_interpreter') | join(", ") + "\n\n"}} -{%- endif %} -{{- "Cutting Knowledge Date: December 2023\n" }} -{{- "Today Date: " + date_string + "\n\n" }} -{%- if tools is not none and not tools_in_user_message %} - {{- "You have access to the following functions. To call a function, please respond with JSON for a function call." }} - {{- 'Respond in the format {"name": function name, "parameters": dictionary of argument name and its value}.' }} - {{- "Do not use variables.\n\n" }} - {%- for t in tools %} - {{- t | tojson(indent=4) }} - {{- "\n\n" }} - {%- endfor %} -{%- endif %} -{{- system_message }} -{{- "<|eot_id|>" }} - -{#- Custom tools are passed in a user message with some extra guidance #} -{%- if tools_in_user_message and not tools is none %} - {#- Extract the first user message so we can plug it in here #} - {%- if messages | length != 0 %} - {%- set first_user_message = messages[0]['content']|trim %} - {%- set messages = messages[1:] %} - {%- else %} - {{- raise_exception("Cannot put tools in the first user message when there's no first user message!") }} -{%- endif %} - {{- '<|start_header_id|>user<|end_header_id|>\n\n' -}} - {{- "Given the following functions, please respond with a JSON for a function call " }} - {{- "with its proper arguments that best answers the given prompt.\n\n" }} - {{- 'Respond in the format {"name": function name, "parameters": dictionary of argument name and its value}.' }} - {{- "Do not use variables.\n\n" }} - {%- for t in tools %} - {{- t | tojson(indent=4) }} - {{- "\n\n" }} - {%- endfor %} - {{- first_user_message + "<|eot_id|>"}} -{%- endif %} - -{%- for message in messages %} - {%- if not (message.role == 'ipython' or message.role == 'tool' or 'tool_calls' in message) %} - {{- '<|start_header_id|>' + message['role'] + '<|end_header_id|>\n\n'+ message['content'] | trim + '<|eot_id|>' }} - {%- elif 'tool_calls' in message %} - {%- if not message.tool_calls|length == 1 %} - {{- raise_exception("This model only supports single tool-calls at once!") }} - {%- endif %} - {%- set tool_call = message.tool_calls[0].function %} - {%- if builtin_tools is defined and tool_call.name in builtin_tools %} - {{- '<|start_header_id|>assistant<|end_header_id|>\n\n' -}} - {{- "<|python_tag|>" + tool_call.name + ".call(" }} - {%- for arg_name, arg_val in tool_call.arguments | items %} - {{- arg_name + '="' + arg_val + '"' }} - {%- if not loop.last %} - {{- ", " }} - {%- endif %} - {%- endfor %} - {{- ")" }} - {%- else %} - {{- '<|start_header_id|>assistant<|end_header_id|>\n\n' -}} - {{- '{"name": "' + tool_call.name + '", ' }} - {{- '"parameters": ' }} - {{- tool_call.arguments | tojson }} - {{- "}" }} - {%- endif %} - {%- if builtin_tools is defined %} - {#- This means we're in ipython mode #} - {{- "<|eom_id|>" }} - {%- else %} - {{- "<|eot_id|>" }} - {%- endif %} - {%- elif message.role == "tool" or message.role == "ipython" %} - {{- "<|start_header_id|>ipython<|end_header_id|>\n\n" }} - {%- if message.content is mapping or message.content is iterable %} - {{- message.content | tojson }} - {%- else %} - {{- message.content }} - {%- endif %} - {{- "<|eot_id|>" }} - {%- endif %} -{%- endfor %} -{%- if add_generation_prompt %} - {{- '<|start_header_id|>assistant<|end_header_id|>\n\n' }} -{%- endif %} diff --git a/tests/test-chat-handler.cpp b/tests/test-chat-handler.cpp index c6ea5c02e..c638105f6 100644 --- a/tests/test-chat-handler.cpp +++ b/tests/test-chat-handler.cpp @@ -369,7 +369,7 @@ static void test_template_output_parsers() { ""); } { - const common_chat_template tmpl(read_file("tests/chat/templates/meta-llama-Meta-Llama-3.1-8B-Instruct.jinja"), "", ""); + const common_chat_template tmpl(read_file("tests/chat/templates/meta-llama-Llama-3.1-8B-Instruct.jinja"), "", ""); std::vector end_tokens { "<|eom_id|>", "<|eot_id|>" }; assert_equals(std::string("llama 3.1 tool calls"), describe(tmpl, tools_params));