File size: 4,758 Bytes
eedb5be
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
{#- 0826版本 -#}

{%- if not messages %}

    {{- raise_exception('No messages provided.') }}

{%- endif %}

{%- set enable_thinking = enable_thinking | default(true) %}



{#- Render a string or a list of text blocks. -#}

{%- macro render_content(content, context_name) %}

    {%- if content is string %}

        {{- content }}

    {%- elif content is none or content is undefined %}

        {{- '' }}

    {%- elif content is iterable and content is not mapping %}

        {%- for block in content %}

            {%- if block.type == 'text' %}

                {{- block.text }}

            {%- else %}

                {{- raise_exception('Unsupported ' ~ context_name ~ ' content block type: ' ~ (block.type | string)) }}

            {%- endif %}

        {%- endfor %}

    {%- else %}

        {{- raise_exception(context_name ~ ' content must be a string or a list of text blocks') }}

    {%- endif %}

{%- endmacro %}



{#- Default system prompt -#}

{%- set default_system = "you are a helpful assistant." %}



{#- The first message-level system is placed in the initial system block. -#}

{%- set ns = namespace(initial_system='') %}

{%- if messages[0].role == "system" %}

    {%- set ns.initial_system = render_content(messages[0].content, 'system') %}

{%- endif %}



{#- System block -#}

{{- '<|start▁of▁sentence|><|System|>' + '\n' + default_system }}

{%- if tools %}

    {{- '## Tools' + '\n' + 'You have access to the following functions:' + '\n' + '<tools>' }}

    {%- for tool in tools %}

        {{- '\n' + tool.function | tojson}}

    {%- endfor %}

    {{- '\n' + '</tools>' }}

{%- endif %}

{%- if ns.initial_system %}

    {{- '\n\n' + ns.initial_system }}

{%- endif %}

{{- '<|end▁of▁sentence|>'}}



{#- Conversation turns -#}

{%- for message in messages %}

    {%- if message.role == "system" %}

        {#- The first system message was consumed by the initial block. -#}

        {%- if not loop.first %}

            {{- '<|start▁of▁sentence|><|System|>\n' + render_content(message.content, 'system') + '<|end▁of▁sentence|>' }}

        {%- endif %}

    {%- elif message.role == "user" %}

        {{- '<|start▁of▁sentence|><|User|>' + render_content(message.content, 'user') + '<|end▁of▁sentence|>' }}

    {%- elif message.role == "assistant" %}

        {%- set assistant_content = render_content(message.content, 'assistant') %}

        {%- if message.reasoning_content is defined and message.reasoning_content %}

            {%- set reasoning_content = message.reasoning_content %}

        {%- else %}

            {%- set reasoning_content = '' %}

        {%- endif %}

        {{- '<|start▁of▁sentence|><|Bot|>'}}

        {%- if reasoning_content %}

            {{- '<think>' + reasoning_content + '</think>'}}

        {%- else %}

            {{- '</think>' }}

        {%- endif %}

        {%- if assistant_content %}

            {{- assistant_content }}

        {%- endif %}

        {%- if message.tool_calls is defined and message.tool_calls is not none %}

            {%- for tool_call in message.tool_calls %}

                {%- if tool_call.function.arguments is not mapping %}

                    {{- raise_exception('tool_call.function.arguments must be a dictionary; normalize JSON strings before apply_chat_template') }}

                {%- endif %}

                {%- set args = tool_call.function.arguments %}

                {{- '<tool_call>' + tool_call.function.name }}

                {%- for k, v in args.items() %}

                    {{- '<arg_key>' ~ k ~ '</arg_key><arg_value>' ~ (v if v is string else v | tojson) ~ '</arg_value>' }}

                {%- endfor %}

                {{- '</tool_call>' }}

            {%- endfor %}

        {%- endif %}

        {{- '<|end▁of▁sentence|>' }}

    {%- elif message.role == "tool" %}

        {%- if loop.previtem is undefined or loop.previtem.role != "tool" %}

            {{- '<|start▁of▁sentence|><|Tool|>' }}

        {%- endif %}

        {{- '<tool_response>' ~ message.content ~ '</tool_response>' }}

        {%- if loop.nextitem is undefined or loop.nextitem.role != "tool" %}

            {{- '<|end▁of▁sentence|>' }}

        {%- endif %}

    {%- else %}

        {{- raise_exception('Unsupported message role: ' ~ message.role) }}

    {%- endif %}

{%- endfor %}



{#- Generation prompt -#}

{%- if add_generation_prompt %}

    {{- '<|start▁of▁sentence|><|Bot|>' }}

    {%- if enable_thinking is defined and enable_thinking %}

        {{- '<think>' }}

    {%- endif %}

    {%- if enable_thinking is defined and not enable_thinking %}

        {{- '</think>' }}

    {%- endif %}

{%- endif %}