Первый пост от связки «копирайтер плюс редактор» выглядел готовым к публикации. Копирайтер написал про «чайные оттенки, цитрусовую кислинку» и «классический эспрессо», хотя ничего этого в кофейне «Зерно» нет. Редактор прошёл пост по чек-листу из шести пунктов, выдумку пропустил, а вычеркнул единственный настоящий факт: адрес «на Трёхсвятской». Проверяющий без списка фактов ошибся так же, как пишущий. В этом уроке вы соберёте цепочку «пишет, проверяет, правит» и увидите, что её чинит.
Чему научитесь в этом уроке:
• брать из таблицы плана одну новую тему и сразу помечать её как взятую в работу;
• собрать агента-копирайтера с брендбуком из урока 3.1;
• собрать агента-редактора, который проверяет пост по чек-листу и сам исправляет нарушения;
• разобрать ответ редактора в узле Code и не потерять пост, если ответ пришёл не в том виде.
Автор и выпускающий редактор
В газете заметку пишет автор, а перед печатью её читает выпускающий редактор. У него свой список: длина влезает в полосу, нет запрещённых слов, факты сходятся с тем, что известно редакции. Ошибку он исправляет сам и не отправляет заметку автору на переделку.
В конвейере то же самое. Копирайтер (первый агент) пишет пост по брендбуку. Редактор (второй агент) получает тему и готовый пост, проверяет по чек-листу и возвращает исправленный текст со списком правок. Оба агента в n8n собраны из одинаковых узлов Basic LLM Chain (узел, который отправляет модели системное сообщение и вашу просьбу и возвращает ответ), отличаются только тексты. Как устроено системное сообщение, разобрано в уроке трека 2 «Промпт без кода».

