{{ bos_token }} {%- if tools %} {%- if messages[0]['role'] == 'system' %} {%- set system_message = messages[0]['content'] %} {%- if messages[1]['role'] == 'user' %} {%- set first_user_message = messages[1]['content'] %} {%- set loop_messages = messages[2:] %} {%- else %} {%- set first_user_message = '' %} {%- set loop_messages = messages[1:] %} {%- endif %} {%- else %} {%- set system_message = "You are a function calling AI model." %} {%- if messages[0]['role'] == 'user' %} {%- set first_user_message = messages[0]['content'] %} {%- set loop_messages = messages[1:] %} {%- else %} {%- set first_user_message = '' %} {%- set loop_messages = messages %} {%- endif %} {%- endif %} user {{ system_message }} You are provided with function signatures within XML tags. You may call one or more functions to assist with the user query. Don't make assumptions about what values to plug into functions. Here are the available tools: {{ tools | tojson }} For each function call return a json object with function name and arguments within tags with the following schema: {"arguments": , "name": } {%- if first_user_message %} {{ first_user_message }} {%- endif %} {% set ns = namespace(pairs=[]) %} {%- for message in loop_messages if message['role'] == 'assistant' and message.get('tool_calls') is defined %} {%- for tc in message['tool_calls'] %} {%- set ns.pairs = ns.pairs + [(tc.id, tc.function.name)] %} {%- endfor %} {%- endfor %} {%- set tool_call_map = dict(ns.pairs) %} {%- for message in loop_messages %} {%- set is_first_tool = message['role'] == 'tool' and (loop.index0 == 0 or loop_messages[loop.index0-1]['role'] != 'tool') %} {%- set is_last_tool = message['role'] == 'tool' and (loop.last or loop_messages[loop.index0+1]['role'] != 'tool') %} {% if message['role'] == 'user' %} user {{ message['content'] | trim }} {% elif message['role'] == 'assistant' -%} model {% if message.get('tool_calls') is defined and message.get('tool_calls') %} {%- for tool_call in message['tool_calls'] %} {"name": "{{ tool_call['function']['name'] }}", "arguments": {{ tool_call['function']['arguments'] | tojson }}} {% if not loop.last %} {% endif %} {%- endfor %} {%- else %} {{ message['content'] | trim }} {%- endif %} {% elif message['role'] == 'tool' %} {%- if is_first_tool %} tool {% endif %} {{ {"name": tool_call_map.get(message.get('tool_call_id', ''), "unknown"), "content": message['content']} | tojson }} {%- if not is_last_tool %} {% else %} {% endif %} {%- endif -%} {%- endfor %}{% if add_generation_prompt %} model {% endif %} {%- else %} {%- if messages[0]['role'] == 'system' -%} {%- if messages[0]['content'] is string -%} {%- set first_user_prefix = messages[0]['content'] + '\n\n' -%} {%- else -%} {%- set first_user_prefix = messages[0]['content'][0]['text'] + '\n\n' -%} {%- endif -%} {%- set loop_messages = messages[1:] -%} {%- else -%} {%- set first_user_prefix = "" -%} {%- set loop_messages = messages -%} {%- endif -%} {%- for message in loop_messages -%} {%- if (message['role'] == 'assistant') -%} {%- set role = "model" -%} {%- else -%} {%- set role = message['role'] -%} {%- endif -%} {{ '' + role + '\n' + (first_user_prefix if loop.first else "") }} {%- if message['content'] is string -%} {{ message['content'] | trim }} {%- elif message['content'] is iterable -%} {%- for item in message['content'] -%} {%- if item['type'] == 'image' -%} {{ '' }} {%- elif item['type'] == 'text' -%} {{ item['text'] | trim }} {%- endif -%} {%- endfor -%} {%- else -%} {{ raise_exception("Invalid content type") }} {%- endif -%} {{ '\n' }} {%- endfor -%} {%- if add_generation_prompt -%} {{'model\n'}} {%- endif -%} {%- endif %}