{%- set ns = namespace(expected='user') -%} {%- for message in messages -%} {%- set role = 'model' if message['role'] == 'assistant' else message['role'] -%} {%- if role == 'system' -%} {%- if not loop.first -%} {{- raise_exception("System message, if present, must be first.") -}} {%- endif -%} {{- '<|im_start|>system\n' + message['content'] + '<|im_end|>\n' -}} {%- else -%} {%- if role not in ['user', 'model'] -%} {{- raise_exception("Only 'system', 'user' and 'model' (or 'assistant') roles are allowed, got: " + message['role']) -}} {%- endif -%} {%- if role != ns.expected -%} {{- raise_exception("user/model must alternate starting with user; expected " + ns.expected + ", got " + role) -}} {%- endif -%} {%- set ns.expected = 'model' if role == 'user' else 'user' -%} {%- if role == 'model' and 'reasoning' in message and message['reasoning'] -%} {{- '<|im_start|>model\n\n' + message['reasoning'] + '\n\n' + message['content'] + '<|im_end|>\n' -}} {%- else -%} {{- '<|im_start|>' + role + '\n' + message['content'] + '<|im_end|>\n' -}} {%- endif -%} {%- endif -%} {%- endfor -%} {%- if add_generation_prompt -%} {{- '<|im_start|>model\n' -}} {%- endif -%}