Агент контент-плана

При подготовке курса агент за один запуск составил для кофейни «Зерно» план на две недели: 6 постов с 14 по 25 октября, рубрики по очереди, все темы легли строками в таблицу. Выдуманных фактов в плане не нашлось. Зато три темы из шести оказались про новый сорт. В этом уроке вы соберёте такого же агента, разберётесь, как ответ модели превращается в строки таблицы, и узнаете, как сделать темы разнообразнее.

Чему научитесь в этом уроке:
• создать в n8n таблицу данных для контент-плана с колонкой статуса;
• написать системное сообщение, после которого модель отвечает списком тем в формате JSON;
• разрезать ответ модели на строки узлом Code и записать их в таблицу;
• заметить однообразный план и поправить промпт.

Тетрадь заказов на стойке

В кофейне на стойке часто лежит тетрадь: на каждой строке дата, что заказали и отметка «готово». Бариста не держит заказы в голове. Он открывает тетрадь, берёт первую строку без отметки и ставит отметку, когда заказ отдан.

Таблица данных n8n (Data Table) устроена так же. Она хранится внутри самого n8n, отдельный сервис подключать не нужно. В ней есть колонки с названиями и строки, которые сценарии умеют добавлять, искать и менять. В треке 2 похожую роль играли таблицы в уроке «Задачи». Наш контент-план будет такой тетрадью: агент плана записывает темы, а копирайтер из следующего урока берёт по одной.

Создайте таблицу данных: на странице проекта (Personal) откройте вкладку Data tables и нажмите Create data table справа вверху. Назовите таблицу «Контент-план кофейни». Добавьте пять колонок, у всех тип текстовый (string). Колонку id добавлять не нужно: таблица создаёт её сама и нумерует строки. Дату тоже храните текстом, например «14.10»:

  • date: день выхода поста, например 14.10;
  • rubric: рубрика: «Новинка», «Как мы варим» или «Гости и город»;
  • topic: тема поста одной фразой;
  • status: где сейчас эта тема в работе;
  • post: готовый текст поста, пока пусто.

Зачем колонка status

Статус играет роль отметки в тетради. Без неё конвейер не поймёт, какую тему уже написали, а какую нет, и может взять одну и ту же дважды. Путь у темы такой:

  1. new: тема в плане, её ещё никто не трогал;
  2. in_progress: копирайтер взял тему в работу;
  3. published: пост вышел в канал;
  4. rejected: вы отклонили черновик.

Сейчас агент плана ставит всем строкам только new. Статус published и отказ появятся в уроке 3.5, где вы одобряете пост кнопкой в Telegram, а in_progress поставим в уроке 3.3: он защищает от повторных постов, если запуск упал на полпути.

Таблица данных n8n «Контент-план кофейни» сразу после агента плана: колонки id, date, rubric, topic, status, post; шесть строк с 14.10 по 25.10, рубрики «Новинка», «Как мы варим», «Гости и город» по кругу, у всех строк status new, колонка post пустая.

Системное сообщение агента плана

Создайте сценарий: Manual Trigger (запуск вручную) и после него Basic LLM Chain с именем «Агент контент-плана». Модель та же, что в уроке 3.1; при подготовке курса это была google/gemini-3.6-flash через CloseRouter. В системное сообщение вставьте:

Ты контент-менеджер кофейни «Зерно» (Тверь). Составь контент-план на 6 постов на ближайшие 2 недели.
Рубрики по кругу: «Новинка», «Как мы варим», «Гости и город».
Опирайся только на факты: с 14 октября новый сорт Эфиопия Иргачеффе (светлая обжарка, черника и жасмин), фильтр-кофе 220 ₽; кофейня на ул. Трёхсвятской; есть выпечка. Других фактов не придумывай.
Верни только JSON-массив без пояснений: [{"date":"ДД.ММ","rubric":"...","topic":"тема одной фразой"}].

В сообщение пользователя хватит одной строки: Составь контент-план.

Третья строка промпта повторяет блок фактов из брендбука, который вы собрали в уроке 3.1. Без него агент плана может придумать тему вроде «наш новый раф с карамелью» (пример условный), и копирайтер честно напишет пост о напитке, которого нет. Выдумку проще не пустить в план, чем потом вылавливать в готовом тексте. Меняете факты в брендбуке, меняйте их и здесь.

Почему просим JSON

Обычным текстом модель напишет план красиво: заголовок, нумерация, пояснения к каждой теме. Человеку такой план удобно читать, а n8n не поймёт, где кончается дата и начинается тема. JSON похож на бланк с подписанными полями: у каждой темы есть поле date, поле rubric и поле topic. Квадратные скобки означают список таких бланков. Имена полей в промпте совпадают с названиями колонок таблицы, и позже это сэкономит вам ручную настройку.

Даже с просьбой «только JSON» модель иногда добавляет перед списком фразу вроде «Вот ваш план:» или обрамляет его служебными значками разметки. Поэтому между моделью и таблицей стоит узел Code.

Узел Code «Строки плана»

Добавьте после агента узел Code (он выполняет небольшую программу на JavaScript) и назовите его «Строки плана». Вставьте код целиком, кнопкой копирования над блоком. Руками его не набирайте: одна пропущенная скобка, и узел упадёт.

const raw = $input.first().json.text || '';
const arr = JSON.parse(raw.replace(/^[^\[]*/, '').replace(/[^\]]*$/, ''));
return arr.map(p => ({ json: { ...p, status: 'new', post: '' } }));

