{%- macro render_content(content, is_system_content=false) %} {%- if content is string %} {{- content }} {%- elif content is iterable and content is not mapping %} {%- for item in content %} {%- if 'text' in item %} {{- item.text }} {%- else %} {{- raise_exception('Unexpected item type in content.') }} {%- endif %} {%- endfor %} {%- elif content is none or content is undefined %} {{- '' }} {%- else %} {{- raise_exception('Unexpected content type.') }} {%- endif %} {%- endmacro %} {%- if not messages %} {{- raise_exception('No messages provided.') }} {%- endif %} {%- if messages[0].role == 'system' %} {%- set system_content = render_content(messages[0].content, true)|trim %} {{- '<|im_start|>system ' + system_content + '<|im_end|> ' }} {%- endif %} {%- for message in messages %} {%- set content = render_content(message.content)|trim %} {%- if message.role == "system" %} {%- if not loop.first %} {{- raise_exception('System message must be at the beginning.') }} {%- endif %} {%- elif message.role == "user" or message.role == "assistant" %} {{- '<|im_start|>' + message.role + ' ' + content + '<|im_end|> ' }} {%- else %} {{- raise_exception('Unexpected message role.') }} {%- endif %} {%- endfor %} {%- if add_generation_prompt %} {{- '<|im_start|>assistant ' }} {%- endif %}