103 lines
4.5 KiB
Django/Jinja
103 lines
4.5 KiB
Django/Jinja
{# ───── defaults ───── #}
|
|
{%- if enable_thinking is not defined -%}
|
|
{%- set enable_thinking = true -%}
|
|
{%- endif -%}
|
|
|
|
{# ───── reasoning mode ───── #}
|
|
{%- if enable_thinking -%}
|
|
{%- set reasoning_mode = "/think" -%}
|
|
{%- else -%}
|
|
{%- set reasoning_mode = "/no_think" -%}
|
|
{%- endif -%}
|
|
|
|
{# ───── header (system message) ───── #}
|
|
{{- "<|im_start|>system\n" -}}
|
|
|
|
{%- if messages[0].role == "system" -%}
|
|
{%- set system_message = messages[0].content -%}
|
|
{%- if "/no_think" in system_message -%}
|
|
{%- set reasoning_mode = "/no_think" -%}
|
|
{%- elif "/think" in system_message -%}
|
|
{%- set reasoning_mode = "/think" -%}
|
|
{%- endif -%}
|
|
{%- set custom_instructions = system_message.replace("/no_think", "").replace("/think", "").rstrip() -%}
|
|
{%- endif -%}
|
|
|
|
{%- if "/system_override" in system_message -%}
|
|
{{- custom_instructions.replace("/system_override", "").rstrip() -}}
|
|
{%- else -%}
|
|
{{- "## Metadata\n\n" -}}
|
|
{{- "Knowledge Cutoff Date: June 2025\n" -}}
|
|
{%- set today = strftime_now("%d %B %Y") -%}
|
|
{{- "Today Date: " ~ today ~ "\n" -}}
|
|
{{- "Reasoning Mode: " + reasoning_mode + "\n\n" -}}
|
|
|
|
{{- "## Custom Instructions\n\n" -}}
|
|
{%- if custom_instructions -%}
|
|
{{- custom_instructions + "\n\n" -}}
|
|
{%- elif reasoning_mode == "/think" -%}
|
|
{{- "You are a helpful AI assistant named SmolLM, trained by Hugging Face.\n\n" -}}
|
|
{%- else -%}
|
|
{{- "You are a helpful AI assistant named SmolLM, trained by Hugging Face.\n\n" -}}
|
|
{%- endif -%}
|
|
|
|
{%- if xml_tools or python_tools or tools -%}
|
|
{{- "### Tools\n\n" -}}
|
|
{%- if xml_tools or tools -%}
|
|
{%- if tools -%}
|
|
{%- set xml_tools = tools -%}
|
|
{%- endif -%}
|
|
{%- set ns = namespace(xml_tool_string="You may call one or more functions to assist with the user query.\nYou are provided with function signatures within <tools></tools> XML tags:\n\n<tools>\n") -%}
|
|
{%- for tool in xml_tools[:] -%}
|
|
{%- set ns.xml_tool_string = ns.xml_tool_string ~ (tool | tojson) ~ "\n" -%}
|
|
{%- endfor -%}
|
|
{%- set xml_tool_string = ns.xml_tool_string + "</tools>\n\nFor each function call, return a json object with function name and arguments within <tool_call> XML tags:\n<tool_call>\n{\"name\": <function-name>, \"arguments\": <args-json-object>}\n</tool_call>" -%}
|
|
{{- xml_tool_string -}}
|
|
{%- endif -%}
|
|
{%- if python_tools -%}
|
|
{%- set ns = namespace(python_tool_string="You may call one or more functions as python tools.\n<tools>\n") -%}
|
|
{%- for tool in python_tools[:] -%}
|
|
{%- set ns.python_tool_string = ns.python_tool_string ~ (tool | string) ~ "\n" -%}
|
|
{%- endfor -%}
|
|
{%- set python_tool_string = ns.python_tool_string + "</tools>\n\nThe state persists between code executions." -%}
|
|
{{- python_tool_string -}}
|
|
{%- endif -%}
|
|
{{- "\n\n" -}}
|
|
{%- endif -%}
|
|
{%- endif -%}
|
|
{{- "<|im_end|>\n" -}}
|
|
|
|
{# ───── main loop ───── #}
|
|
{%- for message in messages -%}
|
|
{%- if message.role == "user" -%}
|
|
{{ "<|im_start|>user\n" + message.content + "<|im_end|>\n" }}
|
|
{%- elif message.role == "assistant" -%}
|
|
{% generation %}
|
|
{%- if message.tool_calls -%}
|
|
{%- set ns = namespace(tc_text="") -%}
|
|
{%- for tc in message.tool_calls -%}
|
|
{%- set ns.tc_text = ns.tc_text ~ "<tool_call>\n{\"name\": \"" ~ tc.function.name ~ "\", \"arguments\": " ~ tc.function.arguments ~ "}\n</tool_call>" -%}
|
|
{%- endfor -%}
|
|
{{ "<|im_start|>assistant\n" ~ (message.content if message.content is string else "") ~ ns.tc_text ~ "<|im_end|>\n" }}
|
|
{%- else -%}
|
|
{%- if reasoning_mode == "/think" -%}
|
|
{{ "<|im_start|>assistant\n<think>\n" ~ (message.content if message.content is string else "") ~ "\n</think><|im_end|>\n" }}
|
|
{%- else -%}
|
|
{{ "<|im_start|>assistant\n" ~ (message.content if message.content is string else "") ~ "<|im_end|>\n" }}
|
|
{%- endif -%}
|
|
{%- endif -%}
|
|
{% endgeneration %}
|
|
{%- elif message.role == "tool" -%}
|
|
{{ "<|im_start|>user\n<tool_response>\n" ~ (message.content if message.content is string else "") ~ "\n</tool_response><|im_end|>\n" }}
|
|
{%- endif -%}
|
|
{%- endfor -%}
|
|
|
|
{# ───── generation prompt ───── #}
|
|
{%- if add_generation_prompt -%}
|
|
{%- if reasoning_mode == "/think" -%}
|
|
{{ "<|im_start|>assistant\n<think>\n" }}
|
|
{%- else -%}
|
|
{{ "<|im_start|>assistant\n" }}
|
|
{%- endif -%}
|
|
{%- endif -%}
|