~/tools / Файлы моделей и шаблоны чата / Ollama Template Tester

Ollama Template Tester — Выполните TEMPLATE Ollama и увидите точный промпт

Вставьте TEMPLATE модели Ollama (из ollama show --template или из вашего Modelfile), добавьте диалог, tools или промпт и увидите точный текст, который Ollama передаёт модели: со специальными токенами, переводами строк и всем остальным. Инструмент выполняет шаблон так, как это делает Ollama: по правилам шаблонов Go, на данных Ollama (сообщения, вызовы инструментов, tools, think) и тремя способами, которыми Ollama запускает шаблон. Он также показывает, будет ли Ollama вообще использовать ваш TEMPLATE или чат-шаблон из файла GGUF, и когда Ollama отклонит запрос с tools или thinking. Ничего не покидает ваш браузер.

Примеры

ollama show --template <model> выводит шаблон имеющейся у вас модели. Подойдёт и текст между тройными кавычками после TEMPLATE в Modelfile.

Запрос

Та же форма, что и в /api/chat: role, content и, по желанию, thinking, tool_calls, tool_name и images.

Та же форма, что и у tools в /api/chat. Оставьте пустым, если tools нет.

Дополнительно: SYSTEM модели и её чат-шаблон GGUF

Строка SYSTEM из Modelfile. Ollama добавляет её, когда первое сообщение не системное (в /api/generate, когда system пуст).

Вставьте его, чтобы увидеть, использует ли Ollama TEMPLATE или этот шаблон. Его показывает GGUF Metadata Viewer.

Что получает модель

<|im_start|>system
You are a helpful assistant.

# Tools

You may call one or more functions to assist with the user query.

You are provided with function signatures within <tools></tools> XML tags:
<tools>
{"type": "function", "function": {get_weather Get the current weather for a city {object <nil> <nil> [city] {"city":{"type":"string","description":"City name"}}}}}
</tools>

For each function call, return a json object with function name and arguments within <tool_call></tool_call> XML tags:
<tool_call>
{"name": <function-name>, "arguments": <args-json-object>}
</tool_call><|im_end|>
<|im_start|>user
What is the weather in Tokyo?<|im_end|>
<|im_start|>assistant
<tool_call>
{"name": "get_weather", "arguments": {"city":"Tokyo"}}
</tool_call><|im_end|>
<|im_start|>user
<tool_response>
{"temperature": 20}
</tool_response><|im_end|>
<|im_start|>assistant
It is 20°C in Tokyo.<|im_end|>
<|im_start|>user
Thanks!<|im_end|>
<|im_start|>assistant
Символов: 954, байт: 955

Об этом шаблоне

Как Ollama его выполнила
Один раз, со всем диалогом в .Messages
Какие имена он использует
$, $i, $last, arguments, content, function, messages, name, prompt, response, role, system, toolcalls, tools
Что он поддерживает (для Ollama)
tools

Проверьте на своей Ollama

Замените MODEL именем вашей модели. _debug_render_only — отладочная опция из исходного кода Ollama, которой нет в документации API, поэтому она может измениться. В ответе промпт находится в _debug_info.rendered_template.

curl -s http://localhost:11434/api/chat -d '{"model":"MODEL","messages":[{"role":"system","content":"You are a helpful assistant."},{"role":"user","content":"What is the weather in Tokyo?"},{"role":"assistant","content":"","tool_calls":[{"function":{"name":"get_weather","arguments":{"city":"Tokyo"}}}]},{"role":"tool","content":"{\"temperature\": 20}","tool_name":"get_weather"},{"role":"assistant","content":"It is 20°C in Tokyo."},{"role":"user","content":"Thanks!"}],"tools":[{"type":"function","function":{"name":"get_weather","description":"Get the current weather for a city","parameters":{"type":"object","properties":{"city":{"type":"string","description":"City name"}},"required":["city"]}}}],"stream":false,"_debug_render_only":true}'

Модели со строкой RENDERER или PARSER в Modelfile, а также gpt-oss используют встроенные в Ollama рендереры, а не TEMPLATE.

Когда диалог длиннее контекста (num_ctx), Ollama отбрасывает самые старые сообщения, но сохраняет системные сообщения и последнее сообщение. Этот инструмент не считает токены, поэтому всегда показывает весь диалог.

Для моделей qwen3 и deepseek-r1 Ollama удаляет <think>…</think> из сообщений ассистента перед последним сообщением пользователя. Этот инструмент этого не делает.

При выводе целого сообщения или {{ .Messages }} Ollama показывает адреса в памяти (0xc…), которые каждый раз меняются. Инструмент показывает заполнитель.

currentDate и yesterdayDate используют сегодняшнюю дату на вашем компьютере. Ollama использует дату на сервере.

Проверено 2026-11-09 по исходному коду Ollama (v0.40.15), text/template из Go и Ollama 0.40.11: Ollama: Template · template.go

Всё работает в вашем браузере. Ничего никуда не отправляется.

