Paste a prompt with {{var}}, {var} or ${var} placeholders and your values. See the rendered prompt, missing and unused variables, and a token estimate.
A prompt template tester fills the variables in a template with your values and shows a plain-substitution preview of the prompt text, together with every variable that has no value. Paste the template in the first box and the values in the second, either as a JSON object or as key=value lines. The rendered prompt appears with a character count and an estimated token count, and a Problems box lists missing variables, values that nothing uses, and braces that do not balance, each with its line number. Nested values are reached with dots, so customer.name reads the name inside the customer object, and items[0] reads the first item of a list. A table shows how many times each variable is used and whether it was filled.
The sample template has five variables: role, company, language, customer.name and question. The sample values fill four of them and also carry a key called tone that the template never uses. The rendered prompt is 112 characters, about 28 tokens at the 4-characters-per-token estimate. The Problems box reports one missing value, language, and one unused value, tone. By default a missing placeholder stays in the output as {{language}}, so the gap is visible; switch to Replace with nothing to see the prompt as it would be sent with an empty value. Add language to the values and the problems list says No problems found.
Three styles are supported. {{ var }} covers Mustache, Handlebars and Jinja, which write plain variables the same way. {var} is Python str.format and f-string style, where {{ and }} are escapes for literal braces, so {{name}} renders as {name}. ${var} is a JavaScript template literal, and \${var} stays literal. Auto-detect counts the plain variables in each style and picks the style with the most, preferring {{ }}, then ${ }, then { }. Pick a style yourself when a template mixes them, for example a JSON example inside a {{ }} template. Only plain names are substituted. A filter such as {{ name | upper }}, a Handlebars section such as {{#if x}}, a Jinja {% %} tag or a JavaScript expression is left as written and reported.
A JSON object keeps its types: strings are inserted as they are, numbers and true or false as typed, null as the word null, and lists and objects as compact JSON. With key=value lines, the text after the first = is the value, a value in double quotes is read as a JSON string so it can hold \n, and lines starting with # are ignored. The tester never calls a model and never runs code. HTML escaping, which Mustache applies by default, is not applied here. Token counts are estimates at 4 characters per token; use the Token Counter tool for a real tokenizer. Each box accepts up to 200,000 characters and the template up to 5,000 placeholders.
Paste the template and your values. The Problems box lists each variable that has no value, such as language, and the table marks it Missing. Missing placeholders stay in the output by default, so you can also search the rendered prompt for them.
In str.format and f-strings, {{name}} is an escape that prints a literal {name}. Use a single pair, {name}, to insert a value. Choose the {var} Python style on this page and the rendered output shows what Python would print.
Only its plain variables, such as {{ user.name }}. Filters like {{ name | upper }} and {% for %} or {% if %} tags are not run. They are left as written, and the Problems box counts them.
A {{ with no closing }}, a }} with no opening {{, or in Python style a single { or } with no partner. A template with these fails or prints oddly in the library that renders it. The report gives the line number of each one.
The page shows an estimate of the characters divided by 4, rounded up: 112 characters is about 28 tokens. Real counts depend on the model's tokenizer and on the language, so use the Token Counter for a closer figure.
No. The text is processed in your browser, in this tab, and not uploaded. Your choices on this page are saved in this browser; the text you paste is not.