YongganFu commited on
Commit
abf48b3
·
verified ·
1 Parent(s): 8200ec0

Update chat_template.jinja

Browse files
Files changed (1) hide show
  1. chat_template.jinja +109 -7
chat_template.jinja CHANGED
@@ -1,7 +1,109 @@
1
- {{'<SPECIAL_10>System'}}{% for message in messages %}{% if message['role'] == 'system' %}{{'
2
- ' + message['content'].strip()}}{% endif %}{% endfor %}{{'
3
- '}}{% for message in messages %}{% if message['role'] == 'user' %}{{ '
4
- <SPECIAL_11>User
5
- ' + message['content'].strip() + '
6
- <SPECIAL_11>Assistant
7
- ' }}{% elif message['role'] == 'assistant' %}{{ message['content'].strip() }}{% endif %}{% endfor %}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {#- Default system message if no system prompt is passed. #}
2
+ {%- set default_system_message = '' %}
3
+ {#- Begin of sequence token. #}
4
+ {{- bos_token }}
5
+ {#- Handle system prompt if it exists. #}
6
+ {#- System prompt supports text content or text chunks. #}
7
+ {%- if messages[0]['role'] == 'system' %}
8
+ {{- '[SYSTEM_PROMPT]' -}}
9
+ {%- if messages[0]['content'] is string %}
10
+ {{- messages[0]['content'] -}}
11
+ {%- else %}
12
+ {%- for block in messages[0]['content'] %}
13
+ {%- if block['type'] == 'text' %}
14
+ {{- block['text'] }}
15
+ {%- else %}
16
+ {{- raise_exception('Only text chunks are supported in system message contents.') }}
17
+ {%- endif %}
18
+ {%- endfor %}
19
+ {%- endif %}
20
+ {{- '[/SYSTEM_PROMPT]' -}}
21
+ {%- set loop_messages = messages[1:] %}
22
+ {%- else %}
23
+ {%- set loop_messages = messages %}
24
+ {%- if default_system_message != '' %}
25
+ {{- '[SYSTEM_PROMPT]' + default_system_message + '[/SYSTEM_PROMPT]' }}
26
+ {%- endif %}
27
+ {%- endif %}
28
+ {#- Tools definition #}
29
+ {%- set tools_definition = '' %}
30
+ {%- set has_tools = false %}
31
+ {%- if tools is defined and tools is not none and tools|length > 0 %}
32
+ {%- set has_tools = true %}
33
+ {%- set tools_definition = '[AVAILABLE_TOOLS]' + (tools| tojson) + '[/AVAILABLE_TOOLS]' %}
34
+ {{- tools_definition }}
35
+ {%- endif %}
36
+ {#- Checks for alternating user/assistant messages. #}
37
+ {%- set ns = namespace(index=0) %}
38
+ {%- for message in loop_messages %}
39
+ {%- if message.role == 'user' or (message.role == 'assistant' and (message.tool_calls is not defined or message.tool_calls is none or message.tool_calls | length == 0)) %}
40
+ {%- if (message['role'] == 'user') != (ns.index % 2 == 0) %}
41
+ {{- raise_exception('After the optional system message, conversation roles must alternate user and assistant roles except for tool calls and results.') }}
42
+ {%- endif %}
43
+ {%- set ns.index = ns.index + 1 %}
44
+ {%- endif %}
45
+ {%- endfor %}
46
+ {#- Handle conversation messages. #}
47
+ {%- for message in loop_messages %}
48
+ {#- User messages supports text content or text and image chunks. #}
49
+ {%- if message['role'] == 'user' %}
50
+ {%- if message['content'] is string %}
51
+ {{- '[INST]' + message['content'] + '[/INST]' }}
52
+ {%- elif message['content'] | length > 0 %}
53
+ {{- '[INST]' }}
54
+ {%- if message['content'] | length == 2 %}
55
+ {%- set blocks = message['content'] | sort(attribute='type') %}
56
+ {%- else %}
57
+ {%- set blocks = message['content'] %}
58
+ {%- endif %}
59
+ {%- for block in blocks %}
60
+ {%- if block['type'] == 'text' %}
61
+ {{- block['text'] }}
62
+ {%- elif block['type'] in ['image', 'image_url'] %}
63
+ {{- '[IMG]' }}
64
+ {%- else %}
65
+ {{- raise_exception('Only text, image and image_url chunks are supported in user message content.') }}
66
+ {%- endif %}
67
+ {%- endfor %}
68
+ {{- '[/INST]' }}
69
+ {%- else %}
70
+ {{- raise_exception('User message must have a string or a list of chunks in content') }}
71
+ {%- endif %}
72
+ {#- Assistant messages supports text content or text and image chunks. #}
73
+ {%- elif message['role'] == 'assistant' %}
74
+ {%- if (message['content'] is none or message['content'] == '' or message['content']|length == 0) and (message['tool_calls'] is not defined or message['tool_calls'] is none or message['tool_calls']|length == 0) %}
75
+ {{- raise_exception('Assistant message must have a string or a list of chunks in content or a list of tool calls.') }}
76
+ {%- endif %}
77
+ {%- if message['content'] is string %}
78
+ {{- message['content'] }}
79
+ {%- elif message['content'] | length > 0 %}
80
+ {%- for block in message['content'] %}
81
+ {%- if block['type'] == 'text' %}
82
+ {{- block['text'] }}
83
+ {%- else %}
84
+ {{- raise_exception('Only text chunks are supported in assistant message contents.') }}
85
+ {%- endif %}
86
+ {%- endfor %}
87
+ {%- endif %}
88
+
89
+ {%- if message['tool_calls'] is defined and message['tool_calls'] is not none and message['tool_calls']|length > 0 %}
90
+ {%- for tool in message['tool_calls'] %}
91
+ {%- set arguments = tool['function']['arguments'] %}
92
+ {%- if arguments is not string %}
93
+ {%- set arguments = arguments|tojson|safe %}
94
+ {%- elif arguments == '' %}
95
+ {%- set arguments = '{}' %}
96
+ {%- endif %}
97
+ {{- '[TOOL_CALLS]' + tool['function']['name'] + '[ARGS]' + arguments }}
98
+ {%- endfor %}
99
+ {%- endif %}
100
+ {#- End of sequence token for each assistant messages. #}
101
+ {{- eos_token }}
102
+ {#- Tool messages only supports text content. #}
103
+ {%- elif message['role'] == 'tool' %}
104
+ {{- '[TOOL_RESULTS]' + message['content']|string + '[/TOOL_RESULTS]' }}
105
+ {#- Raise exception for unsupported roles. #}
106
+ {%- else %}
107
+ {{- raise_exception('Only user, assistant and tool roles are supported, got ' + message['role'] + '.') }}
108
+ {%- endif %}
109
+ {%- endfor %}