mlabonne nathanrchn commited on
Commit
c1c44ff
·
1 Parent(s): f9f0db8

Fix chat template: render assistant tool_calls (#10)

Browse files

- Fix chat template: render assistant tool_calls (d0fa5f956a24834abb8fce10c275c3bbf410105c)


Co-authored-by: nathan ranchin <[email protected]>

Files changed (1) hide show
  1. chat_template.jinja +72 -7
chat_template.jinja CHANGED
@@ -1,7 +1,72 @@
1
- {{- bos_token -}}{%- set system_prompt = "" -%}{%- set ns = namespace(system_prompt="") -%}{%- if messages[0]["role"] == "system" -%} {%- set ns.system_prompt = messages[0]["content"] -%} {%- set messages = messages[1:] -%}{%- endif -%}{%- if tools -%} {%- set ns.system_prompt = ns.system_prompt + ("
2
- " if ns.system_prompt else "") + "List of tools: <|tool_list_start|>[" -%} {%- for tool in tools -%} {%- if tool is not string -%} {%- set tool = tool | tojson -%} {%- endif -%} {%- set ns.system_prompt = ns.system_prompt + tool -%} {%- if not loop.last -%} {%- set ns.system_prompt = ns.system_prompt + ", " -%} {%- endif -%} {%- endfor -%} {%- set ns.system_prompt = ns.system_prompt + "]<|tool_list_end|>" -%}{%- endif -%}{%- if ns.system_prompt -%} {{- "<|im_start|>system
3
- " + ns.system_prompt + "<|im_end|>
4
- " -}}{%- endif -%}{%- for message in messages -%} {{- "<|im_start|>" + message["role"] + "
5
- " -}} {%- set content = message["content"] -%} {%- if content is not string -%} {%- set content = content | tojson -%} {%- endif -%} {%- if message["role"] == "tool" -%} {%- set content = "<|tool_response_start|>" + content + "<|tool_response_end|>" -%} {%- endif -%} {{- content + "<|im_end|>
6
- " -}}{%- endfor -%}{%- if add_generation_prompt -%} {{- "<|im_start|>assistant
7
- " -}}{%- endif -%}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {{- bos_token -}}
2
+ {%- macro format_arg_value(arg_value) -%}
3
+ {%- if arg_value is string -%}
4
+ {{- "'" + (arg_value | replace("\\", "\\\\") | replace("'", "\\'") | replace("\n", "\\n") | replace("\r", "\\r")) + "'" -}}
5
+ {%- elif arg_value is mapping or arg_value is iterable -%}
6
+ {{- arg_value | tojson -}}
7
+ {%- else -%}
8
+ {{- arg_value | string -}}
9
+ {%- endif -%}
10
+ {%- endmacro -%}
11
+ {%- macro render_tool_calls(tool_calls) -%}
12
+ {%- set tool_calls_ns = namespace(tool_calls=[]) -%}
13
+ {%- for tool_call in tool_calls -%}
14
+ {%- set func = tool_call["function"] if "function" in tool_call else tool_call -%}
15
+ {%- set func_name = func["name"] -%}
16
+ {%- set func_args = func.get("arguments") -%}
17
+ {%- set args_ns = namespace(arg_strings=[]) -%}
18
+ {%- if func_args is mapping -%}
19
+ {%- for arg_name, arg_value in func_args.items() -%}
20
+ {%- set args_ns.arg_strings = args_ns.arg_strings + [arg_name + "=" + format_arg_value(arg_value)] -%}
21
+ {%- endfor -%}
22
+ {%- elif func_args is string and (func_args | trim) not in ["", "{}", "null"] -%}
23
+ {{- raise_exception("Tool call arguments must be a mapping, got a JSON-encoded string: parse arguments with json.loads() before applying the chat template") -}}
24
+ {%- endif -%}
25
+ {%- set tool_calls_ns.tool_calls = tool_calls_ns.tool_calls + [func_name + "(" + (args_ns.arg_strings | join(", ")) + ")"] -%}
26
+ {%- endfor -%}
27
+ {{- "<|tool_call_start|>[" + (tool_calls_ns.tool_calls | join(", ")) + "]<|tool_call_end|>" -}}
28
+ {%- endmacro -%}
29
+ {%- set system_prompt = "" -%}
30
+ {%- set ns = namespace(system_prompt="") -%}
31
+ {%- if messages[0]["role"] == "system" -%}
32
+ {%- set ns.system_prompt = messages[0]["content"] -%}
33
+ {%- set messages = messages[1:] -%}
34
+ {%- endif -%}
35
+ {%- if tools -%}
36
+ {%- set ns.system_prompt = ns.system_prompt + ("\n" if ns.system_prompt else "") + "List of tools: <|tool_list_start|>[" -%}
37
+ {%- for tool in tools -%}
38
+ {%- if tool is not string -%}
39
+ {%- set tool = tool | tojson -%}
40
+ {%- endif -%}
41
+ {%- set ns.system_prompt = ns.system_prompt + tool -%}
42
+ {%- if not loop.last -%}
43
+ {%- set ns.system_prompt = ns.system_prompt + ", " -%}
44
+ {%- endif -%}
45
+ {%- endfor -%}
46
+ {%- set ns.system_prompt = ns.system_prompt + "]<|tool_list_end|>" -%}
47
+ {%- endif -%}
48
+ {%- if ns.system_prompt -%}
49
+ {{- "<|im_start|>system\n" + ns.system_prompt + "<|im_end|>\n" -}}
50
+ {%- endif -%}
51
+ {%- for message in messages -%}
52
+ {{- "<|im_start|>" + message["role"] + "\n" -}}
53
+ {%- set content = message.get("content") -%}
54
+ {%- if content is not string -%}
55
+ {%- set content = content | tojson -%}
56
+ {%- endif -%}
57
+ {%- if message["role"] == "tool" -%}
58
+ {%- set content = "<|tool_response_start|>" + content + "<|tool_response_end|>" -%}
59
+ {%- endif -%}
60
+ {%- if message["role"] == "assistant" and message.get("tool_calls") -%}
61
+ {%- if content and content != "null" -%}
62
+ {{- content -}}
63
+ {%- endif -%}
64
+ {{- render_tool_calls(message["tool_calls"]) -}}
65
+ {{- "<|im_end|>\n" -}}
66
+ {%- else -%}
67
+ {{- content + "<|im_end|>\n" -}}
68
+ {%- endif -%}
69
+ {%- endfor -%}
70
+ {%- if add_generation_prompt -%}
71
+ {{- "<|im_start|>assistant\n" -}}
72
+ {%- endif -%}