@@ -3265,6 +3265,50 @@ def from_pretrained(
32653265 )
32663266
32673267
3268+ class Gemma4ChatHandler (Llava15ChatHandler ):
3269+ DEFAULT_SYSTEM_MESSAGE = None
3270+
3271+ CHAT_FORMAT = (
3272+ "{% if messages and messages[0]['role'] == 'system' %}"
3273+ "{% if messages[0]['content'] is string %}"
3274+ "{% set first_user_prefix = messages[0]['content'] + '\n \n ' %}"
3275+ "{% else %}"
3276+ "{% set first_user_prefix = messages[0]['content'][0]['text'] + '\n \n ' %}"
3277+ "{% endif %}"
3278+ "{% set loop_messages = messages[1:] %}"
3279+ "{% else %}"
3280+ "{% set first_user_prefix = '' %}"
3281+ "{% set loop_messages = messages %}"
3282+ "{% endif %}"
3283+ "{% for message in loop_messages %}"
3284+ "{% if (message['role'] == 'user') != (loop.index0 % 2 == 0) %}"
3285+ "{{ raise_exception('Conversation roles must alternate user/assistant/user/assistant/...') }}"
3286+ "{% endif %}"
3287+ "{% set role = 'model' if message['role'] == 'assistant' else message['role'] %}"
3288+ "{{ '<start_of_turn>' + role + '\n ' + (first_user_prefix if loop.first else '') }}"
3289+ "{% if message['content'] is string %}"
3290+ "{{ message['content'] | trim }}"
3291+ "{% elif message['content'] is iterable %}"
3292+ "{% for item in message['content'] %}"
3293+ "{% if item['type'] == 'image_url' and item['image_url'] is string %}"
3294+ "{{ '\n \n ' + item['image_url'] + '\n \n ' }}"
3295+ "{% elif item['type'] == 'image_url' and item['image_url'] is mapping %}"
3296+ "{{ '\n \n ' + item['image_url']['url'] + '\n \n ' }}"
3297+ "{% elif item['type'] == 'text' %}"
3298+ "{{ item['text'] | trim }}"
3299+ "{% endif %}"
3300+ "{% endfor %}"
3301+ "{% else %}"
3302+ "{{ raise_exception('Invalid content type') }}"
3303+ "{% endif %}"
3304+ "{{ '<end_of_turn>\n ' }}"
3305+ "{% endfor %}"
3306+ "{% if add_generation_prompt %}"
3307+ "{{ '<start_of_turn>model\n ' }}"
3308+ "{% endif %}"
3309+ )
3310+
3311+
32683312class ObsidianChatHandler (Llava15ChatHandler ):
32693313 # Prompt Format
32703314 # The model followed ChatML format. However, with ### as the separator
0 commit comments