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 %}
|