121 lines
4.2 KiB
Plaintext
121 lines
4.2 KiB
Plaintext
|
|
{{ 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 %}
|