|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
{% if messages is string -%} |
|
|
{% set text = messages | trim -%} |
|
|
{% set has_assistant = false -%} |
|
|
{%- else -%} |
|
|
{% if messages | length < 1 or messages | length > 2 -%} |
|
|
{{ raise_exception("Provide a single string or 1-2 messages (user[, assistant]).") }} |
|
|
{%- endif -%} |
|
|
{% if (messages[0].get('role') | default('')) != 'user' -%} |
|
|
{{ raise_exception("First message must have role 'user'.") }} |
|
|
{%- endif -%} |
|
|
{% if messages | length == 2 and (messages[1].get('role') | default('')) != 'assistant' -%} |
|
|
{{ raise_exception("Second message, if present, must have role 'assistant'.") }} |
|
|
{%- endif -%} |
|
|
|
|
|
|
|
|
{% set ucontent = messages[0]['content'] | default('', true) -%} |
|
|
{% if ucontent is string -%} |
|
|
{% set text = ucontent | trim -%} |
|
|
{%- else -%} |
|
|
{% if ucontent | length != 2 -%} |
|
|
{{ raise_exception("User content list must have exactly two parts: one text and one image.") }} |
|
|
{%- endif -%} |
|
|
{% set text_parts = ucontent | selectattr('type','equalto','text') | list -%} |
|
|
{% set image_parts = ucontent | selectattr('type','equalto','image') | list -%} |
|
|
{% if (text_parts | length) != 1 or (image_parts | length) != 1 -%} |
|
|
{{ raise_exception("User content must include exactly one text and one image part.") }} |
|
|
{%- endif -%} |
|
|
{% set text = (text_parts[0].get('text') | default('')) | trim -%} |
|
|
{%- endif -%} |
|
|
|
|
|
|
|
|
{% set has_assistant = (messages | length == 2) -%} |
|
|
{% if has_assistant -%} |
|
|
{% set acontent = messages[1]['content'] | default('', true) -%} |
|
|
{% if acontent is string -%} |
|
|
{% set assistant_text = acontent -%} |
|
|
{%- else -%} |
|
|
{% set atexts = acontent | selectattr('type','equalto','text') | map(attribute='text') | list -%} |
|
|
{% set assistant_text = (atexts | join('')) -%} |
|
|
{%- endif -%} |
|
|
{%- endif -%} |
|
|
{%- endif -%} |
|
|
|
|
|
{% set lower = text | lower -%} |
|
|
|
|
|
|
|
|
{% if text == '' -%} |
|
|
<|md_reserved_0|>describe<|md_reserved_1|>normal<|md_reserved_2|> |
|
|
{%- elif lower.startswith('caption:') -%} |
|
|
{% set length = (text[8:] | trim | lower) -%} |
|
|
{% if length not in ['short','normal','long'] -%} |
|
|
{{ raise_exception("caption length must be one of: short, normal, long.") }} |
|
|
{%- endif -%} |
|
|
<|md_reserved_0|>describe<|md_reserved_1|>{{ length }}<|md_reserved_2|> |
|
|
{%- elif lower.startswith('reason:') -%} |
|
|
{% set q = text[7:] | trim -%} |
|
|
<|md_reserved_0|>query<|md_reserved_1|>{{ q }}<|md_reserved_2|><|md_reserved_3|> |
|
|
{%- elif lower.startswith('query:') -%} |
|
|
{% set q = text[6:] | trim -%} |
|
|
<|md_reserved_0|>query<|md_reserved_1|>{{ q }}<|md_reserved_2|> |
|
|
{%- elif lower.startswith('detect:') -%} |
|
|
{% set q = text[7:] | trim -%} |
|
|
<|md_reserved_0|>det<|md_reserved_1|> {{ q }}<|md_reserved_2|> |
|
|
{%- elif lower.startswith('point:') -%} |
|
|
{% set q = text[6:] | trim -%} |
|
|
<|md_reserved_0|>point<|md_reserved_1|> {{ q }}<|md_reserved_2|> |
|
|
{%- else -%} |
|
|
{% set q = text -%} |
|
|
<|md_reserved_0|>query<|md_reserved_1|>{{ q }}<|md_reserved_2|> |
|
|
{%- endif -%} |
|
|
{%- generation -%} |
|
|
{%- if has_assistant -%}{{ assistant_text }}{{ eos_token }}{%- endif -%} |
|
|
{%- endgeneration -%} |