При подготовке курса агент за один запуск составил для кофейни «Зерно» план на две недели: 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
Статус играет роль отметки в тетради. Без неё конвейер не поймёт, какую тему уже написали, а какую нет, и может взять одну и ту же дважды. Путь у темы такой:
- new: тема в плане, её ещё никто не трогал;
- in_progress: копирайтер взял тему в работу;
- published: пост вышел в канал;
- rejected: вы отклонили черновик.
Сейчас агент плана ставит всем строкам только new. Статус published и отказ появятся в уроке 3.5, где вы одобряете пост кнопкой в Telegram, а in_progress поставим в уроке 3.3: он защищает от повторных постов, если запуск упал на полпути.

Системное сообщение агента плана
Создайте сценарий: 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: '' } }));
Что делает каждая строка:
- Берёт текст ответа модели.
- Отрезает всё до первой квадратной скобки и всё после последней. Остаётся сам список, без «Вот ваш план» и лишних значков. Затем превращает текст в настоящий список тем.
- Каждую тему делает отдельной строкой и дописывает к ней два поля: 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-массивом?
Подсказка: Подумайте, кто читает ответ модели после неё: человек или следующий узел сценария.
На курсе задания проверяются автоматически. Подобрать курс
Контрольный вопрос. Агент только что записал план в таблицу. Какой статус стоит у новых строк?
Подсказка: Вспомните, что дописывает к каждой теме узел «Строки плана».
На курсе задания проверяются автоматически. Подобрать курс
Контрольный вопрос. Что делает узел Code «Строки плана»? Выберите все подходящие.
Выберите все верные варианты.
Подсказка: Пройдитесь по трём строкам кода по очереди. Проверки фактов и отправки там нет.
На курсе задания проверяются автоматически. Подобрать курс
Задание. МИССИЯ «Тетрадь на две недели». Создайте в 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;
• блок фактов в промпте плана не пускает выдумки в темы, а повторы стоит ограничить отдельной строкой.
