Перейти к основному контенту

NSFW-редактирование в n8n: новые образы из одного референса персонажа

Соберите пакет правок по референсам в n8n: верные изображения, сохранённые ID задач, проверка постоянства персонажа и доставка выбранных файлов.

Автор
Lydia
Опубликовано
Время чтения
29 мин чтения
Обновлено
Мара, вымышленный взрослый персонаж, в бордовом атласном платье на зелёном бархатном диване.

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

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

В руководстве собран один полный пример: вечерняя серия из шести изображений Мары, вымышленного персонажа 34 лет. Мы изменим одежду, освещение и кадрирование, сохранив установленную идентичность. Публичный пример использует непрозрачную одежду и неоткровенные инструкции. Та же механика подходит для разрешённой работы со взрослой тематикой, но ни n8n, ни этот урок не обещают принятия и точного исполнения любого NSFW-запроса.

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

Постройте серию вокруг одного утверждённого изображения персонажа

Начните с картинки, которую показали бы человеку в ответ на вопрос, кто такая Мара. Выберите чистый, достаточно близкий кадр с читаемым лицом, нужной причёской и светом, не скрывающим половину черт. В нашем примере у неё тёмные локоны до плеч, слегка асимметричная улыбка и непрозрачный тёмно-синий топ под тёмно-серым жакетом. Она сидит рядом с зелёным диваном. Эти детали делают инструкции конкретными без длинной выдуманной биографии.

Сохраните файл как мастер-референс персонажа. Он должен оставаться в вашем хранилище даже после загрузки в SpicyAPI. Временный входной URI удобен для ссылки на файл в ходе работы, но не является постоянным архивом персонажа. Обозначьте версию мастер-референса, например mara-master-v1, чтобы последующее изменение причёски не подменило незаметно исходники старой серии.

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

Фотография комнаты с другим заметным человеком делает такое разделение менее ясным. Референс одежды с лицом другой модели создаёт ту же проблему. Если других исходников нет, перед загрузкой обрежьте их до нужной части. Цель — не максимально большой набор референсов, а однозначная роль каждой картинки.

Первый запрос к ракурсу держите близким к исходному кадру. Сидячий портрет в три четверти даёт более прямую основу для другого сидячего портрета, чем экстремальный вид сверху с отвёрнутой головой. Это рабочая рекомендация, а не измеренная доля успеха. При новом ракурсе модели доступно меньше переносимой визуальной информации, если ей приходится придумывать черты, которых исходник не показывал.

Не стройте серию цепочкой «мастер-референс → смена одежды → другая комната → новая поза → крупный план». Каждый результат становится очередной интерпретацией лица. Изменение, появившееся на втором шаге, может стать исходной точкой третьего. Все шесть наших строк ссылаются на mara-master-v1, а не на предыдущий результат. Для небольшого исправления можно намеренно создать цепочку правок, но это должно быть отдельным решением, а не случайным следствием соединения узлов.

Три референса задают взрослого персонажа, бордовое платье и пустую гостиную.

Первое изображение задаёт идентичность, второе — одежду, третье — комнату. Иллюстрация.

Выберите эндпоинт редактирования до сборки автоматизации

Используйте модель редактирования изображений, а не text-to-image с описанием персонажа в промпте. Встроенный узел Edit Image в n8n обрезает, меняет размер и объединяет файлы; он не является генеративным редактором для смены одежды или комнаты персонажа. В примере идентификатор модели — alibaba/qwen-image-2.1/edit. Страница редактирования Qwen Image 2.1 описывает действительную задачу и доступные настройки.

Текущий эндпоинт принимает список image_urls от одного до десяти изображений, обязательный prompt до 5000 символов, пропорции результата, вариант разрешения и формат файла. Один запрос возвращает одно изображение. Поэтому шесть желаемых картинок — шесть задач генерации. Три референса внутри одного запроса всё равно задают одну выходную картинку, а не три отдельных варианта.

Для обычной серии с несколькими референсами выберите resolution: 2k, aspect_ratio: 4:5, output_format: png и background: opaque. Задайте enable_prompt_expansion равным false, если хотите сначала использовать инструкции без изменений. Отключение расширения доступно в 1k и 2k; это полезная настройка для сравнения, а не переключатель фиксации идентичности. Сначала оставьте seed пустым. Повтор seed не гарантирует то же лицо и не воспроизводит тот же файл.

В текущей схеме эндпоинта нет strength, CFG, числа шагов семплирования или отдельного negative prompt. Не добавляйте привычные поля Stable Diffusion лишь потому, что их использует другой урок. Включайте требования сохранения и исключения в основной промпт. Если нужны настройки локального семплирования, выбирайте процесс, который действительно их предоставляет.

