1+ {{- bos_token -}}
2+ {% - set preserve_thinking = preserve_thinking | default (false ) -%}
3+
4+ {% - macro format_arg_value (arg_value ) -%}
5+ {% - if arg_value is string -%}
6+ {{- "'" + arg_value + "'" -}}
7+ {% - elif arg_value is mapping -%}
8+ {{- arg_value | tojson -}}
9+ {% - else -%}
10+ {{- arg_value | string -}}
11+ {% - endif -%}
12+ {% - endmacro -%}
13+
14+ {% - macro parse_content (content ) -%}
15+ {% - if content is string -%}
16+ {{- content -}}
17+ {% - else -%}
18+ {% - set _ns = namespace (result ="" ) -%}
19+ {% - for item in content -%}
20+ {% - if item ["type" ] == "image" -%}
21+ {% - set _ns .result = _ns .result + "<image>" -%}
22+ {% - elif item ["type" ] == "text" -%}
23+ {% - set _ns .result = _ns .result + item ["text" ] -%}
24+ {% - else -%}
25+ {% - set _ns .result = _ns .result + item | tojson -%}
26+ {% - endif -%}
27+ {% - endfor -%}
28+ {{- _ns.result -}}
29+ {% - endif -%}
30+ {% - endmacro -%}
31+
32+ {% - macro render_tool_calls (tool_calls ) -%}
33+ {% - set tool_calls_ns = namespace (tool_calls =[]) -%}
34+ {% - for tool_call in tool_calls -%}
35+ {% - set func_name = tool_call ["function" ]["name" ] -%}
36+ {% - set func_args = tool_call ["function" ]["arguments" ] -%}
37+ {% - set args_ns = namespace (arg_strings =[]) -%}
38+ {% - for arg_name , arg_value in func_args .items () -%}
39+ {% - set args_ns .arg_strings = args_ns .arg_strings + [arg_name + "=" + format_arg_value (arg_value )] -%}
40+ {% - endfor -%}
41+ {% - set tool_calls_ns .tool_calls = tool_calls_ns .tool_calls + [func_name + "(" + (args_ns .arg_strings | join (", " )) + ")" ] -%}
42+ {% - endfor -%}
43+ {{- "<|tool_call_start|>[" + (tool_calls_ns.tool_calls | join(", ")) + "] <|tool_call_end|>" -}}
44+ {% - endmacro -%}
45+
46+ {% - set ns = namespace (system_prompt ="" , last_user_index =-1) -%}
47+ {% - if messages [0]["role" ] == "system" -%}
48+ {% - if messages [0].get ("content" ) -%}
49+ {% - set ns .system_prompt = parse_content (messages [0]["content" ]) -%}
50+ {% - endif -%}
51+ {% - set messages = messages [1:] -%}
52+ {% - endif -%}
53+ {% - if tools -%}
54+ {% - set ns .system_prompt = ns .system_prompt + ("\n" if ns .system_prompt else "" ) + "List of tools: [" -%}
55+ {% - for tool in tools -%}
56+ {% - if tool is not string -%}
57+ {% - set tool = tool | tojson -%}
58+ {% - endif -%}
59+ {% - set ns .system_prompt = ns .system_prompt + tool -%}
60+ {% - if not loop .last -%}
61+ {% - set ns .system_prompt = ns .system_prompt + ", " -%}
62+ {% - endif -%}
63+ {% - endfor -%}
64+ {% - set ns .system_prompt = ns .system_prompt + "]" -%}
65+ {% - endif -%}
66+ {% - if ns .system_prompt -%}
67+ {{- "<|im_start|>system\n" + ns.system_prompt + "<|im_end|>\n" -}}
68+ {% - endif -%}
69+ {% - for message in messages -%}
70+ {% - if message ["role" ] == "user" -%}
71+ {% - set ns .last_user_index = loop .index 0 -%}
72+ {% - endif -%}
73+ {% - endfor -%}
74+ {% - for message in messages -%}
75+ {{- "<|im_start|>" + message.role + "\n" -}}
76+ {% - if message .role == "assistant" -%}
77+ {% - generation -%}
78+ {% - if message .thinking is defined and (preserve_thinking or loop .index 0 > ns .last_user_index ) -%}
79+ {{- "<think>" + message.thinking + "</think>" -}}
80+ {% - endif -%}
81+ {% - set _cfm_tag = "CONTINUE_FINAL_MESSAGE_TAG " -%}
82+ {% - set _has_cfm = false -%}
83+ {% - if message .content is defined -%}
84+ {% - set content = parse_content (message .content ) -%}
85+ {% - if not (preserve_thinking or loop .index 0 > ns .last_user_index ) -%}
86+ {% - if "</think>" in content -%}
87+ {% - set content = content .split ("</think>" )[-1] | trim -%}
88+ {% - endif -%}
89+ {% - endif -%}
90+ {% - if message .tool_calls is defined and content .endswith (_cfm_tag ) -%}
91+ {% - set _has_cfm = true -%}
92+ {% - set _trunc_len = (content | length ) - (_cfm_tag | length ) -%}
93+ {{- content[:_trunc_len] -}}
94+ {% - else -%}
95+ {{- content -}}
96+ {% - endif -%}
97+ {% - endif -%}
98+ {% - if message .tool_calls is defined -%}
99+ {{- render_tool_calls(message.tool_calls) -}}
100+ {% - endif -%}
101+ {% - if _has_cfm -%}
102+ {{- _cfm_tag -}}
103+ {% - endif -%}
104+ {{- "<|im_end|>\n" -}}
105+ {% - endgeneration -%}
106+ {% - else %}
107+ {% - if message .get ("content" ) -%}
108+ {{- parse_content(message["content"] ) -}}
109+ {% - endif -%}
110+ {{- "<|im_end|>\n" -}}
111+ {% - endif %}
112+ {% - endfor -%}
113+ {% - if add_generation_prompt -%}
114+ {{- "<|im_start|>assistant\n" -}}
115+ {% - endif -%}
0 commit comments