У нас есть рабочий воркфлоу из 15 нод. Он делает простую вещь: читает таблицу, генерирует текст через GPT, отправляет в Telegram. 15 нод для этого - перебор. Но прежде чем трогать код - нужно понять, почему каждая нода существует, что в ней кастомизировано, и какие edge cases она обрабатывает. Вот план.

Зачем вообще рефакторить рабочий воркфлоу

Кстати, хороший вопрос. Воркфлоу работает. Запускается в 7 утра, присылает брифинг, помечает события как отправленные. Зачем трогать?

Три причины:

  1. Дебаг. Когда что-то ломается (а оно ломается - мы это только что пережили), вы ищете проблему в 15 местах. В 9 местах - быстрее
  2. Понимание. Через 3 месяца вы откроете этот воркфлоу и увидите "Get Dates Morning", "Build Morning Data", "Build Morning Context" - три ноды подряд. И спросите: а почему они разделены? Ответ: потому что так получилось. Не потому что так правильно
  3. Расширение. Хотите добавить Google Calendar как источник событий? С 15 нодами это ещё одна ветка, ещё один merge. С 9 нодами - просто дополнительный блок в одной ноде
15 → 9нод в воркфлоу
6нод можно убрать
~5 секэкономия на запуск

Экономия 5 секунд на воркфлоу, который запускается раз в день в 7 утра, пока вы спите - ноль ценности. Упрощение ради дебага и понимания - реальная ценность

Текущая архитектура: 15 нод

Сейчас

Schedule 07:00
  ↓
Get Dates Morning         ← Code: вычисляет today, tomorrow
  ↓
Read Events Sheet         ← HTTP: Google Sheets API
  ↓
Build Morning Data        ← Code: фильтрует события
  ↓
Read Calendar Events      ← HTTP: Google Calendar (отключена)
  ↓
Merge Calendar + Sheet    ← Code: мержит два источника
  ↓
Build Morning Context     ← Code: собирает промпт + французские слова
  ↓
GPT Morning Brief         ← HTTP: OpenAI API
  ↓
Merge Morning GPT         ← Code: вставляет слова в ответ + sanitize HTML
  ↓
Send Morning Brief        ← HTTP: Telegram
  ↓
Build Notified Payload    ← Code: формирует JSON
  ↓
Mark Today Notified       ← HTTP: Google Sheets batchUpdate
  ↓
Check Advance Events      ← Code: проверяет 48ч вперед
  ↓
Send Advance Alert        ← HTTP: Telegram
  ↓
Mark Advance Flags        ← HTTP: Google Sheets batchUpdate

Смотрите на это. 6 Code-нод, 6 HTTP-нод, 1 Schedule, 1 отключённая нода, 1 merge. Из 6 Code-нод - четыре идут подряд в начале цепочки. Каждая берёт выход предыдущей и делает следующий шаг подготовки данных

Это как четыре повара, которые по очереди солят один суп. Может справиться один

Целевая архитектура: 9 нод

После рефакторинга

Schedule 07:00
  ↓
Read Events Sheet         ← без изменений
  ↓
Prepare Context           ← НОВАЯ: даты + фильтрация + контекст + промпт
  ↓
GPT Morning Brief         ← промпт уже содержит все данные
  ↓
Send Morning Brief        ← sanitizeTgHtml встроена
  ↓
Mark Today Notified       ← payload через expression
  ↓
Check Advance Events      ← без изменений
  ↓
Send Advance Alert        ← без изменений
  ↓
Mark Advance Flags        ← без изменений

Что убираем и почему

Get Dates Morning Вычисляет today и tomorrow. Две строчки кода. Переезжают в начало Prepare Context.
Build Morning Data Фильтрует события по дате, приоритету, типу. Основной блок логики, но он работает с данными из предыдущей ноды - нет причины держать отдельно. Переезжает в Prepare Context.
Merge Calendar + Sheet Мержит Calendar + Sheets данные. Calendar сейчас отключён. Когда включится - мерж будет частью Prepare Context.
Build Morning Context Собирает промпт для GPT, добавляет французские слова, chatId. Переезжает в Prepare Context. Французские слова идут прямо в промпт, GPT их оформляет.
Merge Morning GPT Вставляет французские слова в ответ GPT + sanitizeTgHtml. Если слова в промпте - вставка не нужна. sanitize переезжает в Send Morning Brief.
Build Notified Payload Формирует JSON для Google Sheets batchUpdate. Можно сделать expression-ом прямо в HTTP-ноде Mark Today Notified.

