{{ bos_token }}
{%- if enable_thinking is defined -%}
{%- if enable_thinking is sameas true -%}
{%- set _reasoning_mode = "/think" -%}
{%- elif enable_thinking is sameas false -%}
{%- set _reasoning_mode = "/nothink" -%}
{%- else -%}
{%- set _reasoning_mode = enable_thinking -%}
{%- endif -%}
{%- else -%}
{%- set _reasoning_mode = none -%}
{%- endif -%}
{%- set _custom_instructions = custom_instructions | default(None, true) -%}
{%- set _xml_tools_list = xml_tools | default([], true) -%}
{%- if tools is defined and tools -%}
{%- set _xml_tools_list = tools -%}
{%- endif -%}
{%- set _python_tools = python_tools | default([], true) -%}
{%- set _has_aux_header = (_reasoning_mode is not none) or _custom_instructions or (_xml_tools_list) or (_python_tools) -%}
{%- if _has_aux_header -%}
<|start_header_id|>system<|end_header_id|>
{%- if _reasoning_mode is not none -%}
Reasoning: {{ _reasoning_mode }}
{%- endif %}
{%- if _custom_instructions %}
{{ _custom_instructions | trim }}
{%- endif %}
{% if _xml_tools_list or _python_tools %}
{{ "
### Tools
" }}
You may call one or more functions to assist with the user query.
{% if _xml_tools_list %}
You are provided with function signatures within tags:
{% for tool in _xml_tools_list %}
{{ tool | string }}{% if not loop.last %}
{% endif %}
{% endfor %}
For each function call, pass a json object with function name and arguments within tags:
{"name": , "arguments": }
{% endif %}
{% if _python_tools %}
When you send a message containing Python code between <|python_tag|> and <|eom_id|> tags, it will be executed in a stateful Jupyter notebook environment, and you will then be given the output.
You can use the following tools in your python code like regular functions:
{% for tool in _python_tools %}
{{ tool | string }}{% if not loop.last %}
{% endif %}
{% endfor %}
{% endif %}
{% endif %}
<|eot_id|>
{%- endif -%}
{%- for message in messages -%}
{%- set has_tool_calls = message.get('tool_calls') is not none and message.get('tool_calls') -%}
{%- if not (message.get('role') in ['tool', 'ipython'] or has_tool_calls) -%}
{%- if message.get('role') == 'assistant' -%}
<|start_header_id|>assistant<|end_header_id|>
{% set content = message.get('content') %}
{% if content is string %}
{% generation %}{{- content | trim }}<|eot_id|>{% endgeneration %}
{% elif content is mapping %}
{% generation %}{{- content.get('text', '') | trim }}<|eot_id|>{% endgeneration %}
{% elif content is iterable %}
{% generation %}
{%- for chunk in content -%}
{%- if chunk.get('type') == 'text' -%}
{{ chunk.get('text', '') | trim }}
{%- endif -%}
{%- endfor -%}
<|eot_id|>
{% endgeneration %}
{% else %}
{% generation %}{% endgeneration %}<|eot_id|>
{% endif %}
{%- else -%}
<|start_header_id|>{{ message['role'] }}<|end_header_id|>
{% set content = message.get('content') %}
{% if content is string %}
{{ content | trim }}<|eot_id|>
{% elif content is mapping %}
{{ content.get('text', '') | trim }}<|eot_id|>
{% elif content is iterable %}
{%- for chunk in content -%}
{%- if chunk.get('type') == 'text' -%}
{{ chunk.get('text', '') | trim }}
{%- endif -%}
{%- endfor -%}<|eot_id|>
{% else %}
<|eot_id|>
{% endif %}
{%- endif -%}
{%- elif message.get('role') == 'tool' -%}
{%- set _tool_name = message.get('name') -%}
{%- set _tool_id = message.get('tool_call_id') -%}
{%- set _attr_name = ' name="' ~ _tool_name ~ '"' if _tool_name else '' -%}
{%- set _attr_id = ' id="' ~ _tool_id ~ '"' if _tool_id else '' -%}
<|start_header_id|>tool<|end_header_id|>
{%- set tool_content = message.get('content') -%}
{%- if tool_content is mapping or (tool_content is iterable and tool_content is not string) -%}
{{- tool_content | tojson }}
{%- else -%}
{{- tool_content if tool_content is not none else '' }}
{%- endif -%}
<|eot_id|>
{{- "
" -}}
{%- elif message.get('role') == 'ipython' -%}
<|start_header_id|>ipython<|end_header_id|>
{% set ipy_content = message.get('content') %}
{% if ipy_content is string %}
{{- { "output": ipy_content } | tojson -}}
{% elif ipy_content is iterable %}
{%- for chunk in ipy_content -%}
{%- if chunk.get('type') == 'text' -%}
{{- { "output": chunk.get('text', '') } | tojson -}}
{%- endif -%}
{%- endfor -%}
{% else %}
{{- { "output": ipy_content } | tojson -}}
{% endif %}
<|eot_id|>
{% elif has_tool_calls -%}
{%- if message.tool_calls|length != 1 -%}
{{- raise_exception("This template expects exactly one tool call per assistant turn.") -}}
{%- endif -%}
{%- set tool_call = message.tool_calls[0].function -%}
<|start_header_id|>assistant<|end_header_id|>
{% generation %}
{{- '{"name": "' + tool_call.name + '", "arguments": ' -}}
{{- tool_call.arguments | tojson -}}
{{- "}" -}}<|eot_id|>
{% endgeneration %}
{%- endif -%}
{%- endfor -%}
{%- if add_generation_prompt -%}
<|start_header_id|>assistant<|end_header_id|>
{% endif -%}