File size: 8,080 Bytes
7522010
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
{% macro render_item_list(item_list, tag_name='required') %}
    {%- if item_list is defined and item_list is iterable and item_list | length > 0 %}
        {%- if tag_name %}{{- '\n<' ~ tag_name ~ '>' -}}{% endif %}
            {{- '[' }}
                {%- for item in item_list -%}
                    {%- if loop.index > 1 %}{{- ", "}}{% endif -%}
                    {%- if item is string -%}
                        {{ "`" ~ item ~ "`" }}
                    {%- else -%}
                        {{ item }}
                    {%- endif -%}
                {%- endfor -%}
            {{- ']' }}
        {%- if tag_name %}{{- '</' ~ tag_name ~ '>' -}}{% endif %}
    {%- endif %}
{% endmacro %}

{%- if not add_generation_prompt is defined %}
    {% set add_generation_prompt = false %}
{%- endif %}

{%- set ns = namespace(is_first=false, system_prompt='You are Nex, a helpful assistant.', is_first_sp=true, is_last_user=false) %}
{%- for message in messages %}
    {%- if message['role'] == 'system' %}
        {%- if ns.is_first_sp %}
            {% set ns.system_prompt = message['content'] %}
            {% set ns.is_first_sp = false %}
        {%- else %}
            {% set ns.system_prompt = ns.system_prompt ~ '\n\n' ~ message['content'] %}
        {%- endif %}
    {%- endif %}
{%- endfor -%}

{%- if tools is defined and tools is not none %}
    {% set tool_ns = namespace(text='You are a helpful assistant with tool calling capabilities. '
        'When a tool call is needed, you MUST use the following format to issue the call:\n\n'
        '<tool_call>\n<function=example_function_name>\n<parameter=example_parameter_1>\nvalue_1\n</parameter>\n<parameter=example_parameter_2>\nThis is the value for the second parameter\nthat can span\nmultiple lines\n</parameter>\n</function>\n</tool_call>\n\n'
        'IMPORTANT:\n'
        '- Function calls MUST follow the specified format: an inner <function=...></function> block must be nested within <tool_call></tool_call> XML tags\n'
        '- Required parameters MUST be specified\n'
        '- You may provide optional reasoning for your function call in natural language BEFORE the function call, but NOT after\n\n'
        'You have access to the following functions:\n\n'
        '<tools>') %}
    {% for tool in tools %}
        {%- if tool.function is defined %}
            {%- set tool = tool.function %}
        {%- endif %}
        {% set tool_ns.text = tool_ns.text ~ '\n<function>\n<name>' ~ tool.name ~ '</name>' %}
        {% set tool_ns.text = tool_ns.text ~ '\n<description>' ~ (tool.description | trim) ~ '</description>' %}
        {% set tool_ns.text = tool_ns.text ~ '\n<parameters>' %}
        {%- for param_name, param_fields in tool.parameters.properties|items %}
            {% set tool_ns.text = tool_ns.text ~ '\n<parameter>' %}
            {% set tool_ns.text = tool_ns.text ~ '\n<name>' ~ param_name ~ '</name>' %}
            {%- if param_fields.type is defined %}
                {% set tool_ns.text = tool_ns.text ~ '\n<type>' ~ (param_fields.type | string) ~ '</type>' %}
            {%- endif %}
            {%- if param_fields.description is defined %}
                {% set tool_ns.text = tool_ns.text ~ '\n<description>' ~ (param_fields.description | trim) ~ '</description>' %}
            {%- endif %}
            {%- if param_fields.enum is defined and param_fields.enum is iterable and param_fields.enum | length > 0 %}
                {% set tool_ns.text = tool_ns.text ~ render_item_list(param_fields.enum, 'enum') %}
            {%- endif %}
            {%- set handled_keys = ['type', 'description', 'enum', 'required'] %}
            {%- for json_key in param_fields.keys() | reject("in", handled_keys) %}
                {%- set normed_json_key = json_key | replace("-", "_") | replace(" ", "_") | replace("$", "") %}
                {%- if param_fields[json_key] is mapping %}
                    {% set tool_ns.text = tool_ns.text ~ '\n<' ~ normed_json_key ~ '>' ~ (param_fields[json_key] | tojson | safe) ~ '</' ~ normed_json_key ~ '>' %}
                {%- else %}
                    {% set tool_ns.text = tool_ns.text ~ '\n<' ~ normed_json_key ~ '>' ~ (param_fields[json_key] | string) ~ '</' ~ normed_json_key ~ '>' %}
                {%- endif %}
            {%- endfor %}
            {%- if param_fields.required is defined and param_fields.required is iterable and param_fields.required | length > 0 %}
                {% set tool_ns.text = tool_ns.text ~ render_item_list(param_fields.required, 'required') %}
            {%- endif %}
            {% set tool_ns.text = tool_ns.text ~ '\n</parameter>' %}
        {%- endfor %}
        {%- if tool.parameters.required is defined and tool.parameters.required is iterable and tool.parameters.required | length > 0 %}
            {% set tool_ns.text = tool_ns.text ~ render_item_list(tool.parameters.required, 'required') %}
        {%- endif %}
        {% set tool_ns.text = tool_ns.text ~ '\n</parameters>' %}
        {%- if tool.return is defined %}
            {%- if tool.return is mapping %}
                {% set tool_ns.text = tool_ns.text ~ '\n<return>' ~ (tool.return | tojson | safe) ~ '</return>' %}
            {%- else %}
                {% set tool_ns.text = tool_ns.text ~ '\n<return>' ~ (tool.return | string) ~ '</return>' %}
            {%- endif %}
        {%- endif %}
        {% set tool_ns.text = tool_ns.text ~ '\n</function>' %}
    {% endfor %}
    {% set tool_ns.text = tool_ns.text ~ '\n</tools>' %}
    {% set ns.system_prompt = ns.system_prompt ~ '\n\n' ~ tool_ns.text %}
{%- endif %}

