Results
Snapshot of 22 October 2026, Ollama v0.40.7. For each model, the text the model would read was produced three ways (the maker’s template, the copy inside the model file, and what Ollama uses) for six practice conversations that involve tools. A model “differs” if, in at least one of them, Ollama’s text changes what the model is told compared with the maker’s. Spaces, line breaks, the date and the start-of-text marker don’t count. How it works explains the method.
Summary
| Differs | Differs, order-only set aside | Built for tools: differs | Built for tools: order-only set aside | |
|---|---|---|---|---|
| Ollama library | 32 of 43 | 28 of 43 | 15 of 19 | 11 of 19 |
| Hugging Face | 5 of 22 | 5 of 22 | 4 of 21 | 4 of 21 |
The full list, with what changes for each model, is on the results page.
“Order-only” means the only change is the order of the fields inside a tool’s description,
for example required listed before properties. “Built for tools” means the maker’s own
template shows the model the list of tools.
Ollama library: the 50 most popular chat models
| Model | Built for tools | Differs | Differs, order-only set aside | Where | What changes |
|---|---|---|---|---|---|
codegemma:latest |
no | no | no | ||
codellama:latest |
no | yes | yes | Ollama’s version (file has no template) | other wording differs |
deepseek-coder-v2:latest |
no | yes | yes | Ollama’s version | other wording differs |
deepseek-coder:latest |
no | yes | yes | Ollama’s version | a default instruction added or dropped; other wording differs; tool results laid out differently or left out |
deepseek-r1:latest |
no | no | no | ||
deepseek-v3:latest |
no | no | no | ||
dolphin3:latest |
no | yes | yes | Ollama’s version | a default instruction added or dropped |
falcon3:latest |
yes | yes | yes | both | the tool list not shown; the model’s earlier tool requests written differently; tool results laid out differently or left out; tool descriptions or tool instructions worded differently |
gemma2:latest |
no | no | no | ||
gemma3:latest |
no | yes | yes | Ollama’s version | turn layout changed |
gemma4:latest |
yes | no | no | ||
gemma:latest |
no | no | no | ||
glm-ocr:latest |
yes | yes | yes | Ollama’s version (file has no template) | the model’s earlier tool requests written differently |
granite3.1-moe:latest |
yes | yes | yes | Ollama’s version | other wording differs; the model’s earlier tool requests written differently; tool results laid out differently or left out |
llama2:latest |
no | yes | yes | Ollama’s version | other wording differs |
llama3.1:latest |
yes | yes | yes | Ollama’s version | message text changed; a default instruction added or dropped; other wording differs; the tool list not shown; tool results laid out differently or left out; tool descriptions or tool instructions worded differently |
llama3.2-vision:latest |
yes | no | no | ||
llama3.2:latest |
yes | yes | yes | Ollama’s version | message text changed; a default instruction added or dropped; other wording differs; the tool list not shown; tool results laid out differently or left out; tool descriptions or tool instructions worded differently |
llama3.3:latest |
yes | yes | yes | Ollama’s version | message text changed; a default instruction added or dropped; other wording differs; the tool list not shown; tool results laid out differently or left out; tool descriptions or tool instructions worded differently |
llama3:latest |
no | yes | yes | Ollama’s version | tool results laid out differently or left out |
llava:latest |
no | no | no | ||
minicpm-v:latest |
no | yes | yes | Ollama’s version | a default instruction added or dropped |
mistral-nemo:latest |
yes | yes | yes | both | the model’s earlier tool requests written differently; tool results laid out differently or left out |
mistral-small:latest |
no | yes | yes | Ollama’s version | the tool list not shown; tool descriptions or tool instructions worded differently |
mistral:latest |
yes | yes | yes | both | the model’s earlier tool requests written differently; tool results laid out differently or left out |
mixtral:latest |
no | no | no | ||
nemotron-3-super:latest |
yes | no | no | ||
olmo2:latest |
no | yes | yes | Ollama’s version | a default instruction added or dropped; tool results laid out differently or left out |
phi3:latest |
no | yes | yes | Ollama’s version | turn layout changed; tool results laid out differently or left out |
phi4:latest |
no | yes | yes | both | tool results laid out differently or left out |
qwen2.5-coder:latest |
yes | yes | yes | Ollama’s version | the model’s earlier tool requests written differently; tool results laid out differently or left out; tool descriptions or tool instructions worded differently; tools described in Go format instead of JSON |
qwen2.5:latest |
yes | yes | yes | both | the model’s earlier tool requests written differently; tool results laid out differently or left out; tools described in Go format instead of JSON |
qwen2.5vl:latest |
no | yes | yes | Ollama’s version | tool results laid out differently or left out |
qwen2:latest |
no | yes | yes | Ollama’s version | the tool list not shown; the model’s earlier tool requests written differently; tool results laid out differently or left out; tools described in Go format instead of JSON |
qwen3-coder:latest |
yes | no | no | ||
qwen3-vl:latest |
yes | yes | no | Ollama’s version | only the order of fields in tool descriptions |
qwen3.5:latest |
yes | yes | no | Ollama’s version | only the order of fields in tool descriptions |
qwen3.6:latest |
yes | yes | no | Ollama’s version | only the order of fields in tool descriptions |
qwen3.8:latest |
yes | yes | no | Ollama’s version | only the order of fields in tool descriptions |
qwen3:latest |
yes | yes | yes | Ollama’s version | the model’s earlier tool requests written differently; tool results laid out differently or left out; tools described in Go format instead of JSON |
qwen:latest |
no | yes | yes | both | a default instruction added or dropped; tool results laid out differently or left out |
smollm2:latest |
no | yes | yes | Ollama’s version | message text changed; a default instruction added or dropped; the tool list not shown; the model’s earlier tool requests written differently; tool results laid out differently or left out; tool descriptions or tool instructions worded differently |
tinyllama:latest |
no | yes | yes | Ollama’s version | a default instruction added or dropped; turn layout changed; tool results laid out differently or left out |
Not compared
orca-mini:latest: latest = 3b-q4_0, from pankajmathur/orca_mini_3b. That repo has no chat template; its prompt format is given only as prose in the model card.starcoder2:latest: latest = 3b-q4_0, the base completion model bigcode/starcoder2-3b, which has no chat template (starcoder2:instruct is a separate, non-default tag).llama2-uncensored:latest: latest = 7b-chat-q4_0, from georgesung/llama2_7b_chat_uncensored, which has no chat template.mistral-small3.2:latest: latest = 24b-instruct-2506-q4_K_M. Mistral’s repo ships tekken.json, params.json and SYSTEM_PROMPT.txt for mistral-common and no Jinja chat template.minimax-m2.7:cloud: Cloud-only in Ollama: the tags page lists onlycloud, so there is no local package (no GGUF, Go template or selection) to audit. The author repo does have chat_template.jinja.gpt-oss:latest: Ollama lays out this model’s conversations with special code (“harmony”) that this study doesn’t reproduce.translategemma:latest: The maker’s template could not show any of the six tool conversations.
Hugging Face: the 30 most downloaded chat models
For these, Ollama uses the template inside the file. It fills it in with a separate engine, which this study reproduces in Python. That copy is very close but not byte-for-byte Ollama.
| Model | Built for tools | Differs | Differs, order-only set aside | Where | What changes |
|---|---|---|---|---|---|
hf.co/CMSManhattan/JiRackUltra_1b:Q4_K_M |
no | yes | yes | the model file | thinking-block handling differs |
hf.co/DavidAU/Qwen3.5-9B-The-Defiant-Fable-Uncensored-Heretic-NEO-IMATRIX-MAX-MTP-GGUF:Q4_K_M |
yes | no | no | ||
hf.co/DavidAU/Qwen3.8-27B-TURBO-Fable-Cold-Fusion-735-882-Heretic-Uncensored-NEO-CODER-MAX-MTP-GGUF:Q4_K_M |
yes | no | no | ||
hf.co/ggml-org/Qwen3.8-27B-GGUF:Q4_K_M |
yes | no | no | ||
hf.co/huihui-ai/Huihui-Qwen3.8-27B-abliterated-GGUF:Q4_K_M |
yes | no | no | ||
hf.co/ISTA-DASLab/Qwen3.8-27B-GSQ-RCO-GGUF:IQ3_S |
yes | no | no | ||
hf.co/JonathanColetti/Qwen3.8-27B-Uncensored-GGUF:Q4_K_M |
yes | no | no | ||
hf.co/mradermacher/Ornith-1.5-9B-uncensored-GGUF:Q4_K_M |
yes | no | no | ||
hf.co/ornith-ai/Ornith-1.0-35B-GGUF:Q4_K_M |
yes | no | no | ||
hf.co/ornith-ai/Ornith-1.0-9B-GGUF:Q4_K_M |
yes | no | no | ||
hf.co/ornith-ai/Ornith-1.5-35B-A3B-GGUF:Q4_K_M |
yes | no | no | ||
hf.co/ornith-ai/Ornith-1.5-397B-GGUF:Q4_K_M |
yes | no | no | ||
hf.co/ornith-ai/Ornith-1.5-9B-GGUF:Q4_K_M |
yes | no | no | ||
hf.co/peculiar-ragdoll/Dirk-Qwen3.8-27B-GGUF:Q4_K_M |
yes | yes | yes | the model file | a default instruction added or dropped; thinking-block handling differs; tool descriptions or tool instructions worded differently |
hf.co/peculiar-ragdoll/Tiel-Coder-35B-A3B-GGUF-MTP:Q4_K_XL |
yes | yes | yes | the model file | a default instruction added or dropped; thinking-block handling differs; tool descriptions or tool instructions worded differently |
hf.co/prism-ml/Ternary-Bonsai-2-27B-gguf:PQ2_0 |
yes | no | no | ||
hf.co/ukisai/Swift-1.5-Qwen3.8-27B-GSQ-RCO-GGUF:IQ3_S |
yes | no | no | ||
hf.co/unsloth/gemma-4-12b-it-GGUF:Q4_K_M |
yes | no | no | ||
hf.co/unsloth/Qwen3.5-4B-GGUF:Q4_K_M |
yes | yes | yes | the model file | thinking-block handling differs |
hf.co/unsloth/Qwen3.5-9B-GGUF:Q4_K_M |
yes | yes | yes | the model file | thinking-block handling differs |
hf.co/unsloth/Qwen3.6-35B-A3B-GGUF:Q4_K_M |
yes | no | no | ||
hf.co/unsloth/Qwen3.8-27B-GGUF:Q4_K_M |
yes | no | no |
Not compared
hf.co/HauhauCS/Qwen3.8-27B-Uncensored-HauhauCS-Aggressive-MTP-GGUF:Q4_K_P: A weight-edited (uncensored) Qwen3.8-27B published only as GGUF: HauhauCS has no safetensors repo for it, so there is no author template outside the GGUF. If re-included, the candidate L0 is Qwen/Qwen3.8-27B (the card’s base).hf.co/SC117/Qwen3.8-Flash-Next-GSQ-RCO-abliterated-GGUF:IQ3_S: An abliterated (weight-edited, ‘tensor-transplant’) build made from another GGUF repo and published only as GGUF; there is no author template outside the GGUF. If re-included, the candidate L0 is Qwen/Qwen3.8-Flash-Next.hf.co/antirez/deepseek-v4-gguf:Q4K-experts: deepseek-ai/DeepSeek-V4-Flash publishes its prompt format as Python (encoding/encoding_dsv4.py with test vectors), not as a Jinja chat template, so there is no author template to render. The chat template inside the GGUF was written by the quantiser.hf.co/antirez/deepseek-v4.1-flash-gguf:MXFP4: Hugging Face’s download service returned an error (HTTP 400) for this file name.hf.co/byteshape/Qwen3.8-27B-GGUF:IQ4_XS: Hugging Face’s download service returned an error (HTTP 400) for this file name.hf.co/cdiamond/Qwen3.8-27B-iMatrix-NVFP4-MTP-GGUF:NVFP4: Hugging Face’s download service returned an error (HTTP 400) for this file name.hf.co/ISTA-DASLab/Qwen3.8-Flash-Next-GSQ-RCO-GGUF:IQ3_S: Hugging Face’s download service returned an error (HTTP 400) for this file name.hf.co/mudler/Laguna-XS-2.1-APEX-GGUF:APEX-Balanced: Hugging Face’s download service returned an error (HTTP 400) for this file name.
Old copies inside model files
In 9 of the 45 library model files, the template inside matches an older version of the maker’s template. The table shows the date of that version and the maker’s next change to it.
| Model | File matches the maker’s version of | Maker changed it on | Maker’s note for that change |
|---|---|---|---|
falcon3:latest |
2024-12-17 | 2024-12-18 | fix chat_template for tool use (#7) |
mistral-nemo:latest |
2024-07-30 | 2024-07-31 | Fix chat template (#56) |
mistral-small:latest |
2025-01-30 | 2025-01-30 | Add system message to chat template (#6) |
mistral:latest |
2024-05-22 | 2024-06-20 | Updating chat template, trying to make it match with mistral_common (#44) |
phi4:latest |
2025-01-08 | 2025-02-04 | Suggested tokenizer changes by Unsloth.ai (#21) |
qwen2.5:latest |
2024-09-18 | 2024-09-19 | Upload ./tokenizer_config.json with huggingface_hub |
qwen3-coder:latest |
2025-08-01 | 2025-08-07 | Update chat_template in tokenizer_config.json (#14) |
qwen3:latest |
2025-04-29 | 2025-05-19 | update tokenizer_config.json |
qwen:latest |
2024-02-05 | 2024-02-06 | update tokenizer_config.json |
How often the check-up’s template warning fires
The check-up’s template rules were run over 95 different templates from 65 model packages read for this study (the maker’s, the model file’s and Ollama’s). It flagged 3. Read by hand, each one is a visible feature, not hidden instructions:
gpt-oss:latest(author): reacts to<|channel|>analysis<|message|>,<|channel|>final<|message|>.hf.co/peculiar-ragdoll/Tiel-Coder-35B-A3B-GGUF-MTP:Q4_K_XL(gguf): reacts to<|think_extreme|>,<|think_high|>,<|think_low|>,<|think_max|>,<|think_medium|>,<|think_minimal|>,<|think_off|>,<|think_on|>,<|think_ultracode|>,<|think_xhigh|>.hf.co/peculiar-ragdoll/Dirk-Qwen3.8-27B-GGUF:Q4_K_M(gguf): reacts to<|think_extreme|>,<|think_high|>,<|think_low|>,<|think_max|>,<|think_medium|>,<|think_minimal|>,<|think_off|>,<|think_on|>,<|think_ultracode|>,<|think_xhigh|>.
The two models with <|think_…|> words let you switch their thinking mode by typing those
words. gpt-oss uses its channel markers to separate its reasoning from its answer.
Known gaps
- Mistral’s own templates accept only nine-character tool request numbers. The practice
conversations use
call_1, so those comparisons couldn’t run and aren’t counted. - The automatic sorter doesn’t know a few model-specific markers (DeepSeek’s start-of-text marker, for example), so it labels them “other wording”. Each was checked by hand. The others are real wording differences. The DeepSeek marker is not, but no model’s result depends on it.
- A file with no template of its own can’t be checked for old copies.
Raw data and the scripts that produced this page: github.com/MohanVishe/template-drift-audit.