File size: 8,238 Bytes
818feb6 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 | <|begin_of_text|>{%- macro render_extra_keys(json_dict, handled_keys) -%}
{%- if json_dict is mapping %}
{%- for json_key in json_dict if json_key not in handled_keys %}
{%- if json_dict[json_key] is mapping or (json_dict[json_key] is sequence and json_dict[json_key] is not string) %}
{{- '\n<' ~ json_key ~ '>' ~ (json_dict[json_key] | tojson | safe) ~ '</' ~ json_key ~ '>' }}
{%- else %}
{{- '\n<' ~ json_key ~ '>' ~ (json_dict[json_key] | string) ~ '</' ~ json_key ~ '>' }}
{%- endif %}
{%- endfor %}
{%- endif %}
{%- endmacro -%}
{%- macro render_tool_call(raw_tool_call) -%}
{%- if raw_tool_call.function is defined and raw_tool_call.function is mapping %}
{%- set tool_call = raw_tool_call.function %}
{%- else %}
{%- set tool_call = raw_tool_call %}
{%- endif %}
{{- '<tool_call>\n<function=' + (tool_call.name | default('') | string) + '>\n' }}
{%- if tool_call.arguments is defined and tool_call.arguments is mapping %}
{%- for args_name, args_value in tool_call.arguments.items() %}
{{- '<parameter=' + (args_name | string) + '>\n' }}
{%- if args_value is mapping or (args_value is sequence and args_value is not string) %}
{{- args_value | tojson | safe }}
{%- else %}
{{- args_value | string }}
{%- endif %}
{{- '\n</parameter>\n' }}
{%- endfor %}
{%- endif %}
{{- '</function>\n</tool_call>' }}
{%- endmacro -%}
{%- set system_message = none %}
{%- if messages and messages[0]["role"] == "system" %}
{%- set system_message = messages[0]["content"] %}
{%- set loop_messages = messages[1:] %}
{%- else %}
{%- set loop_messages = messages %}
{%- endif %}
{%- if not tools is defined %}
{%- set tools = [] %}
{%- endif %}
{%- set has_tools = tools is iterable and tools is not string and tools | length > 0 %}
{%- if system_message is not none or has_tools %}
{{- '<|im_start|>system\n' }}
{%- if system_message is not none %}
{{- system_message }}
{%- else %}
{{- "You are Trinity Large, a helpful assistant developed by Arcee AI, that can interact with a computer to solve tasks." }}
{%- endif %}
{%- if has_tools %}
{{- "\n\n# Tools\n\nYou have access to the following functions:\n\n<tools>" }}
{%- for tool in tools %}
{%- if tool.function is defined and tool.function is mapping %}
{%- set tool = tool.function %}
{%- endif %}
{{- '\n<function>\n<name>' ~ (tool.name | default('') | string) ~ '</name>' }}
{%- if tool.description is defined and tool.description is not none %}
{{- '\n<description>' ~ (tool.description | string | trim) ~ '</description>' }}
{%- endif %}
{{- '\n<parameters>' }}
{%- if tool.parameters is defined and tool.parameters is mapping and tool.parameters.properties is defined and tool.parameters.properties is mapping %}
{%- for param_name, param_fields in tool.parameters.properties.items() %}
{{- '\n<parameter>\n<name>' ~ (param_name | string) ~ '</name>' }}
{%- if param_fields is mapping and param_fields.type is defined and param_fields.type is not none %}
{{- '\n<type>' ~ (param_fields.type | string) ~ '</type>' }}
{%- endif %}
{%- if param_fields is mapping and param_fields.description is defined and param_fields.description is not none %}
{{- '\n<description>' ~ (param_fields.description | string | trim) ~ '</description>' }}
{%- endif %}
{%- if param_fields is mapping %}
{%- set handled_keys = ['name', 'type', 'description'] %}
{{- render_extra_keys(param_fields, handled_keys) }}
{%- endif %}
{{- '\n</parameter>' }}
{%- endfor %}
{%- endif %}
{%- if tool.parameters is defined %}
{%- set handled_keys = ['type', 'properties'] %}
{{- render_extra_keys(tool.parameters, handled_keys) }}
{%- endif %}
{{- '\n</parameters>' }}
{%- set handled_keys = ['type', 'name', 'description', 'parameters'] %}
{{- render_extra_keys(tool, handled_keys) }}
{{- '\n</function>' }}
{%- endfor %}
{{- "\n</tools>" }}
{{- '\n\nIf you choose to call a function ONLY reply in the following format with NO suffix:\n\n<tool_call>\n<function=example_function_name>\n<parameter=example_parameter_1>\nvalue_1\n</parameter>\n<parameter=example_parameter_2>\nThis is the value for the second parameter\nthat can span\nmultiple lines\n</parameter>\n</function>\n</tool_call>\n\n<IMPORTANT>\nReminder:\n- Function calls MUST follow the specified format: an inner <function=...></function> block must be nested within <tool_call></tool_call> XML tags\n- Required parameters MUST be specified\n- You may provide optional reasoning for your function call in natural language BEFORE the function call, but NOT after\n- If there is no function call available, answer the question like normal with your current knowledge and do not tell the user about function calls\n</IMPORTANT>' }}
{%- endif %}
{{- '<|im_end|>\n' }}
{%- endif %}
{%- for message in loop_messages %}
{%- set role = message.role | default('') %}
{%- if role == "assistant" %}
{%- set content_str = '' if message.content is none else (message.content | string) %}
{%- set trimmed_content = content_str | trim %}
{%- set has_reasoning_content = message.reasoning_content is defined %}
{%- set has_reasoning = has_reasoning_content or (message.reasoning is defined) %}
{%- if has_reasoning_content %}
{%- set reasoning_value = message.reasoning_content %}
{%- elif message.reasoning is defined %}
{%- set reasoning_value = message.reasoning %}
{%- else %}
{%- set reasoning_value = none %}
{%- endif %}
{%- set has_tool_calls = message.tool_calls is defined and message.tool_calls is iterable and message.tool_calls is not string and message.tool_calls | length > 0 %}
{{- '<|im_start|>assistant\n' }}
{%- if has_reasoning %}
{%- if reasoning_value %}
{{- '<think>' + (reasoning_value | string | trim) + '</think>' }}
{%- else %}
{{- '<think></think>' }}
{%- endif %}
{%- if trimmed_content %}
{{- '\n' + trimmed_content }}
{%- endif %}
{%- elif has_tool_calls %}
{%- if trimmed_content %}
{{- trimmed_content }}
{%- endif %}
{%- else %}
{{- content_str }}
{%- endif %}
{%- if has_tool_calls %}
{%- for tool_call in message.tool_calls %}
{%- set separator = '\n' if ((loop.first and (has_reasoning or trimmed_content)) or (not loop.first)) else '' -%}
{{- separator + render_tool_call(tool_call) }}
{%- endfor %}
{%- endif %}
{{- '<|im_end|>\n' }}
{%- elif role == "tool" or role == "observation" or role == "function" %}
{%- if loop.first or loop.previtem.role not in ["tool", "observation", "function"] %}
{{- '<|im_start|>user\n' }}
{%- endif %}
{{- '<tool_response>\n' }}
{{- '' if message.content is none else (message.content | string) }}
{{- '\n</tool_response>\n' }}
{%- if loop.last or loop.nextitem.role not in ["tool", "observation", "function"] %}
{{- '<|im_end|>\n' }}
{%- endif %}
{%- else %}
{{- '<|im_start|>' + (role | string) }}
{{- '\n' + ('' if message.content is none else (message.content | string)) }}
{{- '<|im_end|>\n' }}
{%- endif %}
{%- endfor %}
{%- if add_generation_prompt %}
{{- '<|im_start|>assistant\n<think>' }}
{%- endif %} |