У эндпоинта есть также mask_url для другой задачи: локального исправления с ровно одним референсом. Для серии с тремя референсами мы не используем этот режим. Небольшое исправление края одежды после выбора удачного кадра может стать отдельной задачей с маской. Одновременная отправка персонажа, одежды, комнаты и маски нарушит требование к входным данным локального режима.

Каталог описывает этот эндпоинт как unrestricted. Для NSFW-автора это полезно при выборе редактора, но не гарантирует конкретные результаты следующей серии. Существующая статья о редактировании в Qwen рассматривает другой набор наблюдавшихся результатов. Этот урок добавляет организацию производства серий по референсам, а не превращает прежние наблюдения в новый тест постоянства персонажа.

Установите настоящий узел и задайте имена узлам процесса

Сведения о пакете, настройке API-ключа и HTTP-шаблонах для n8n Cloud находятся в официальном руководстве по узлу SpicyAPI для n8n. Затем следуйте настройке сцен и референсов ниже для данного процесса.

Пакет — @spicyapi/n8n-nodes-spicyapi, версия 0.1.1. В самостоятельно размещённом n8n откройте Settings → Community Nodes → Install, введите имя пакета и установите его. Создайте учётные данные SpicyAPI (spicyapi.ai) API с ключом из консоли API-ключей. Оставьте стандартный базовый URL API, если нет конкретной причины его менять.

n8n Cloud допускает проверенные узлы сообщества; сама публикация в npm не означает проверку пакета. Здесь используется узел сообщества в самостоятельно размещённом n8n. Пользователи Cloud могут реализовать те же вызовы API встроенными HTTP Request, но не должны ожидать там выпадающих списков и автоматической загрузки файлов этого пакета. Документация по установке n8n объясняет различие.

У SpicyAPI нет отдельной операции «Edit Character» или «Batch NSFW». Выберите Resource: Image → Operation: Generate, затем модель редактирования. Generate — операция узла для моделей изображений, включая редактирование; конкретную задачу определяет выбранная модель. Выпадающий список моделей показывает начальные цены, а не полный расчёт вашего набора референсов.

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

При сборке назовите важные узлы Read Jobs, Ready Jobs, Loop Jobs, Prepare Edit, Edit Character, Attach Job, Save Candidate и Record Candidate. На эти имена ссылаются дальнейшие выражения. Если выберете другие, соответственно измените выражения. Это руководство по ручной сборке, а не заявление о существовании официального импортируемого шаблона именно этой серии.

Начните с Manual Trigger. Расписание можно добавить, когда процесс работает нужным образом, но первый запуск должен содержать одно намеренно выбранное задание. Папка с новыми загрузками ещё не является производственным заданием. Таблица определит, какие исходники относятся друг к другу и какой результат требуется.

Создайте шесть строк заданий вместо папки с несвязанными файлами

В примере используйте Google Sheet с вкладкой Jobs. Каждая строка — один желаемый результат. Назначьте ей уникальный job_id, название серии, промпт, три расположения исходников, разрешение, пропорции, номер попытки и статус. Так можно повторить конкретный запрос без новой генерации всех остальных картинок.

Шесть творческих запросов достаточно различаются, чтобы составить полезную серию:

ЗаданиеНужная картинкаГлавное изменениеЧто остаётся узнаваемым
M01Сидячий портрет в гостинойБордовое платье, та же сидячая позаЛицо, локоны, улыбка, зелёный диван
M02Портрет по пояс возле лампыБолее тёплый боковой свет и близкий кадрЛицо, причёска, конструкция платья
M03Портрет стоя возле диванаДругая поза и больше видимой комнатыИдентичность, цвет одежды, палитра гостиной
M04Портрет в три четверти возле окнаХолоднее свет из окна, лампа позадиИдентичность, длина волос, бордовое платье
M05Крупный портрет с жакетомДобавить исходный тёмно-серый жакетПропорции лица, локоны, сдержанное выражение
M06Более широкий сидячий кадрМесто для заголовка или обрезкиИдентичность, платье, расположение мебели

Для всех шести используйте batch_id: mara-evening-01 и attempt: 1. Сначала только M01 пометьте как ready, оставив пять остальных draft. Когда один кандидат полностью пройдёт до хранилища с правильными данными строки, переведите остальные в готовность. Этот небольшой старт проверяет реальный путь редактирования, а не отдельный тест учётных данных.

Храните character_uri, wardrobe_uri и room_uri в отдельных колонках. Это могут быть недавно созданные URI загрузок или публичные URL изображений, доступные API. Три отдельных поля удобнее читать в таблице, чем строку с целым JSON-массивом. Prepare Edit объединит их в обязательный для модели массив image_urls в фиксированном порядке.

