>_
automate_this
Г
Это демо
Потыкай, посмотри как устроено — а чтобы начать, заведи аккаунт: M0 бесплатно.

M0-07Детектор настроения

тренажёрfree
Представь: ты получаешь поток отзывов клиентов — в чате поддержки, на сайте, в почте. Хочется автоматически выделять негативные, чтобы менеджер видел их в первую очередь и быстро реагировал, пока клиент не ушёл совсем. Соберём в n8n простой детектор тональности: пишешь сообщение во встроенный чат, AI определяет — позитив, нейтрал или негатив — и направляет в свою ветку. Дальше на каждую ветку можно повесить разные действия: алёрт в Telegram, запись в базу, уведомление руководителю.
#chat#ai#sentiment#routing#llm

Что собираем

Две основные ноды плюс одна sub-нода.

Chat Trigger принимает сообщение из встроенного в n8n чата.

Sentiment Analysis определяет тональность текста (Positive / Neutral / Negative) и направляет результат в одну из трёх своих выходных веток.

К Sentiment Analysis снизу подключена sub-нода OpenAI Chat Model — это «мозг», который реально оценивает текст через языковую модель deepseek-chat.

Готовый воркфлоу: Chat Trigger → Sentiment Analysis (три выхода Positive/Neutral/Negative) ← OpenAI Chat Model снизу через коннектор Model, все три выхода Sentiment Analysis сходятся в Send Message
Итоговый воркфлоу

Шаги выполнения

1Подключи Chat Trigger

Первая нода — Chat Trigger. Она запускает workflow при сообщении во встроенном чате n8n и кладёт текст сообщения в поле chatInput.

💬Встроенный чат n8n — как открыть и зачем он нуженстатья · ~2 мин

Встроенный чат для отладки AI-воркфлоу

Встроенное окно чата открывается прямо в редакторе n8n. Оно нужно, чтобы быстро проверить, как AI-воркфлоу отвечает на сообщения, без подключения Telegram или сайтового виджета. Чат работает только вместе с нодой Chat Trigger — без неё кнопка открытия не появляется.

Окно не генерирует ответы само. Чтобы получить ответ, воркфлоу должен выполниться: либо в режиме разработки, либо после публикации.

Как это работает

Нода Chat Trigger добавляется так: на пустом холсте нажми + → в списке триггеров What triggers this workflow? выбери On chat message. На холсте нода появится под именем When chat message received. После добавления появляется кнопка Open chat — и на карточке самой ноды, и в нижней панели инструментов canvas.

Для отладки используй Test this trigger внутри настроек ноды или сразу открывай чат кнопкой Open chat. Каждое сообщение в таком режиме запускает воркфлоу один раз.

Для постоянной работы без повторных запусков нажми Publish в заголовке воркфлоу. В этом режиме чат слушает сообщения постоянно, пока воркфлоу опубликован.

Отдельной кнопки сохранения нет — все изменения сохраняются автоматически.

Правило одной строкой
Чат требует запущенный воркфлоу

Чтобы получить ответ, воркфлоу должен быть запущен через Test this trigger, Open chat или Publish. Само окно чата только отправляет и показывает сообщения.

Типичные ошибки

  • Кнопки Open chat нет → в воркфлоу не добавлена нода Chat Trigger; добавь её, кнопка появится.
  • Отправил сообщение, бот молчит → воркфлоу не запущен; нажми Test this trigger или Open chat, либо Publish.
  • Поменял системный промпт, ответы прежние → Test this trigger подхватывает правки только при новом запуске, а не на лету.
  • Ищешь кнопку Save → её нет, воркфлоу сохраняется автоматически.
  • Ждёшь, что в этом чате будут сидеть реальные пользователи → это инструмент разработки, для прода нужен внешний канал.
1.1
Добавь Chat Trigger

На пустом canvas нажми + → в поиске нод начни вводить chat → выбери Chat Trigger (значок чата).

📖Как добавить ноду в n8nстатья · ~2 мин

Добавление ноды на canvas

Чтобы продолжить цепочку, нужно вставить новую ноду после существующей или на пустой canvas. Для этого открывают панель выбора нод тремя способами: кнопка Open nodes panel в центре canvas, кнопка Add node на стрелке соединения и + на output-коннекторе любой ноды.

Панель называется What happens next?. В ней сразу видно категории и поле поиска.

Как это работает

  • Клик по Open nodes panel или Add node открывает список.
  • В поле Search nodes... вводят имя ноды или сервиса (например http, slack, schedule). Список фильтруется по мере ввода.
  • Навигация по категориям: AI, Action in an app, Data transformation, Flow, Core, Human review, Add another trigger.
  • Клик по названию ноды ставит её на canvas и сразу открывает панель Parameters.
  • На пустом canvas можно нажать клавишу Tab — откроется та же панель без клика мышью.

Первая нода любого воркфлоу должна быть триггером (Schedule Trigger, Webhook, Manual и подобные). Обычные ноды-действия в начало ставить нельзя.

Правило одной строкой
Первая нода — всегда триггер

Если первой стоит обычная нода-действие, воркфлоу не запустится. Начинай всегда с триггера.

Типичные ошибки

  • Поставил обычную ноду первой → воркфлоу не из чего стартовать → замени первую ноду на триггер из категории Core или через поиск.
  • Ищут ноду по русскому названию → список остаётся пустым → вводи английское имя сервиса в поле Search nodes....
  • Целятся мышью в мелкий + на стрелке → промахиваются → нажми Tab прямо на canvas.
  • Открывают категорию Add another trigger после уже существующей ноды → добавляют лишний триггер → для обычного шага используй поиск или категории Action in an app и Data transformation.
1.2
Настрой Chat Trigger

Внутри ноды внизу есть раздел Options Нажми на кнопку Add Field В раскрывшемся меню выбери Response Mode - эта опция нужна чтобы возвращать ответ в чат через специальную ноду, которую мы добавим позже

Триггер добавлен. Теперь нужно получить от чата реальные данные, чтобы дальше с ними работать.

1.3
Нажми кнопку Open chat

