File size: 4,666 Bytes
5f923cd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
{{ bos_token }}
{%- set ns = namespace(prev_message_type=None) -%}
{#- Tool Declarations -#}
{%- set loop_messages = messages -%}
{%- if tools or messages[0]['role'] == 'system' -%}
    {{- '<start_of_turn>developer\n' -}}
    {%- if messages[0]['role'] == 'system' -%}
        {%- if messages[0]['content'] is string -%}
            {{- messages[0]['content'] | trim -}}
        {%- else -%}
            {%- for item in messages[0]['content'] -%}
                {%- if item['type'] == 'text' -%}
                    {{- item['text'] | trim -}}
                {%- endif -%}
            {%- endfor -%}
        {%- endif -%}
        {%- set loop_messages = messages[1:] -%}
        {%- if tools -%}
            {{- '\n\n' -}}
        {%- endif -%}
    {%- endif -%}
    {%- for tool in tools %}
        {{- '<start_function_declaration>' -}}
        {{- tool | trim }}
        {{- '<end_function_declaration>' -}}
    {%- endfor %}
    {{- '<end_of_turn>\n'}}
{%- endif %}
{#- Loop through messages. -#}
{%- for message in loop_messages -%}
    {%- if (message['role'] == 'assistant') -%}
        {#- Rename "assistant" to "model". -#}
        {%- set role = "model" -%}
    {%- else -%}
        {%- set role = message['role'] -%}
    {%- endif -%}
    {%- if role != 'tool' -%}
        {%- if ns.prev_message_type == 'tool_call' -%}
            {{ raise_exception("Tool call must be followed by a tool response.") }}
        {%- endif -%}
        {%- if ns.prev_message_type != 'tool_response' -%}
            {{- '<start_of_turn>' + role + '\n'}}
        {%- endif -%}
        {%- set ns.prev_message_type = None -%}
        {%- if 'content' in message -%}
            {%- if message['content'] is string -%}
                {{ message['content'] | trim }}
            {%- elif message['content'] is iterable -%}
                {%- for item in message['content'] -%}
                    {%- if item['type'] == 'text' -%}
                        {{ item['text'] | trim }}
                    {%- endif -%}
                {%- endfor -%}
            {%- else -%}
                {{ raise_exception("Invalid content type") }}
            {%- endif -%}
            {%- set ns.prev_message_type = 'content' -%}
        {%- endif -%}
        {%- if 'tool_calls' in message and message['tool_calls'] and message['tool_calls'] is iterable -%}
            {#- Tool Calls -#}
            {%- for tool_call in message['tool_calls'] -%}
                {%- if 'function' in tool_call -%}
                    {%- set tool_call = tool_call['function'] -%}
                {%- endif -%}
                {{-  '<start_function_call>call:' + tool_call['name'] + '{' -}}
                {%- if 'arguments' in tool_call -%}
                    {%- for key in tool_call['arguments'] -%}
                        {{- key + ':' + tool_call['arguments'][key] -}}
                        {% if not loop.last %}
                            {{- ',' -}}
                        {% endif %}
                    {%- endfor %}
                {%- endif -%}
                {{- '}' + '<end_function_call>' -}}
            {%- endfor -%}
            {%- if loop.last -%}
                {{ '<start_function_response>' }}
            {%- endif -%}
            {%- set ns.prev_message_type = 'tool_call' -%}
        {%- endif -%}
    {%- else -%}
        {#- Tool Responses -#}
        {%- if 'content' in message -%}
            {%- if message['content'] is string -%}
                {{- '<start_function_response>response:' -}}
                {{ message['content'] | trim }}
                {{- '<end_function_response>' -}}
            {%- elif message['content'] is iterable -%}
                {%- for item in message['content'] -%}
                    {%- if item['type'] == 'text' -%}
                        {{ '<start_function_response>response:' + item['text'] + '<end_function_response>' }}
                    {%- else -%}
                        {{ raise_exception("Invalid content type for tool response.") }}
                    {%- endif -%}
                {%- endfor -%}
            {%- else -%}
                {{ raise_exception("Invalid content type") }}
            {%- endif -%}
        {%- endif -%}
        {%- set ns.prev_message_type = 'tool_response' -%}
    {%- endif -%}
    {%- if ns.prev_message_type not in ['tool_call', 'tool_response'] -%}
        {{ '<end_of_turn>\n' }}
    {%- endif -%}
{%- endfor -%}
{%- if add_generation_prompt -%}
    {%- if ns.prev_message_type == 'tool_call' -%}
        {{- '<start_function_response>' -}}
    {%- elif ns.prev_message_type != 'tool_response' -%}
        {{- '<start_of_turn>model\n' -}}
    {%- endif -%}
{%- endif -%}