{%- for message in messages %} {%- if not message['role'] is string or not message['role'].isdigit() %} {{- raise_exception("Role must be a stringified integer speaker id.") }} {%- endif %} {%- set content = message['content'] %} {%- if content is not iterable or content is string %} {{- raise_exception("Content must be a list.") }} {%- endif %} {%- set texts = content | selectattr('type','equalto','text') | list %} {%- set audios = content | selectattr('type','equalto','audio') | list %} {%- if loop.last %} {%- if texts|length != 1 or audios|length != 0 %} {{- raise_exception("Last message must have one text and no audio.") }} {%- endif %} {%- else %} {%- if texts|length != 1 or audios|length != 1 %} {{- raise_exception("Each non-last message must have one text and one audio.") }} {%- endif %} {%- endif %} {%- endfor %} {{- bos_token }} {%- for message in messages %} {%- set text_item = message['content'] | selectattr('type','equalto','text') | list | first %} {%- if not loop.last -%} [{{ message['role'] }}]{{ text_item['text'] }}{{ " " }} {%- else -%} {{ text_item['text'] }} {%- endif -%} {%- endfor %} {{- eos_token }} {%- for message in messages %} {%- if not loop.last %} {{- '<|AUDIO|>' }} {%- endif %} {%- endfor %}