Как собирать сценарий
Сценарий - это цепочка узлов на холсте. Вы добавляете узлы, соединяете их линиями, и данные проходят слева направо от узла к узлу. Эта страница объясняет механику: как соединять узлы, как они передают данные друг другу и как выстроить рабочий процесс сборки.
Добавление и соединение узлов
Чтобы добавить первый узел - нажмите Добавить узел в центре пустого холста или кнопку + на панели.
Чтобы добавить следующий узел и сразу соединить его с предыдущим - нажмите на коннектор (стрелка на правой стороне узла). Список узлов откроется уже с готовой связью: выбранный узел добавится и сразу подключится.
Или нажмите кнопку Добавить узел в нижней панели - тогда узел добавится на холст без соединения с другими узлами.
Узлы со свободными коннекторами магнитятся друг к другу: потяните один к другому - связь создастся автоматически.
Связь можно протянуть вручную от одного узла к другому. Если связь уже есть - не нужно удалять и создавать заново: потяните её начало или конец к другому узлу, и она переподключится.
Чтобы удалить связь - кликните на ней правой кнопкой мыши и выберите Удалить.

Как получить первые данные в сценарий
Если в сценарии стоит триггер приложения (Gmail, Telegram, Slack и т.д.), нужно получить от него данные, прежде чем настраивать следующие узлы. Есть два способа.
Способ 1: запустить только триггер. Наведите на узел-триггер, нажмите на него правой кнопкой мыши и выберите Запустить узел один раз. Узел попытается получить последнее событие из подключённой системы. В некоторых случаях API вернёт тестовое (sample) сообщение - этого достаточно, чтобы увидеть структуру данных и начать настройку следующих узлов.
Способ 2: запустить весь сценарий. Нажмите Запустить один раз в нижнем левом меню - сценарий запустится полностью и будет ожидать реального события в триггере подключённой системы. Как только вы вручную создадите это событие (отправите письмо, сообщение и т.д.), триггер его поймает и данные пройдут по всей цепочке.
Вы также можете в любой момент запустить вручную любой экшн в цепочке и получить от него данные - независимо от триггера.
Мы рекомендуем начинать тестирование с первого способа: запускайте узлы по одному и проверяйте данные на каждом шаге.
Как посмотреть данные выполнения узла
После того как узел запустился, рядом с ним появляется зелёный кружок. Кликните на него - откроется панель с вкладками Input, Output, Log и Error.
Самая ценная вкладка - Output: здесь собраны все данные, которые вернул сервис на ваш запрос. Именно их вы будете использовать в следующих узлах. Например, для триггера Telegram там уже есть ID отправителя, ID чата, текст сообщения и другие поля.

Как подставить данные дальше по сценарию
Предположим, триггер получил сообщение из Telegram и мы хотим передать его текст в ChatGPT. Кликните в нужное поле узла - откроется окно с вкладкой «Данные», где доступны переменные из всех предыдущих узлов цепочки. Напишите текст запроса, раскройте нужный узел и кликните на переменную - она вставится прямо в то место, где стоит курсор.
На вкладке «Данные» видны переменные из всех предыдущих узлов цепочки, не только из ближайшего. Можно взять данные из любого узла левее по цепочке.
Чтобы переменная появилась в «Данных», предыдущий узел должен быть запущен хотя бы один раз. Если вкладка «Данные» пустая - сначала запустите нужный узел через Run Node Once.
Если запустить узел, в полях которого стоят переменные из незапущенных предыдущих узлов, на месте этих переменных придёт null. Это может привести к ошибке или к неправильному результату. Всегда запускайте узлы по порядку: сначала тот, из которого берёте данные, потом тот, который их использует.
В примере ниже: добавляем узел Telegram для отправки ответа, передаём в поле Chat ID переменную из триггера, а в поле с текстом - ответ ChatGPT.
Поля, помеченные красной звёздочкой, обязательны для заполнения. Без них узел выдаст ошибку. Заполняйте их в первую очередь.
Названия полей обычно совпадают с названиями нужных данных. Если поле называется Chat ID - туда нужно подставить значение chat_id из предыдущего узла. Так работает с большинством стандартных идентификаторов: chat_id, user_id, request_id и другими. Ищите в «Данных» переменную с таким же именем.
Подход к сборке
- Спланируйте сценарий: определите, какие узлы нужны и в каком порядке.
- Добавьте нужные узлы на холст.
- Начните настройку с первого узла: заполните поля и запустите его - ПКМ → Запустить узел один раз.
- Кликните на кружок рядом с выполненным узлом и проверьте выходные данные: вернул ли узел то, что ожидалось. Если нет - измените настройки и запустите снова.
- Настройте следующий узел: подставьте нужные данные из предыдущих узлов через вкладку «Данные» и запустите его.
- Проверьте его Output так же, как в шаге 4.
- Повторяйте шаги 5-6 до конца цепочки.
Если при настройке узла нужных данных в «Данных» нет - скорее всего, не хватает промежуточного шага. Например, дополнительного запроса к API, который получит или создаст нужные данные. Добавьте его в цепочку, запустите - и нужные переменные появятся в «Данных».
Операторы
Иногда данные нужно не просто передать дальше, а преобразовать: привести дату к нужному формату, собрать строку из нескольких переменных, посчитать длину текста. Для этого используются операторы.
Кликните в любое поле узла и перейдите на вкладку Operators - она находится рядом с «Данными». Там собраны все операторы по группам: сравнения, математика, работа со строками, датами и массивами.

Оператором можно обернуть и статичный текст, и переменную из предыдущего узла - результат будет вычислен динамически при каждом запуске. Вот как выглядит поле с несколькими операторами и что получается на выходе:

Значения now, today и timestamp доступны в любом поле без предварительного запуска узлов.
Ветвление: фильтры и условия
Операторы также используются для фильтрации и маршрутизации: условие на связи между узлами - это оператор сравнения, который решает, пойдут ли данные по этой ветке.
В Nodul нет отдельных узлов для фильтрации и маршрутизации - таких как if, filter, split, merge и подобных. Всё это настраивается прямо на связях между узлами.
Один узел может иметь несколько исходящих связей. На каждой задаётся условие - ветка сработает только если оно выполнилось. Если условие не выполнилось, данные по этой ветке не пройдут.
Нажмите на связь между узлами - откроется панель, где задаётся условие. В примере ниже две ветки: одна срабатывает если amount больше 100, другая - если меньше.

Вот как это работает в действии: при значении 150 срабатывает первая ветка, при 50 - вторая.
Если на связи не задано условия - данные пройдут по ней всегда. Если у узла несколько связей без условий - выполнятся все ветки одновременно.
Полный список операторов и примеры работы с ними - в разделе Основы операторов.
Резервная связь. Если ни одно условие на исходящих связях не выполнилось, сработает резервная связь - ветка «для всех остальных случаев». Включается переключателем Fallback router в настройках связи.
