char-fork/llama.cpp

git clone https://git.t4t.associates/char-fork/llama.cpp

Tarek Dakhrancommon/chat : fix LFM2/LFM2.5 reasoning round-trip and <think> leak (#24234)98d5e8ba8

char/aliceai-t5-moe
4.5 KiB115 linesraw
1{{- bos_token -}}
2{%- set preserve_thinking = preserve_thinking | default(false) -%}
3
4{%- macro format_arg_value(arg_value) -%}
5    {%- if arg_value is string -%}
6        {{- "'" + arg_value + "'" -}}
7    {%- elif arg_value is mapping -%}
8        {{- arg_value | tojson -}}
9    {%- else -%}
10        {{- arg_value | string -}}
11    {%- endif -%}
12{%- endmacro -%}
13
14{%- macro parse_content(content) -%}
15    {%- if content is string -%}
16        {{- content -}}
17    {%- else -%}
18        {%- set _ns = namespace(result="") -%}
19        {%- for item in content -%}
20            {%- if item["type"] == "image" -%}
21                {%- set _ns.result = _ns.result + "<image>" -%}
22            {%- elif item["type"] == "text" -%}
23                {%- set _ns.result = _ns.result + item["text"] -%}
24            {%- else -%}
25                {%- set _ns.result = _ns.result + item | tojson -%}
26            {%- endif -%}
27        {%- endfor -%}
28        {{- _ns.result -}}
29    {%- endif -%}
30{%- endmacro -%}
31
32{%- macro render_tool_calls(tool_calls) -%}
33    {%- set tool_calls_ns = namespace(tool_calls=[]) -%}
34    {%- for tool_call in tool_calls -%}
35        {%- set func_name = tool_call["function"]["name"] -%}
36        {%- set func_args = tool_call["function"]["arguments"] -%}
37        {%- set args_ns = namespace(arg_strings=[]) -%}
38        {%- for arg_name, arg_value in func_args.items() -%}
39            {%- set args_ns.arg_strings = args_ns.arg_strings + [arg_name + "=" + format_arg_value(arg_value)] -%}
40        {%- endfor -%}
41        {%- set tool_calls_ns.tool_calls = tool_calls_ns.tool_calls + [func_name + "(" + (args_ns.arg_strings | join(", ")) + ")"] -%}
42    {%- endfor -%}
43    {{- "<|tool_call_start|>[" + (tool_calls_ns.tool_calls | join(", ")) + "]<|tool_call_end|>" -}}
44{%- endmacro -%}
45
46{%- set ns = namespace(system_prompt="", last_user_index=-1) -%}
47{%- if messages[0]["role"] == "system" -%}
48    {%- if messages[0].get("content") -%}
49        {%- set ns.system_prompt = parse_content(messages[0]["content"]) -%}
50    {%- endif -%}
51    {%- set messages = messages[1:] -%}
52{%- endif -%}
53{%- if tools -%}
54    {%- set ns.system_prompt = ns.system_prompt + ("\n" if ns.system_prompt else "") + "List of tools: [" -%}
55    {%- for tool in tools -%}
56        {%- if tool is not string -%}
57            {%- set tool = tool | tojson -%}
58        {%- endif -%}
59        {%- set ns.system_prompt = ns.system_prompt + tool -%}
60        {%- if not loop.last -%}
61            {%- set ns.system_prompt = ns.system_prompt + ", " -%}
62        {%- endif -%}
63    {%- endfor -%}
64    {%- set ns.system_prompt = ns.system_prompt + "]" -%}
65{%- endif -%}
66{%- if ns.system_prompt -%}
67    {{- "<|im_start|>system\n" + ns.system_prompt + "<|im_end|>\n" -}}
68{%- endif -%}
69{%- for message in messages -%}
70    {%- if message["role"] == "user" -%}
71        {%- set ns.last_user_index = loop.index0 -%}
72    {%- endif -%}
73{%- endfor -%}
74{%- for message in messages -%}
75    {{- "<|im_start|>" + message.role + "\n" -}}
76    {%- if message.role == "assistant" -%}
77        {%- generation -%}
78        {%- if message.thinking is defined and (preserve_thinking or loop.index0 > ns.last_user_index) -%}
79            {{- "<think>" + message.thinking + "</think>" -}}
80        {%- endif -%}
81        {%- set _cfm_tag = "CONTINUE_FINAL_MESSAGE_TAG " -%}
82        {%- set _has_cfm = false -%}
83        {%- if message.content is defined -%}
84            {%- set content = parse_content(message.content) -%}
85            {%- if not (preserve_thinking or loop.index0 > ns.last_user_index) -%}
86                {%- if "</think>" in content -%}
87                    {%- set content = content.split("</think>")[-1] | trim -%}
88                {%- endif -%}
89            {%- endif -%}
90            {%- if message.tool_calls is defined and content.endswith(_cfm_tag) -%}
91                {%- set _has_cfm = true -%}
92                {%- set _trunc_len = (content | length) - (_cfm_tag | length) -%}
93                {{- content[:_trunc_len] -}}
94            {%- else -%}
95                {{- content -}}
96            {%- endif -%}
97        {%- endif -%}
98        {%- if message.tool_calls is defined -%}
99            {{- render_tool_calls(message.tool_calls) -}}
100        {%- endif -%}
101        {%- if _has_cfm -%}
102            {{- _cfm_tag -}}
103        {%- endif -%}
104        {{- "<|im_end|>\n" -}}
105        {%- endgeneration -%}
106    {%- else %}
107        {%- if message.get("content") -%}
108            {{- parse_content(message["content"]) -}}
109        {%- endif -%}
110        {{- "<|im_end|>\n" -}}
111    {%- endif %}
112{%- endfor -%}
113{%- if add_generation_prompt -%}
114    {{- "<|im_start|>assistant\n" -}}
115{%- endif -%}