| {%- if tools %} |
| {{- '<|im_start|>system\n' }} |
| {%- if messages[0].role == 'system' %} |
| {{- "You are a helpful AI assistant. When presented with questions, think step by step to reach conclusions. " }} |
| {{- messages[0].content | trim }} |
| {{- " You FIRST think about the reasoning process as an internal monologue and then provide the final answer. The reasoning process MUST BE enclosed within <think> </think> tags. Approximately every 2000 tokens, generate a summary and it MUST BE enclosed within <summary> </summary> tags, then continue reasoning. The final answer MUST BE put in \\boxed{}.\n\n" }} |
| {%- else %} |
| {{- "You are a helpful AI assistant. When presented with questions, think step by step to reach conclusions. You FIRST think about the reasoning process as an internal monologue and then provide the final answer. The reasoning process MUST BE enclosed within <think> </think> tags. Approximately every 2000 tokens, generate a summary and it MUST BE enclosed within <summary> </summary> tags, then continue reasoning. The final answer MUST BE put in \\boxed{}.\n\n" }} |
| {%- endif %} |
| {{- "# 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>" }} |
| {%- for tool in tools %} |
| {{- "\n" }} |
| {{- tool | tojson }} |
| {%- endfor %} |
| {{- "\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" }} |
| {%- else %} |
| {%- if messages[0].role == 'system' %} |
| {{- '<|im_start|>system\n' }} |
| {{- "You are a helpful AI assistant. When presented with questions, think step by step to reach conclusions. " }} |
| {{- messages[0].content | trim }} |
| {{- " You FIRST think about the reasoning process as an internal monologue and then provide the final answer. The reasoning process MUST BE enclosed within <think> </think> tags. Approximately every 2000 tokens, generate a summary and it MUST BE enclosed within <summary> </summary> tags, then continue reasoning. The final answer MUST BE put in \\boxed{}." }} |
| {{- '<|im_end|>\n' }} |
| {%- else %} |
| {{- '<|im_start|>system\n' }} |
| {{- "You are a helpful AI assistant. When presented with questions, think step by step to reach conclusions. You FIRST think about the reasoning process as an internal monologue and then provide the final answer. The reasoning process MUST BE enclosed within <think> </think> tags. Approximately every 2000 tokens, generate a summary and it MUST BE enclosed within <summary> </summary> tags, then continue reasoning. The final answer MUST BE put in \\boxed{}." }} |
| {{- '<|im_end|>\n' }} |
| {%- endif %} |
| {%- endif %} |
| {%- set ns = namespace(multi_step_tool=true, last_query_index=messages|length - 1) %} |
| {%- for message in messages[::-1] %} |
| {%- set index = (messages|length - 1) - loop.index0 %} |
| {%- if ns.multi_step_tool and message.role == "user" and message.content is string and not(message.content.startswith('<tool_response>') and message.content.endswith('</tool_response>')) %} |
| {%- set ns.multi_step_tool = false %} |
| {%- set ns.last_query_index = index %} |
| {%- endif %} |
| {%- endfor %} |
| {%- for message in messages %} |
| {%- if message.content is string %} |
| {%- set content = message.content %} |
| {%- else %} |
| {%- set content = '' %} |
| {%- endif %} |
| {%- if (message.role == "user") or (message.role == "system" and not loop.first) %} |
| {{- '<|im_start|>' + message.role + '\n' + content + '<|im_end|>' + '\n' }} |
| {%- elif message.role == "assistant" %} |
| {%- set reasoning_content = '' %} |
| {%- if message.reasoning_content is string %} |
| {%- set reasoning_content = message.reasoning_content %} |
| {%- else %} |
| {%- if '</think>' in content %} |
| {%- set reasoning_content = content.split('</think>')[0].rstrip('\n').split('<think>')[-1].lstrip('\n') %} |
| {%- set content = content.split('</think>')[-1].lstrip('\n') %} |
| {%- endif %} |
| {%- endif %} |
| {%- if loop.index0 > ns.last_query_index %} |
| {%- if loop.last or (not loop.last and reasoning_content) %} |
| {{- '<|im_start|>' + message.role + '\n<think>\n' + reasoning_content.strip('\n') + '\n</think>\n\n' + content.lstrip('\n') }} |
| {%- else %} |
| {{- '<|im_start|>' + message.role + '\n' + content }} |
| {%- endif %} |
| {%- else %} |
| {{- '<|im_start|>' + message.role + '\n' + content }} |
| {%- endif %} |
| {%- if message.tool_calls %} |
| {%- for tool_call in message.tool_calls %} |
| {%- if (loop.first and content) or (not loop.first) %} |
| {{- '\n' }} |
| {%- endif %} |
| {%- if tool_call.function %} |
| {%- set tool_call = tool_call.function %} |
| {%- endif %} |
| {{- '<tool_call>\n{"name": "' }} |
| {{- tool_call.name }} |
| {{- '", "arguments": ' }} |
| {%- if tool_call.arguments is string %} |
| {{- tool_call.arguments }} |
| {%- else %} |
| {{- tool_call.arguments | tojson }} |
| {%- endif %} |
| {{- '}\n</tool_call>' }} |
| {%- endfor %} |
| {%- endif %} |
| {{- '<|im_end|>\n' }} |
| {%- elif message.role == "tool" %} |
| {%- if loop.first or (messages[loop.index0 - 1].role != "tool") %} |
| {{- '<|im_start|>user' }} |
| {%- endif %} |
| {{- '\n<tool_response>\n' }} |
| {{- content }} |
| {{- '\n</tool_response>' }} |
| {%- if loop.last or (messages[loop.index0 + 1].role != "tool") %} |
| {{- '<|im_end|>\n' }} |
| {%- endif %} |
| {%- endif %} |
| {%- endfor %} |
| {%- if add_generation_prompt %} |
| {{- '<|im_start|>assistant\n' }} |
| {%- if enable_thinking is defined and enable_thinking is false %} |
| {{- '<think>\n\n</think>\n\n' }} |
| {%- endif %} |
| {%- endif %} |