Добавьте колонки результатов вместо перезаписи творческого задания: task_id, candidate_file_id, candidate_name, review_status, review_note, delivery_file_id и actual_cost. Если кандидатов на задание несколько, храните их на отдельной вкладке Candidates с ключом candidate_id, а на Jobs оставьте описание нужного кадра. В первом проходе у нас один кандидат на строку, но разделение пригодится, как только M03 потребует двух попыток.

Идентификатор кандидата может выглядеть как mara-evening-01-M03-a2: сразу видны серия, желаемая картинка и попытка. Идентификатор задачи API важен для восстановления задачи, но не объясняет, какую смену одежды вы просили. Сохраняйте оба.

Используйте обычные производственные статусы: draft, ready, pending_review, approved, identity_fix, creative_fix, task_error и delivered. Это значения вашей таблицы, а не состояния задач SpicyAPI. SpicyAPI может сообщать succeeded, а ваша таблица — identity_fix: изображение существует, но лицо не соответствует серии.

Акварельный модный эскиз вымышленной взрослой Мары в бордовом платье и тёмно-сером жакете возле гардероба.

Планируйте одежду, позу и кадрирование каждого задания с одним референсом персонажа. Иллюстрация.

Передавайте референсы в n8n, не путая байты и URL

Один элемент n8n может нести обычные поля JSON и бинарные данные файлов. Строка URL относится к JSON. Скачанная фотография находится в бинарном свойстве вроде data или character. Ни имя бинарного свойства, ни идентификатор файла в хранилище не являются публичным URL изображения.

Для быстрой настройки одного задания скачайте персонажа через интеграцию своего хранилища в бинарное поле character. Одежду скачайте в wardrobe, комнату — в room; убедитесь, что все файлы приходят в одном элементе с промптом. Если между скачиванием и генерацией есть Edit Fields, оставьте Include Binary Data включённым. Иначе JSON может сохраниться, а фотографии — исчезнуть.

В узле SpicyAPI откройте Media Inputs и добавьте три записи. Для каждой выберите поле image_urls, Source: Binary File и соответствующее Input Binary Field: character, wardrobe или room. Повтор одного поля-списка намеренный: узел загружает эти файлы и собирает их в один массив референсов в порядке добавления.

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

Для повторного использования одних и тех же трёх исходников явная загрузка проще в управлении. Скачайте каждый оригинал в n8n, затем используйте SpicyAPI → File → Upload с соответствующим именем бинарного поля. Результат содержит uri, fileId, fileName, mimeType и bytes. Запишите возвращённый uri в нужную колонку исходников этой серии.

Загрузка возвращает новый объект JSON и не копирует автоматически поле вроде reference_role из прежнего элемента. При загрузке списка из трёх элементов сохраните роль через выражения связанных элементов или явно присоедините её обратно. Для начинающего проще проверить три отдельно названных узла загрузки: персонажа, одежды и комнаты. Перенос каждого URI в таблицу также делает роли видимыми до любой оплачиваемой правки.

Загруженные входные файлы временны: реализация пакета указывает хранение в течение дня. При подготовке более поздней серии заново загрузите сохранённые оригиналы. Не рассчитывайте, что вставленное в таблицу месяц назад значение spicy:// ещё пригодно. Рядом с временными URI храните исходные идентификаторы файлов Drive или ключи своего хранилища для восстановления загрузок.

URL страницы общего доступа Drive — ещё одна частая ошибка. API нужны байты изображения, а не HTML-страница с предпросмотром после входа. Вместо открытия мастер-референсов для всех скачайте бинарные данные через узел Google Drive со своими учётными данными, затем загрузите через SpicyAPI. Закрытая папка исходников автора может оставаться закрытой.

В примере с шестью строками используйте свежие URI загрузок для всех строк. Задайте трём Media Inputs Source: URL и выражения {{ $json.character_uri }}, {{ $json.wardrobe_uri }} и {{ $json.room_uri }}. Здесь поле URL принимает также Spicy URI. Так не придётся переносить три полноразмерных бинарных изображения через каждую операцию с таблицей.

Держите несколько референсов внутри одного элемента

Здесь есть два разных вида «нескольких изображений». Шесть заданий должны быть шестью элементами n8n. Три референса каждого задания должны оставаться массивом из трёх элементов внутри этого задания. Разделение массива на три элемента меняет смысл: редактор может получить три независимых запроса с одним референсом в каждом.

