~/tools / Arquivos de modelo e templates de chat / Ollama Template Tester
Ollama Template Tester — Execute um TEMPLATE do Ollama e veja o prompt exato
Cole o TEMPLATE de um modelo do Ollama (de ollama show --template ou do seu Modelfile), adicione uma conversa, ferramentas ou um prompt, e veja o texto exato que o Ollama entrega ao modelo: tokens especiais, quebras de linha e tudo. A ferramenta executa o template como o Ollama faz, com as regras de templates do Go, os dados do Ollama (mensagens, tool calls, ferramentas, think) e suas três formas de executar um template. Ela também diz se o Ollama vai usar o seu TEMPLATE ou o template de chat que está dentro do arquivo GGUF, e quando o Ollama recusa uma requisição com ferramentas ou com thinking. Nada sai do seu navegador.
ollama show --template <model> imprime o template de um modelo que você tem. O texto entre as aspas triplas depois de TEMPLATE em um Modelfile também funciona.
O mesmo formato de /api/chat: role, content e, opcionalmente, thinking, tool_calls, tool_name e images.
O mesmo formato de tools em /api/chat. Deixe vazio para não usar ferramentas.
Avançado: o SYSTEM do modelo e o seu template de chat GGUF
A linha SYSTEM do Modelfile. O Ollama a adiciona quando a primeira mensagem não é uma mensagem de sistema (em /api/generate, quando system está vazio).
Cole-o para ver se o Ollama usa o TEMPLATE ou este. O GGUF Metadata Viewer o mostra.
O que o modelo recebe
<|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
Sobre este template
- Como o Ollama o executou
- Uma vez, com a conversa inteira em .Messages
- Nomes que ele usa
- $, $i, $last, arguments, content, function, messages, name, prompt, response, role, system, toolcalls, tools
- O que ele suporta (para o Ollama)
- ferramentas
Confira com o seu próprio Ollama
Substitua MODEL pelo nome do seu modelo. _debug_render_only é uma opção de depuração do código-fonte do Ollama, não da documentação da API, então pode mudar. A resposta traz o prompt em _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}'Modelos com uma linha RENDERER ou PARSER no Modelfile, e o gpt-oss, usam renderizadores embutidos no Ollama, não o TEMPLATE.
Quando a conversa é mais longa que o contexto (num_ctx), o Ollama descarta as mensagens mais antigas, mas mantém as mensagens de sistema e a última mensagem. Esta ferramenta não conta tokens, então sempre mostra a conversa inteira.
Para os modelos qwen3 e o deepseek-r1, o Ollama remove <think>…</think> das mensagens do assistente anteriores à última mensagem do usuário. Esta ferramenta não faz isso.
Imprimir uma mensagem inteira ou {{ .Messages }} mostra endereços de memória no Ollama (0xc…), que mudam a cada vez. A ferramenta mostra um marcador.
currentDate e yesterdayDate usam a data de hoje do seu computador. O Ollama usa a data do servidor.
Verificado em 2026-11-09 com o código-fonte do Ollama (v0.40.15), o text/template do Go e o Ollama 0.40.11: Ollama: Template · template.go
Tudo é executado no seu navegador. Nada é enviado para lugar nenhum.
O Ollama transforma uma conversa no texto que um modelo lê usando o TEMPLATE do modelo, escrito na linguagem de templates do Go: {{ range .Messages }}, {{ .Role }}, {{ .Content }}, {{ if .Tools }} e assim por diante. Um erro pequeno, como uma quebra de linha que falta, um {{- que corta demais ou um nome de campo que não existe, muda o que o modelo vê ou faz todas as requisições falharem. Esta ferramenta executa o seu template como o Ollama faz. Ela segue as regras do text/template do Go (marcadores de corte, variáveis, range, with, comparações, printf, as mensagens de erro), passa os mesmos dados que o Ollama passa (System, Messages com Role, Content, Thinking, ToolCalls, ToolName e ToolCallID, Tools, Think, ThinkLevel, IsThinkSet, Prompt, Suffix, Response) e tem as funções extras do Ollama (json, currentDate, yesterdayDate, toTypeScriptType). Também copia como o Ollama prepara os dados: as mensagens de sistema são unidas em .System, mensagens consecutivas do mesmo papel são unidas com uma linha em branco, o SYSTEM do modelo é adicionado quando a primeira mensagem não é uma mensagem de sistema, e as imagens viram [img-0], [img-1] e assim por diante. Um template que nunca usa .Messages é executado da maneira antiga, uma vez por turno com .Prompt e .Response, e o Ollama adiciona {{ .Response }} a um template que não usa nenhum dos dois. Desde o Ollama 0.40, um modelo também pode trazer um template de chat dentro do seu arquivo GGUF (tokenizer.chat_template), e o Ollama escolhe um dos dois pelo que cada um consegue fazer: ferramentas, thinking e fill-in-the-middle. Cole o template de chat do GGUF em Avançado e a ferramenta diz qual o Ollama vai usar. Verificamos a ferramenta de três maneiras: com o text/template do próprio Go (Go 1.26.6) executando o código de templates do Ollama em 243 casos, incluindo os 20 templates embutidos do Ollama, cujos resultados de teste ela reproduz; com o Ollama 0.40.11 neste computador, com 330 requisições a /api/generate; e com 49 requisições a /api/chat para o qwen2.5:7b e para modelos que fizemos com nossos próprios TEMPLATE. A saída e as mensagens de erro coincidiram.
A lógica principal desta ferramenta é de código aberto, sob a licença MIT. github.com/seigo5555/toolkitbox-lib/src/ollama-template.ts
Casos de uso
- Verificar um TEMPLATE que você está escrevendo para um Modelfile antes de executar ollama create: quebras de linha, tokens especiais, a mensagem de sistema, as tool calls e seus resultados
- Descobrir por que mudar o TEMPLATE não tem efeito, e se o Ollama usa esse TEMPLATE ou o template de chat do arquivo GGUF
- Ver exatamente o que um modelo recebe em uma conversa longa com ferramentas, para depurar tool calls erradas ou ausentes
Como usar
- Cole um template na caixa (ollama show --template <model> imprime o template de um modelo que você tem), ou comece por um dos exemplos.
- Escolha /api/chat e edite as mensagens e as ferramentas como JSON, no mesmo formato da API, ou escolha /api/generate e preencha prompt, system e suffix. Defina think se você o usar.
- Leia o resultado, com os espaços em branco visíveis se precisar. Para comparar com o seu próprio Ollama, execute o comando curl no final com o nome do seu modelo.
FAQ
Mudei o TEMPLATE, mas a saída não mudou. Por quê?
Desde o Ollama 0.40, um modelo pode ter dois templates: o TEMPLATE do Modelfile e o template de chat que está dentro do arquivo GGUF. O Ollama escolhe o que consegue fazer mais (ferramentas, thinking, fill-in-the-middle). No nosso teste com o Ollama 0.40.11, um TEMPLATE sem ferramentas foi ignorado em um modelo feito a partir do qwen2.5:7b, porque o template de chat GGUF do qwen2.5:7b suporta ferramentas. O log do servidor mostra a escolha na linha "template selection" (selected=go_template ou selected=gguf_chat_template), e definir OLLAMA_GO_TEMPLATE=1 no servidor faz o Ollama usar o TEMPLATE sempre que um modelo tiver um.
Como posso ver o prompt que o meu Ollama realmente monta?
O código-fonte do Ollama tem uma opção de depuração, _debug_render_only, que devolve o prompt em vez de executar o modelo (como _debug_info.rendered_template). Nós a usamos para verificar esta ferramenta. Ela não está na documentação da API, então pode mudar. A ferramenta monta o comando curl para você.
Qual é a diferença entre templates com .Messages e com .Prompt?
Se o template usa .Messages, o Ollama o executa uma vez com a conversa inteira. Se não usa, o Ollama o executa uma vez por turno com .System, .Prompt e .Response, e no último turno corta o template depois de {{ .Response }}, de modo que o modelo continua a partir dali. A ferramenta mostra qual das duas formas foi usada.
Por que o Ollama responde "does not support tools" ou "does not support thinking"?
O Ollama recusa uma requisição com ferramentas quando o template que ele usa não suporta ferramentas (um TEMPLATE as suporta quando usa .Tools), e uma requisição com think em true ou com um nível quando o template não tem parte de thinking. Para um template que tem thinking, o Ollama ativa think quando a requisição não o define. A ferramenta mostra os dois casos.
As ferramentas no meu prompt não parecem JSON. Isso é um bug da ferramenta?
Provavelmente não. Nos templates do Go, um valor é impresso como JSON apenas quando o seu tipo assim determina. O .Tools do Ollama, uma ferramenta inteira e .Function.Arguments são impressos como JSON, mas .Function é impresso no formato próprio do Go. No nosso teste, o template do qwen2.5:7b usa {{ .Function }}, e o Ollama 0.40.11 enviou ao modelo um texto como {get_weather Get the weather {object <nil> <nil> [city] {…}}}. Use {{ json .Function }} se quiser JSON.
Meu template é enviado para algum lugar?
Não. Tudo é executado no seu navegador.