Шаблоны

Шаблон — это текст с подстановками {{ ... }}, который нода вычисляет в момент своего исполнения. Так промпт, тело HTTP-запроса или сообщение получают значения из предыдущих нод, переменных и секретов, не требуя ни одной строки кода.

Где шаблоны работают, а где нет

Шаблонным является поле, а не нода. Такое поле редактор рисует редактором кода с подсказкой доступных имён и подсветкой неизвестных — например template у template или system_prompt у ai_agent.

Движок передаёт ноде конфигурацию как есть; подстановку делает сама нода — и только для полей, объявленных шаблонными. Поле без такой пометки принимает текст буквально: {{ ... }} в нём останется двумя фигурными скобками.

app.iterna.ai

Настройка ноды

Шаблон

Параметры

Шаблон
Клиент написал: {{ inputs.input }}

Подставляется значение, пришедшее на порт 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
LLM
Выход
  • Исполнение + данные
  • LLM
inputs — от соседа слева; nodes.<id> — от любой ноды по её id.

Значение или строка

Правило одно и оно важно для полей, которым нужен список или число:

  • строка целиком равна одному выражению — {{ 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__, если что-то не разрешилось. В редакторе неизвестные имена подсвечиваются прямо в поле, ещё до запуска.