{%- set user_messages = messages | selectattr('role', 'equalto', 'user') | list %} {%- macro output_available_tools(tools, message) %} {%- if tools and (message == user_messages[-1]) %} {{- '<|available_tools|>[' }} {%- for tool in tools %} {%- set tool = tool.function %} {{- "{" }} {%- for key, val in tool.items() if key != "return" %} {%- if val is string %} {{- "'" + key + "': '" + val + "'" }} {%- else %} {{- "'" + key + "': " + val|string }} {%- endif %} {%- if not loop.last %} {{- ", " }} {%- endif %} {%- endfor %} {{- "}" }} {%- if not loop.last %} {{- ", " }} {%- else %} {{- "]" }} {%- endif %} {%- endfor %} {{- eos_token -}} {%- endif %} {%- endmacro %} {%- macro output_tool_results(tool_results) %} {{- '<|tool_results|>[' }} {%- for tool_result in tool_results %} {{- "{'content': " + tool_result.content|string + ", 'call_id': '" + tool_result.call_id + "'}" }} {%- endfor %} {{- ']' }} {{- eos_token -}} {%- endmacro %} {%- macro output_tool_calls(tool_calls) %} {{- '<|tool_calls|>[' }} {%- for tool_call in tool_calls %} {{- "{'id': '" + tool_call.id + "', 'name': '" + tool_call.name + "', 'arguments': " + tool_call.arguments|string + '}' }} {%- endfor %} {{- ']' }} {%- endmacro %} {%- for message in messages %} {%- if message['role'] == 'user' %} {%- if tools is defined %} {{- output_available_tools(tools, message) }} {%- endif %} {{- '<|user|>' + message['content'] + eos_token -}} {%- elif message['role'] == 'system' %} {{- '<|system|>' + message['content'] + eos_token -}} {%- elif message['role'] == 'assistant' %} {% set assistant_content = "" %} {%- if message.content is defined %} {% set assistant_content = message.content %} {%- endif %} {%- if message.tool_calls is defined and message.tool_calls -%} {{- '<|assistant|>' + assistant_content + output_tool_calls(message['tool_calls']) + eos_token -}} {%- else %} {{- '<|assistant|>' + assistant_content + eos_token }} {%- endif %} {%- elif message['role'] == 'tool_results' %} {{- output_tool_results(message.tool_results) }} {%- endif %} {%- if loop.last and add_generation_prompt -%} {{- '<|assistant|>' -}} {%- endif -%} {%- endfor %}