{{- bos_token }}
{{- ns.system_prompt }}
{%- for message in messages %}
    {% set content = message['content'] %}
    {%- if content is none %}
        {% set content = '' %}
    {%- endif %}
    {%- if message['role'] == 'user' %}
        {%- set ns.is_first = false -%}
        {%- set ns.is_last_user = true -%}
        {{- '<|User|>' ~ content }}
    {%- endif %}
    {%- if message['role'] == 'assistant' %}
        {% if '</think>' in content %}
            {% set content = content.split('</think>')[-1] %}
        {% endif %}
    {% endif %}
    {%- if message['role'] == 'assistant' and message['tool_calls'] is defined and message['tool_calls'] is not none %}
        {%- set ns.is_last_user = false -%}
        {%- set ns.is_first = false %}
        {{- '<|Assistant|>' }}
        {%- if content is defined and content is not none and content | trim | length > 0 %}
            {{- content | trim ~ '\n' }}
        {%- endif %}
        {%- for tool in message['tool_calls'] %}
            {%- if tool.function is defined %}
                {%- set tool_call = tool.function %}
            {%- else %}
                {%- set tool_call = tool %}
            {%- endif %}
            {{- '<tool_call>\n<function=' ~ tool_call.name ~ '>\n' }}
            {%- if tool_call.arguments is defined %}
                {%- for args_name, args_value in tool_call.arguments|items %}
                    {{- '<parameter=' ~ args_name ~ '>\n' }}
                    {%- set args_value = args_value if args_value is string else args_value | string %}
                    {{- args_value }}
                    {{- '\n</parameter>\n' }}
                {%- endfor %}
            {%- endif %}
            {{- '</function>\n</tool_call>' }}
        {%- endfor %}
        {{- '<|end▁of▁sentence|>'}}
    {%- endif %}
    {%- if message['role'] == 'assistant' and (message['tool_calls'] is not defined or message['tool_calls'] is none)%}
        {%- set ns.is_last_user = false -%}
        {{- '<|Assistant|>' ~ content ~ '<|end▁of▁sentence|>'}}
    {%- endif %}
    {%- if message['role'] == 'tool' %}
        {%- set ns.is_last_user = false -%}
        {%- if loop.previtem and loop.previtem['role'] != 'tool' %}
            {{- '<|User|>' }}
        {%- endif %}
        {{- '<tool_response>\n' }}
        {{- content }}
        {{- '\n</tool_response>' }}
    {%- endif %}
{%- endfor -%}
{% if add_generation_prompt %}
    {{- '<|Assistant|>'}}
{%- endif %}