{% 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 %}{{- '' -}}{% 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' '\n\n\nvalue_1\n\n\nThis is the value for the second parameter\nthat can span\nmultiple lines\n\n\n\n\n' 'IMPORTANT:\n' '- Function calls MUST follow the specified format: an inner block must be nested within 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' '') %} {% for tool in tools %} {%- if tool.function is defined %} {%- set tool = tool.function %} {%- endif %} {% set tool_ns.text = tool_ns.text ~ '\n\n' ~ tool.name ~ '' %} {% set tool_ns.text = tool_ns.text ~ '\n' ~ (tool.description | trim) ~ '' %} {% set tool_ns.text = tool_ns.text ~ '\n' %} {%- for param_name, param_fields in tool.parameters.properties|items %} {% set tool_ns.text = tool_ns.text ~ '\n' %} {% set tool_ns.text = tool_ns.text ~ '\n' ~ param_name ~ '' %} {%- if param_fields.type is defined %} {% set tool_ns.text = tool_ns.text ~ '\n' ~ (param_fields.type | string) ~ '' %} {%- endif %} {%- if param_fields.description is defined %} {% set tool_ns.text = tool_ns.text ~ '\n' ~ (param_fields.description | trim) ~ '' %} {%- 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) ~ '' %} {%- else %} {% set tool_ns.text = tool_ns.text ~ '\n<' ~ normed_json_key ~ '>' ~ (param_fields[json_key] | string) ~ '' %} {%- 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' %} {%- 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' %} {%- if tool.return is defined %} {%- if tool.return is mapping %} {% set tool_ns.text = tool_ns.text ~ '\n' ~ (tool.return | tojson | safe) ~ '' %} {%- else %} {% set tool_ns.text = tool_ns.text ~ '\n' ~ (tool.return | string) ~ '' %} {%- endif %} {%- endif %} {% set tool_ns.text = tool_ns.text ~ '\n' %} {% endfor %} {% set tool_ns.text = tool_ns.text ~ '\n' %} {% 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 '' in content %} {% set content = content.split('')[-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 %} {{- '\n\n' }} {%- if tool_call.arguments is defined %} {%- for args_name, args_value in tool_call.arguments|items %} {{- '\n' }} {%- set args_value = args_value if args_value is string else args_value | string %} {{- args_value }} {{- '\n\n' }} {%- endfor %} {%- endif %} {{- '\n' }} {%- 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 %} {{- '\n' }} {{- content }} {{- '\n' }} {%- endif %} {%- endfor -%} {% if add_generation_prompt %} {{- '<|Assistant|>'}} {%- endif %}