Шаблоны
Шаблон — это текст с подстановками {{ ... }}, который нода вычисляет в момент своего
исполнения. Так промпт, тело HTTP-запроса или сообщение получают значения из предыдущих
нод, переменных и секретов, не требуя ни одной строки кода.
Где шаблоны работают, а где нет
Шаблонным является поле, а не нода. Такое поле редактор рисует редактором кода с
подсказкой доступных имён и подсветкой неизвестных — например template у
template или system_prompt у ai_agent.
Движок передаёт ноде конфигурацию как есть; подстановку делает сама нода — и только для
полей, объявленных шаблонными. Поле без такой пометки принимает текст буквально:
{{ ... }} в нём останется двумя фигурными скобками.
Настройка ноды
Шаблон
Параметры
Подставляется значение, пришедшее на порт Input.
Пространства имён
| Имя | Что в нём лежит |
|---|---|
inputs.<handle> |
Значение, которое доставил непосредственный предшественник на этот порт. Имя относительно каждой ноды: inputs.input у ноды в середине графа — это выход её предыдущей ноды, а не вход воркфлоу. |
nodes.<id>.output |
Основное значение другой ноды — ровно то, что её успешное ребро отдаёт дальше. Остальные ключи результата доступны рядом: nodes.<id>.status, nodes.<id>.branch. |
variables.<name> |
Переменные сессии, объявленные нодой var. Внутри while_loop сюда же попадает счётчик loop_index. |
secret.<NAME> |
Секреты рабочего пространства (раздел «Секреты» в настройках). Расшифровываются один раз на запуск, доступны в любой ноде. |
loop |
Поля текущей итерации внутри шелла итерации, например loop.item. |
telegram.reply_message_id |
Идентификатор ответного сообщения бота — только в ходах Telegram, до отправки ответа пустой. |
Есть и короткая форма: {{ my_node.output }} работает так же, как {{ nodes.my_node.output }},
а имя входного порта доступно напрямую. Если id ноды не является допустимым идентификатором
Jinja, используйте {{ nodes['my-node'].output }}.
- Исполнение + данные
- LLM
Значение или строка
Правило одно и оно важно для полей, которым нужен список или число:
- строка целиком равна одному выражению —
{{ inputs.input.items }}— возвращается нативное значение (список, число, словарь); - выражение смешано с текстом или в строке есть блоки
{% ... %}— результат всегда строка.
Время и отсутствующие значения
Доступны {{ now() }} (UTC; now('Europe/Moscow') — в нужной зоне) и фильтр
| datetimeformat('%d.%m.%Y %H:%M') с алиасом | strftime. Он принимает дату, unix-число
или ISO-строку; то, что распознать не удалось, даёт пустую строку и не роняет ноду.
Модулей и import в шаблонах нет — за произвольной логикой идите в
code_javascript.
Неизвестное имя тоже не роняет ноду: оно рендерится пустым. Прочитанные пустые пути
записываются в исполнение ноды под ключом __undefined_refs__ — это единственный след
опечатки в id, поэтому проверяйте его, когда поле неожиданно пустое.
Один проход, и это про безопасность
Каждое шаблонное поле рендерится ровно один раз. Значение, уже прошедшее рендер,
повторно не обрабатывается, даже если после подстановки в нём появились {{ }}.
Так и должно быть: после первого прохода строка законно содержит данные пользователя,
строку из базы или ответ модели. Второй проход выполнил бы этот текст как шаблон в
контексте, где есть secret.*.
Как проверить результат
Откройте запуск и разверните ноду: в её отладочной панели есть секция с отрендеренными
шаблонами — там видно, что именно ушло в модель или в HTTP-запрос, вместе с
__undefined_refs__, если что-то не разрешилось. В редакторе неизвестные имена
подсвечиваются прямо в поле, ещё до запуска.