{{- bos_token -}} {%- set keep_past_thinking = keep_past_thinking | default(false) -%} {%- set ns = namespace(system_prompt="") -%} {%- if messages[0]["role"] == "system" -%} {%- set ns.system_prompt = messages[0]["content"] -%} {%- set messages = messages[1:] -%} {%- endif -%} {%- if tools -%} {%- set ns.system_prompt = ns.system_prompt + ("\n" if ns.system_prompt else "") + "List of tools: [" -%} {%- for tool in tools -%} {%- if tool is not string -%} {%- set tool = tool | tojson -%} {%- endif -%} {%- set ns.system_prompt = ns.system_prompt + tool -%} {%- if not loop.last -%} {%- set ns.system_prompt = ns.system_prompt + ", " -%} {%- endif -%} {%- endfor -%} {%- set ns.system_prompt = ns.system_prompt + "]" -%} {%- endif -%} {%- if ns.system_prompt -%} {{- "<|im_start|>system\n" + ns.system_prompt + "<|im_end|>\n" -}} {%- endif -%} {%- set ns.last_assistant_index = -1 -%} {%- for message in messages -%} {%- if message["role"] == "assistant" -%} {%- set ns.last_assistant_index = loop.index0 -%} {%- endif -%} {%- endfor -%} {%- for message in messages -%} {{- "<|im_start|>" + message["role"] + "\n" -}} {%- if message.get('tool_calls') %} {# ───── create a list to append tool calls to ───── #} {%- set tool_calls_ns = namespace(tool_calls=[])%} {%- for tool_call in message['tool_calls'] %} {%- set func_name = tool_call['function']['name'] %} {%- set func_args = tool_call['function']['arguments'] %} {# ───── create a list of func_arg strings to accumulate for each tool call ───── #} {%- set args_ns = namespace(arg_strings=[])%} {%- for arg_name, arg_value in func_args.items() %} {%- if arg_value is none %} {%- set formatted_arg_value = 'null' %} {%- elif arg_value is boolean %} {%- set formatted_arg_value = 'True' if arg_value else 'False' %} {%- elif arg_value is string %} {%- set formatted_arg_value = '"' ~ arg_value ~ '"' %} {%- elif arg_value is mapping or arg_value is iterable %} {%- set formatted_arg_value = arg_value | tojson %} {%- else %} {%- set formatted_arg_value = arg_value | string %} {%- endif %} {# ───── format each argument key,value pair ───── #} {%- set args_ns.arg_strings = args_ns.arg_strings + [arg_name ~ '=' ~ formatted_arg_value] %} {%- endfor %} {# ───── append each formatted tool call ───── #} {%- set tool_calls_ns.tool_calls = tool_calls_ns.tool_calls + [(func_name + '(' + (args_ns.arg_strings | join(", ")) + ')' )]%} {%- endfor %} {# ───── format the final tool calls ───── #} {{-'<|tool_call_start|>[' + (tool_calls_ns.tool_calls | join(", ")) + ']<|tool_call_end|>'}} {%- endif %} {%- set content = message["content"] -%} {%- if content is not string -%} {%- set content = content | tojson -%} {%- endif -%} {%- if message["role"] == "assistant" and not keep_past_thinking and loop.index0 != ns.last_assistant_index -%} {%- if "" in content -%} {%- set content = content.split("")[-1] | trim -%} {%- endif -%} {%- endif -%} {{- content + "<|im_end|>\n" -}} {%- endfor -%} {%- if add_generation_prompt -%} {{- "<|im_start|>assistant\n" -}} {%- endif -%}