~/tools / File di modello e chat template / Ollama Template Tester
Ollama Template Tester — Esegui un TEMPLATE di Ollama e vedi il prompt esatto
Incolla il TEMPLATE di un modello Ollama (da ollama show --template o dal tuo Modelfile), aggiungi una conversazione, degli strumenti o un prompt, e vedi il testo esatto che Ollama consegna al modello: token speciali, a capo e tutto il resto. Lo strumento esegue il template come fa Ollama, con le regole dei template di Go, i dati di Ollama (messaggi, tool call, strumenti, think) e i suoi tre modi di eseguire un template. Dice anche se Ollama userà il tuo TEMPLATE o il chat template contenuto nel file GGUF, e quando Ollama rifiuta una richiesta con strumenti o con thinking. Nulla lascia il tuo browser.
ollama show --template <model> stampa il template di un modello che hai. Va bene anche il testo tra le triple virgolette dopo TEMPLATE in un Modelfile.
La stessa forma di /api/chat: role, content e, facoltativamente, thinking, tool_calls, tool_name e images.
La stessa forma di tools in /api/chat. Lascialo vuoto per non usare strumenti.
Avanzate: il SYSTEM del modello e il suo chat template GGUF
La riga SYSTEM del Modelfile. Ollama la aggiunge quando il primo messaggio non è un messaggio di sistema (in /api/generate, quando system è vuoto).
Incollalo per vedere se Ollama usa TEMPLATE o questo. GGUF Metadata Viewer lo mostra.
Che cosa riceve il modello
<|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
Informazioni su questo template
- Come l'ha eseguito Ollama
- Una volta, con l'intera conversazione in .Messages
- Nomi che usa
- $, $i, $last, arguments, content, function, messages, name, prompt, response, role, system, toolcalls, tools
- Che cosa supporta (per Ollama)
- strumenti
Verifica con il tuo Ollama
Sostituisci MODEL con il nome del tuo modello. _debug_render_only è un'opzione di debug del codice sorgente di Ollama, non della documentazione dell'API, quindi può cambiare. La risposta contiene il prompt in _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}'I modelli con una riga RENDERER o PARSER nel Modelfile, e gpt-oss, usano renderer integrati in Ollama, non TEMPLATE.
Quando la conversazione è più lunga del contesto (num_ctx), Ollama scarta i messaggi più vecchi ma mantiene i messaggi di sistema e l'ultimo messaggio. Questo strumento non conta i token, quindi mostra sempre l'intera conversazione.
Per i modelli qwen3 e deepseek-r1, Ollama rimuove <think>…</think> dai messaggi dell'assistente precedenti all'ultimo messaggio dell'utente. Questo strumento no.
Stampare un intero messaggio o {{ .Messages }} mostra in Ollama indirizzi di memoria (0xc…), che cambiano ogni volta. Lo strumento mostra un segnaposto.
currentDate e yesterdayDate usano la data di oggi del tuo computer. Ollama usa la data del server.
Verificato il 2026-11-09 con il codice sorgente di Ollama (v0.40.15), il text/template di Go e Ollama 0.40.11: Ollama: Template · template.go
Tutto viene eseguito nel tuo browser. Nulla viene inviato da nessuna parte.
Ollama trasforma una conversazione nel testo che legge un modello con il TEMPLATE del modello, scritto nel linguaggio di template di Go: {{ range .Messages }}, {{ .Role }}, {{ .Content }}, {{ if .Tools }} e così via. Un piccolo errore, come un a capo mancante, un {{- che taglia troppo o un nome di campo che non esiste, cambia ciò che vede il modello o fa fallire ogni richiesta. Questo strumento esegue il tuo template come fa Ollama. Segue le regole di text/template di Go (marcatori di taglio, variabili, range, with, confronti, printf, i messaggi di errore), passa gli stessi dati che passa Ollama (System, Messages con Role, Content, Thinking, ToolCalls, ToolName e ToolCallID, Tools, Think, ThinkLevel, IsThinkSet, Prompt, Suffix, Response) e ha le funzioni aggiuntive di Ollama (json, currentDate, yesterdayDate, toTypeScriptType). Copia anche il modo in cui Ollama prepara i dati: i messaggi di sistema vengono uniti in .System, i messaggi consecutivi dello stesso ruolo vengono uniti con una riga vuota, il SYSTEM del modello viene aggiunto quando il primo messaggio non è un messaggio di sistema, e le immagini diventano [img-0], [img-1] e così via. Un template che non usa mai .Messages viene eseguito alla vecchia maniera, una volta per turno con .Prompt e .Response, e Ollama aggiunge {{ .Response }} a un template che non usa né l'uno né l'altro. Da Ollama 0.40, un modello può anche portare un chat template dentro il suo file GGUF (tokenizer.chat_template), e Ollama sceglie uno dei due in base a ciò che ciascuno sa fare: strumenti, thinking e fill-in-the-middle. Incolla il chat template del GGUF in Avanzate e lo strumento ti dice quale userà Ollama. Abbiamo verificato lo strumento in tre modi: con il text/template di Go stesso (Go 1.26.6) che esegue il codice dei template di Ollama su 243 casi, compresi i 20 template integrati di Ollama, di cui riproduce gli output di test; con Ollama 0.40.11 su questo computer, con 330 richieste a /api/generate; e con 49 richieste a /api/chat a qwen2.5:7b e a modelli che abbiamo creato con i nostri TEMPLATE. L'output e i messaggi di errore coincidevano.
La logica principale di questo strumento è open source, con licenza MIT. github.com/seigo5555/toolkitbox-lib/src/ollama-template.ts
Casi d'uso
- Controllare un TEMPLATE che stai scrivendo per un Modelfile prima di eseguire ollama create: a capo, token speciali, messaggio di sistema, tool call e relativi risultati
- Capire perché cambiare TEMPLATE non ha effetto, e se Ollama usa quel TEMPLATE o il chat template del file GGUF
- Vedere esattamente che cosa riceve un modello in una lunga conversazione con strumenti, per fare il debug di tool call sbagliate o mancanti
Utilizzo
- Incolla un template nella casella (ollama show --template <model> stampa il template di un modello che hai), oppure parti da uno degli esempi.
- Scegli /api/chat e modifica i messaggi e gli strumenti come JSON, con la stessa forma dell'API, oppure scegli /api/generate e compila prompt, system e suffix. Imposta think se lo usi.
- Leggi il risultato, con gli spazi visibili se ti servono. Per confrontare con il tuo Ollama, esegui il comando curl in fondo con il nome del tuo modello.
FAQ
Ho cambiato TEMPLATE, ma l'output non è cambiato. Perché?
Da Ollama 0.40, un modello può avere due template: il TEMPLATE del Modelfile e il chat template contenuto nel file GGUF. Ollama sceglie quello che sa fare di più (strumenti, thinking, fill-in-the-middle). Nel nostro test con Ollama 0.40.11, un TEMPLATE senza strumenti è stato ignorato in un modello creato da qwen2.5:7b, perché il chat template GGUF di qwen2.5:7b supporta gli strumenti. Il log del server mostra la scelta nella riga "template selection" (selected=go_template o selected=gguf_chat_template), e impostare OLLAMA_GO_TEMPLATE=1 per il server fa usare a Ollama il TEMPLATE ogni volta che un modello ne ha uno.
Come posso vedere il prompt che il mio Ollama costruisce davvero?
Il codice sorgente di Ollama ha un'opzione di debug, _debug_render_only, che restituisce il prompt invece di eseguire il modello (come _debug_info.rendered_template). L'abbiamo usata per verificare questo strumento. Non è nella documentazione dell'API, quindi può cambiare. Lo strumento costruisce il comando curl per te.
Che differenza c'è tra i template con .Messages e quelli con .Prompt?
Se il template usa .Messages, Ollama lo esegue una volta con l'intera conversazione. Se non lo usa, Ollama lo esegue una volta per turno con .System, .Prompt e .Response, e per l'ultimo turno taglia il template dopo {{ .Response }}, così il modello continua da lì. Lo strumento mostra quale dei due modi è stato usato.
Perché Ollama risponde "does not support tools" o "does not support thinking"?
Ollama rifiuta una richiesta con strumenti quando il template che usa non supporta gli strumenti (un TEMPLATE li supporta quando usa .Tools), e una richiesta con think a true o con un livello quando il template non ha una parte di thinking. Per un template che ha il thinking, Ollama attiva think quando la richiesta non lo imposta. Lo strumento mostra entrambi i casi.
Gli strumenti nel mio prompt non sembrano JSON. È un bug dello strumento?
Probabilmente no. Nei template di Go, un valore viene stampato come JSON solo quando il suo tipo lo prevede. .Tools di Ollama, uno strumento intero e .Function.Arguments vengono stampati come JSON, ma .Function viene stampato nel formato proprio di Go. Nel nostro test, il template di qwen2.5:7b usa {{ .Function }}, e Ollama 0.40.11 ha inviato al modello un testo come {get_weather Get the weather {object <nil> <nil> [city] {…}}}. Usa {{ json .Function }} se vuoi JSON.
Il mio template viene inviato da qualche parte?
No. Tutto viene eseguito nel tuo browser.