~/tools / Файлы моделей и шаблоны чата / Hugging Face Chat Template Tester
Hugging Face Chat Template Tester — Отрисуйте чат-шаблон Hugging Face и увидите точный промпт
Вставьте чат-шаблон Hugging Face (Jinja) или весь tokenizer_config.json модели, добавьте messages и tools и увидите точный текст промпта, который создаёт apply_chat_template(..., tokenize=False) из transformers. Инструмент запускает Jinja2 с теми же настройками песочницы, что и transformers, поэтому текст, ошибки и номера их строк совпадают с Python. Ничто не покидает ваш браузер.
Вставьте шаблон Jinja (chat_template.jinja) или весь tokenizer_config.json либо chat_template.json из файлов модели на Hugging Face.
Список сообщений в JSON, тот же список, который вы передаёте в apply_chat_template.
Список определений инструментов в JSON (JSON Schema). Оставьте пустым, если инструментов нет.
Добавляет в конце начало хода ассистента, чтобы модель написала ответ (если шаблон это поддерживает).
Оставляет последнее сообщение открытым, чтобы модель его продолжила (prefill). Нельзя использовать вместе с add_generation_prompt.
Другие значения, передаваемые в apply_chat_template как именованные аргументы, в виде объекта JSON, например {"enable_thinking": false}. Переменные, которые читает шаблон, перечислены под результатом.
Дополнительные параметры
transformers передаёт шаблону специальные токены токенизатора. Они заполняются, когда вы вставляете tokenizer_config.json.
Для шаблонов, поддерживающих documents (RAG): список объектов JSON вида {"title": "…", "text": "…"}.
Время, которое возвращает strftime_now(). Оставьте пустым, чтобы использовать текущее время.
Текст промпта
<|im_start|>system
You are a helpful assistant.
# Tools
You can call these functions:
<tools>
{"type": "function", "function": {"name": "get_weather", "description": "Get the current weather in a city.", "parameters": {"type": "object", "properties": {"city": {"type": "string", "description": "City name"}}, "required": ["city"]}}}
</tools>
To call one, reply with JSON inside <tool_call></tool_call>.<|im_end|>
<|im_start|>user
What's the weather in Paris?<|im_end|>
<|im_start|>assistant
<tool_call>
{"name": "get_weather", "arguments": {"city": "Paris"}}
</tool_call><|im_end|>
<|im_start|>user
<tool_response>
{"temperature": 22}
</tool_response><|im_end|>
<|im_start|>assistant
Об этом шаблоне
- Переменные, которые он читает
- Задаются apply_chat_template: add_generation_prompt, messages, toolsСпециальные токены: нетДругие: нет
- Использует {% generation %}
- Нет
Проверьте в Python
Запустите это, чтобы сравнить с transformers. Замените MODEL_ID на модель или передайте свой шаблон как chat_template=.
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("MODEL_ID")
messages = [
{'role': 'system', 'content': 'You are a helpful assistant.'},
{'role': 'user', 'content': "What's the weather in Paris?"},
{'role': 'assistant', 'content': '', 'tool_calls': [{'type': 'function', 'function': {'name': 'get_weather', 'arguments': {'city': 'Paris'}}}]},
{'role': 'tool', 'name': 'get_weather', 'content': '{"temperature": 22}'},
]
tools = [
{'type': 'function', 'function': {'name': 'get_weather', 'description': 'Get the current weather in a city.', 'parameters': {'type': 'object', 'properties': {'city': {'type': 'string', 'description': 'City name'}}, 'required': ['city']}}},
]
text = tokenizer.apply_chat_template(
messages,
tools=tools,
add_generation_prompt=True,
tokenize=False,
)
print(text)Результат это текст до токенизации. Затем transformers токенизирует его с add_special_tokens=False, поэтому специальные токены появляются только там, где их пишет шаблон.
Если заданы tools и у модели есть шаблон с именем tool_use, transformers использует именно его. Шаблон также можно выбрать по имени.
messages, tools и documents читаются как модулем json в Python: целые числа становятся int, а числа с десятичной точкой float, что может изменить то, как шаблон их выводит.
Проверено 2026-11-09 на transformers 5.22.2 с Jinja2 3.1.6 (Python 3.14). transformers: чат-шаблоны · Исходный код transformers
Всё выполняется в вашем браузере. Ничто из вставленного вами не отправляется и не сохраняется.
Большинство открытых моделей на Hugging Face поставляются с чат-шаблоном: небольшой программой на Jinja, которая превращает список сообщений в текст, который модель на самом деле читает. Пропущенный пробел, двойной токен BOS или неверный промпт генерации меняют то, что видит модель, а шаблон трудно читать, не запустив его. Этот инструмент запускает его так, как это делает transformers. Мы портировали Jinja2 3.1.6 на JavaScript: его лексер, парсер, правила о том, какие переменные где видны, constant folding, песочницу, которую использует transformers, и все встроенные фильтры и тесты вместе с поведением самого Python для строк, чисел, сортировки и сообщений об ошибках. Поверх этого он следует apply_chat_template в transformers 5.22.2: специальные токены вроде bos_token, шаблон tool_use при заданных tools, add_generation_prompt, continue_final_message, documents, reasoning_content и участки {% generation %}. Мы отрисовали чат-шаблоны 39 открытых моделей (Qwen, Llama, Mistral, Gemma, Phi, DeepSeek, gpt-oss и других) на 15 видах диалогов, и все 585 результатов совпали с transformers. Более 20 000 других тестовых шаблонов тоже совпали, включая ошибки и номера строк, кроме нескольких, которые используют фильтр random, чей результат в Python тоже случаен.
Когда пригодится
- Увидеть точный промпт, который получает модель, прежде чем дообучать её или запускать: токены BOS и EOS, пробелы, переводы строк и промпт генерации
- Найти переключатели, которые читает шаблон, например enable_thinking, и увидеть, что они меняют
- Отладить чат-шаблон, который вы пишете, с ошибками и номерами строк, tools, documents и continue_final_message
Как пользоваться
- Вставьте чат-шаблон или весь tokenizer_config.json либо chat_template.json модели или выберите пример.
- Отредактируйте messages и tools (те же списки JSON, которые вы передаёте в Python) и задайте add_generation_prompt и другие параметры.
- Прочитайте текст промпта и переменные, которые использует шаблон, и скопируйте код на Python, чтобы проверить те же входные данные в transformers.
Вопросы
Совпадает ли результат с apply_chat_template?
Он совпадает с apply_chat_template(..., tokenize=False), то есть с текстом до токенизации. Специальные токены, add_generation_prompt, continue_final_message, tools и documents обрабатываются как в transformers 5.22.2. Инструмент не превращает текст в token IDs.
Откуда берутся bos_token и eos_token?
В Python они берутся из токенизатора. Если вы вставляете tokenizer_config.json, инструмент читает их оттуда. В остальных случаях введите их в разделе Дополнительные параметры.
Что делает {% generation %}?
Некоторые шаблоны оборачивают ответы ассистента в {% generation %} … {% endgeneration %}. transformers использует эти участки для return_assistant_tokens_mask, например чтобы обучать только на токенах ассистента. Инструмент подсвечивает их в результате.
Дадут ли vLLM, llama.cpp или другие серверы тот же текст?
Другое программное обеспечение может отрисовывать тот же шаблон другим движком или с другими настройками, поэтому его результат может отличаться. Этот инструмент следует transformers.
Почему переменная вроде enable_thinking указана в разделе Другие?
Шаблон её читает, но apply_chat_template её не задаёт. Передайте её как дополнительную переменную (например {"enable_thinking": false}), чтобы изменить результат, как в Python вы передали бы enable_thinking=False.
Отправляется ли мой шаблон куда-либо?
Нет. Всё выполняется в вашем браузере.