Repository: ollama
Issue: Missing tool support for DeepSeek-R1 Distillates based on Qwen
Labels: bug

### What is the issue?

I tried `deepseek-r1:70B` and ollama claims that it doesn't support tools. 

```
{
  "error": {
    "message": "registry.ollama.ai/library/deepseek-r1:70B does not support tools",
    "type": "api_error",
    "param": null,
    "code": null
  }
```

Looks to me like the template you have is missing the rules for tools.

The current Ollama template:

```
{{- if .System }}{{ .System }}{{ end }}
{{- range $i, $_ := .Messages }}
{{- $last := eq (len (slice $.Messages $i)) 1}}
{{- if eq .Role "user" }}<｜User｜>{{ .Content }}
{{- else if eq .Role "assistant" }}<｜Assistant｜>{{ .Content }}{{- if not $last }}<｜end▁of▁sentence｜>{{- end }}
{{- end }}
{{- if and $last (ne .Role "assistant") }}<｜Assistant｜>{{- end }}
{{- end }}
```

The template from https://huggingface.co/unsloth/DeepSeek-R1-Distill-Llama-70B-GGUF has tool calls stuff:

```
{% if not add_generation_prompt is defined %}
    {% set add_generation_prompt = false %}
{% endif %}
{% set ns = namespace(is_first=false, is_tool=false, is_output_first=true, system_prompt='') %}
{%- for message in messages -%}
    {%- if message['role'] == 'system' -%}
        {% set ns.system_prompt = message['content'] %}
    {%- endif -%}
{%- endfor -%}
{{ bos_token }}{{ ns.system_prompt }}
{%- for message in messages -%}
    {%- if message['role'] == 'user' -%}
        {%- set ns.is_tool = false -%}
        {{ '<｜User｜>' + message['content'] }}
    {%- endif -%}
    
    {%- if message['role'] == 'assistant' and message['content'] is none -%}
        {%- set ns.is_tool = false -%}
        {%- for tool in message['tool_calls'] -%}
            {%- if not ns.is_first -%}
                {{ '<｜Assistant｜><｜tool▁calls▁begin｜><｜tool▁call▁begin｜>' + tool['type'] + '<｜tool▁sep｜>' + tool['function']['name'] + '\n' + '```json' + '\n' + tool['function']['arguments'] + '\n' + '```' + '<｜tool▁call▁end｜>' }}
                {%- set ns.is_first = true -%}
            {%- else -%}
                {{ '\n' + '<｜tool▁call▁begin｜>' + tool['type'] + '<｜tool▁sep｜>' + tool['function']['name'] + '\n' + '```json' + '\n' + tool['function']['arguments'] + '\n' + '```' + '<｜tool▁call▁end｜>' }}
                {{ '<｜tool▁calls▁end｜><｜end▁of▁sentence｜>' }}
            {%- endif -%}
        {%- endfor -%}
    {%- endif -%}
    
    {%- if message['role'] == 'assistant' and message['content'] is not none -%}
        {%- if ns.is_tool -%}
            {{ '<｜tool▁outputs▁end｜>' + message['content'] + '<｜end▁of▁sentence｜>' }}
            {%- set ns.is_tool = false -%}
        {%- else -%}
            {% set content = message['content'] %}
            {% if '</think>' in content %}
                {% set content = content.split('</think>')[-1] %}
            {% endif %}
            {{ '<｜Assistant｜>' + content + '<｜end▁of▁sentence｜>' }}
        {%- endif -%}
    {%- endif -%}
    
    {%- if message['role'] == 'tool' -%}
        {%- set ns.is_tool = true -%}
        {%- if ns.is_output_first -%}
            {{ '<｜tool▁outputs▁begin｜><｜tool▁output▁begin｜>' + message['content'] + '<｜tool▁output▁end｜>' }}
            {%- set ns.is_output_first = false -%}
        {%- else -%}
            {{ '\n<｜tool▁output▁begin｜>' + message['content'] + '<｜tool▁output▁end｜>' }}
        {%- endif -%}
    {%- endif -%}
{%- endfor -%}

{% if ns.is_tool %}
    {{ '<｜tool▁outputs▁end｜>' }}
{% endif %}

{% if add_generation_prompt and not ns.is_tool %}
    {{ '<｜Assistant｜>' }}
{% endif %}
``` 

### OS

macOS

### GPU

Apple

### CPU

_No response_

### Ollama version

0.5.7