Ollama превращает диалог в текст, который читает модель, с помощью TEMPLATE модели, написанного на языке шаблонов Go: {{ range .Messages }}, {{ .Role }}, {{ .Content }}, {{ if .Tools }} и так далее. Небольшая ошибка, например пропущенный перевод строки, {{-, которое обрезает слишком много, или имя поля, которого не существует, меняет то, что видит модель, или приводит к ошибке в каждом запросе. Этот инструмент выполняет ваш шаблон так, как это делает Ollama. Он следует правилам Go text/template (маркеры обрезки, переменные, range, with, сравнения, printf, сообщения об ошибках), передаёт те же данные, что и Ollama (System, Messages с Role, Content, Thinking, ToolCalls, ToolName и ToolCallID, Tools, Think, ThinkLevel, IsThinkSet, Prompt, Suffix, Response), и имеет дополнительные функции Ollama (json, currentDate, yesterdayDate, toTypeScriptType). Он повторяет и то, как Ollama готовит данные: системные сообщения объединяются в .System, подряд идущие сообщения одной роли соединяются пустой строкой, SYSTEM модели добавляется, если первое сообщение не системное, а изображения превращаются в [img-0], [img-1] и так далее. Шаблон, который нигде не использует .Messages, выполняется по-старому, один раз на каждый ход с .Prompt и .Response, а Ollama добавляет {{ .Response }} к шаблону, который не использует ни то ни другое. Начиная с Ollama 0.40, модель может нести ещё и чат-шаблон внутри файла GGUF (tokenizer.chat_template), и Ollama выбирает один из двух по тому, что умеет каждый: tools, thinking и дополнение в середине (fill-in-the-middle). Вставьте чат-шаблон GGUF в разделе «Дополнительно», и инструмент скажет, какой из них будет использовать Ollama. Мы проверили инструмент тремя способами: по собственному text/template из Go (Go 1.26.6), выполняющему код шаблонов Ollama, на 243 случаях, включая 20 встроенных шаблонов Ollama, результаты тестов которых он воспроизводит; по Ollama 0.40.11 на этом компьютере на 330 запросах /api/generate; и на 49 запросах /api/chat к qwen2.5:7b и к моделям, которые мы создали со своими TEMPLATE. Вывод и сообщения об ошибках совпали.

Основная логика этого инструмента открыта под лицензией MIT. github.com/seigo5555/toolkitbox-lib/src/ollama-template.ts

Когда пригодится

  • Проверить TEMPLATE, который вы пишете для Modelfile, перед запуском ollama create: переводы строк, специальные токены, системное сообщение, вызовы инструментов и их результаты
  • Выяснить, почему изменение TEMPLATE ничего не меняет и использует ли его Ollama или чат-шаблон из файла GGUF
  • Точно увидеть, что получает модель в длинном диалоге с tools, чтобы найти причину неверных или пропавших вызовов инструментов

Как пользоваться

  1. Вставьте шаблон в поле (ollama show --template <model> выводит шаблон имеющейся у вас модели) или начните с одного из примеров.
  2. Выберите /api/chat и правьте сообщения и tools как JSON, в той же форме, что и в API, или выберите /api/generate и заполните prompt, system и suffix. Задайте think, если вы его используете.
  3. Прочитайте результат, при необходимости с показом пробельных символов. Чтобы сравнить с вашей Ollama, выполните команду curl внизу с именем вашей модели.

Вопросы

Я изменил TEMPLATE, но вывод не изменился. Почему?

Начиная с Ollama 0.40, у модели может быть два шаблона: TEMPLATE из Modelfile и чат-шаблон внутри файла GGUF. Ollama выбирает тот, который умеет больше (tools, thinking, fill-in-the-middle). В нашем тесте с Ollama 0.40.11 TEMPLATE без tools был проигнорирован в модели, созданной из qwen2.5:7b, потому что чат-шаблон GGUF у qwen2.5:7b поддерживает tools. Журнал сервера показывает выбор в строке "template selection" (selected=go_template или selected=gguf_chat_template), а если задать для сервера OLLAMA_GO_TEMPLATE=1, Ollama будет использовать TEMPLATE всякий раз, когда он есть у модели.

Как увидеть промпт, который моя Ollama действительно строит?

В исходном коде Ollama есть отладочная опция _debug_render_only, которая возвращает промпт вместо запуска модели (как _debug_info.rendered_template). Мы использовали её для проверки этого инструмента. В документации API её нет, поэтому она может измениться. Инструмент строит команду curl за вас.

Чем отличаются шаблоны с .Messages от шаблонов с .Prompt?

Если шаблон использует .Messages, Ollama выполняет его один раз со всем диалогом. Если нет, Ollama выполняет его один раз на каждый ход с .System, .Prompt и .Response, а на последнем ходу обрезает шаблон после {{ .Response }}, так что модель продолжает с этого места. Инструмент показывает, какой способ был использован.

Почему Ollama отвечает "does not support tools" или "does not support thinking"?

Ollama отклоняет запрос с tools, если используемый шаблон не поддерживает tools (TEMPLATE их поддерживает, когда использует .Tools), и запрос с think, равным true или заданным уровнем, если в шаблоне нет части thinking. Для шаблона, в котором часть thinking есть, Ollama включает think, если запрос его не задаёт. Инструмент показывает и то и другое.

Tools в моём промпте не похожи на JSON. Это ошибка инструмента?

Скорее всего, нет. В шаблонах Go значение выводится как JSON только тогда, когда так говорит его тип. .Tools из Ollama, целый инструмент и .Function.Arguments выводятся как JSON, а .Function выводится в собственном формате Go. В нашем тесте шаблон qwen2.5:7b использует {{ .Function }}, и Ollama 0.40.11 отправила модели текст вроде {get_weather Get the weather {object <nil> <nil> [city] {…}}}. Используйте {{ json .Function }}, если вам нужен JSON.

Отправляется ли мой шаблон куда-нибудь?

Нет. Всё работает в вашем браузере.

Похожие