Внизу canvas найди оранжевую кнопку Open chat (с иконкой сообщения) — она открывает встроенный чат-виджет n8n.

Нажми её. Можно использовать горячую клавишу L.

Внизу откроется окно чата.

🚩Publish и режимы воркфлоу в n8nстатья · ~2 мин

Два режима воркфлоу: Unpublished и Published

В n8n у воркфлоу два состояния. Unpublished — черновик: ты редактируешь и можешь запускать его только вручную через Execute workflow, триггеры молчат. Published — живая версия: триггеры включены, Schedule срабатывает по расписанию, Webhook и Form принимают запросы по Production URL, polling-триггеры (Telegram, Gmail) слушают обновления. Переключает между состояниями кнопка Publish в правом верхнем углу редактора.

Что включает Publish
  • Schedule-триггер — начинает запускаться по расписанию. В Unpublished не сработает ни разу.
  • Webhook / Form Trigger — Production URL начинает принимать запросы. До Publish этот URL возвращает 404.
  • Test URL у Webhook / Form — работает только пока ты нажал Execute workflow в редакторе. От статуса Publish не зависит.
  • Polling-триггеры (Telegram, Gmail и подобные) — начинают слушать события.
  • Воркфлоу-исполнитель — для триггеров берёт именно опубликованную версию, не текущее состояние редактора.
Главная тонкость
Без Publish триггеры молчат

Частая ошибка новичка: настроил Telegram Trigger, протестировал через Execute workflow — всё пришло, обрадовался. Закрыл редактор. Бот молчит. Потому что Telegram-вебхук и любая боевая активность триггеров включаются только после Publish. Test-режим Execute workflow живёт лишь пока редактор открыт и кнопка нажата.

Version Name и Describe changes — каждая публикация это новая версия

При нажатии Publish n8n показывает диалог с двумя полями:

  • Version Name — обязательное короткое имя версии. Любая строка, по которой ты потом узнаешь эту версию в истории. Хорошие примеры: журнал менеджера добавлен, webhook: новая схема заявки, fix: timezone for cron. Плохие: 123, update, асдф — через неделю ты не поймёшь что в этой версии было.
  • Describe changes (опционально) — что именно поменялось с прошлой версии. Это короткий журнал в свободной форме: «добавил Stretch-ветку ai-классификации жалоб», «починил Switch L2 — было kebab-case, стало snake_case». Заполняй обязательно для значимых правок — себе через месяц спасибо скажешь.

Каждая публикация создаёт новую версию workflow. История версий доступна через Versions (рядом с Editor/Executions) — можешь посмотреть какой код был на каждой версии, откатиться на любую из них одной кнопкой Restore. Это и есть встроенный git-подобный version control для воркфлоу.

Привычка
Маленькая правка → отдельный Publish с осмысленным именем

Кажется заманчивым копить много правок в одной публикации, чтобы не возиться с именами. На практике это плохо: если позже сломается какая-то ветка, и захочется откатиться — придётся откатить всё сразу, теряя другие изменения. Лучше публиковать мелкими шагами: подключил ветку — Publish с именем «ветка orders собрана»; залогировал действие — Publish с именем «orders + лог». Каждая версия = одно атомарное улучшение.

Sub-Workflow тоже публикуют

Воркфлоу, который вызывается из другого через Execute Workflow Trigger, тоже нужно публиковать. Родитель при вызове берёт последнюю опубликованную версию Sub-WF — если ты внёс правки и не нажал Publish, родитель их не увидит. Управляется той же кнопкой Publish.

Типичные ошибки

  • Поправил опубликованный воркфлоу, забыл Publish заново → триггеры исполняют старую версию. После каждой правки — Publish.
  • Дёргаешь Production URL у Unpublished воркфлоу → возвращает 404. Либо публикуй, либо открой редактор, нажми Execute workflow и шли на Test URL.
  • Хочешь временно остановить воркфлоу → нажми Unpublish. Триггеры замолкают, Production URL перестаёт принимать запросы. Чтобы запустить обратно — снова Publish.
Канвас с открытым чатом
Канвас с открытым чатом
1.4
Отправь тестовое сообщение в чат

В окне чата напиши тестовое сообщение "Тестовое сообщение для чата" и отправь.

Чат отправит сообщение в Chat Trigger, workflow запустится. На триггере появится зелёная галочка.

Chat Trigger на canvas с зелёной обводкой, галочкой и меткой 1 item на стрелке
После первого сообщения — Chat Trigger выполнился
1.5
Запинь данные триггера через Pin data

В правой панели Output нажми иконку пина 📌 (горячая клавиша P). Данные триггера зафиксируются — нода получит фиолетовую обводку. Теперь Sentiment Analysis сможет читать эти данные без повторной отправки в чат.

📖Pin Data в n8n: как зафиксировать тестовый вход нодыстатья · ~2 мин

Pin Data в n8n: как зафиксировать тестовый вход ноды

Pin Data — это способ «прибить» к ноде заранее заготовленные данные, которые n8n будет подставлять вместо настоящего входа на каждом тестовом запуске. Полезно, когда дёргать реальный источник (внешний воркфлоу, веб-хук, API) на каждое нажатие Execute workflow неудобно или невозможно.

Зачем это нужно

Часто отлаживается не сам триггер, а ноды после него — логика, маппинг, запрос в базу. Чтобы не звать каждый раз источник данных (другой воркфлоу, бот, форму), удобнее один раз получить пример настоящего входа, зафиксировать его на триггере и потом крутить запуски сколько нужно.

Поэтому Pin Data — это инструмент разработчика на этапе сборки, не часть рабочего воркфлоу. В боевом режиме закреплённые данные перестают использоваться: n8n берёт реальный вход.

Как это работает

К любой ноде с выходом можно прикрепить «запинённый» JSON. После этого:

  • При запуске воркфлоу через UI (Execute workflow, тестовый прогон) n8n не вызывает саму ноду, а сразу выдаёт следующим нодам зафиксированные данные.
  • Pin Data привязана к конкретной ноде, не к workflow целиком — можно запинить триггер и оставить остальные ноды живыми.
  • На холсте у запинённой ноды появляется визуальный значок (булавка/иконка), чтобы не забыть, что данные «искусственные».