Это различие встречается в реальных вопросах сообщества. В обсуждении альбомов Telegram на Reddit автор обнаружил, что несколько изображений запускают отдельные выполнения; Wait лишь задерживает каждое, не объединяя альбом. Участники предлагают буферизацию по общему идентификатору альбома или разделение сбора и обработки. Универсальное решение не доказано, но пример показывает: «немного подождать» не равно «собрать один набор референсов».

Наша таблица заранее решает задачу сбора: три референса указаны до начала редактирования. Если позже добавите форму загрузки нескольких файлов, пусть этап сбора выдаёт один элемент со всеми выбранными файлами и ролями. Не позволяйте каждому входящему файлу отдельно запускать Edit Character. Загрузка одежды не должна сама по себе становиться запросом на её переработку.

Можно использовать описанные повторные записи Media Inputs или собрать список в Additional Parameters (JSON). Поле JSON ожидает один объект и объединяется последним. Его ключи переопределяют Prompt, Model Parameters и Media Inputs. Для динамического массива это удобно, но может скрыть значения, которые вы считали выбранными в форме.

Например, это выражение создаёт полный входной объект из подготовленной строки:

javascript
{{ {
  prompt: $json.edit_prompt,
  image_urls: [$json.character_uri, $json.wardrobe_uri, $json.room_uri],
  resolution: $json.resolution,
  aspect_ratio: $json.aspect_ratio,
  output_format: "png",
  background: "opaque",
  enable_prompt_expansion: false
} }}

Выберите один способ передачи массива референсов. При таком JSON-выражении оставьте Media Inputs пустым, чтобы не загружать файлы, которые затем заменит итоговое переопределение. Если удобнее визуальный список Media Inputs, не добавляйте image_urls в Additional Parameters. Собранный вход API должен содержать один массив из трёх элементов, а не массив внутри массива или строку с запятыми.

Колонка массива из таблицы может оказаться обычным текстом, даже если выглядит как JSON. Отдельные URI-колонки снимают эту неопределённость. Если вместо них используете references_json, разберите содержимое в массив до генерации и остановите строку при ошибке разбора. Строка вроде "[first,second,third]" не является списком URL изображений.

То же относится к разрешению и булевым значениям. В JSON-выражение вводите false как Boolean, а не текст "false". Значение 2k задавайте как допустимую строку перечисления, а не предполагаемый размер в пикселях. Форма, созданная по схеме, удобна именно тем, что показывает принимаемые эндпоинтом значения.

Напишите первую инструкцию так, чтобы модель понимала роль каждого референса

В Prepare Edit соберите edit_prompt из фиксированного вступления о ролях референсов и индивидуального задания кадра. Строки можно соединить в Edit Fields; Code для шести простых строк не требуется. Требования к идентичности оставьте постоянными, а изменение берите из строки.

Подходящая инструкция для M01:

Image 1 — Мара, вымышленный взрослый персонаж 34 лет. Сохрани пропорции её лица, тёмные локоны до плеч, слегка асимметричную улыбку и сидячую позу. Image 2 задаёт только бордовое непрозрачное атласное платье: копируй его цвет, вырез и расположение швов, а не идентичность другого человека. Image 3 задаёт только гостиную, зелёный бархатный диван и латунную лампу. Помести Мару в эту гостиную в платье. Сохрани естественность портрета, читаемые глаза и мягкий тёплый свет. Сидячий портрет в три четверти, пропорции 4:5. Не добавляй других людей, текст и лишние аксессуары.

Это предложенный промпт, а не выполненный и оценённый нами запрос. Он задаёт роль каждой картинки, изменение и несколько узнаваемых черт. Он также объясняет редактору, что делать при противоречии референсов: лицо берётся из Image 1, одежда из Image 2.

Для M02 замените предложение о кадре на портрет по пояс с латунной лампой, освещающей одну сторону лица. Не повторяйте M01 с добавлением десяти противоречивых терминов камеры. Для M03 замените требование сохранения сидячей позы явной стойкой возле дивана с расслабленными видимыми руками. Одновременные «сохрани сидячую позу» и «поставь её стоя» создают ненужное противоречие.

M04 требует света возле окна. Сохраните описание локонов и одежды, но укажите холодный оконный свет с лампой на фоне. Меняются отношения освещения и положение в комнате, а не описание персонажа. M05 возвращает тёмно-серый жакет мастер-референса поверх бордового платья; скажите это прямо, иначе у модели есть понятная причина следовать только референсу одежды.

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

Указывайте нужную NSFW-стилистику в творческом задании там, где она уместна для эндпоинта и аудитории. Общая метка «сделай NSFW» не объясняет желаемые одежду, выражение, кадрирование и настроение: автору всё равно нужно их определить. В публичном примере взрослая вечерняя атмосфера, непрозрачный атлас и прямой взгляд передают нужный тон без откровенных инструкций.

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