Что НЕ трогаем

Schedule 07:00 Триггер. Трогать нечего.
Read Events Sheet HTTP-вызов к Google Sheets API. Работает.
GPT Morning Brief HTTP-вызов к OpenAI. Меняем только промпт (добавляем французские слова).
Check Advance Events + Send Advance Alert + Mark Advance Flags Отдельная логика для предупреждений за 48 часов. Работает, не пересекается с основной цепочкой.

Что создаём

Prepare Context Объединяет 4 ноды в одну. Вычисляет даты, фильтрует события, собирает промпт с французскими словами, формирует контекст для GPT. Это самая большая нода - и самая рискованная при рефакторинге.

Главное правило: исследование до кода

Не начинайте рефакторинг с написания кода. Начните с чтения. Прочитайте каждую Code-ноду целиком. Найдите кастомизации. Поймите edge cases. Только потом пишите.

Вот конкретный чек-лист - что проверить перед тем, как написать первую строку:

Почему это важно? Потому что в Build Morning Context может лежать массив из 30 дней французских слов, который редактировали вручную. Или в Build Morning Data может быть фильтр, который обрабатывает recurrence-правила для еженедельных событий. Потеряете нюанс при объединении - воркфлоу будет работать, но неправильно. А заметите это через неделю

Риски и как их снизить

Вероятность что заработает с первого раза: 70-75%.

Не 100% - потому что 4 Code-ноды, которые объединяются, содержат скрытую логику. Не 50% - потому что задача простая: прочитать, отфильтровать, отправить

Как снизить риск:

Когда НЕ стоит делать рефакторинг

Кстати, знаете что? Иногда ответ - "не трогай"

Рефакторинг оправдан когда: нужно добавить новый источник данных (Calendar), часто ломается и долго дебажить, или архитектура мешает понять что происходит

В нашем случае все три причины на месте. Но мы всё равно сначала исследуем, потом делаем. Не наоборот

FAQ

Когда стоит делать рефакторинг n8n воркфлоу?

Когда воркфлоу сложно дебажить (слишком много нод для простой задачи), когда нужно добавить новую функцию и текущая архитектура мешает, или когда несколько Code-нод подряд передают данные друг другу без веской причины. НЕ стоит - ради экономии секунд на воркфлоу, который запускается раз в день

Как безопасно объединить несколько Code-нод в одну?

Сначала прочитать ВСЕ ноды целиком. Найти кастомизации (пользователь мог менять промпт, список данных). Понять edge cases (что если данных 0? что если дата невалидная?). Только потом писать объединённую ноду. Тестировать на реальных данных, не на моках

Какие ноды в n8n нельзя объединять?

HTTP-ноды (Sheets, Telegram, OpenAI) - каждая делает внешний вызов, их не объединить. Code-ноды, которые работают с разными контекстами (данные до GPT и после GPT). Ноды с разной частотой ошибок - если одна падает часто, лучше изолировать для дебага

Ключевые выводы

  • 15 нод для "прочитай таблицу, сгенерируй текст, отправь" - overengineering
  • Упрощать ради дебага и понимания, не ради секунд
  • Исследование до кода: прочитать ВСЕ ноды, найти кастомизации, понять edge cases
  • 4 Code-ноды подряд = 1 Code-нода. Но только если вы поняли каждую
  • HTTP-ноды не трогаем, Code между ними - объединяем
  • Сохранить оригинал перед рефакторингом. Всегда
  • Вероятность успеха 70-75%. Остальные 25% - нюансы кастомизаций

Ваши воркфлоу разрослись?

Бот проанализирует ваш сайт и покажет, где автоматизация с правильной архитектурой даст максимальный эффект

Бесплатный анализ сайта

Больше инсайтов - в соцсетях

Закулисье, разборы, кейсы и то, что не попадает в блог

Instagram Facebook