diff --git a/server/model.go b/server/model.go index 4c82fb994..d0f503e24 100644 --- a/server/model.go +++ b/server/model.go @@ -82,7 +82,7 @@ func detectChatTemplate(layers []*layerGGML) ([]*layerGGML, error) { for _, layer := range layers { if s := layer.GGML.KV().ChatTemplate(); s != "" { if t, err := template.Named(s); err != nil { - slog.Debug("template detection", "error", err) + slog.Debug("template detection", "error", err, "template", s) } else { layer, err := NewLayer(t.Reader(), "application/vnd.ollama.image.template") if err != nil { diff --git a/template/gemma3-instruct.gotmpl b/template/gemma3-instruct.gotmpl new file mode 100644 index 000000000..eb69d9f56 --- /dev/null +++ b/template/gemma3-instruct.gotmpl @@ -0,0 +1,13 @@ +{{- range $i, $_ := .Messages }} +{{- $last := eq (len (slice $.Messages $i)) 1 }} +{{- if eq .Role "user" }}user +{{- if and (eq $i 1) $.System }} +{{ $.System }} +{{ end }} +{{ .Content }} +{{ else if eq .Role "assistant" }}model +{{ .Content }} +{{ end }} +{{- if $last }}model +{{ end }} +{{- end }} diff --git a/template/gemma3-instruct.json b/template/gemma3-instruct.json new file mode 100644 index 000000000..b1dac3fed --- /dev/null +++ b/template/gemma3-instruct.json @@ -0,0 +1,6 @@ +{ + "stop": [ + "" + ], + "temperature": 0.1 +} diff --git a/template/index.json b/template/index.json index 7a27747c5..5714665a5 100644 --- a/template/index.json +++ b/template/index.json @@ -87,6 +87,10 @@ "template": "{{ bos_token }}{% if messages[0]['role'] == 'system' %}{{ raise_exception('System role not supported') }}{% endif %}{% for message in messages %}{% if (message['role'] == 'user') != (loop.index0 % 2 == 0) %}{{ raise_exception('Conversation roles must alternate user/assistant/user/assistant/...') }}{% endif %}{% if (message['role'] == 'assistant') %}{% set role = 'model' %}{% else %}{% set role = message['role'] %}{% endif %}{{ '' + role + '\n' + message['content'] | trim + '\n' }}{% endfor %}{% if add_generation_prompt %}{{'model\n'}}{% endif %}", "name": "gemma-instruct" }, + { + "template": "{{ bos_token }}\n{%- if messages[0]['role'] == 'system' -%}\n {%- if messages[0]['content'] is string -%}\n {%- set first_user_prefix = messages[0]['content'] + '\n\n' -%}\n {%- else -%}\n {%- set first_user_prefix = messages[0]['content'][0]['text'] + '\n\n' -%}\n {%- endif -%}\n {%- set loop_messages = messages[1:] -%}\n{%- else -%}\n {%- set first_user_prefix = \"\" -%}\n {%- set loop_messages = messages -%}\n{%- endif -%}\n{%- for message in loop_messages -%}\n {%- if (message['role'] == 'user') != (loop.index0 % 2 == 0) -%}\n {{ raise_exception(\"Conversation roles must alternate user/assistant/user/assistant/...\") }}\n {%- endif -%}\n {%- if (message['role'] == 'assistant') -%}\n {%- set role = \"model\" -%}\n {%- else -%}\n {%- set role = message['role'] -%}\n {%- endif -%}\n {{ '' + role + '\n' + (first_user_prefix if loop.first else \"\") }}\n {%- if message['content'] is string -%}\n {{ message['content'] | trim }}\n {%- elif message['content'] is iterable -%}\n {%- for item in message['content'] -%}\n {%- if item['type'] == 'image' -%}\n {{ '' }}\n {%- elif item['type'] == 'text' -%}\n {{ item['text'] | trim }}\n {%- endif -%}\n {%- endfor -%}\n {%- else -%}\n {{ raise_exception(\"Invalid content type\") }}\n {%- endif -%}\n {{ '\n' }}\n{%- endfor -%}\n{%- if add_generation_prompt -%}\n {{'model\n'}}\n{%- endif -%}\n", + "name": "gemma3-instruct" + }, { "template": "{% set loop_messages = messages %}{% for message in loop_messages %}{% set content = '<|start_header_id|>' + message['role'] + '<|end_header_id|>\n\n'+ message['content'] | trim + '<|eot_id|>' %}{% if loop.index0 == 0 %}{% set content = bos_token + content %}{% endif %}{{ content }}{% endfor %}{% if add_generation_prompt %}{{ '<|start_header_id|>assistant<|end_header_id|>\n\n' }}{% endif %}", "name": "llama3-instruct" diff --git a/template/testdata/gemma3-instruct.gotmpl/system-user-assistant-user b/template/testdata/gemma3-instruct.gotmpl/system-user-assistant-user new file mode 100644 index 000000000..5453a1db3 --- /dev/null +++ b/template/testdata/gemma3-instruct.gotmpl/system-user-assistant-user @@ -0,0 +1,10 @@ +user +You are a helpful assistant. + +Hello, how are you? +model +I'm doing great. How can I help you today? +user +I'd like to show off how chat templating works! +model + diff --git a/template/testdata/gemma3-instruct.gotmpl/user b/template/testdata/gemma3-instruct.gotmpl/user new file mode 100644 index 000000000..fed1f5fa2 --- /dev/null +++ b/template/testdata/gemma3-instruct.gotmpl/user @@ -0,0 +1,4 @@ +user +Hello, how are you? +model + diff --git a/template/testdata/gemma3-instruct.gotmpl/user-assistant-user b/template/testdata/gemma3-instruct.gotmpl/user-assistant-user new file mode 100644 index 000000000..ab15a0710 --- /dev/null +++ b/template/testdata/gemma3-instruct.gotmpl/user-assistant-user @@ -0,0 +1,8 @@ +user +Hello, how are you? +model +I'm doing great. How can I help you today? +user +I'd like to show off how chat templating works! +model +