Перейти к содержанию

Шаблоны

Аргумент template_format фабрики задаёт способ подстановки переменных в сообщения; его значение по умолчанию, langfuse, совпадает с playground. Промпт может нести свой формат в ключе конфигурации template_format, который действует, когда allowed_config_keys его перечисляет или равен "any" (см. раздел Модели и ключи конфигурации). В модель этот ключ не передаётся.

{"provider": "openai", "model": "gpt-5.5", "template_format": "jinja2"}
Формат Синтаксис Чем рендерится
langfuse (по умолчанию) {{ name }} TemplateParser из Langfuse SDK
f-string {name} str.format, как в шаблонах промптов LangChain
mustache {{ name }}, {{{ name }}}, {{#flag}}...{{/flag}} Mustache-рендерер LangChain
jinja2 {{ name \| upper }}, {% if %} Jinja2 в изолированном окружении, как в LangChain; требуется pip install "langfuse-hotswap[jinja2]"

Формат действует на все сообщения промпта. В любом формате переменные обязательны: входные данные проверяет шаблон LangChain, поэтому отсутствующая переменная вызывает KeyError с её именем.

Формат langfuse

Сообщения рендерит TemplateParser из Langfuse SDK, поэтому результат совпадает с playground. Его правила закреплены контрактным тестом:

  • Переменная — это всё, что находится между {{ и ближайшим }}, без пробелов по краям. Значения подставляются через str() без экранирования; None превращается в пустую строку.
  • Одиночные фигурные скобки и HTML остаются без изменений. Секций нет: {{#flag}} — это переменная с именем #flag, а {{a.b}} — переменная с именем a.b.
  • В отличие от prompt.compile(), отсутствующая переменная — это ошибка, а не оставленный как есть текст.

Форматы LangChain

f-string, mustache и jinja2 рендерятся теми же функциями, что стоят за ChatPromptTemplate с соответствующим template_format, и по их правилам: f-string считает одиночные скобки полями, mustache экранирует HTML в {{ }}, поддерживает секции и трактует a.b как вложенный доступ, jinja2 вычисляет выражения и фильтры. Используйте их для промптов с условиями и циклами и помните, что playground Langfuse понимает только {{ name }}.

Сообщения

  • Текстовый промпт превращается в одно сообщение с ролью human. Роли, неизвестные LangChain, например developer, сохраняются как ChatMessage с соответствующей ролью.
  • Плейсхолдеры заполняются из входной переменной с тем же именем; она должна содержать список сообщений. Переменные внутри этих сообщений не подставляются.
  • Переменные с именами stop и self отклоняются LangChain.