Узел 1. «Следующая тема»
Темы лежат в таблице «Контент-план кофейни», которую заполнил агент в уроке 3.2. Добавьте узел Data Table с именем «Следующая тема» и заполните:
- Operation: Get (получить строки), таблица «Контент-план кофейни»;
- Conditions: колонка
status, условиеequals, значениеnew; - Limit: 1.
Узел вернёт одну строку плана: дату, рубрику, тему и номер строки (id).
Узел 2. «Взять в работу»
Сразу за ним второй узел Data Table, «Взять в работу»: Operation Update, та же таблица. В Conditions выберите колонку id, условие equals и впишите выражение ниже, а в полях для записи поставьте status = in_progress.
{{ $('Следующая тема').first().json.id }}
Зачем этот узел: пока черновик ждёт вашего одобрения, тема иначе числилась бы новой, и следующий запуск по расписанию взял бы её второй раз. Так появляются два одинаковых поста. Подробно эту дыру и её закрытие разберём в уроке 5.1, сейчас просто поставьте узел.
Узел 3. Копирайтер
Узел Basic LLM Chain с именем «Копирайтер», модель та же, что в уроке 3.1. В системное сообщение вставьте брендбук из урока 3.1 целиком, вместе с блоком фактов. В сообщение пользователя впишите выражение:
{{ "Тема поста: " + $('Следующая тема').first().json.topic + ". Рубрика: " + $('Следующая тема').first().json.rubric }}
Почему тема берётся через $('Следующая тема'), а не из того, что пришло на вход? На вход копирайтеру приходит ответ узла «Взять в работу», а это результат обновления строки, и поля topic в нём может не оказаться. Откройте вывод узла «Взять в работу» после запуска и посмотрите сами, какие поля там есть. Обращение по имени узла достаёт данные ровно оттуда, где они точно есть, и не ломается, если между узлами появится ещё один шаг.
Узел 4. Редактор
Второй Basic LLM Chain, «Редактор». Сообщение пользователя передаёт ему тему и пост копирайтера:
{{ "Тема: " + $("Следующая тема").first().json.topic + "\n\nПост:\n" + $json.text }}
Системное сообщение редактора, с которым прошёл прогон курса:
Ты редактор кофейни «Зерно». Проверь пост по чек-листу:
1) 400–600 знаков; 2) не больше одного эмодзи; 3) нет слов «уникальный», «лучший», «качественный»; 4) нет цен, вкусов, напитков и фактов о кофейне, которых нет в списке фактов ниже (адрес из списка — не нарушение); 5) в конце вопрос читателю; 6) нет разметки.
Исправь нарушения сам и верни только JSON: {"ok": true|false, "issues": ["что исправил"], "text": "итоговый текст поста"}.
ФАКТЫ О КОФЕЙНЕ (других не существует):
- кофейня «Зерно», Тверь, ул. Трёхсвятская;
- с 14 октября новый сорт Эфиопия Иргачеффе: светлая обжарка, ноты черники и жасмина;
- фильтр-кофе 220 ₽;
- есть выпечка.
Всё, чего нет в этом списке (другие вкусы, напитки, цены, сотрудники, оборудование), — выдумка.
У этого редактора три особенности. Чек-лист состоит из пунктов, которые можно проверить: число знаков, эмодзи, конкретные слова. Редактор исправляет сам, иначе пришлось бы гонять пост между агентами по кругу. И ответ он отдаёт в виде JSON (текст в строгом формате «поле: значение»): ok (всё ли было в порядке), issues (что исправил) и text (итоговый пост). Такой ответ следующий узел разберёт без участия человека.
Что показал прогон
В первом запуске блока фактов не было ни у одного агента: копирайтер получил только тему, редактор только тему и пост. Копирайтер досочинил вкусы и напиток. Редактор сверял пост с темой, а в теме не было ни «цитрусовой кислинки», ни адреса. Выдумку он счёл нормальным описанием кофе, а улицу вычеркнул как факт, которого ему не давали.
После того как один и тот же блок фактов вставили в оба системных сообщения, пост собрался только из списка: черника, жасмин, фильтр-кофе за 220 ₽, выпечка, Трёхсвятская. Редактор ответил «ok, замечаний нет».
Правило: один блок фактов на оба агента. Меняете факты в брендбуке копирайтера, в тот же день меняйте их и у редактора. Если списки разойдутся, редактор начнёт вычёркивать правду или пропускать выдумку.
Отсюда и оговорка в пункте 4 чек-листа: «адрес из списка — не нарушение». Пункт велит выкидывать факты о кофейне, а адрес тоже факт о кофейне. Без оговорки модель может прочитать правило слишком широко и снова убрать улицу. Оговорка стоит там, где редактор уже ошибался.
Планировали, что редактор будет ловить и запрещённые обещания, например скидки. В прогоне курса таких обещаний копирайтер не написал, так что эту проверку на живом посте мы не видели. Проверьте её сами: подставьте редактору пост со скидкой, которой нет в фактах.
Узел 5. Code «Итог редактора»
Модель иногда добавляет к JSON вступление вроде «Вот результат:» или возвращает обычный текст. Узел Code (узел, в котором пишется короткая программа на JavaScript) с именем «Итог редактора» вырезает из ответа часть от первой фигурной скобки до последней и разбирает её. Если разобрать не вышло, конвейер не падает: берётся текст копирайтера, а в списке замечаний появляется пометка «редактор вернул не JSON». Её вы увидите в черновике и прочитаете пост внимательнее.
const raw = $input.first().json.text || '';
let r;
try { r = JSON.parse(raw.replace(/^[^{]*/, '').replace(/[^}]*$/, '')); }
catch (e) { r = { ok: false, issues: ['редактор вернул не JSON'], text: $('Копирайтер').first().json.text }; }
return [{ json: { ...r, topic: $('Следующая тема').first().json.topic, rowId: $('Следующая тема').first().json.id } }];
Последняя строка добавляет к результату тему и номер строки плана. Они понадобятся дальше, когда пост будет одобрен и строку нужно будет отметить в таблице.
Если не получилось
- Копирайтер пишет про другую тему или пишет «undefined». Проверьте, что узел называется ровно «Следующая тема»: имя в выражении
$('Следующая тема')должно совпадать с именем узла до буквы. - Редактор вычёркивает адрес или цену из списка. Блок фактов не попал в системное сообщение редактора или отличается от блока копирайтера. Скопируйте его заново целиком.
- В итоге всегда «редактор вернул не JSON». Откройте вывод узла «Редактор». Если там обычный текст, проверьте, что в системном сообщении есть строка «верни только JSON» с образцом полей.
- Таблица не отдаёт тему. Все строки уже не new. Верните нужной строке статус new вручную в таблице и запустите снова.
Контрольный вопрос. Копирайтер получил блок фактов, а редактор нет. Что вероятнее всего случится с настоящим адресом кофейни в посте?
Подсказка: Редактор сверяет пост только с тем, что ему передали. Был ли адрес в теме поста?
На курсе задания проверяются автоматически. Подобрать курс
Контрольный вопрос. Почему копирайтер берёт тему выражением $(‘Следующая тема’), а не из входящих данных?
Подсказка: Посмотрите, какой узел стоит прямо перед копирайтером и что он возвращает.
На курсе задания проверяются автоматически. Подобрать курс
Контрольный вопрос. Что делает узел «Итог редактора», если редактор вернул не JSON? Выберите все верные варианты.
Выберите все верные варианты.
Подсказка: Перечитайте блок catch в коде узла.
На курсе задания проверяются автоматически. Подобрать курс
Задание. МИССИЯ «Автор и выпускающий». Соберите в n8n цепочку из пяти узлов: «Следующая тема», «Взять в работу», «Копирайтер», «Редактор», «Итог редактора». Сделайте два запуска на темы из своей таблицы плана: первый, когда блок фактов есть только у копирайтера, второй, когда он есть у обоих агентов. Перед вторым запуском верните первой теме статус new или возьмите следующую. Приложите: (1) системное сообщение редактора; (2) вывод узла «Итог редактора» из обоих запусков; (3) снимок таблицы плана со статусом in_progress у взятой темы; (4) одну-две фразы: что редактор пропустил или вычеркнул зря в первом запуске. Принято, если: в цепочке есть все пять узлов, и тема берётся через $(‘Следующая тема’); чек-лист редактора проверяемый (числа, слова, наличие вопроса) и требует ответ в JSON; во втором запуске у редактора тот же блок фактов, что у копирайтера; вывод «Итог редактора» содержит поля ok, issues, text; в постах нет фактов вне списка или они отмечены в issues; персональные данные клиентов не указаны.
Подсказка: Если редактор в первом запуске ничего не испортил, это тоже результат: опишите его честно и проверьте редактора постом с выдуманной ценой.
✅ Готово, если: программа запускается без ошибок и выводит то, что просят в задании.
На курсе задания проверяются автоматически. Подобрать курс
Что дальше
Пост готов и проверен, и он один на обе площадки. В следующем уроке разберём, что Telegram и ВКонтакте принимают от сценария вместе с текстом, и добавим к посту картинку.
Итог:
• конвейер берёт одну новую тему и сразу помечает её in_progress;
• копирайтер пишет по брендбуку, редактор проверяет по чек-листу из шести пунктов и сам исправляет;
• один блок фактов нужен обоим агентам, иначе редактор пропускает выдумку и вычёркивает правду;
• узел «Итог редактора» спасает пост, если редактор ответил не в формате JSON.