Что делает каждая строка:

  1. Берёт текст ответа модели.
  2. Отрезает всё до первой квадратной скобки и всё после последней. Остаётся сам список, без «Вот ваш план» и лишних значков. Затем превращает текст в настоящий список тем.
  3. Каждую тему делает отдельной строкой и дописывает к ней два поля: status со значением new и пустой post.

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

Запись в таблицу

Последний узел, Data Table, назовите «В таблицу плана». Выберите операцию Insert (добавить строку) и таблицу «Контент-план кофейни». В настройке полей выберите Map Automatically: n8n сам разложит поля по колонкам с теми же именами. Поэтому date, rubric и topic в промпте написаны латиницей и точно так же, как в таблице.

Нажмите Execute workflow и откройте таблицу. При подготовке курса в ней появились 6 строк на 14–25 октября, рубрики шли по кругу, у всех статус new.

Проверяем план глазами

Прочитайте темы подряд, как подписчик будет читать канал две недели. В прогоне курса фактов вне списка не было, но новый сорт встретился в трёх темах из шести. Модель не нарушила ни одного правила: новый сорт стоит в фактах первым и выглядит самым интересным, поэтому она к нему и возвращается. Подписчику три поста про один сорт за две недели быстро надоедят.

Приём против этого: прямо ограничить повтор в системном сообщении и подсказать, о чём ещё можно писать. Например, добавьте строку:

Каждый факт — не больше чем в двух темах. Чередуй: новый сорт, фильтр-кофе, выпечка, улица и гости.
В прогоне курса эту строку не проверяли. Запустите план с ней и без неё и сравните, сколько тем пришлось на новый сорт. Если повтор остался, назовите в промпте темы, которые хотите видеть, хотя бы по одной на рубрику.

Если не получилось

  • Code падает с ошибкой разбора JSON. Откройте вывод агента и посмотрите текст целиком. Чаще всего модель оборвала ответ или добавила пояснение внутри списка. Повторите запуск и проверьте, что в промпте есть «Верни только JSON-массив без пояснений».
  • Строки в таблице есть, а колонки пустые. Имена полей в ответе не совпадают с колонками: например, модель написала «Дата» вместо date. Проверьте пример в последней строке промпта и названия колонок в таблице, буква в букву.
  • В таблице одна строка вместо шести. Проверьте, что в последней строке кода стоит arr.map: именно он делает из списка отдельные строки.
  • После повторного запуска строк стало двенадцать. Insert каждый раз добавляет новые строки. Удалите лишние в таблице вручную перед следующим запуском. Помните, что следующие уроки берут темы из этой таблицы по одной: перед практикумом 3.7 план нужно будет составить заново.

Контрольный вопрос. Зачем в системном сообщении агента плана просят вернуть ответ JSON-массивом?

АТак модель пишет темы короче
БТак n8n может разложить каждую тему по колонкам таблицы
ВТак модель перестаёт выдумывать факты
ГТак план можно сразу опубликовать в канале

Подсказка: Подумайте, кто читает ответ модели после неё: человек или следующий узел сценария.

На курсе задания проверяются автоматически. Подобрать курс

Контрольный вопрос. Агент только что записал план в таблицу. Какой статус стоит у новых строк?

Аin_progress
Бpublished
Вnew
Гrejected

Подсказка: Вспомните, что дописывает к каждой теме узел «Строки плана».

На курсе задания проверяются автоматически. Подобрать курс

Контрольный вопрос. Что делает узел Code «Строки плана»? Выберите все подходящие.

Выберите все верные варианты.

АПроверяет темы на выдуманные факты
БОтрезает текст до и после списка в ответе модели
ВПревращает каждую тему в отдельную строку
ГДописывает поля status и post
ДОтправляет план в Telegram

Подсказка: Пройдитесь по трём строкам кода по очереди. Проверки фактов и отправки там нет.

На курсе задания проверяются автоматически. Подобрать курс

Задание. МИССИЯ «Тетрадь на две недели». Создайте в n8n таблицу данных для контент-плана своего бизнеса или бизнеса клиента с колонками date, rubric, topic, status, post. Соберите сценарий: агент плана с блоком фактов из вашего брендбука, Code «Строки плана», Data Table Insert с Map Automatically. Сделайте два запуска: с обычным промптом и с добавленным ограничением повторов. Приложите: (1) системное сообщение второго запуска; (2) снимок таблицы после каждого запуска; (3) одну фразу: сколько тем повторяли один факт до правки и после. Принято, если: в таблице не меньше 6 строк с заполненными date, rubric, topic и статусом new; рубрики чередуются; в темах нет фактов вне вашего списка; сравнение двух запусков написано честно, даже если правка не помогла; персональные данные клиентов в таблице не указаны.

Подсказка: Перед вторым запуском очистите таблицу, иначе строки двух запусков перемешаются.

✅ Готово, если: программа запускается без ошибок и выводит то, что просят в задании.

На курсе задания проверяются автоматически. Подобрать курс

Что дальше

В таблице лежат темы со статусом new. В следующем уроке копирайтер возьмёт первую такую тему, напишет пост по брендбуку, а редактор проверит его по чек-листу.

Итог:
• таблица данных n8n хранит контент-план, а колонка status показывает, где каждая тема;
• JSON с именами полей, как у колонок, позволяет записать план без ручной настройки;
• узел Code вырезает список из ответа модели и делает из него строки со статусом new;
• блок фактов в промпте плана не пускает выдумки в темы, а повторы стоит ограничить отдельной строкой.

← Назад  ·  ↑ В начало урока  ·  ⌂ В начало курса  ·  Вперёд →

Школа Виктора Комлева