Удобнее всего пинить триггер: на нём поле выхода — то, что в боевом режиме приходит снаружи (Telegram-апдейт, тело веб-хука, поля Execute Workflow Trigger). Тестовый JSON собирают с теми же ключами, что отдаёт реальный источник.

К примеру
Где это встречается

К примеру, в Sub-Workflow с триггером Execute Workflow Trigger пин на триггере позволяет запускать сам Sub-WF кнопкой сверху и отлаживать ноды после триггера, не запуская вызывающий workflow. Иногда — пин ставят на ноде HTTP Request к платному API, чтобы при разработке не жечь квоту запросами «ещё разок проверить парсинг».

Типичные ошибки

  • Забыли про пин при отладке — в редакторе тестовые прогоны идут по закреплённым данным, а не по реальным, поэтому новый вход «не доходит». Боевому запуску пин не мешает, но перед проверкой на живых данных его лучше снять.
  • Структура запинённого JSON не совпадает с реальным — отладка проходит идеально, но в проде ломается на полях, которых не было в тестовом примере; делайте пин из реальной execution, а не «на глаз».
  • Запинили середину воркфлоу, забыли — переименовали поле в ноде до пина, а пин остался со старой структурой. Следующие ноды читают «фантомные» данные.
  • Pin Data перепутали с переменными среды — пин не передаётся между воркфлоу и не сохраняется при экспорте на другую инсталляцию n8n как «конфиг»; это именно отладочный фиксаж.

Когда не подходит

Pin Data не заменяет настоящие тесты — это удобство в редакторе, не автоматизация. Если нужна повторяемая проверка с разными входами, лучше делать отдельный тестовый workflow или мини-набор тест-кейсов; пин подходит, когда хочется быстро прогнать «один и тот же» сценарий N раз.

📖JSON: формат данных, синтаксис и типыОткрыть
Chat Trigger с фиолетовой обводкой и иконкой пина
После Pin data триггер подсвечен фиолетовым
2Подключи Sentiment Analysis и OpenAI Chat Model как sub-ноду

Теперь добавим главную ноду — Sentiment Analysis.

Это кластерная нода: сама по себе она не анализирует текст. Ей нужен «мозг» — sub-нода OpenAI Chat Model, которая обращается к языковой модели.

У Sentiment Analysis есть три выхода справа:

Positive — для положительного результата.

Neutral — для нейтрального результата.

Negative — для отрицательного результата.

Данные пойдут только в один из этих выходов — в зависимости от того, что вернёт модель.

📖AI-фильтр перед действием: классификатор как маршрутизаторстатья · ~2 мин

AI-нода как маршрутизатор потока

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

Такой подход нужен, когда семантику сложно описать условиями If. Достаточно двух-семи категорий, а цена ошибки не критична — тогда AI-фильтр даёт простой и гибкий маршрутизатор.

Как это работает

Есть три способа собрать такой фильтр.

Первый — кластерная нода Sentiment Analysis или Text Classifier. У неё сразу несколько выходов (Positive, Neutral, Negative и т. д.). После ноды If ставить не нужно: поток уже разошёлся по нужным веткам.

Второй способ — AI Agent + Switch. Агент возвращает категорию в поле, а Switch по этому полю направляет item дальше.

Третий — нода Guardrails в режиме Check Text for Violations. Категорий у неё две: выход Pass — нарушений нет, выход Fail — сработала хотя бы одна проверка. Правило можно выбрать из встроенных или описать словами в проверке Custom. Так проверяют и сообщение покупателя до нейросети, и готовый ответ нейросети до отправки.

Кластерная нода требует подключённой sub-ноды OpenAI Chat Model. Коннектор Model находится снизу ноды. В параметре Sampling Temperature (или Temperature) можно поставить 0 — так модель реже отправляет один и тот же текст в разные ветки. Полностью разброс это не убирает: на пересекающихся категориях модель всё равно путается, и лечится это описаниями категорий, а не температурой.

Правило одной строкой
AI-фильтр уместен при 2–7 категориях и некритичной цене ошибки

Если категорий больше семи или ошибка стоит дорого, лучше добавить If или Switch как подстраховку после AI-ноды.

Типичные ошибки

  • Поставил AI-фильтр перед удалением сообщения без буфера → ошибочная категория удалит нужный текст → добавь ветку в карантин и удаляй только после второго прохода.
  • Задал 20 категорий «на вырост» → модель путает близкие варианты → оставь 3–5 крупных категорий, дроби при необходимости.
  • Один и тот же текст уходит то в одну ветку, то в другую → категории пересекаются по смыслу → разведи их описания или слей в одну; Sampling Temperature = 0 уменьшает разброс, но не убирает его.
  • Нет лога «текст → категория» → невозможно понять точность фильтра → пиши пары в Data table.
2.1
Добавь ноду Sentiment Analysis

На canvas нажми + справа от Chat Trigger. В поиске нод начни вводить sentiment → выбери Sentiment Analysis. Нода появится на canvas и автоматически подключится к триггеру.

2.2
Настрой поле Text to Analyze

В панели Input слева раскрой Chat Trigger → найди поле chatInput → перетащи его в поле Text to Analyze ноды.

В поле появится выражение {{ $json.chatInput }}.

Это текст сообщения, которое пользователь написал в чате. Sentiment Analysis стоит сразу после Chat Trigger, поэтому в $json лежит выход триггера, и chatInput — это стандартное имя поля с текстом сообщения в Chat Trigger.

📖Что такое expression в n8n и как она читает значения из других нодстатья · ~2 мин

Что такое expression

В n8n expression — это маленький кусочек кода в фигурных скобках, который динамически подставляет значение в поле ноды. Записывается так:

{{ <выражение> }}

В поле интерфейса = перед выражением писать не нужно: поле в режиме Expression уже трактует содержимое как выражение, а знак = n8n сам добавляет в файле воркфлоу (JSON) как маркер. Если напечатать = самому, он попадёт в результат текстом (например, сообщение начнётся с «=🚨»). Если поле осталось в режиме Fixed, {{ ... }} запишется как обычный текст.

