| {%- 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 %} |