Skip to content

Instantly share code, notes, and snippets.

@yisiqi
Forked from qingy1337/glm-4.5-nothink.jinja
Created August 26, 2025 14:49
Show Gist options
  • Save yisiqi/9b8cfa514a4b48ff7be040fc3b5569d7 to your computer and use it in GitHub Desktop.
Save yisiqi/9b8cfa514a4b48ff7be040fc3b5569d7 to your computer and use it in GitHub Desktop.

Revisions

  1. @qingy1337 qingy1337 created this gist Jul 28, 2025.
    103 changes: 103 additions & 0 deletions glm-4.5-nothink.jinja
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,103 @@
    [gMASK]<sop>
    {%- if tools -%}
    <|system|>
    # Tools

    You may call one or more functions to assist with the user query.

    You are provided with function signatures within <tools></tools> XML tags:
    <tools>
    {% for tool in tools %}
    {{ tool | tojson(ensure_ascii=False) }}
    {% endfor %}
    </tools>

    For each function call, output the function name and arguments within the following XML format:
    <tool_call>{function-name}
    <arg_key>{arg-key-1}</arg_key>
    <arg_value>{arg-value-1}</arg_value>
    <arg_key>{arg-key-2}</arg_key>
    <arg_value>{arg-value-2}</arg_value>
    ...
    </tool_call>{%- endif -%}
    {%- macro visible_text(content) -%}
    {%- if content is string -%}
    {{- content }}
    {%- elif content is iterable and content is not mapping -%}
    {%- for item in content -%}
    {%- if item is mapping and item.type == 'text' -%}
    {{- item.text }}
    {%- elif item is string -%}
    {{- item }}
    {%- endif -%}
    {%- endfor -%}
    {%- else -%}
    {{- content }}
    {%- endif -%}
    {%- endmacro -%}
    {%- set ns = namespace(last_user_index=-1) %}
    {%- for m in messages %}
    {%- if m.role == 'user' %}
    {% set ns.last_user_index = loop.index0 -%}
    {%- endif %}
    {%- endfor %}
    {% for m in messages %}
    {%- if m.role == 'user' -%}<|user|>
    {{ visible_text(m.content) }}
    {{- '/nothink' if (enable_thinking is defined and not enable_thinking and not visible_text(m.content).endswith("/nothink")) else '' -}}
    {%- elif m.role == 'assistant' -%}
    <|assistant|>
    {%- set reasoning_content = '' %}
    {%- set content = visible_text(m.content) %}
    {%- if m.reasoning_content is string %}
    {%- set reasoning_content = m.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_user_index and reasoning_content -%}
    {{ '\n<think>' + reasoning_content.strip() + '</think>'}}
    {%- else -%}
    {{ '\n<think></think>' }}
    {%- endif -%}
    {%- if content.strip() -%}
    {{ '\n' + content.strip() }}
    {%- endif -%}
    {% if m.tool_calls %}
    {% for tc in m.tool_calls %}
    {%- if tc.function %}
    {%- set tc = tc.function %}
    {%- endif %}
    {{ '\n<tool_call>' + tc.name }}
    {% set _args = tc.arguments %}
    {% for k, v in _args.items() %}
    <arg_key>{{ k }}</arg_key>
    <arg_value>{{ v | tojson(ensure_ascii=False) if v is not string else v }}</arg_value>
    {% endfor %}
    </tool_call>{% endfor %}
    {% endif %}
    {%- elif m.role == 'tool' -%}
    {%- if m.content is string -%}
    {%- if loop.first or (messages[loop.index0 - 1].role != "tool") %}
    {{- '<|observation|>' }}
    {%- endif %}
    {{- '\n<tool_response>\n' }}
    {{- m.content }}
    {{- '\n</tool_response>' }}
    {%- else -%}
    <|observation|>{% for tr in m.content %}

    <tool_response>
    {{ tr.output if tr.output is defined else tr }}
    </tool_response>{% endfor -%}
    {% endif -%}
    {%- elif m.role == 'system' -%}
    <|system|>
    {{ visible_text(m.content) }}
    {%- endif -%}
    {%- endfor -%}
    {%- if add_generation_prompt -%}
    <|assistant|>{{- '\n<think></think>' -}}
    {%- endif -%}