Files
gemma-3-4B-T1-it-mlx-fp16/chat_template.jinja

121 lines
4.2 KiB
Plaintext
Raw Normal View History

{{ bos_token }}
{%- if tools %}
{%- if messages[0]['role'] == 'system' %}
{%- set system_message = messages[0]['content'] %}
{%- if messages[1]['role'] == 'user' %}
{%- set first_user_message = messages[1]['content'] %}
{%- set loop_messages = messages[2:] %}
{%- else %}
{%- set first_user_message = '' %}
{%- set loop_messages = messages[1:] %}
{%- endif %}
{%- else %}
{%- set system_message = "You are a function calling AI model." %}
{%- if messages[0]['role'] == 'user' %}
{%- set first_user_message = messages[0]['content'] %}
{%- set loop_messages = messages[1:] %}
{%- else %}
{%- set first_user_message = '' %}
{%- set loop_messages = messages %}
{%- endif %}
{%- endif %}
<start_of_turn>user
{{ system_message }} You are provided with function signatures within <tools> </tools> 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:
<tools>
{{ tools | tojson }}
</tools>
For each function call return a json object with function name and arguments within <tool_call> </tool_call> tags with the following schema:
<tool_call>
{"arguments": <args-dict>, "name": <function-name>}
</tool_call>
{%- if first_user_message %}
{{ first_user_message }}
{%- endif %}
<end_of_turn>
{% set ns = namespace(pairs=[]) %}
{%- for message in loop_messages if message['role'] == 'assistant' and message.get('tool_calls') is defined %}
{%- for tc in message['tool_calls'] %}
{%- set ns.pairs = ns.pairs + [(tc.id, tc.function.name)] %}
{%- endfor %}
{%- endfor %}
{%- set tool_call_map = dict(ns.pairs) %}
{%- for message in loop_messages %}
{%- set is_first_tool = message['role'] == 'tool' and (loop.index0 == 0 or loop_messages[loop.index0-1]['role'] != 'tool') %}
{%- set is_last_tool = message['role'] == 'tool' and (loop.last or loop_messages[loop.index0+1]['role'] != 'tool') %}
{% if message['role'] == 'user' %}
<start_of_turn>user
{{ message['content'] | trim }}<end_of_turn>
{% elif message['role'] == 'assistant' -%}
<start_of_turn>model
{% if message.get('tool_calls') is defined and message.get('tool_calls') %}
{%- for tool_call in message['tool_calls'] %}
<tool_call>
{"name": "{{ tool_call['function']['name'] }}", "arguments": {{ tool_call['function']['arguments'] | tojson }}}
</tool_call>{% if not loop.last %}
{% endif %}
{%- endfor %}
{%- else %}
{{ message['content'] | trim }}
{%- endif %}
<end_of_turn>
{% elif message['role'] == 'tool' %}
{%- if is_first_tool %}
<start_of_turn>tool
{% endif %}
<tool_response>
{{ {"name": tool_call_map.get(message.get('tool_call_id', ''), "unknown"), "content": message['content']} | tojson }}
</tool_response>
{%- if not is_last_tool %}
{% else %}
<end_of_turn>
{% endif %}
{%- endif -%}
{%- endfor %}{% if add_generation_prompt %}
<start_of_turn>model
{% endif %}
{%- else %}
{%- if messages[0]['role'] == 'system' -%}
{%- if messages[0]['content'] is string -%}
{%- set first_user_prefix = messages[0]['content'] + '\n\n' -%}
{%- else -%}
{%- set first_user_prefix = messages[0]['content'][0]['text'] + '\n\n' -%}
{%- endif -%}
{%- set loop_messages = messages[1:] -%}
{%- else -%}
{%- set first_user_prefix = "" -%}
{%- set loop_messages = messages -%}
{%- endif -%}
{%- for message in loop_messages -%}
{%- if (message['role'] == 'assistant') -%}
{%- set role = "model" -%}
{%- else -%}
{%- set role = message['role'] -%}
{%- endif -%}
{{ '<start_of_turn>' + role + '\n' + (first_user_prefix if loop.first else "") }}
{%- if message['content'] is string -%}
{{ message['content'] | trim }}
{%- elif message['content'] is iterable -%}
{%- for item in message['content'] -%}
{%- if item['type'] == 'image' -%}
{{ '<img>' }}
{%- elif item['type'] == 'text' -%}
{{ item['text'] | trim }}
{%- endif -%}
{%- endfor -%}
{%- else -%}
{{ raise_exception("Invalid content type") }}
{%- endif -%}
{{ '<end_of_turn>\n' }}
{%- endfor -%}
{%- if add_generation_prompt -%}
{{'<start_of_turn>model\n'}}
{%- endif -%}
{%- endif %}