{%- if not add_generation_prompt is defined -%} {%- set add_generation_prompt = false -%} {%- endif -%} {%- set ns = namespace(is_first=false, is_tool_outputs=false, is_output_first=true, system_prompt='') -%} {%- for message in messages -%} {%- if message['role'] == 'system' -%} {%- set ns.system_prompt = message['content'] -%} {%- endif -%} {%- endfor -%} {{bos_token}} {%- if tools %} You can call any of the following function tools to satisfy the user's requests: {{tools | map(attribute='function') | tojson(indent=2)}} Example function tool call syntax: <|tool▁calls▁begin|><|tool▁call▁begin|>function<|tool▁sep|>example_function_name ```json { "arg1": "some_value" ... } ``` <|tool▁call▁end|><|tool▁calls▁end|> {% endif -%} {{ns.system_prompt}} {%- macro flush_tool_outputs() -%} {%- if ns.is_tool_outputs -%} {{- '<|tool▁outputs▁end|><|end▁of▁sentence|>' -}} {%- set ns.is_tool_outputs = false -%} {%- endif -%} {%- endmacro -%} {{- flush_tool_outputs() -}} {%- for message in messages -%} {%- if message['role'] != 'tool' -%} {{- flush_tool_outputs() -}} {%- endif -%} {%- if message['role'] == 'user' -%} {{- '<|User|>' + message['content'] + '<|end▁of▁sentence|>' -}} {%- endif -%} {%- if message['role'] == 'assistant' and message['content'] is none -%} {{- '<|Assistant|><|tool▁calls▁begin|>' -}} {%- set ns.is_first = true -%} {%- for tc in message['tool_calls'] -%} {%- if ns.is_first -%} {%- set ns.is_first = false -%} {%- else -%} {{- '\n' -}} {%- endif -%} {%- set tool_name = tc['function']['name'] -%} {%- set tool_args = tc['function']['arguments'] -%} {{- '<|tool▁call▁begin|>' + tc['type'] + '<|tool▁sep|>' + tool_name + '\n' + '```json' + '\n' + tool_args + '\n' + '```' + '<|tool▁call▁end|>' -}} {%- endfor -%} {{- '<|tool▁calls▁end|><|end▁of▁sentence|>' -}} {%- endif -%} {%- if message['role'] == 'assistant' and message['content'] is not none -%} {{- flush_tool_outputs() -}} {%- set content = message['content'] -%} {%- if '' in content -%} {%- set content = content.split('')[-1] -%} {%- endif -%} {{- '<|Assistant|>' + content + '<|end▁of▁sentence|>' -}} {%- endif -%} {%- if message['role'] == 'tool' -%} {%- set ns.is_tool_outputs = true -%} {%- if ns.is_output_first -%} {{- '<|tool▁outputs▁begin|>' -}} {%- set ns.is_output_first = false -%} {%- endif -%} {{- '\n<|tool▁output▁begin|>' + message['content'] + '<|tool▁output▁end|>' -}} {%- endif -%} {%- endfor -%} {{- flush_tool_outputs() -}} {%- if add_generation_prompt and not ns.is_tool_outputs -%} {{- '<|Assistant|>\n' -}} {%- endif -%}