Соедините цикл генерации с отдельной веткой ошибок задачи

Добавьте Google Sheets Get Row(s) в Read Jobs, выберите вкладку Jobs и получите строки серии. Узел Filter с именем Ready Jobs должен оставлять status, равный ready. Если фильтруете внутри Sheets, убедитесь, что возвращаются все совпадающие строки, а не только первая. Таблица с шестью строками, возвращающая один элемент, не является серией из шести картинок.

Передайте отфильтрованные элементы в Loop Jobs, узел Loop Over Items с Batch Size 1 и выключенным Reset. Соедините выход loop с Prepare Edit, затем с Edit Character. SpicyAPI уже обрабатывает несколько входящих элементов, поэтому для самого выполнения нескольких правок цикл не обязателен. Здесь он нужен, чтобы сохранение и обновление статуса каждой строки завершались до следующего запроса.

Настройте Edit Character как Image → Generate, выберите точную модель редактирования и сопоставьте Prompt подготовленной инструкции. Добавьте три референса или единый объект JSON согласно прежнему выбору. Включите Wait for Completion и Download Output. Осознанно задайте Max Cost per Item (USD); для небольшого примера $0.10 — удобный начальный предел при условии, что полный расчёт запроса ниже него.

Этот предел относится к одному элементу, а не ко всей таблице. Сто строк могут пройти десятицентовый лимит каждая. Ограничьте выбранную серию шестью готовыми строками и задайте API-ключу лимит расходов аккаунта, если нужна вторая граница. Число строк и лимит не улучшают изображение, а предотвращают запуск гораздо большего производственного списка случайным расписанием.

Узел самостоятельно рассчитывает цену перед созданием задачи. Если полный запрос превышает предел, ошибка возникает до генерации. Не добавляйте второй узел расчёта в рабочий путь, если не нужно показывать отдельную оценку в таблице. Для планирования Model → Get Quote рассчитывает те же референсы и настройки без создания изображения.

В Settings настройте On Error на продолжение через обычный выход для описанной ветки ошибок. При таком продолжении плагин возвращает error, description и идентификатор задачи, когда он доступен. После Edit Character поставьте If, проверяющий наличие error. Ветка ошибки записывает task_error и сообщение, затем возвращается в Loop Jobs; успешная ветка сохраняет кандидата, записывает pending_review и возвращается на тот же вход цикла.

Не используйте выход done для генерации ещё одного изображения. Он предназначен для итогов серии после возврата всех обработанных строк. Через него можно прочитать обновлённую таблицу кандидатов или показать количество. Обе ветки должны оставаться явными: ошибка API не попадает в папку проверки пустым файлом, а созданный файл не отправляется сразу в папку доставки.

Для шести правок оставьте встроенное ожидание узла; отдельная схема обратных вызовов обычно не нужна. Если выполнение перестало ждать ещё работающую задачу, скопируйте её исходный идентификатор в Task → Get и включите Wait for Completion и Download Output в параметрах. Task → Get по умолчанию не ждёт, поэтому без этой настройки может вернуть работающую запись без файла. Для отдельного выполнения восстановления сначала прочитайте соответствующую строку Jobs и пропустите её через Prepare Edit, затем соедините Task → Get → Attach Job → путь сохранения кандидата. Так сохранится связанный контекст задания для выражений ниже; новый Manual Trigger напрямую перед Task → Get оставит Prepare Edit невыполненным. После успеха и скачивания сохраните кандидата без возврата в Generate. Ошибка тайм-аута может указывать идентификатор в description даже при пустом отдельном taskId, поэтому прочитайте описание до отправки замены. Запуск новой генерации из-за медленной страницы способен создать ещё одну оплачиваемую задачу, хотя исходная позже тоже завершится успешно.

Восстановите связь с заданием до сохранения

При успехе узел возвращает запись задачи и скачанные бинарные данные. JSON — не исходная строка таблицы с несколькими добавленными полями. Он содержит сведения о задаче, включая taskId, state, cost, settled и output. Поэтому последующее {{ $json.job_id }} может быть пустым, хотя промпт использовал верную строку.

После успешной ветки добавьте Edit Fields с именем Attach Job. Сохраните JSON задачи, включите Include Binary Data и добавьте производственные поля выражениями связанных элементов. Узел сообщества предоставляет привязку элементов, поэтому можно обратиться к конкретному элементу Prepare Edit, а не брать первую строку серии.

