| | |
| | {%- set default_system_message = '' %} |
| | |
| | |
| | {{- bos_token }} |
| | |
| | |
| | |
| | {%- if messages[0]['role'] == 'system' %} |
| | {{- '[SYSTEM_PROMPT]' -}} |
| | {%- if messages[0]['content'] is string %} |
| | {{- messages[0]['content'] -}} |
| | {%- else %} |
| | {%- for block in messages[0]['content'] %} |
| | {%- if block['type'] == 'text' %} |
| | {{- block['text'] }} |
| | {%- else %} |
| | {{- raise_exception('Only text chunks are supported in system message contents.') }} |
| | {%- endif %} |
| | {%- endfor %} |
| | {%- endif %} |
| | {{- '[/SYSTEM_PROMPT]' -}} |
| | {%- set loop_messages = messages[1:] %} |
| | {%- else %} |
| | {%- set loop_messages = messages %} |
| | {%- if default_system_message != '' %} |
| | {{- '[SYSTEM_PROMPT]' + default_system_message + '[/SYSTEM_PROMPT]' }} |
| | {%- endif %} |
| | {%- endif %} |
| | |
| | |
| | |
| | {%- set tools_definition = '' %} |
| | {%- set has_tools = false %} |
| | {%- if tools is defined and tools is not none and tools|length > 0 %} |
| | {%- set has_tools = true %} |
| | {%- set tools_definition = '[AVAILABLE_TOOLS]' + (tools| tojson) + '[/AVAILABLE_TOOLS]' %} |
| | {{- tools_definition }} |
| | {%- endif %} |
| | |
| | |
| | {%- set ns = namespace() %} |
| | {%- set ns.index = 0 %} |
| | {%- for message in loop_messages %} |
| | {%- 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)) %} |
| | {%- if (message['role'] == 'user') != (ns.index % 2 == 0) %} |
| | {{- raise_exception('After the optional system message, conversation roles must alternate user and assistant roles except for tool calls and results.') }} |
| | {%- endif %} |
| | {%- set ns.index = ns.index + 1 %} |
| | {%- endif %} |
| | {%- endfor %} |
| | |
| | |
| | {%- for message in loop_messages %} |
| | |
| | |
| | {%- if message['role'] == 'user' %} |
| | {%- if message['content'] is string %} |
| | {{- '[INST]' + message['content'] + '[/INST]' }} |
| | {%- elif message['content'] | length > 0 %} |
| | {{- '[INST]' }} |
| | {%- set sorted_blocks = message['content'] | sort(attribute='type') %} |
| | {%- for block in sorted_blocks %} |
| | {%- if block['type'] == 'text' %} |
| | {{- block['text'] }} |
| | {%- else %} |
| | {{- raise_exception('Only text chunks are supported in user message content.') }} |
| | {%- endif %} |
| | {%- endfor %} |
| | {{- '[/INST]' }} |
| | {%- else %} |
| | {{- raise_exception('User message must have a string or a list of chunks in content') }} |
| | {%- endif %} |
| | |
| | |
| | {%- elif message['role'] == 'assistant' %} |
| | {%- 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) %} |
| | {{- raise_exception('Assistant message must have a string or a list of chunks in content or a list of tool calls.') }} |
| | {%- endif %} |
| | |
| | {%- if message['content'] is string and message['content'] != '' %} |
| | {{- message['content'] }} |
| | {%- elif message['content'] | length > 0 %} |
| | {%- for block in message['content'] %} |
| | {%- if block['type'] == 'text' %} |
| | {{- block['text'] }} |
| | {%- else %} |
| | {{- raise_exception('Only text chunks are supported in assistant message contents.') }} |
| | {%- endif %} |
| | {%- endfor %} |
| | {%- endif %} |
| | |
| | {%- if message['tool_calls'] is defined and message['tool_calls'] is not none and message['tool_calls']|length > 0 %} |
| | {%- for tool in message['tool_calls'] %} |
| | {{- '[TOOL_CALLS]' }} |
| | {%- set name = tool['function']['name'] %} |
| | {%- set arguments = tool['function']['arguments'] %} |
| | {%- if arguments is not string %} |
| | {%- set arguments = arguments|tojson|safe %} |
| | {%- elif arguments == '' %} |
| | {%- set arguments = '{}' %} |
| | {%- endif %} |
| | {{- name + '[ARGS]' + arguments }} |
| | {%- endfor %} |
| | {%- endif %} |
| | |
| | {{- eos_token }} |
| | |
| | |
| | {%- elif message['role'] == 'tool' %} |
| | {{- '[TOOL_RESULTS]' + message['content']|string + '[/TOOL_RESULTS]' }} |
| | |
| | |
| | {%- else %} |
| | {{- raise_exception('Only user, assistant and tool roles are supported, got ' + message['role'] + '.') }} |
| | {%- endif %} |
| | {%- endfor %} |