File size: 9,843 Bytes
e789c15 | 1 2 3 4 5 6 | {
"bos_token": "<|startoftext|>",
"eos_token": "<|im_end|>",
"pad_token": "<|pad|>",
"chat_template": "{{- bos_token -}}\n{%- set preserve_thinking = preserve_thinking | default(false) -%}\n\n{%- macro render_value(v) -%}\n {%- if v is string -%}\n {{- v -}}\n {%- elif v is boolean -%}\n {{- \"true\" if v else \"false\" -}}\n {%- elif v is none -%}\n {{- \"null\" -}}\n {%- elif v is mapping or (v is sequence and v is not string) -%}\n {{- v | tojson -}}\n {%- else -%}\n {{- v -}}\n {%- endif -%}\n{%- endmacro -%}\n\n{%- macro parse_content(content) -%}\n {%- if content is string -%}\n {{- content -}}\n {%- elif content is mapping -%}\n {{- content | tojson -}}\n {%- elif content is iterable -%}\n {%- set _ns = namespace(result=\"\") -%}\n {%- for item in content -%}\n {%- if item is string -%}\n {%- set _ns.result = _ns.result + item -%}\n {%- elif item is mapping and item.get(\"type\")\n in [\"audio\", \"audio_url\", \"input_audio\"] -%}\n {%- set _ns.result = _ns.result + \"<|audio|>\" -%}\n {%- elif item is mapping and item.get(\"type\") == \"audio_out\" -%}\n {%- set _ns.result = _ns.result + \"<|audio_out|>\" -%}\n {%- elif item is mapping and item.get(\"type\") == \"image\" -%}\n {%- set _ns.result = _ns.result + \"<|vision_start|><|image|><|vision_end|>\" -%}\n {%- elif item is mapping and item.get(\"type\") == \"video\" -%}\n {%- set _ns.result = _ns.result + \"<|vision_start|><|video|><|vision_end|>\" -%}\n {%- elif item is mapping and item.get(\"type\") == \"text\" -%}\n {%- set _ns.result = _ns.result + ((item.get(\"text\") or \"\") | string) -%}\n {%- else -%}\n {%- set _ns.result = _ns.result + (item | tojson) -%}\n {%- endif -%}\n {%- endfor -%}\n {{- _ns.result -}}\n {%- endif -%}\n{%- endmacro -%}\n\n{%- macro render_tool_calls(tool_calls) -%}\n {%- for tool_call in tool_calls -%}\n {%- if not loop.first -%}{{- \"\\n\\n\" -}}{%- endif -%}\n {%- set func = tool_call[\"function\"] if \"function\" in tool_call else tool_call -%}\n {%- set func_args = func.get(\"arguments\") -%}\n {%- if func_args is string and (func_args | trim) not in [\"\", \"{}\", \"null\"] -%}\n {{- raise_exception(\"Tool call arguments must be a mapping, got a JSON-encoded string: parse arguments with json.loads() before applying the chat template\") -}}\n {%- endif -%}\n {{- \"<tool_call>\\n<function=\" + func[\"name\"] + \">\\n\" -}}\n {%- if func_args is mapping -%}\n {%- for arg_name, arg_value in func_args.items() -%}\n {{- \"<parameter=\" + arg_name + \">\\n\" + render_value(arg_value) + \"\\n</parameter>\\n\" -}}\n {%- endfor -%}\n {%- endif -%}\n {{- \"</function>\\n</tool_call>\" -}}\n {%- endfor -%}\n{%- endmacro -%}\n\n{%- macro tool_to_json(tool) -%}\n {%- set fn = tool.function if tool.function is defined else tool -%}\n {%- set ns_t = namespace(first=true) -%}\n {{- \"{\" -}}\n {%- for k, v in fn.items() -%}\n {%- if k != \"defer_loading\" -%}\n {%- if not ns_t.first -%}{{- \", \" -}}{%- endif -%}\n {%- set ns_t.first = false -%}\n {{- k | tojson -}}{{- \": \" -}}{{- v | tojson -}}\n {%- endif -%}\n {%- endfor -%}\n {{- \"}\" -}}\n{%- endmacro -%}\n\n{%- macro render_tool_response(content) -%}\n {#- content that already carries the tag (pre-formatted by the caller) is\n passed through as-is instead of being wrapped a second time -#}\n {%- if content is string and \"<tool_response>\" in content -%}\n {{- content -}}\n {%- else -%}\n {{- \"<tool_response>\\n\" -}}\n {%- if content is string -%}\n {{- content -}}\n {%- else -%}\n {%- for item in content -%}\n {%- if not loop.first -%}{{- \"\\n\" -}}{%- endif -%}\n {%- if item is mapping and item.result is defined and item.result is mapping and item.result.tools is defined -%}\n {{- \"<additional_tools>\\n\" -}}\n {%- set _tl = item.result.tools -%}\n {%- if _tl is string -%}\n {{- _tl -}}\n {%- elif _tl is mapping -%}\n {{- tool_to_json(_tl) -}}\n {%- else -%}\n {%- for t in _tl -%}\n {%- if not loop.first -%}{{- \"\\n\" -}}{%- endif -%}\n {{- tool_to_json(t) -}}\n {%- endfor -%}\n {%- endif -%}\n {{- \"\\n</additional_tools>\" -}}\n {%- else -%}\n {{- item | tojson -}}\n {%- endif -%}\n {%- endfor -%}\n {%- endif -%}\n {{- \"\\n</tool_response>\" -}}\n {%- endif -%}\n{%- endmacro -%}\n\n{%- set ns = namespace(system_prompt=\"\", last_user_index=-1) -%}\n{%- if messages and messages[0][\"role\"] == \"system\" -%}\n {%- if messages[0].get(\"content\") -%}\n {%- set ns.system_prompt = parse_content(messages[0][\"content\"]) -%}\n {%- endif -%}\n {%- set messages = messages[1:] -%}\n{%- endif -%}\n{%- if tools -%}\n {%- set tools_ns = namespace(lines=[]) -%}\n {%- for tool in tools -%}\n {%- set fn = tool.function if tool.function is defined else tool -%}\n {%- set _dyn = (fn.defer_loading is defined and fn.defer_loading) or (tool.defer_loading is defined and tool.defer_loading) -%}\n {%- if not _dyn -%}\n {%- set tools_ns.lines = tools_ns.lines + [tool_to_json(fn)] -%}\n {%- endif -%}\n {%- endfor -%}\n {%- if tools_ns.lines -%}\n {%- set ns.system_prompt = ns.system_prompt + (\"\\n\\n\" if ns.system_prompt else \"\") + \"<tools>\\n\" + (tools_ns.lines | join(\"\\n\")) + \"\\n</tools>\" -%}\n {%- endif -%}\n{%- endif -%}\n{%- if ns.system_prompt -%}\n {{- \"<|im_start|>system\\n\" + ns.system_prompt + \"<|im_end|>\\n\" -}}\n{%- endif -%}\n{%- for message in messages -%}\n {%- if message[\"role\"] == \"user\" -%}\n {%- set ns.last_user_index = loop.index0 -%}\n {%- endif -%}\n{%- endfor -%}\n{%- for message in messages -%}\n {{- \"<|im_start|>\" + message.role + \"\\n\" -}}\n {%- if message.role == \"assistant\" -%}\n {%- generation -%}\n {%- set keep_thinking = preserve_thinking -%}\n {%- if message.thinking is defined and keep_thinking -%}\n {{- \"<think>\" + (message.thinking or \"\") + \"</think>\" -}}\n {%- endif -%}\n {%- set _cfm_tag = \"CONTINUE_FINAL_MESSAGE_TAG \" -%}\n {%- set _has_cfm = false -%}\n {%- set content = \"\" -%}\n {%- if message.get(\"content\") -%}\n {%- set content = parse_content(message.content) -%}\n {%- endif -%}\n {%- if not keep_thinking -%}\n {%- if \"</think>\" in content -%}\n {%- set content = content.split(\"</think>\")[-1] | trim -%}\n {%- endif -%}\n {%- endif -%}\n {%- if content.endswith(_cfm_tag) -%}\n {%- set _has_cfm = true -%}\n {%- set _trunc_len = (content | length) - (_cfm_tag | length) -%}\n {%- set content = content[:_trunc_len] -%}\n {%- endif -%}\n {{- content -}}\n {%- if message.tool_calls -%}\n {{- render_tool_calls(message.tool_calls) -}}\n {%- endif -%}\n {%- if _has_cfm -%}\n {{- _cfm_tag -}}\n {%- endif -%}\n {{- \"<|im_end|>\\n\" -}}\n {%- endgeneration -%}\n {%- elif message.role == \"tool\" -%}\n {%- if message.get(\"additional_tools\") -%}\n {%- set _at = message[\"additional_tools\"] -%}\n {#- definitions may live in additional_tools itself, or in content\n with additional_tools used as a plain truthy flag -#}\n {%- if _at is mapping or (_at is sequence and _at is not string) -%}\n {%- set _src = _at -%}\n {%- else -%}\n {%- set _src = message.get(\"content\") -%}\n {%- endif -%}\n {#- nothing to reveal: skip the wrapper entirely rather than\n emitting an empty <additional_tools> block -#}\n {%- if _src is string and \"<tool_response>\" in _src -%}\n {{- _src -}}\n {%- elif _src is string and \"<additional_tools>\" in _src -%}\n {{- \"<tool_response>\\n\" + _src + \"\\n</tool_response>\" -}}\n {%- elif _src -%}\n {{- \"<tool_response>\\n<additional_tools>\\n\" -}}\n {%- if _src is string -%}\n {{- _src -}}\n {%- elif _src is mapping -%}\n {{- tool_to_json(_src) -}}\n {%- else -%}\n {%- for t in _src -%}\n {%- if not loop.first -%}{{- \"\\n\" -}}{%- endif -%}\n {{- tool_to_json(t) -}}\n {%- endfor -%}\n {%- endif -%}\n {{- \"\\n</additional_tools>\\n</tool_response>\" -}}\n {%- endif -%}\n {%- elif message.get(\"content\") -%}\n {{- render_tool_response(message[\"content\"]) -}}\n {%- endif -%}\n {{- \"<|im_end|>\\n\" -}}\n {%- else %}\n {%- if message.get(\"content\") -%}\n {{- parse_content(message[\"content\"]) -}}\n {%- endif -%}\n {{- \"<|im_end|>\\n\" -}}\n {%- endif %}\n{%- endfor -%}\n{%- if add_generation_prompt -%}\n {{- \"<|im_start|>assistant\\n\" -}}\n{%- endif -%}\n"
} |