1+ {% - if tools %}
2+ {{- '<|im_start|>system\n' }}
3+ {% - if messages [0].role == 'system' %}
4+ {{- messages[0] .content + '\n\n' }}
5+ {% - endif %}
6+ {{- "# Tools\n\nYou may call one or more functions to assist with the user query.\n\nYou are provided with function signatures within <tools></tools> XML tags:\n<tools>" }}
7+ {% - for tool in tools %}
8+ {{- "\n" }}
9+ {{- tool | tojson }}
10+ {% - endfor %}
11+ {{- "\n</tools>\n\nFor each function call, return a json object with function name and arguments within <tool_call></tool_call> XML tags:\n<tool_call>\n{\"name\": <function-name>, \"arguments\": <args-json-object>}\n</tool_call><|im_end|>\n" }}
12+ {% - else %}
13+ {% - if messages [0].role == 'system' %}
14+ {{- '<|im_start|>system\n' + messages[0] .content + '<|im_end|>\n' }}
15+ {% - endif %}
16+ {% - endif %}
17+ {% - set ns = namespace (multi_step_tool =true , last_query_index =messages |length - 1) %}
18+ {% - for message in messages [::-1] %}
19+ {% - set index = (messages |length - 1) - loop .index 0 %}
20+ {% - if ns .multi_step_tool and message .role == "user" and not (message .content .startswith ('<tool_response>' ) and message .content .endswith ('</tool_response>' )) %}
21+ {% - set ns .multi_step_tool = false %}
22+ {% - set ns .last_query_index = index %}
23+ {% - endif %}
24+ {% - endfor %}
25+ {% - for message in messages %}
26+ {% - if (message .role == "user" ) or (message .role == "system" and not loop .first ) %}
27+ {{- '<|im_start|>' + message.role + '\n' + message.content + '<|im_end|>' + '\n' }}
28+ {% - elif message .role == "assistant" %}
29+ {% - set content = message .content %}
30+ {% - set reasoning_content = '' %}
31+ {% - if message .reasoning_content is defined and message .reasoning_content is not none %}
32+ {% - set reasoning_content = message .reasoning_content %}
33+ {% - else %}
34+ {% - if '</think>' in message .content %}
35+ {% - set content = message .content .split ('</think>' )[-1].lstrip ('\n' ) %}
36+ {% - set reasoning_content = message .content .split ('</think>' )[0].rstrip ('\n' ).split ('<think>' )[-1].lstrip ('\n' ) %}
37+ {% - endif %}
38+ {% - endif %}
39+ {% - if loop .index 0 > ns .last_query_index %}
40+ {% - if loop .last or (not loop .last and reasoning_content ) %}
41+ {{- '<|im_start|>' + message.role + '\n<think>\n' + reasoning_content.strip('\n') + '\n</think>\n\n' + content.lstrip('\n') }}
42+ {% - else %}
43+ {{- '<|im_start|>' + message.role + '\n' + content }}
44+ {% - endif %}
45+ {% - else %}
46+ {{- '<|im_start|>' + message.role + '\n' + content }}
47+ {% - endif %}
48+ {% - if message .tool_calls %}
49+ {% - for tool_call in message .tool_calls %}
50+ {% - if (loop .first and content ) or (not loop .first ) %}
51+ {{- '\n' }}
52+ {% - endif %}
53+ {% - if tool_call .function %}
54+ {% - set tool_call = tool_call .function %}
55+ {% - endif %}
56+ {{- '<tool_call>\n{"name": "' }}
57+ {{- tool_call.name }}
58+ {{- '", "arguments": ' }}
59+ {% - if tool_call .arguments is string %}
60+ {{- tool_call.arguments }}
61+ {% - else %}
62+ {{- tool_call.arguments | tojson }}
63+ {% - endif %}
64+ {{- '}\n</tool_call>' }}
65+ {% - endfor %}
66+ {% - endif %}
67+ {{- '<|im_end|>\n' }}
68+ {% - elif message .role == "tool" %}
69+ {% - if loop .first or (messages [loop .index 0 - 1].role != "tool" ) %}
70+ {{- '<|im_start|>user' }}
71+ {% - endif %}
72+ {{- '\n<tool_response>\n' }}
73+ {{- message.content }}
74+ {{- '\n</tool_response>' }}
75+ {% - if loop .last or (messages [loop .index 0 + 1].role != "tool" ) %}
76+ {{- '<|im_end|>\n' }}
77+ {% - endif %}
78+ {% - endif %}
79+ {% - endfor %}
80+ {% - if add_generation_prompt %}
81+ {{- '<|im_start|>assistant\n' }}
82+ {% - if enable_thinking is defined and enable_thinking is false %}
83+ {{- '<think>\n\n</think>\n\n' }}
84+ {% - endif %}
85+ {% - endif %}
0 commit comments