{%- set image_count = namespace(value=0) %} {%- set video_count = namespace(value=0) %} {%- set add_vision_id = add_vision_id if add_vision_id is defined else false %} {%- set enable_thinking = enable_thinking if enable_thinking is defined else true %} {%- set _preserve_thinking = preserve_thinking if preserve_thinking is defined else true %} {%- set ns_state = namespace(thinking=enable_thinking) %} {%- macro render_content(content, do_vision_count, is_system_content=false) %} {%- if content is string %} {{- content }} {%- elif content is iterable and content is not mapping %} {%- for item in content %} {%- if item is mapping %} {%- if item.type == 'image' or 'image' in item or 'image_url' in item %} {%- if is_system_content %} {{- raise_exception('System message cannot contain images.') }} {%- endif %} {%- if do_vision_count %} {%- set image_count.value = image_count.value + 1 %} {%- endif %} {%- if add_vision_id %} {{- 'Picture ' ~ image_count.value ~ ': ' }} {%- endif %} {{- '<|vision_start|><|image_pad|><|vision_end|>' }} {%- elif item.type == 'video' or 'video' in item %} {%- if is_system_content %} {{- raise_exception('System message cannot contain videos.') }} {%- endif %} {%- if do_vision_count %} {%- set video_count.value = video_count.value + 1 %} {%- endif %} {%- if add_vision_id %} {{- 'Video ' ~ video_count.value ~ ': ' }} {%- endif %} {{- '<|vision_start|><|video_pad|><|vision_end|>' }} {%- elif 'text' in item %} {{- item.text }} {%- else %} {{- raise_exception('Unexpected item type in content.') }} {%- endif %} {%- else %} {{- item | string }} {%- endif %} {%- endfor %} {%- elif content is none or content is undefined %} {{- '' }} {%- else %} {{- raise_exception('Unexpected content type.') }} {%- endif %} {%- endmacro %} {%- if not messages %} {{- raise_exception('No messages provided.') }} {%- endif %} {%- set _first_role = messages[0].role %} {%- if _first_role == 'system' or _first_role == 'developer' %} {%- set _sys_msg = messages[0] %} {%- set _msgs = messages[1:] %} {%- else %} {%- set _sys_msg = none %} {%- set _msgs = messages %} {%- endif %} {%- set _sc = '' %} {%- if _sys_msg is not none %} {%- set _sc = render_content(_sys_msg.content, false, true) | trim %} {%- endif %} {%- if _sc %} {{- '<|im_start|>system\n' + _sc + '<|im_end|>\n' }} {%- endif %} {%- set _last_idx = _msgs | length - 1 %} {%- set ns = namespace(last_query_index=_last_idx) %} {%- for message in _msgs[::-1] %} {%- set index = (_msgs | length - 1) - loop.index0 %} {%- if message.role == 'user' %} {%- set ns.last_query_index = index %} {%- break %} {%- endif %} {%- endfor %} {%- for message in _msgs %} {%- set is_system = (message.role == "system" or message.role == "developer") %} {%- set content = render_content(message.content, true, is_system) | trim %} {%- if is_system or message.role == 'user' %} {%- if '<|think_off|>' in content %} {%- set ns_state.thinking = false %} {%- set content = content.split('<|think_off|>') | join('') | trim %} {%- elif '<|think_on|>' in content %} {%- set ns_state.thinking = true %} {%- set content = content.split('<|think_on|>') | join('') | trim %} {%- endif %} {%- endif %} {%- if is_system %} {{- '<|im_start|>system\n' + content + '<|im_end|>\n' }} {%- elif message.role == 'user' %} {{- '<|im_start|>user\n' + content + '<|im_end|>\n' }} {%- elif message.role == 'assistant' %} {%- set reasoning_content = '' %} {%- if message.reasoning_content is defined and message.reasoning_content is not none %} {%- if message.reasoning_content is string %} {%- set reasoning_content = message.reasoning_content %} {%- else %} {%- set reasoning_content = message.reasoning_content | string %} {%- endif %} {%- elif message.thinking is defined and message.thinking is not none %} {%- if message.thinking is string %} {%- set reasoning_content = message.thinking %} {%- else %} {%- set reasoning_content = message.thinking | string %} {%- endif %} {%- else %} {%- set _think_end = '' %} {%- if content.startswith('') %} {%- set _think_end = '' %} {%- elif content.startswith('') %} {%- set _think_end = '' %} {%- elif '\n' in content %} {%- set _think_end = '\n' %} {%- elif '\n' in content %} {%- set _think_end = '\n' %} {%- elif '\n' in content %} {%- set _think_end = '\n' %} {%- elif '\n' in content %} {%- set _think_end = '\n' %} {%- endif %} {%- if _think_end %} {%- if 'thinking' in _think_end %} {%- set _think_start = '' %} {%- else %} {%- set _think_start = '' %} {%- endif %} {%- set reasoning_content = content.split(_think_end)[0].rstrip('\n') %} {%- if _think_start in reasoning_content %} {%- set reasoning_content = reasoning_content.split(_think_start)[-1].lstrip('\n') %} {%- endif %} {%- set content = content.split(_think_end)[-1].lstrip('\n') %} {%- endif %} {%- endif %} {%- set reasoning_content = reasoning_content | trim %} {%- if (_preserve_thinking or loop.index0 > ns.last_query_index) and reasoning_content %} {{- '<|im_start|>assistant\n\n' + reasoning_content + '\n\n\n' + content + '<|im_end|>\n' }} {%- else %} {{- '<|im_start|>assistant\n' + content + '<|im_end|>\n' }} {%- endif %} {%- else %} {{- '<|im_start|>user\n[' + message.role + ']: ' + content + '<|im_end|>\n' }} {%- endif %} {%- endfor %} {%- if add_generation_prompt %} {{- '<|im_start|>assistant\n' }} {%- endif %}