Используйте {{ $('Prepare Edit').item.json.job_id }} для job_id и тот же способ для batch_id, attempt, edit_prompt и обозначения версии исходников. Для task_id берите текущую запись задачи через {{ $json.taskId }}. Соберите candidate_id из идентификаторов серии, задания и попытки и используйте его как основу имени файла.

Не восстанавливайте идентичность всех строк через $('Read Jobs').first(). Это выражение берёт первый результат и может пометить все шесть изображений как M01. Также не восстанавливайте связи по позиции после сортировки или фильтрации одной из веток. Привязка элементов работает, пока между ними сохраняется однозначная связь; если позже намеренно разделяете или объединяете элементы, передавайте вместе с ними явный job_id.

Первый скачанный файл по умолчанию находится в бинарном поле data. Дополнительные файлы используют data_1, data_2 и так далее. Редактор в нашем примере возвращает одно изображение, поэтому в хранилище передаётся data. Если замените его моделью, возвращающей несколько файлов, сохранение data ещё не означает, что сохранён весь результат. Решите, какой файл относится к кандидату, или разверните выходные файлы в отдельные записи кандидатов с собственными именами.

Путь JSON output.assets[].url содержит ссылки на результаты, а не скачанное содержимое файлов. Согласно документации пакета, эти ссылки истекают примерно через двадцать минут. Таблица только с такой ссылкой может казаться удобной при немедленной проверке, но перестать работать, когда вы вернётесь позже. Download Output передаёт узлу хранилища реальные байты для сохранения.

Бинарным копиям тоже нужно постоянное место хранения. Они не наследуют короткий срок действия подписанной ссылки, но данные выполнений n8n могут удаляться. Успешный запуск процесса ещё не является архивом. Сохранение кандидата во время выполнения позволит вернуться к изображению завтра без новой генерации.

Сохраните кандидатов для проверки и решите, каким нужен ещё один проход

Создайте в своём хранилище закрытую папку mara-evening-01/review. Для примера добавьте Google Drive File → Upload в Save Candidate, задайте Input Data Field Name равным data, имя файла — идентификатор кандидата плюс .png, и выберите эту папку. Документация узла Drive описывает поля загрузки бинарных данных.

Имя должно соответствовать реальному формату результата. Расширение .png у JPEG не преобразует его в PNG; в нашем примере PNG выбран в запросе к модели. Сохраните идентификатор файла, возвращённый интеграцией хранилища, а не только удобное имя. В папке могут находиться два файла с одинаковым именем, а этапу доставки нужен однозначный исходник.

Загрузка в Drive возвращает метаданные файла, а не полную запись кандидата. В Record Candidate используйте идентификатор загруженного файла из текущего элемента, а идентификаторы кандидата, задания и задачи, а также стоимость — из связанного Attach Job. Вручную сопоставьте поля вкладке Candidates через Append or Update Row, используя candidate_id для поиска строки. Так следующая попытка не перезапишет запись первой.

Если обновляете также вкладку Jobs, задайте строке с соответствующим job_id статус pending_review. Верните результат последнего обновления таблицы в Loop Jobs. В ветке ошибки задачи перед возвратом запишите исходный идентификатор задания из Prepare Edit, описание ошибки и идентификатор задачи, если он есть. Обе ветки должны возвращаться в цикл, иначе серия может остановиться после первого ошибочного или успешного элемента.

Рассмотрите шесть сохранённых изображений вместе в двух размерах. На миниатюрах оцените, получилась ли задуманная серия: один персонаж, согласованные одежда и комната, достаточное разнообразие кадров. В полном размере сравните глаза, нос, форму рта, контур челюсти, линию роста волос и характерную асимметрию исходника и кандидата. Это практические ориентиры для просмотра, а не автоматическая система биометрической оценки.

Разделяйте в таблице ошибки идентичности и творческого задания. Узнаваемой Маре с неверно расположенной лампой нужна другая следующая инструкция, чем красивому портрету другого человека. Если лицо подходит, но композиция неверна, отметьте creative_fix и укажите недостающую правку. Если изменился персонаж, поставьте identity_fix и опишите изменение, например более узкую челюсть и другую линию роста волос.

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

Для каждой ошибки назначьте конкретную следующую правку

Допустим, M01 почти подходит, но персонаж перенял форму волос манекена с референса одежды. Сначала убедитесь, что Image 2 действительно не содержит конкурирующей головы; если содержит, обрежьте изображение до одежды. Затем уточните, что Image 2 задаёт только платье, а локоны и линия роста волос берутся исключительно из Image 1. Отправьте это как попытку 2 с исходным мастер-референсом персонажа, а не с уже изменившимся кандидатом.