Внутри {{ }} пишется JavaScript-выражение. Самое частое — чтение значения из другой ноды.

Зачем нужны expressions

Каждое поле в параметрах ноды может быть либо фиксированным значением (например, URL https://api.example.com), либо expression'ом — формулой, которая считается на лету в момент исполнения ноды. Expressions нужны, когда значение зависит от данных, пришедших из предыдущей ноды.

К примеру
Где это встречается

К примеру, ты сделал ноду «прочитать строку из таблицы конфига», а следующая нода — HTTP Request к внешнему API. В URL этой HTTP-ноды можно подставить значение из конфига: {{ $('Get Config').item.json.api_url }} — n8n при каждом исполнении возьмёт актуальный URL из таблицы, а не зашитый в ноду.

Как читать значения из других нод

Базовая формула: {{ $('<имя_ноды>').item.json.<поле> }}

Разбор по частям:

  • $('<имя_ноды>') — обращение к ноде по имени (то, что написано на холсте под нодой). Имя — в одинарных кавычках, точно как на холсте.
  • .item — текущий элемент, который обрабатывается. У большинства нод элементов несколько (массив), item берёт тот, что соответствует текущей итерации.
  • .json — содержимое поля json элемента (там лежат все данные, которые нода вернула).
  • .<поле> — конкретное поле внутри json. Если поле вложенное — пишется через точку: .config.embedding_model.

Пошагово — как вставить expression в поле

  1. Наведи курсор на поле и переключи Fixed → Expression в правом верхнем углу поля (или просто начни вводить {{ — поле само перейдёт в режим expression).
  2. В появившемся окне (expression builder) — слева список нод воркфлоу, можно кликать по полям и они вставятся в формулу.
  3. Справа — preview: видно, какое значение получится прямо сейчас. Если красным — формула или путь к полю некорректные.
  4. Закрой окно, поле остаётся в режиме expression (синий фон + иконка fx).
Типичная ошибка
Поле в режиме `Fixed` вместо `Expression`

Если вставил {{ ... }} в поле, которое осталось в режиме Fixed, n8n запишет текст {{ ... }} как есть, и нода уйдёт делать HTTP-запрос на URL вроде {{ $('...').item.json.api_url }} буквально. Симптом — ошибка Invalid URL или 404 на странную строку. Лечение: переключи поле в Expression. И наоборот, = в начале вручную не печатай — он попадёт в результат.

Типичные ошибки

  • Имя ноды не совпадает. В формуле $('Get Config') имя должно точно совпадать с подписью ноды на холсте. Если переименовал ноду — старые expressions, ссылающиеся на неё, сломаются.
  • Путь к полю не существует. .item.json.embedding_dimensions упадёт с undefined, если у элемента такого поля нет. Проверка — посмотри preview в expression builder, он сразу показывает значение или ошибку.
  • Поле осталось в режиме Fixed. Самая частая ошибка — описана в callout выше.
  • Кавычки внутри {{ }}. Внутри expression строки оборачиваются одинарными кавычками: {{ 'Hello ' + $json.name }}; двойные тоже работают. Поля с кириллицей и пробелами читаются как $json["Имя"].

Когда expression не нужен

Иногда поле должно быть фиксированным. Например, метод HTTP-запроса (GET / POST) или имя коллекции, которое одинаково для всего воркфлоу — нет смысла читать его динамически. Простое правило: если значение меняется от итерации к итерации или зависит от пришедших данных — нужен expression; если значение постоянное — оставляй фиксированным.

⚡Как передать данные из одной ноды в другую через drag-and-dropстатья · ~2 мин

Перетаскивание полей из Input panel

Когда нужно подставить значение из предыдущей ноды в параметр текущей, не пиши выражение вручную. Открой ноду двойным кликом. Слева откроется Input panel с деревом полей предыдущей ноды. Справа — node parameters.

Раскрой нужное поле в Input panel и перетащи его мышкой в parameter's field. n8n сам сформирует выражение и переключит поле из режима Fixed в Expression.

Как это работает

Input panel показывает данные из OUTPUT предыдущей ноды. Данные приходят в виде дерева: каждое поле можно раскрыть до примитива.

После drop в parameter's field появляется выражение в двойных фигурных скобках. n8n поддерживает два формата:

  • $json.<field> — когда данные идут напрямую из предыдущей ноды по главной ветке;
  • $('<NodeName>').item.json.<field> — когда нужно явно указать имя ноды-источника.

n8n сам определяет нужный item через item linking. Ручной поиск соответствия не требуется.

Поле автоматически окрашивается и переключается в режим Expression. Альтернатива — открыть expressions editor и написать то же выражение вручную. Результат идентичен.

Вложенные поля раскрываются через точку: $json.body.city.

Правило одной строкой
Перетаскивай только до примитива

Если перетащить объект-обёртку, в поле попадёт [object Object]. Всегда раскрывай дерево до конечного значения.

Типичные ошибки

  • Перетащил объект-обёртку вместо примитива → в поле уходит [object Object] → раскрой дерево до листа.
  • Дропнул в соседнее поле параметра (Text вместо Chat ID) → нода работает не на тех данных → визуально проверь куда легло выражение.
  • Переименовал ноду уже после drag-and-drop → expression $('старое имя') сломался → верни старое имя или перепиши выражение вручную.
  • Впечатал статичное значение через drag вместо обычного текста → лишнее выражение там где значение не меняется → для констант просто впечатывай текст.
  • Тащишь из ноды через ветку которая не выполнялась → expression вернёт undefined → проверь что нужная ветка реально дошла до текущей ноды.
📖Fixed и Expression — два режима любого поля ноды в n8nстатья · ~2 мин

Fixed и Expression — два режима любого поля ноды в n8n

Каждое поле в Parameters любой ноды работает в одном из двух режимов. В режиме Fixed значение отправляется ровно так, как ты его написал. В режиме Expression значение пересчитывается на каждом item по JavaScript-формуле внутри {{ }}.

Переключатель Fixed | Expression находится справа от поля. Слева — кнопка Focus parameter и три точки с пунктом Reset Value. Никакой шестерёнки и пункта Add Expression в n8n v2 уже нет.

Как это работает

Режим Fixed — значение статично. Ты пишешь текст, число или выбираешь опцию из списка, и нода отправит именно это.

Режим Expression — значение динамическое. n8n показывает знак = слева от поля, оранжевую подсветку, блок Result и Item, а также кнопку Edit Expression. Формула выполняется заново для каждого входящего item.

Переключить режим можно двумя способами:

  • кликнуть Expression в radiogroup справа от поля;
  • перетащить поле из панели Input прямо в целевое поле параметра — n8n сам включит Expression и подставит {{ $json.field }} или {{ $('Имя ноды').item.json.field }}.

Переключатель есть в текстовых полях, выпадающих списках и в resource locator (там он появляется третьим табом).

Выбирай Expression, когда значение зависит от данных или времени. Оставляй Fixed, когда значение всегда одинаковое.

Правило одной строкой
Режим выбирается справа от поля

Чтобы включить динамическое значение — кликни Expression справа или перетащи поле из Input. Чтобы вернуть статичное — кликни Fixed.

Типичные ошибки

  • Написал {{ $json.name }} в режиме Fixed → n8n отправит литеральную строку со скобками → переключи справа на Expression или перетащи поле из Input заново.
  • Переключил Expression → Fixed в resource locator → выбранный объект исчез → вернись в Expression и подставь id формулой или заново выбери из From list в Fixed.
  • Ищешь шестерёнку слева по старым инструкциям → её нет в n8n v2 → используй radiogroup Fixed | Expression справа от поля.
  • Перетащил поле из Input, но режим не сменился → отпустил над зоной Drag input fields here соседнего параметра → отпускай строго над нужным полем.
  • Написал формулу без знака = → n8n считает её текстом → кликни Expression справа, тогда = появится автоматически.
📖$json или $('Имя ноды'): когда какая форма обращения к даннымстатья · ~2 мин

Две формы обращения — разница только в источнике

В n8n у одной и той же ноды есть две формы прочитать поле из данных воркфлоу:

{{ $json.business_idea }}
{{ $('Form Trigger').item.json.business_idea }}

Обе достают одно и то же значение, но смотрят в разные места:

  • $json — это выход ноды, которая стоит прямо перед текущей. Короткая форма для «возьми поле из предыдущей ноды».
  • $('Имя ноды') — это обращение к любой ноде воркфлоу по имени, в том числе к той, что стоит на 2-3-5 шагов раньше.

Когда писать какую

Правило простое:

  • Хочешь взять данные у предыдущей ноды (стрелка идёт прямо в текущую) — пиши $json.поле.
  • Хочешь дотянуться до ноды глубже по цепочке (между ней и текущей есть промежуточные ноды) — пиши $('Имя ноды').item.json.поле.
Пример
Цепочка из трёх нод

Цепочка: Form Trigger → OpenAI → Send Message.

В Send Message обращения к двум разным источникам выглядят так:

  • к ответу OpenAI (предыдущая нода): ={{ $json.output }}
  • к полю формы (нода на два шага назад): ={{ $('Form Trigger').item.json['Email'] }}

Если в Send Message написать ={{ $json['Email'] }} — поле не найдётся, потому что у OpenAI в выходе нет Email. Это типичная ошибка студентов.

Почему короткая форма вообще существует

$json — это просто синоним для $input.item.json, то есть «текущий обрабатываемый элемент входа». А вход текущей ноды формируется из выхода предыдущей. Поэтому $json.поле и $('Предыдущая нода').item.json.поле всегда дают одно и то же значение — пока стрелка идёт напрямую.

$('Имя ноды') нужна там, где короткая форма не справится: между источником и текущей нодой есть промежуточные шаги, которые этого поля уже не передают (например, OpenAI вернул только текст ответа, и поле формы Email к моменту Send Message живёт только в выходе Form Trigger).

Типичные ошибки

  • Написал $json.Email в ноде после OpenAI. OpenAI возвращает output, а не Email. Решение — обратиться по имени: $('Form Trigger').item.json['Email'].
  • Имя ноды в $('...') не совпадает с подписью на canvas. В expression имя — буквально то, что написано под нодой на canvas. Переименовал ноду — все старые expressions, ссылавшиеся на её прежнее имя, сломаются.
  • Забыл .item после имени ноды. Полная форма — $('Имя').item.json.поле. Без .item обращаешься не к данным, а к самой ноде как объекту — поле не найдётся.
2.3
Проверь параметры Sentiment Analysis
Параметры Sentiment Analysis
ПараметрЗначение
Text to Analyze{{ $json.chatInput }}
(дефолтные категории)Positive, Neutral, Negative
2.4
Добавь sub-ноду OpenAI Chat Model

Закрой ноду. Под ней ты увидишь хвост с подписью Model*. Кликни на неё и в окне выбора ноды найди OpenAI Chat Model → выбери её.

🔀Что такое sub-нода в n8n и как её заменитьстатья · ~2 мин

Что такое sub-нода

В n8n AI-ноды устроены как «родитель + дети». Родитель — основная нода (AI Agent, Qdrant Insert, Qdrant Vector Store…). Дети — sub-ноды, которые подключаются к специальным кружкам на нижней стороне родителя. Каждая sub-нода — это «поставщик ресурса» для родителя.

AI Agent (родитель) с подключёнными sub-нодами Chat Model и Tool, и пустым слотом Memory

Какие бывают sub-ноды

  • Embeddings — поставляет векторы (OpenAI / Cohere / Voyage / Google Gemini / bge / …).
  • Chat Model — поставляет LLM для AI Agent, Basic LLM Chain и других AI-нод, например Guardrails.
  • Document Loader — поставляет «нарезанные» куски документа.
  • Text Splitter — внутри Document Loader, разбивает на чанки.
  • Memory — поставляет историю диалога для AI Agent.
  • Tool — поставляет инструменты, которые AI Agent может вызвать.

Когда родитель запускается (например, Qdrant Insert получил файл и собирается записать его в БД), он по очереди обращается к sub-нодам: «дай мне чанки», «переведи каждый чанк в вектор». Sub-ноды отвечают, родитель собирает результат.

Как выглядит sub-нода в параметрах родителя

Если открыть параметры родителя двойным кликом — справа выезжает панель параметров, а на нижней границе панели видны кружки sub-нод. Подключённая sub-нода показана как круглый цветной индикатор с иконкой провайдера. При наведении — всплывающая подсказка с именем и статусом.

Панель параметров ноды Qdrant Insert TXT — на нижней границе видны слоты Embedding и Document, к Embedding подключена sub-нода Embeddings (видна всплывающая подсказка)

Как заменить sub-ноду

  1. Закрой панель параметров родителя (Esc).
  2. На canvas найди подключённую sub-ноду — она расположена под родителем. Кликни на ней, нажми Delete (или правый клик → Delete). Sub-нода удалится, у родителя освободится слот.
  3. На родителе освободившийся слот покажет «+» (например, Add document embedding). Нажми — справа откроется список доступных sub-нод нужного типа.
Список доступных Embedding sub-нод: Cohere, AWS Bedrock, Azure OpenAI, Google Gemini, Google Vertex, Hugging Face и др.
  1. Выбери нужную sub-ноду — она автоматически подключится к родителю на освободившемся слоте.
  2. Заполни параметры новой sub-ноды (credential, модель, режим).
Важно
Заменяешь sub-ноду — проверь всех её родителей

Одну sub-ноду можно подключить к нескольким родителям: например, одну модель — к агенту и к цепочке Basic LLM Chain, одну ноду памяти — к агенту и к Chat Memory Manager (n8n 2.20.7). Тогда замена этой sub-ноды меняет поведение всех родителей сразу. А если у каждого родителя своя sub-нода (например, две ноды Qdrant Insert — для txt и для pdf — и у каждой своя Embeddings), заменить нужно в каждом родителе отдельно.

Воркфлоу после добавления всех нод
Воркфлоу после добавления всех нод
2.5
Настрой OpenAI Chat Model и проверь credential

В ноде OpenAI Chat Model поле Credential должен быть выбран OpenAi account (или то, как ты назвал credential)

🔑Как добавить credential в n8nстатья · ~1 мин

Универсальный процесс добавления credential

Credential в n8n — это сохранённая «учётка» для подключения к сервису (API-ключ, OAuth-токен, логин/пароль и т.д.). Любая нода, которой нужна авторизация, выбирает credential из общего списка — поэтому добавлять его нужно один раз, а использовать можно из любого количества нод того же типа.

Пошагово

  1. В левом меню n8n открой раздел Credentials.
  1. Нажми кнопку Add credential (правый верхний угол).
  1. В поиске введи название нужного типа credential — например, OpenAI, Header Auth, Postgres, Google — и выбери его из списка.
  1. В шапке формы дай credential понятное имя — например, OpenAI школа или Postgres prod. По этому имени ты будешь выбирать его в нодах.
  1. Заполни поля формы. Какие именно — зависит от типа: для API-ключевых это обычно одно поле API Key, для Header Auth — Name и Value заголовка, для Postgres — host/port/database/user/password, для OAuth — запуск OAuth-flow по кнопке.
  1. Нажми Save. Готово — credential можно подключать к любой ноде, которая поддерживает этот тип.
Подсказка
Один credential — много нод

Один сохранённый credential можно использовать в неограниченном количестве нод одного типа. Если ключ протухнет — поменяй его в credential один раз, обновится во всех нодах сразу.

Кстати
Какие поля заполнять у конкретного типа

Этот гайд — про универсальный процесс. Какие поля и какие значения вводить у конкретного credential (OpenAI API, Header Auth, Postgres и т.д.) — смотри в inline-статье на этот тип, она будет рядом со ссылкой на текущую.

2.6
Выбери модель deepseek-chat

В поле Model выбери модель deepseek-chat

2.7
Выключи переключатель Use Responses API

Это особенность работы со школьным ключем для нейросетей. Так как у через ноду OpenAi подключаются разные модели при включенном параметре нода может сломаться.

📖Responses API vs Chat Completions: два разных эндпоинта OpenAIстатья · ~3 мин

Два эндпоинта к одним моделям

У OpenAI два разных эндпоинта для одних и тех же моделей: /v1/chat/completions и /v1/responses. Оба принимают запросы к gpt-4o и другим моделям, но формат запроса и ответа у них несовместим.

Chat Completions — старый и до сих пор поддерживаемый путь. Responses API — новый интерфейс, который OpenAI рекомендует для агентских сценариев.

Ключевое отличие не в модели, а в том, как ты передаёшь данные и хранишь контекст.

Как это работает

Chat Completions принимает массив messages. В ответе модель возвращает одно сообщение в choices[0].message. Всю историю разговора клиент должен хранить и отправлять заново при каждом запросе.

Responses API использует параметр input — это может быть строка или массив typed items. Поле instructions вынесено отдельно от сообщений. В ответе приходит массив typed output items (message, reasoning, function_call и другие).

Responses поддерживает stateful-цепочки через previous_response_id: OpenAI хранит предыдущие сообщения на своей стороне. Токены предыдущих запросов при этом всё равно учитываются при биллинге.

В Responses встроены инструменты Web Search, File Search и Code Interpreter — их можно включить без написания собственных функций.

В n8n-ноде OpenAI Chat Model есть переключатель Use Responses API, который меняет эндпоинт запроса. Через школьный прокси LiteLLM результат зависит от ноды, к которой подключена модель: AI Agent отвечает в обоих положениях, но с включённым переключателем n8n записывает в выполнение только оценку расхода — tokenUsageEstimate, где токены ответа модели всегда 0; Text Classifier с включённым переключателем падает на каждом элементе. С выключенным переключателем запрос идёт на /v1/chat/completions, и в выполнении виден настоящий расход — блок tokenUsage. Поэтому в задачах школы переключатель выключают всегда.

Это именно разные эндпоинты: формат Chat Completions, отправленный на /v1/responses, не сработает, и наоборот.

Правило одной строкой
Разные форматы — разные эндпоинты

Выбор эндпоинта определяет структуру запроса и ответа. Модель при этом остаётся той же. Передача полей input, instructions или previous_response_id на /v1/chat/completions приводит к ошибке валидации.

Типичные ошибки

  • Оставили Use Responses API включённым при работе через школьный LiteLLM-прокси → у AI Agent в выполнении нет настоящего расхода токенов, только оценка с нулём на ответе, а Text Classifier падает на каждом элементе → выключи переключатель.
  • Перенесли готовый воркфлоу с прямого OpenAI на прокси и не тронули тоггл → часть нод падает, у остальных пропадает настоящий расход токенов → проверь состояние переключателя в каждой OpenAI-ноде.
  • Передали в запрос к /v1/chat/completions поля input, instructions или previous_response_id → ошибка валидации или поля просто игнорируются → используй только массив messages и храни историю на стороне клиента.
  • Решили, что Responses API нужен только для новых моделей → gpt-4o доступен по обоим эндпоинтам, разница только в формате → не путай выбор эндпоинта с выбором модели.
⚙LiteLLM-прокси школы — единый шлюз для платных моделейстатья · ~2 мин

Один URL вместо ключей всех провайдеров

LiteLLM-прокси — это единый шлюз, который принимает запросы в формате OpenAI и пересылает их к разным платным моделям: OpenAI, Anthropic, DeepSeek, Cohere и другим. Студент работает только с одним адресом и одним набором настроек.

Школа поднимает прокси, чтобы все студенты ходили через общий счёт. Школа платит провайдерам по одному договору и видит расход токенов каждого студента по отдельности. Студенту не нужно заводить личные billing-аккаунты и следить за лимитами.

OpenAI-совместимый интерфейс позволяет использовать прокси в n8n и SDK без изменений кода. Ноды и библиотеки отправляют запросы на школьный адрес, а не напрямую на api.openai.com.

Как это работает

В n8n credential OpenAi account указывает Base URL школьного прокси. Все запросы к моделям DeepSeek, Claude и остальным идут через этот credential. Модель указывается в параметре model как обычно.

Прокси не хранит модели у себя. Он только маршрутизирует запросы к внешним API и возвращает ответы. Поэтому он не заменяет self-hosted решения вроде Ollama.

Прямой ключ провайдера нужен только в двух случаях: когда требуется Assistants API или когда нужны параметры, которые прокси ещё не поддерживает. В остальных задачах весь трафик идёт через OpenAi account.

Правило одной строкой
Прокси — это маршрутизатор, а не модель

LiteLLM-прокси не запускает модели локально и не добавляет новых провайдеров. Он принимает OpenAI-формат и пересылает запросы дальше.

Типичные ошибки

  • Считаешь OpenAi account отдельной моделью → запрос уходит не туда → выбирай имя модели из списка, который даёт школа.
  • Меняешь значение model на имя из документации провайдера → модель не находится → уточняй у школы, какое имя доступно через прокси.
  • Пытаешься вызвать Assistants API через прокси → запрос падает → используй прямой ключ OpenAI.
  • Думаешь, что личный ключ запрещён → можно использовать, но по умолчанию весь учебный трафик должен идти через OpenAi account.
  • Путаешь прокси с self-hosted моделью → ждёшь, что модели работают без интернета → LiteLLM только пересылает запросы к платным API.
2.8
Проверь параметры ноды
Параметры OpenAI Chat Model
ПараметрЗначение
CredentialOpenAi account
Model (режим)From list
Model (значение)deepseek-chat
Use Responses APIoff

Связка настроена. Теперь её нужно протестировать.

2.9
Запусти Execute step на Sentiment Analysis

В параметрах ноды нажми кнопку Execute step в правом верхнем углу.

Нода выполнится на запиненных данных триггера:

возьмёт текст из chatInput → отправит в OpenAI Chat Model → получит JSON с категорией → направит данные в одну из трёх веток (Positive / Neutral / Negative).

📖Кнопка «Execute step»: запуск одной ноды без всего воркфлоустатья · ~2 мин

Запустить одну ноду, не дёргая весь workflow

Execute step — это кнопка внутри панели ноды (открывается двойным кликом по ноде). По смыслу — младший брат большой кнопки Execute workflow внизу холста: та запускает весь воркфлоу с начала, эта — только текущую ноду. Удобно, когда настраиваешь параметры и хочешь сразу видеть, что отдаёт нода, не перезапуская всю цепочку.

Как это работает

Когда ты жмёшь Execute step, n8n берёт уже существующие данные на входе ноды (output предыдущей ноды из последнего прогона) и прогоняет через эту ноду. Сама нода выполняется реально: HTTP-запрос уходит, запись в базу пишется, письмо отправляется. Это не «сухой прогон», а полноценное выполнение — только одного шага.

  • key: Execute workflow

value: Запускает весь воркфлоу от триггера. Нужен полный прогон с самого начала. Каждый раз заново дёргает все API.

  • key: Execute step

value: Запускает только эту ноду. Берёт вход из последнего output предыдущей ноды. Идеально для подбора параметров и отладки.

  • key: Когда работает

value: Только если на входе ноды есть данные с прошлого прогона. Если ни разу не запускал предыдущие — кнопка либо ничего не вернёт, либо упадёт «No input data».

Типичный сценарий: запустил весь воркфлоу один раз (Execute workflow), увидел что нода HTTP Request отдаёт не то, поправил поле URL, нажал Execute step — увидел новый результат за секунду. Предыдущие ноды повторно не выполнялись.

У триггеров кнопка называется иначе
Смысл тот же — запустить один шаг и получить тестовое событие

У некоторых триггерных нод n8n кнопка Execute step подписана по-другому, потому что у триггера нет «входа» — он сам должен сходить за событием. Например, у RSS Trigger она называется Fetch Test Event: клик подтянет последние записи из ленты и положит их на выход ноды как тестовый input для остального воркфлоу. Работает идентично Execute step обычной ноды — точно так же используется для отладки и подбора параметров без полного прогона.

Важно про побочные эффекты
Каждый Execute step — это реальный вызов

Нода с записью в базу или отправкой сообщения каждое нажатие Execute step делает реально: 5 нажатий = 5 записей / 5 писем. Для отладки таких нод используй тестовые данные или подменяй credentials.

Типичные ошибки

  • Жать Execute step на ноде, у которой ещё не было входных данных → «No input data», нода не запустится. Сначала прогони весь воркфлоу через Execute workflow или хотя бы триггер вручную, чтобы у каждой ноды появился output.
  • Использовать Execute step для проверки изменений в предыдущих нодах → текущая нода работает со старым output, изменения не подхватятся. Если поправил предыдущую ноду — перезапусти её, а потом уже текущую.
  • Тестировать ноду с побочным эффектом (запись в БД, отправка письма) на проде → каждый клик создаёт реальную запись. Использовать тестовый credential или временно подменять параметры на безопасные.
Готовый workflow: Chat Trigger → Sentiment Analysis (с тремя выходами Positive/Neutral/Negative) ← OpenAI Chat Model снизу через коннектор Model
Готовый workflow после шага 2 — три ноды, sub-нода подключена снизу
3Добавь ноду Chat -> Send Message

Для того, чтобы отправлять ответ обратно в чат нужно использовать ноду Send Message. В первом шаге мы выбрали в триггере опцию Response Mode = Using response node, то есть используя ноду для ответа.

Это и есть та нода для ответа.

3.1
Добавь ноду на канвас

На canvas нажми + справа от Sentiment Analysis. В поиске нод начни вводить chat → среди результатов выбери Send Message.

3.2
Соедини ветку Positive с нодой Chat

На canvas потяни мышкой от первого выхода Sentiment Analysis (помечен Positive) к ноде Send Message. Между ними появится стрелка-соединение.

Это значит, что когда модель определит сообщение как позитивное — данные пойдут именно по этой ветке и попадут в Send Message.

3.3
Соедини ветку Neutral с нодой Chat

Точно так же потяни от второго выхода Sentiment Analysis (помечен Neutral) к той же Send Message. Получится вторая стрелка, идущая в ту же ноду.

Все три ветки сходятся в одной Send Message — это нормально для n8n, в ноду может приходить несколько входящих соединений.

3.4
Соедини ветку Negative с нодой Chat

Аналогично потяни от третьего выхода Sentiment Analysis (помечен Negative) к Send Message. На canvas появится третья стрелка.

Теперь любое из трёх настроений попадёт в нашу ноду чата.

Все три ветки Sentiment Analysis должны вести в ноду Chat
Все три ветки Sentiment Analysis сведены в одну Send Message
3.5
Настрой поле Message

В панели Input слева раскрой Sentiment Analysis → найди поле sentimentAnalysis → внутри него найди поле category → перетащи его в поле Message ноды Chat.

В поле появится выражение {{ $json.sentimentAnalysis.category }}, его фон станет зелёным.

Это категория настроения (Positive, Neutral или Negative), которую вернула модель в ноде Sentiment Analysis. На каждой из трёх веток $json уже содержит результат своей ветки, поэтому в чат улетит именно та категория, по которой сработала текущая ветка.

3.6
Проверь параметры Chat

Проверь, чтобы параметры ноды соответствовали таблице ниже.

Параметры Chat
ПараметрЗначение
OperationSend Message
Message{{ $json.sentimentAnalysis.category }}
Optionsпусто (No properties)

Нода настроена. Теперь нужно протестировать всю цепочку и убедиться, что Chat возвращает категорию в чат.

3.7
Запусти Execute step на ноде Chat

В параметрах ноды Chat нажми кнопку Execute step в правом верхнем углу.

Нода возьмёт данные с категорией от Sentiment Analysis (она уже запинена с прошлых шагов) и отправит сообщение с категорией обратно во встроенный чат n8n.

Готовый workflow: Chat Trigger → Sentiment Analysis (с тремя выходами Positive/Neutral/Negative) → Chat (Send Message), все ноды с галочками после end-to-end прогона
Готовый workflow после шага 3.7 — четыре ноды, все с галочками после Execute step

Все, воркфлоу собран. Можешь потестировать его, а потом выполнить Stretch (задачу со звездочкой)

🚀Stretch

Сейчас Sentiment Analysis работает с тремя стандартными категориями — Positive, Neutral, Negative. Это базовый набор, который подходит для общей задачи «отличить хорошее от плохого». В реальной работе с обратной связью полезнее свои категории, заточенные под конкретный сервис: например, отдельно «похвала», «жалоба на цену», «жалоба на скорость доставки», «не по теме».

Замени стандартные категории на свои четыре в параметре Sentiment Categories ноды Sentiment Analysis. Названия выходов на canvas автоматически подтянутся под новые категории — увидишь как меняется поведение классификатора, когда меняется сама шкала, по которой он мыслит.

Тест-кейсы

ВходОжидаем
«Какой прекрасный день! Я так счастлив!»Sentiment Analysis возвращает {sentimentAnalysis: {category: "Positive"}}, данные идут через ветку Positive.
«Я просто пошёл в магазин за хлебом.»Sentiment Analysis возвращает category: "Neutral", данные идут через ветку Neutral.
«Ужасный сервис, вы мне всё испортили, верните деньги!»Sentiment Analysis возвращает category: "Negative", данные идут через ветку Negative.
«Пицца была ничего, но курьер нахамил и опоздал на час.» (смешанные эмоции)Sentiment Analysis выбирает доминирующую эмоцию (Negative или Neutral) и направляет данные строго в один выход. Любая из двух веток валидна — модель сама решает.
«I am absolutely thrilled with the results!» (английский)Sentiment Analysis возвращает category: "Positive" — модель понимает другие языки.
Помощь
Застрял где-то по ходу? Покажи в учебном чате скрин ноды и текст ошибки — разберёмся.
Написать в чат
Собрал воркфлоу? Сдай на ревью
Это демо — задачу можно прочитать целиком. Свой n8n, сдача на ревью и разбор открываются в аккаунте. Заведи аккаунт — модуль M0 бесплатно.

Можно аналитические cookie?

Аналитические cookie ставим только с твоего согласия: они помогают понять, что работает. Откажешься — аналитика обойдётся без них. Подробности — в политике обработки персональных данных.