Если M02 похожа на Мару, но изменяет вырез платья, улучшите референс одежды. Тёмная фотография со скрытым вырезом даёт мало информации для сохранения. Подготовьте более ясный фрагмент со швами и попросите сохранить именно эти детали конструкции, оставив кадр по пояс. Дополнительные изображения отдалённо похожих платьев могут усилить неоднозначность вместо её устранения.

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

M04 может сохранить лицо, но сделать освещение настолько холодным и тёмным, что сравнение с исходником станет сложным. Прежде чем списать кадр из-за дрейфа идентичности, рассмотрите его в нейтральных условиях и отличите влияние света от изменения пропорций лица. Следующая инструкция может сохранить место возле окна, попросив хорошо читаемые детали лица и более мягкую тень. Не добавляйте автоматически другой референс идентичности лишь потому, что цветокоррекция сделала знакомого персонажа непривычным.

В M05 бордовое платье может исчезнуть под жакетом, который превратится в совершенно другой наряд. Уточните, что исходный тёмно-серый жакет надет поверх платья и остаётся расстёгнутым, а конструкция платья видна. Если в остальном удачном кадре неправильно выглядит только один край жакета, подумайте о локальном исправлении выбранного изображения по маске вместо ещё одной правки всей сцены. Это новое задание с выбранным кандидатом как единственным исходником, а не исходный запрос с тремя референсами.

M06 может создать нужное свободное пространство, но сделать голову Мары слишком маленькой для обложки. Уточните композицию: сидячий портрет средним планом, комната видна слева, лицо остаётся достаточно крупным и читаемым. Одно изменение пропорций результата не объясняет модели, где должно находиться место для заголовка. В творческой заметке описывайте расположение элементов, а не просто указывайте 4:5 или 16:9.

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

Останавливайте ветку исправлений после заранее выбранного числа попыток, например двух для первого прохода. Это решение по организации работы, а не прогноз, что двух попыток всегда хватит. Сложный кадр можно вернуть к подготовке исходников или ручному редактированию. Автоматизация полезнее всего, когда делает проблему заметной и воспроизводимой, а не создаёт двадцать слабо связанных вариантов, пока вас нет.

Крупный портрет вымышленного взрослого персонажа с отчётливыми локонами и мягко размытой лампой позади.

Сравнивайте пропорции лица и локоны отдельно от кадрирования фона и положения лампы. Иллюстрация.

Доставляйте одобренные файлы без повторной генерации

После проверки задайте выбранным строкам кандидатов статус approved. Остальные попытки оставьте на проверке вместе с заметками. Для M03 можно одобрить попытку 2, сохранив попытку 1 как identity_fix. Процесс доставки должен читать Candidates, а не считать победителем последний файл в папке.

Соберите второй процесс из Manual Trigger, Google Sheets Get Row(s) и Filter, выбирающего строки с review_status, равным approved, и пустым delivery_file_id. Добавьте Loop Over Items с Batch Size 1. Скачивайте каждого кандидата по сохранённому идентификатору файла Drive в бинарное поле data, затем загружайте эти данные в папку серии approved с нужным именем для доставки.

Здесь скачивайте собственный сохранённый кандидат, а не временный URL результата SpicyAPI. Это именно то изображение, которое вы проверили. Не вызывайте Image → Generate, чтобы воссоздать его с тем же seed или в большем разрешении, предполагая, что одобрение сохраняется. Любой новый результат требует отдельной проверки: лицо, одежда или кадрирование могут измениться.

После загрузки в папку одобренных изображений обновите строку кандидата: запишите delivery_file_id и review_status: delivered. При желании добавьте выбранный идентификатор кандидата в строку Jobs. Верните результат обновления в цикл. Идентификатор файла обеспечивает стабильный доступ к доставленной версии и не позволяет обычному повторному запуску считать все одобренные строки незавершёнными.

Здесь используется копирование через скачивание и загрузку, потому что передача бинарных данных явно видна. Если хранилище предлагает собственную операцию копирования, сохраняющую исходные байты, можно использовать её. Творческое правило остаётся тем же: доставка копирует одобренное изображение, а не запускает редактор снова.

Для экспортов с изменённым размером, кадрированием или сжатием используйте отдельную папку. Квадратная миниатюра и одобренный портрет в полном размере — два разных файла, даже если исходник общий. Сохраняйте исходную одобренную версию, чтобы сделать ещё один экспорт без новой платы за генерацию. Если кадрирование обрезает причёску или меняет представление персонажа, проверьте экспорт для конкретного места использования.

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

Рассчитывайте стоимость реального набора референсов, а не только выбранного пункта

Начальная цена узла помогает ориентироваться в каталоге. Полный набор референсов и настройки запроса определяют расчёт. В каталоге Qwen Image 2.1 Edit указаны начальные суммы $0.036 для 1k, $0.048 для 2k и $0.072 для 1.5k. Публичный расчёт для трёх референсов составляет $0.060 для 1k и $0.048 для 2k при непрозрачном PNG и отключённом расширении промпта. В 1k два дополнительных референса добавляют $0.024; в указанном запросе 2k такой доплаты нет. Не считайте промежуточное разрешение обязательно более дешёвым, чем 2k, и не предполагайте одинаковую доплату за референсы во всех вариантах.

Перед переводом ещё пяти строк в готовность используйте Model → Get Quote с теми же image_urls, промптом и настройками. Узел возвращает собранные входные данные вместе с расчётом: так удобно проверить, сохранились ли все три референса после сопоставления полей. Эта операция планирования при необходимости загружает бинарные референсы, но не генерирует изображение.

Для нашего запланированного запроса 2k с тремя референсами текущие $0.048 дают бюджет первого прохода из шести кандидатов $0.288; двенадцать запросов стоили бы $0.576. Те же шесть запросов с тремя референсами в 1k по указанному расчёту составили бы $0.360. Это производственные бюджеты по расчёту, а не чеки выполненной серии и не сравнение качества изображений. Перед запуском заново рассчитайте свой набор исходников и настройки. Хранилище, размещение n8n или подписка оплачиваются отдельно.

Считайте попытки как задачи. Для шести одобренных изображений может потребоваться больше шести успешных генераций, поскольку часть оплаченных кандидатов не соответствует заданию. Если рассчитываете первый проход, а затем назначаете лимит две попытки на кадр, максимум запланированных попыток генерации — двенадцать. Такой бюджет полезнее «одной серии из шести изображений» без запаса на замены.

Плагин отправляет ключ идемпотентности для каждого элемента. Повтор того же вызова узла в рамках того же выполнения предназначен для восстановления существующей задачи вместо оплаты дубликата. Новое выполнение, изменённые входные данные или другой проход цикла — новая работа. Повторное нажатие Execute Workflow не равно восстановлению исходного идентификатора задачи.

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

Документация плагина указывает, что неудачные и истёкшие задачи обычно освобождают зарезервированную сумму, а отклонённые запросы не оплачиваются, если на странице модели не указано иное. Успешный кандидат, который вы отклонили при собственной проверке, отличается от ошибки API. Сохраняйте actual_cost из записи задачи после расчёта, чтобы позже видеть реальные затраты на каждый доставленный кадр.

Проведите первое задание от исходника до доставки, затем расширьте серию

Перед включением всех шести строк проведите M01 через генерацию кандидата, сохранение и проверку. Откройте настоящий сохранённый файл в папке проверки. Убедитесь, что в строке указан M01, промпт использует правильные роли референсов, а возвращённый файл — именно тот, который вы рассматриваете. Корректный предпросмотр в панели выполнения ещё не доказывает правильность имени и связи сохранённого кандидата с таблицей.

Одобрите этого кандидата и один раз запустите доставку. Откройте файл в папке одобренных изображений и убедитесь, что он совпадает с выбранным. Снова запустите доставку, не меняя состояние строки: строка с уже заполненным идентификатором доставки должна быть пропущена. Если позже вручную очистите этот идентификатор, процесс снова сочтёт строку подходящей, поэтому делайте это только при реальной необходимости ещё одной копии.

Затем переведите M02–M06 в готовность. Цикл генерации должен создать по одной записи кандидата для каждого задания либо запись с конкретной ошибкой задачи. Проверьте контактный лист, напишите краткие конкретные заметки и создайте только те повторные попытки, которые они оправдывают. Мастер-референс персонажа остаётся исходником обычных замен кадров.

Теперь у вас есть полезный NSFW-процесс image-to-image в n8n: определённый исходник персонажа, референсы с обозначенными ролями, отдельные задания редактирования, корректная работа с бинарными данными и URI, понятные творческие инструкции и папка доставки с выбранными вами изображениями. Автоматизация переносит материалы и сохраняет работу. Именно разработка кадров и отбор определяют, достойна ли полученная серия публикации.

Другие языки English · 日本語 · 한국어 · Deutsch · Français · Español · Português (Brasil) · Italiano · Polski

Примените руководство на практике

Открыть рабочий процесс

Создайте NSFW-фотосерию персонажа с n8n.

Превратите выбранного взрослого персонажа в цельную NSFW-галерею для авторского проекта. Создавайте 4, 8 или 12 вариантов одежды и сцен с n8n, используя один исходный портрет для каждой правки Qwen Image 2.1.