Przejdź do treści głównej

Edycja obrazów NSFW w n8n: seria nowych stylizacji z jednej referencji postaci

Zbuduj w n8n serię edycji z referencjami: poprawnie przekazuj obrazy, zachowuj identyfikatory zadań, oceniaj spójność postaci i zapisuj wybrane pliki.

Autor
Lydia
Opublikowano
Czas czytania
29 min czytania
Zaktualizowano
Mara, fikcyjna dorosła postać, w bordowej satynowej sukience na zielonej aksamitnej sofie.

Aby seryjnie edytować postać NSFW w n8n, potraktuj każde zamówione zdjęcie jako osobne zadanie, trzymaj jego obrazy referencyjne razem i w każdej wariacji wracaj do tego samego zatwierdzonego źródła postaci. Pobieraj wyniki do folderu do oceny, a do folderu docelowego przenoś tylko zatwierdzone obrazy. W ten sposób otrzymasz powtarzalny proces produkcji, nie uznając samego zakończenia żądania API za dowód, że twarz została zachowana.

Najtrudniejsze zwykle nie jest napisanie sześciu promptów. Trzeba dopilnować, aby sześć osobnych elementów otrzymało właściwe źródło, referencję stroju i pomieszczenia, aby każdy wynik pozostał powiązany z instrukcjami i aby wybraną wersję dało się odnaleźć, gdy tymczasowy link przestanie działać. Workflow może wykonać się bezbłędnie, a mimo to dostarczyć niewłaściwą postać, jeśli nie zadbasz o te decyzje.

Ten poradnik przedstawia jeden kompletny przykład: serię sześciu wieczornych zdjęć Mary, fikcyjnej 34-letniej postaci. Zmienimy garderobę, oświetlenie i kadrowanie, zachowując ustaloną tożsamość. Publiczny przykład wykorzystuje nieprzezroczyste ubrania oraz instrukcje bez treści dosłownych. Ten sam mechanizm możesz zastosować do dozwolonej twórczości dla dorosłych, ale ani n8n, ani poradnik nie obiecują przyjęcia każdego żądania NSFW lub uzyskania dokładnie zamierzonego efektu.

Poniższy workflow jest propozycją konfiguracji opartą na wydanym węźle społecznościowym SpicyAPI i obecnym schemacie edycji. Nie jest relacją z nowego testu serii sześciu obrazów. Instrukcje oddzielają czynności wykonywane automatycznie przez węzeł od decyzji twórczych, które nadal należą do ciebie.

Oprzyj serię na jednym zatwierdzonym obrazie postaci

Zacznij od zdjęcia, które pokazałbyś komuś pytającemu, kim jest Mara. Wybierz czyste, dość bliskie ujęcie z czytelną twarzą, docelową fryzurą i światłem, które nie ukrywa połowy rysów. W naszym przykładzie Mara ma ciemne loki do ramion, lekko asymetryczny uśmiech oraz ciemnoniebieski nieprzezroczysty top pod grafitową marynarką. Siedzi obok zielonej sofy. Te szczegóły pozwalają napisać konkretne instrukcje edycji bez wymyślania długiej biografii.

Zapisz ten plik jako główny obraz postaci. Powinien pozostać dostępny w twoim własnym magazynie, nawet jeżeli później prześlesz go do SpicyAPI. Tymczasowy URI wejściowy wygodnie wskazuje plik podczas produkcji, ale nie jest trwałym archiwum postaci. Nadaj obrazowi wersję, na przykład mara-master-v1, aby późniejsza zmiana fryzury nie podmieniła po cichu źródeł używanych w starszej serii.

Przygotuj jeszcze dwa obrazy. Referencja garderoby przedstawia bordową nieprzezroczystą satynową sukienkę na wieszaku lub manekinie, bez konkurencyjnej twarzy. Referencja pomieszczenia pokazuje pusty salon z mosiężną lampą i zielonymi aksamitnymi meblami. Model powinien otrzymać trzy odrębne instrukcje: weź osobę z pierwszego obrazu, ubranie z drugiego, a otoczenie z trzeciego.

Fotografia pomieszczenia z inną wyraźnie widoczną osobą utrudnia ten podział. To samo dotyczy zdjęcia stroju z twarzą innej modelki. Jeśli nie masz innych referencji, przed przesłaniem wykadruj potrzebny fragment. Celem nie jest zebranie jak największej paczki referencji, lecz usunięcie niejasności dotyczących roli każdego obrazu.

Pierwsze żądanie dotyczące kamery powinno być zbliżone do źródła. Siedzący portret w ujęciu trzy czwarte łatwiej stanowi punkt wyjścia dla kolejnego siedzącego portretu niż dla skrajnego widoku z góry z odwróconą głową. To praktyczna rekomendacja, a nie zmierzony odsetek sukcesów. Przy nowym kącie wymagającym odtworzenia niewidocznych wcześniej rysów model ma mniej informacji, które może przenieść ze źródła.

Nie buduj serii według schematu obraz główny → zmiana stroju → nowe pomieszczenie → nowa poza → zbliżenie. Każdy wynik takiego łańcucha jest kolejną interpretacją twarzy. Odchylenie w drugim kroku może zostać punktem wyjścia dla trzeciego. Nasze sześć wierszy wskazuje na mara-master-v1, a nie na poprzedni wynik. Łańcuch edycji może być świadomym wyborem przy drobnej poprawce, ale nie powinien wynikać przypadkiem z połączeń między węzłami.

Trzy referencje dostarczają dorosłą postać, bordową sukienkę i pusty salon.

Pierwszy obraz określa tożsamość, drugi ubranie, a trzeci pomieszczenie. Ilustracja.

Wybierz endpoint edycji, zanim zbudujesz automatyzację

Użyj modelu do edycji obrazów, a nie modelu text-to-image z opisem postaci wklejonym do promptu. Wbudowany w n8n węzeł Edit Image potrafi kadrować, skalować i łączyć pliki, ale nie jest generatywnym edytorem zmieniającym strój lub pomieszczenie. W przykładzie identyfikator modelu to alibaba/qwen-image-2.1/edit. Strona edycji Qwen Image 2.1 opisuje rzeczywiste zadanie i dostępne ustawienia.

Obecny endpoint przyjmuje image_urls jako listę od jednego do dziesięciu obrazów, wymagany prompt do 5 000 znaków, proporcje wyniku, poziom rozdzielczości i format wyjściowy. Zwraca jeden obraz na żądanie. Sześć docelowych zdjęć oznacza więc sześć zadań generowania. Dodanie trzech referencji do jednego żądania nadal zamawia jeden obraz wynikowy, a nie trzy osobne wariacje.

Dla zwykłej serii z wieloma referencjami wybierz resolution: 2k, aspect_ratio: 4:5, output_format: png i background: opaque. Ustaw enable_prompt_expansion na false, jeśli chcesz zacząć od niezmienionych instrukcji. Wyłączenie rozwijania promptu jest dostępne przy 1k i 2k; pomaga porównywać wyniki, ale nie blokuje tożsamości. Na początku pozostaw seed pusty. Powtórzenie seedu nie gwarantuje tej samej twarzy ani odtworzenia identycznego pliku.

Obecny schemat tego endpointu nie udostępnia strength, CFG, liczby kroków próbkowania ani osobnego negative promptu. Nie dodawaj znanych pól Stable Diffusion tylko dlatego, że występują w innym poradniku. Instrukcje zachowania elementów i wykluczenia umieść w głównym prompcie. Jeśli potrzebujesz takich lokalnych ustawień próbkowania, wybierz workflow, który je rzeczywiście udostępnia.

Endpoint ma również mask_url dla innego zadania: miejscowej poprawki z dokładnie jednym obrazem referencyjnym. Nie używamy tego trybu w serii z trzema referencjami. Drobna poprawka krawędzi ubrania po wybraniu udanego obrazu może być osobnym zadaniem z maską. Jednoczesne przesłanie referencji postaci, stroju, pomieszczenia i maski naruszyłoby wymagania wejściowe trybu miejscowego.

Katalog opisuje ten endpoint jako unrestricted. To istotne dla twórcy NSFW wybierającego edytor, ale nie gwarantuje rezultatów następnej serii. Dotychczasowy artykuł o edycji Qwen omawia inny zestaw zaobserwowanych wyników. Ten poradnik dodaje mechanikę produkcji serii z referencjami; nie zamienia wcześniejszych obserwacji w nowy benchmark spójności.

Zainstaluj właściwy węzeł i nazwij węzły workflow

Informacje o pakiecie, konfiguracji klucza API i szablonach HTTP dla n8n Cloud znajdziesz w oficjalnym przewodniku po węźle SpicyAPI dla n8n. Następnie skorzystaj z poniższej konfiguracji sceny i referencji dla tego konkretnego workflow.

Pakiet to @spicyapi/n8n-nodes-spicyapi, wersja 0.1.1. W samodzielnie hostowanym n8n otwórz Settings → Community Nodes → Install, wpisz nazwę pakietu i zainstaluj go. Utwórz poświadczenie SpicyAPI (spicyapi.ai) API z kluczem z konsoli kluczy API. Zachowaj domyślny bazowy URL API, chyba że masz konkretny powód do zmiany.

n8n Cloud dopuszcza zweryfikowane węzły społecznościowe; samo opublikowanie pakietu na npm nie oznacza weryfikacji. Ten poradnik używa węzła społecznościowego w samodzielnie hostowanym n8n. Użytkownicy Cloud mogą wykonać te same wywołania API za pomocą wbudowanych węzłów HTTP Request, ale nie powinni oczekiwać tych samych list wyboru ani automatycznego przesyłania plików. Obecna dokumentacja instalacji n8n wyjaśnia tę różnicę.

SpicyAPI nie ma osobnej operacji o nazwie „Edit Character” ani „Batch NSFW”. Wybierz Resource: Image → Operation: Generate, a następnie model edycji. Generate jest operacją węzła dla modeli obrazowych, również edycyjnych; to wybrany model określa zadanie. Lista modeli pokazuje ceny początkowe, nie ostateczną wycenę twojej konkretnej paczki referencji.

Zbudujemy dwa małe workflow. Pierwszy tworzy kandydatów i zapisuje ich w folderze do oceny. Drugi odczytuje zatwierdzone wiersze i umieszcza wybrane pliki w folderze docelowym. Rozdzielenie pozwala obejrzeć sześć obrazów razem bez pozostawiania wykonania oczekującego na twój powrót. Pozwala też ponownie uruchomić dostarczenie bez płacenia za wygenerowanie tego samego obrazu.

W trakcie budowania nadaj istotnym węzłom nazwy: Read Jobs, Ready Jobs, Loop Jobs, Prepare Edit, Edit Character, Attach Job, Save Candidate i Record Candidate. Późniejsze wyrażenia odwołują się do tych nazw. Jeśli wybierzesz inne, odpowiednio zmień wyrażenia. To instrukcja ręcznego budowania, a nie deklaracja istnienia oficjalnego szablonu do importu dla tej dokładnej serii.

Zacznij od Manual Trigger. Harmonogram możesz dodać, gdy workflow działa zgodnie z oczekiwaniami, ale pierwszy przebieg powinien zawierać jedno świadomie wybrane zadanie. Folder nowych plików sam w sobie nie stanowi briefu produkcyjnego. Tabela zadań określi, które pliki należą razem i jaki wynik zamawiasz.

Utwórz sześć wierszy zadań zamiast folderu luźno powiązanych plików

W przykładzie użyj arkusza Google z kartą Jobs. Każdy wiersz oznacza jeden zamówiony wynik. Nadaj mu unikatowy job_id, nazwę serii, prompt, trzy lokalizacje źródeł, rozdzielczość, proporcje, numer próby i status. Dzięki temu możesz zamówić konkretną powtórkę bez regenerowania pozostałych zdjęć.

Sześć pomysłów różni się wystarczająco, aby tworzyć użyteczną serię:

ZadanieDocelowy obrazGłówna zmianaRozpoznawalne elementy
M01Siedzący portret w salonieBordowa sukienka, ta sama siedząca pozaTwarz, loki, uśmiech, zielona sofa
M02Portret do pasa przy lampieCieplejsze boczne światło i bliższy kadrTwarz, fryzura, konstrukcja sukienki
M03Portret stojący obok sofyInna postawa i więcej widocznego pomieszczeniaTożsamość, kolor ubrania, paleta salonu
M04Portret trzy czwarte przy oknieChłodniejsze światło okna, lampa z tyłuTożsamość, długość włosów, bordowa sukienka
M05Bliski portret z marynarkąDodanie oryginalnej grafitowej marynarkiProporcje twarzy, loki, subtelny wyraz twarzy
M06Szersza siedząca kompozycjaWięcej miejsca na tytuł lub kadrowanieTożsamość, sukienka, ustawienie mebli

Dla wszystkich sześciu użyj batch_id: mara-evening-01 i attempt: 1. Początkowo tylko M01 oznacz jako ready, a pozostałe pięć jako draft. Gdy jeden kandydat dotrze do magazynu z poprawnymi informacjami o wierszu, oznacz pozostałe jako gotowe. Taki mały początek sprawdza rzeczywistą ścieżkę edycji, a nie tylko odłączony test poświadczeń.

Trzymaj character_uri, wardrobe_uri i room_uri w osobnych kolumnach. Mogą zawierać świeżo utworzone URI przesłanych plików lub publiczne URL obrazów dostępne dla API. Trzy pola są w arkuszu czytelniejsze niż ciąg tekstu z całym JSON-em tablicy. Prepare Edit połączy je w wymaganą przez model tablicę image_urls w ustalonej kolejności.

Dodaj kolumny wyników zamiast nadpisywać brief: task_id, candidate_file_id, candidate_name, review_status, review_note, delivery_file_id i actual_cost. Jeśli zadanie ma więcej niż jednego kandydata, umieść ich w osobnej karcie Candidates z kluczem candidate_id, zachowując zamówione ujęcie w Jobs. Pierwsza próba daje jednego kandydata na wiersz, ale taki podział przydaje się już wtedy, gdy M03 wymaga dwóch prób.

Identyfikator kandydata może mieć postać mara-evening-01-M03-a2. Na pierwszy rzut oka wskazuje serię, zamówione zdjęcie i próbę. Identyfikator zadania API nadal jest ważny dla odzyskiwania zadania, lecz nie mówi, jaką zmianę garderoby zamówiłeś. Zachowuj oba identyfikatory.

Statusy traktuj jako proste stany produkcji: draft, ready, pending_review, approved, identity_fix, creative_fix, task_error i delivered. To wartości w twojej tabeli, nie stany zadania SpicyAPI. SpicyAPI może zgłosić succeeded, podczas gdy tabela wskazuje identity_fix: obraz istnieje, ale twarz nie pasuje do serii.

Akwarelowy szkic modowy fikcyjnej dorosłej Mary w bordowej sukience i grafitowej marynarce obok garderoby.

Zaplanuj strój, pozę i kadr dla każdego zadania, zachowując jedną referencję postaci. Ilustracja.

Wprowadź referencje do n8n bez mylenia bajtów z URL

n8n może przenosić zwykłe pola JSON i binarne dane plików w tym samym elemencie. Ciąg URL należy do JSON. Pobrana fotografia należy do właściwości binarnej, takiej jak data lub character. Ani nazwa właściwości binarnej, ani jej identyfikator przechowywania nie są publicznym URL obrazu.

W szybkiej konfiguracji jednego zadania pobierz postać ze swojego magazynu przez jego integrację n8n, umieszczając plik w polu binarnym character. Pobierz ubranie do wardrobe, a pomieszczenie do room, i dopilnuj, aby wszystkie pliki dotarły w tym samym elemencie wejściowym co prompt. Jeśli między pobieraniem a generowaniem używasz Edit Fields, pozostaw Include Binary Data włączone. W przeciwnym razie JSON może przetrwać, podczas gdy fotografie znikną.

W węźle SpicyAPI otwórz Media Inputs i dodaj trzy wpisy. W każdym wybierz pole image_urls, Source: Binary File oraz odpowiedni Input Binary Field: character, wardrobe albo room. Powtórzenie tego samego pola listy jest celowe. Węzeł przesyła te pliki binarne i składa je w jedną tablicę referencji w kolejności dodania.

Nie dodawaj trzech wpisów do pola przyjmującego jeden plik, takiego jak mask_url. Plugin sprawdza tę różnicę i zgłasza błąd, jeśli wiele wejść wskazuje pole pojedynczego pliku. Lista pól multimedialnych pochodzi ze schematu wybranego modelu. Jeśli widzisz nieznane pole, sprawdź wybrany model, zanim skopiujesz nazwę z innego workflow.

Przy wielokrotnym używaniu tych samych trzech źródeł łatwiej zarządzać jawnym przesyłaniem. Pobierz każdy oryginał do n8n, a następnie użyj SpicyAPI → File → Upload z pasującą nazwą pola binarnego. Wynik przesłania zawiera uri, fileId, fileName, mimeType i bytes. Wstaw zwrócony uri do odpowiedniej kolumny źródłowej dla tej serii produkcyjnej.

Operacja przesyłania zwraca nowy obiekt JSON. Nie kopiuje automatycznie pola takiego jak reference_role z poprzedniego elementu. Jeśli przesyłasz listę trzech elementów, zachowaj ich role przez wyrażenia powiązanych elementów albo jawne ponowne połączenie. Dla początkującego czytelniejsze są trzy osobno nazwane węzły przesyłania: postaci, garderoby i pomieszczenia. Wklejenie każdego zwróconego URI do arkusza pokazuje role jeszcze przed płatną edycją.

Przesłane wejścia są tymczasowe; implementacja pakietu opisuje przechowywanie plików przez jeden dzień. Przygotowując późniejszą serię, prześlij ponownie przechowywane oryginały. Nie zakładaj, że wartość spicy:// wklejona do arkusza miesiąc temu nadal zadziała. Obok tych tymczasowych URI zachowuj oryginalne identyfikatory plików Drive albo własne klucze magazynu, aby móc je odtworzyć.

Częstym błędem jest także URL strony udostępniania Drive. API potrzebuje bajtów obrazu, nie strony HTML z podglądem po zalogowaniu. Zamiast publicznie udostępniać główne obrazy postaci, pozwól węzłowi Google Drive pobrać plik binarny przy użyciu twoich poświadczeń, a potem prześlij go przez SpicyAPI. Prywatny folder źródeł może pozostać prywatny.

Dla sześciu wierszy użyj świeżo przesłanych URI źródeł we wszystkich wierszach. Ustaw trzy Media Inputs na Source: URL i użyj {{ $json.character_uri }}, {{ $json.wardrobe_uri }} oraz {{ $json.room_uri }}. W tym interfejsie URL przyjmuje także URI Spicy. Dzięki temu nie trzeba przenosić trzech pełnych plików binarnych przez każdą operację tabeli.

Trzymaj wiele referencji w jednym elemencie

„Wiele obrazów” oznacza tu dwie różne rzeczy. Masz sześć zadań, czyli sześć elementów n8n. Każde zadanie ma trzy referencje, które powinny pozostać trzyelementową tablicą wewnątrz tego zadania. Podzielenie tablicy na trzy elementy zmieniłoby znaczenie: edytor mógłby dostać trzy niezależne żądania z jedną referencją każde.

To rozróżnienie pojawia się w rzeczywistych pytaniach społeczności. W dyskusji Reddit o albumach Telegram autor zauważył, że kilka obrazów uruchamiało osobne wykonania; dodanie Wait opóźniało każde z nich, lecz nie grupowało albumu. Rozmowa proponuje buforowanie według wspólnego identyfikatora albumu albo rozdzielenie zbierania od przetwarzania. Nie dowodzi uniwersalnego rozwiązania, ale pokazuje, dlaczego „chwilę poczekaj” nie znaczy „złóż jedną paczkę referencji”.

Nasza tabela omija problem zbierania: deklaruje trzy referencje przed rozpoczęciem edycji. Jeśli później dodasz formularz wielu plików, etap zbierania powinien tworzyć jeden element ze wszystkimi wybranymi plikami i ich rolami. Nie pozwalaj, aby każdy przychodzący plik osobno uruchamiał Edit Character. Przesłanie ubrania nie powinno stawać się samodzielnym żądaniem jego przeprojektowania.

Możesz użyć opisanych powtarzających się wpisów Media Inputs albo zbudować listę w Additional Parameters (JSON). Pole JSON oczekuje jednego obiektu i jest łączone na końcu. Jego klucze nadpisują Prompt, Model Parameters i Media Inputs. To przydatne dla dynamicznej tablicy, ale może też ukryć wartości, które, jak sądzisz, wybrałeś w formularzu.

Na przykład poniższe wyrażenie tworzy kompletny obiekt wejściowy z przygotowanego wiersza:

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
} }}

Wybierz jedną metodę dla tablicy referencji. Przy tym wyrażeniu JSON pozostaw Media Inputs puste, aby nie przesyłać plików, które później zastąpi końcowe nadpisanie. Jeśli wolisz wizualną listę Media Inputs, pomiń image_urls w Additional Parameters. Złożone wejście API powinno mieć jedną trzyelementową tablicę, nie tablicę wewnątrz tablicy ani ciąg rozdzielony przecinkami.

Kolumna tablicy z arkusza może być zwykłym tekstem, nawet jeśli wygląda jak JSON. Osobne kolumny URI usuwają tę niepewność. Jeśli wybierzesz kolumnę references_json, przed generowaniem sparsuj ją do tablicy i zatrzymaj wiersz, jeśli parsowanie się nie powiedzie. Ciąg taki jak "[first,second,third]" nie jest listą URL obrazów.

To samo dotyczy rozdzielczości i wartości logicznych. Wstaw false do wyrażenia JSON jako Boolean, nie tekst "false". Wpisz 2k jako poprawną wartość enum, zamiast zgadywać rozmiar w pikselach. Formularz wygenerowany ze schematu jest wygodny właśnie dlatego, że pokazuje wartości akceptowane przez endpoint.

Napisz pierwszą instrukcję tak, aby model wiedział, co skąd pochodzi

W Prepare Edit zbuduj edit_prompt ze stałego wprowadzenia o rolach referencji i indywidualnego zamówienia ujęcia. Do łączenia ciągów możesz użyć Edit Fields; dla sześciu prostych wierszy Code nie jest potrzebny. Zachowaj stałe instrukcje tożsamości, a zmianę pobieraj z wiersza.

Odpowiednia instrukcja M01 może brzmieć:

Obraz 1 przedstawia Marę, fikcyjną dorosłą postać w wieku 34 lat. Zachowaj proporcje jej twarzy, ciemne loki do ramion, lekko asymetryczny uśmiech i siedzącą pozę. Obraz 2 dostarcza wyłącznie bordową nieprzezroczystą satynową sukienkę: skopiuj jej kolor, dekolt i położenie szwów, nie tożsamość innej osoby. Obraz 3 dostarcza wyłącznie salon, zieloną aksamitną sofę i mosiężną lampę. Umieść Marę w tym salonie w sukience. Portret ma być naturalny, z czytelnymi oczami i miękkim ciepłym światłem. Wykadruj siedzący portret w ujęciu trzy czwarte w proporcjach 4:5. Nie dodawaj innej osoby, tekstu ani dodatkowych akcesoriów.

To proponowany prompt, a nie instrukcja, którą uruchomiliśmy i oceniliśmy. Nadaje każdemu obrazowi rolę, opisuje zmianę oraz wskazuje kilka elementów, które mają pozostać rozpoznawalne. Mówi też edytorowi, co zrobić przy sprzecznych referencjach: twarz pochodzi z obrazu 1, ubranie z obrazu 2.

Dla M02 zmień zdanie o ujęciu na portret do pasa z mosiężną lampą oświetlającą jedną stronę twarzy. Nie powtarzaj M01 z dziesięcioma sprzecznymi terminami fotograficznymi na końcu. Dla M03 zastąp zdanie o zachowaniu siedzącej pozy wyraźnym opisem stania obok sofy z rozluźnionymi widocznymi dłońmi. Jednoczesne „zachowaj siedzącą pozę” i „niech stoi” tworzy zbędną sprzeczność.

M04 zamawia światło przy oknie. Zachowaj opis loków i ubrania, lecz określ chłodne światło okna z lampą pozostającą w tle. Zmiana dotyczy relacji świateł i miejsca w pomieszczeniu, nie nowego opisu postaci. M05 wykorzystuje grafitową marynarkę z obrazu głównego na bordowej sukience; powiedz to wprost, bo inaczej model ma rozsądny powód, by trzymać się referencji pokazującej samą sukienkę.

M06 zamawia szerszą siedzącą kompozycję z wolnym miejscem po jednej stronie. To coś innego niż przypadkowe zmniejszenie twarzy przez kadrowanie po generowaniu. Podaj docelową kompozycję, a potem obejrzyj twarz w pełnym rozmiarze. Szeroki kadr może sprawdzać się jako nagłówek, ale dostarczać mniej szczegółów twarzy do oceny tożsamości.

Pożądany styl NSFW umieszczaj w briefie, stosownie do endpointu i odbiorców. Ogólne „make it NSFW” nie opisuje stroju, wyrazu twarzy, kadru ani nastroju. Twórca nadal musi określić te elementy. W publicznym przykładzie dojrzały wieczorny klimat, nieprzezroczysta satyna i bezpośredni kontakt wzrokowy przekazują zamierzony ton bez dosłownych instrukcji.

Jeśli rzeczywisty brief wymaga dokładnej pozy niewidocznej w obrazie głównym, przed zaplanowaniem dużej serii utwórz ją jako osobną zatwierdzoną referencję. Workflow nie zastąpi brakujących informacji wizualnych przez powtarzanie tego samego niejasnego żądania. Użytecznym wynikiem pierwszej serii może być lepsza paczka źródeł, a nie sześć natychmiast udanych zdjęć.

Połącz pętlę generowania z osobną ścieżką błędów zadania

Dodaj Google Sheets Get Row(s) jako Read Jobs, wybierz kartę Jobs i odczytaj wiersze serii. Węzłem Filter o nazwie Ready Jobs zachowaj wiersze, których status to ready. Jeśli filtrujesz w samym Sheets, upewnij się, że wiele dopasowań zwraca wszystkie wiersze, a nie tylko pierwszy. Sześciowierszowa tabela zwracająca jeden element nie jest serią sześciu zdjęć.

Połącz przefiltrowane elementy z Loop Jobs, węzłem Loop Over Items z Batch Size 1 i wyłączonym Reset. Jego wyjście loop połącz z Prepare Edit, a potem Edit Character. SpicyAPI już przetwarza wiele elementów wejściowych, więc sama wielokrotna edycja nie wymaga pętli. Używamy jej, aby zapis i aktualizacja statusu każdego wiersza skończyły się przed przejściem do następnego żądania.

W Edit Character ustaw Image → Generate, wybierz dokładny model edycji i przypisz Prompt do przygotowanej instrukcji. Dodaj trzy referencje albo pojedynczy obiekt JSON, zgodnie z wcześniejszym wyborem. Włącz Wait for Completion i Download Output. Ustal świadomy limit Max Cost per Item (USD); dla małego przykładu $0.10 jest użytecznym początkowym limitem, o ile wycena całego wejścia mieści się pod nim.

Limit dotyczy jednego elementu, nie całego arkusza. Sto wierszy może osobno przejść limit dziesięciu centów. Ogranicz wybraną serię do sześciu gotowych wierszy i ustaw limit wydatków konta dla klucza API, jeśli chcesz drugą granicę. Ani liczba wierszy, ani limit wydatków nie poprawiają obrazu; zapobiegają przypadkowemu uruchomieniu znacznie większej listy przez harmonogram.

Węzeł sam wycenia zadanie przed jego utworzeniem. Jeśli kompletne żądanie przekroczy limit, zgłasza błąd przed generowaniem. Nie dodawaj drugiego węzła wyceny do ścieżki produkcyjnej, chyba że potrzebujesz osobnego kosztorysu w tabeli. Do planowania Model → Get Quote wyceni dokładnie te same referencje i ustawienia bez utworzenia obrazu.

W Settings ustaw On Error na kontynuowanie przez zwykłe wyjście dla opisanej ścieżki błędów. Wynik pluginu w tym trybie zawiera error, description i identyfikator zadania, jeśli jest dostępny. Za Edit Character umieść If sprawdzający obecność error. Ścieżka błędu zapisuje task_error oraz wiadomość, po czym wraca do Loop Jobs; ścieżka sukcesu zapisuje kandydata i pending_review, po czym wraca do tego samego wejścia pętli.

Nie używaj wyjścia done pętli do generowania następnego obrazu. Done służy podsumowaniu po powrocie wszystkich przetworzonych wierszy. Możesz odczytać zaktualizowaną tabelę kandydatów albo pokazać liczby. Rozdziel ścieżki jasno: błąd API nie trafia do folderu oceny jako pusty plik, a gotowy plik nie trafia bezpośrednio do folderu docelowego.

Przy sześciu edycjach pozostaw wbudowane oczekiwanie węzła. Osobna konfiguracja callbacków jest zwykle zbędna. Jeśli wykonanie przestanie oczekiwać, gdy zadanie jeszcze działa, skopiuj pierwotny identyfikator do Task → Get i w jego opcjach włącz Wait for Completion oraz Download Output. Task → Get domyślnie nie czeka, więc bez tej opcji może zwrócić trwające zadanie bez pliku. W osobnym wykonaniu odzyskiwania najpierw odczytaj pasujący wiersz Jobs i przepuść go przez Prepare Edit, a następnie połącz Task → Get → Attach Job → ścieżkę zapisu kandydata. To zachowuje powiązany kontekst używany przez poniższe wyrażenia; świeży Manual Trigger podłączony wprost do Task → Get pozostawiłby Prepare Edit niewykonany. Gdy odzyskane zadanie zakończy się i pobierze plik, zapisz kandydata bez powrotu do Generate. Błąd przekroczenia czasu może zawierać identyfikator w description, mimo pustego pola taskId, więc sprawdź opis przed zamówieniem zamiennika. Nowe generowanie z powodu wolno działającej strony może utworzyć kolejne płatne zadanie, choć pierwotne później się powiedzie.

Ponownie dołącz tożsamość zadania przed zapisaniem czegokolwiek

Po sukcesie węzeł zwraca rekord zadania i pobrane pliki binarne. JSON nie jest pierwotnym wierszem arkusza z kilkoma dopisanymi polami. Zawiera informacje zadania, takie jak taskId, state, cost, settled i output. Dlatego późniejsze {{ $json.job_id }} może być puste, choć prompt użył właściwego wiersza.

Za ścieżką sukcesu dodaj Attach Job, węzeł Edit Fields. Zachowaj JSON zadania, włącz Include Binary Data i dodaj pola produkcyjne przez wyrażenia powiązanych elementów. Węzeł społecznościowy zapewnia parowanie elementów, więc możesz wrócić do konkretnego elementu Prepare Edit, zamiast pobierać pierwszy wiersz serii.

Użyj {{ $('Prepare Edit').item.json.job_id }} dla job_id, a analogicznego wzoru dla batch_id, attempt, edit_prompt i etykiety wersji źródła. task_id pobierz z bieżącego rekordu przez {{ $json.taskId }}. Z serii, zadania i próby zbuduj candidate_id, który posłuży jako rdzeń nazwy pliku.

Nie odzyskuj identyfikacji każdego wiersza przez $('Read Jobs').first(). To bierze pierwszy wynik i może oznaczyć wszystkie sześć plików jako M01. Unikaj też odbudowy powiązań według pozycji po sortowaniu lub filtrowaniu jednej ścieżki. Parowanie działa, dopóki związek pozostaje czytelny; jeśli później świadomie dzielisz lub agregujesz elementy, zachowuj w nich jawny job_id.

Pierwszy pobrany zasób jest domyślnie binarnym data. Kolejne używają data_1, data_2 i tak dalej. Edytor z przykładu zwraca jeden obraz, więc do magazynu przekazujesz data. Jeśli zmienisz model na zwracający wiele zasobów, nie zakładaj, że zapis data zachował cały wynik. Wybierz zasób należący do kandydata albo rozdziel zasoby na osobno nazwane rekordy kandydatów.

Ścieżka JSON output.assets[].url zawiera linki wynikowe, nie treść pobranego pliku. Według dokumentacji pakietu wygasają po około dwudziestu minutach. Arkusz zawierający wyłącznie URL może sprawdzać się podczas natychmiastowej oceny, a przestać działać przy późniejszym powrocie. Download Output dostarcza węzłowi magazynu rzeczywiste bajty do zapisania.

Kopie binarne również potrzebują trwałego miejsca. Nie dziedziczą krótkiej ważności podpisanego URL, ale dane wykonania n8n mogą być usuwane. Udane wykonanie nie jest archiwum. Zapis kandydata podczas wykonania pozwala wrócić do obrazu jutro bez ponownego generowania.

Zapisz kandydatów do oceny i sam zdecyduj, co wymaga poprawki

Utwórz prywatny folder mara-evening-01/review w swoim magazynie. W przykładzie dodaj Google Drive File → Upload jako Save Candidate, ustaw Input Data Field Name na data, nazwę pliku na identyfikator kandydata z .png i wybierz folder oceny. Dokumentacja węzła Drive opisuje pola przesyłania plików binarnych.

Nazwa powinna odzwierciedlać rzeczywisty format. Dopisanie .png do JPEG go nie konwertuje; w przykładzie wybraliśmy PNG w żądaniu modelu. Zachowaj identyfikator pliku zwrócony przez integrację magazynu, nie tylko czytelną nazwę. Dwa pliki w folderze mogą mieć tę samą nazwę, a późniejsze dostarczenie potrzebuje jednoznacznego źródła.

Drive Upload zwraca metadane pliku zamiast zachować cały rekord kandydata. W Record Candidate użyj identyfikatora przesłanego pliku z bieżącego elementu i powiązanych wartości z Attach Job dla identyfikatora kandydata, zadania, zadania API i kosztu. Ręcznie przypisz pola do Candidates przez Append or Update Row, dopasowując po candidate_id. Wtedy kolejna próba nie nadpisze rekordu pierwszej.

Jeśli aktualizujesz też Jobs, ustaw pasujący wiersz job_id na pending_review. Końcowe wyjście aktualizacji tabeli skieruj do Loop Jobs. Na ścieżce błędu zapisz oryginalny identyfikator z Prepare Edit, opis błędu i dostępny identyfikator zadania, zanim wrócisz. Obie ścieżki muszą docierać do pętli; inaczej seria może skończyć się na pierwszym błędzie lub sukcesie.

Obejrzyj sześć zapisanych obrazów razem w dwóch rozmiarach. W miniaturach sprawdź, czy tworzą zamierzoną serię: tę samą postać, spójny strój i pomieszczenie oraz wystarczająco różne ujęcia. W pełnym rozmiarze porównaj oczy, nos, kształt ust, kontur żuchwy, linię włosów i charakterystyczną asymetrię źródła oraz kandydata. To praktyczne punkty oględzin, nie automatyczny system oceny biometrycznej.

Oddziel w tabeli problemy tożsamości od twórczych. Rozpoznawalna Mara z lampą w złym miejscu wymaga innej kolejnej instrukcji niż piękny portret kogoś innego. Gdy twarz pasuje, ale kompozycja nie, ustaw creative_fix i opisz brakującą zmianę. Jeśli zmieniła się postać, ustaw identity_fix i wskaż różnicę, na przykład węższą żuchwę i inną linię włosów.

Nie zatwierdzaj obrazu wyłącznie dlatego, że jego state oznacza sukces albo automatyczny opis rozpoznał właściwy strój. Model opisujący może rozpoznać bordową sukienkę, nie rozstrzygając, czy twarz należy do ustalonej serii. Możesz dodać asystenta sugerującego notatki, ale właściwa decyzja zatwierdzenia powinna pozostać osobna i widoczna.

Każdej porażce przypisz konkretną następną edycję

Załóżmy, że M01 jest blisko celu, lecz postać przejęła kształt włosów manekina z referencji stroju. Najpierw sprawdź, czy obraz 2 rzeczywiście nie ma konkurencyjnej głowy; jeśli ma, wykadruj samo ubranie. Następnie wyjaśnij, że obraz 2 dostarcza wyłącznie sukienkę, a loki i linia włosów pochodzą tylko z obrazu 1. Zleć próbę 2 względem pierwotnego obrazu głównego, nie kandydata z odchyleniem.

Jeśli M02 wygląda jak Mara, ale zmienia dekolt sukienki, popraw referencję ubrania. Ciemne zdjęcie ukrywające dekolt dostarcza niewiele informacji do zachowania. Wykadruj czytelniejszy widok szwów i zażądaj konkretnych szczegółów konstrukcji, utrzymując portret do pasa. Dodanie kolejnych nieco podobnych sukienek może zwiększyć niejasność zamiast ją usunąć.

Stojąca poza M03 może zawieść na dwa sposoby. Gdy poza jest wiarygodna, lecz zmienia się twarz, zmniejsz zmianę kamery i spróbuj stojącego portretu trzy czwarte z twarzą w stronę aparatu. Gdy twarz pozostaje, lecz ciało układa się niezręcznie, zamów prostszą postawę obok sofy z rozluźnionymi widocznymi dłońmi. Próba żądająca naraz trudnego skrętu, skrzyżowanych ramion i skrajnego światła utrudnia rozpoznanie przyczyny porażki.

M04 może zachować twarz, ale tak ochłodzić i przyciemnić światło, że trudno porównać ją ze źródłem. Zanim odrzucisz obraz jako zmianę tożsamości, obejrzyj go neutralnie i rozróżnij wpływ światła od zmiany proporcji twarzy. Kolejny prompt może zachować miejsce przy oknie, prosząc o czytelne szczegóły twarzy i łagodniejszy cień. Nie dodawaj automatycznie innej referencji tożsamości tylko dlatego, że kolorystyka sprawiła, iż ta sama postać wygląda obco.

M05 może ukryć bordową sukienkę pod marynarką rozrastającą się w inny strój. Określ, że oryginalna grafitowa marynarka jest rozpięta na sukience, której konstrukcja pozostaje widoczna. Jeśli na poza tym świetnym ujęciu zniekształcona jest tylko jedna krawędź marynarki, rozważ miejscową poprawkę wybranego obrazu maską zamiast nowej edycji całej sceny. To nowe zadanie używające wybranego kandydata jako jedynego źródła, nie pierwotne żądanie z trzema referencjami.

M06 może dać zamówione puste miejsce, ale zbyt małą głowę Mary dla docelowej okładki. Popraw instrukcję kompozycji: siedzący portret w planie średnim, pomieszczenie widoczne po lewej, twarz nadal czytelnie duża. Sama zmiana proporcji nie mówi modelowi, gdzie ma być miejsce na tytuł. Notatka twórcza powinna opisywać układ, nie tylko podawać 4:5 lub 16:9.

Odrzucenie treści należy do ścieżki błędów zadania, nie naprawy tożsamości. Przeczytaj powód i wybierz odpowiednie dozwolone żądanie albo model; nie przesyłaj wielokrotnie niezmienionego odrzuconego wejścia. Wygenerowany, ale nieodpowiedni wynik to inna sytuacja: może być płatny, bo generowanie się powiodło. Zachowaj to rozróżnienie w tabeli, aby koszt nieudanych prób twórczych pozostał widoczny.

Zatrzymaj ścieżkę poprawek po świadomie wybranym limicie, na przykład dwóch próbach w pierwszym podejściu. To decyzja produkcyjna, a nie przewidywanie, że dwie próby wystarczą. Uporczywe ujęcie może wrócić do przygotowania źródeł lub ręcznej edycji. Automatyzacja jest najbardziej użyteczna, gdy uwidacznia problem i pozwala go powtarzalnie rozwiązywać, zamiast tworzyć dwadzieścia luźno powiązanych alternatyw podczas twojej nieobecności.

Bliski portret fikcyjnej dorosłej postaci z wyraźnymi lokami i miękko rozmytą lampą w tle.

Porównuj proporcje twarzy i loki osobno od kadru tła oraz położenia lampy. Ilustracja.

Dostarcz zatwierdzone pliki bez ponownego generowania

Po ocenie zmień status wybranych kandydatów na approved. Pozostałe próby zachowaj z notatkami. Dla M03 możesz zatwierdzić próbę 2 i pozostawić próbę 1 jako identity_fix. Workflow dostarczenia powinien odczytywać Candidates, nie zgadywać zwycięzcy na podstawie najnowszego pliku w folderze.

Zbuduj drugi workflow z Manual Trigger, Google Sheets Get Row(s) i Filter wybierającym review_status równy approved oraz pusty delivery_file_id. Dodaj Loop Over Items z Batch Size 1. Pobierz każdego kandydata po zapisanym identyfikatorze Drive do binarnego data, a następnie prześlij go do folderu serii approved pod docelową nazwą.

Do pobierania używaj własnego zapisanego kandydata, nie tymczasowego URL wyniku SpicyAPI. To dokładnie obraz, który oceniłeś. Nie wywołuj Image → Generate, aby odtworzyć go z tym samym seedem lub w wyższej rozdzielczości, zakładając, że nadal jest zatwierdzony. Każdy nowy render wymaga własnej oceny, bo twarz, strój lub kadr mogą się zmienić.

Po przesłaniu do zatwierdzonego folderu zaktualizuj wiersz kandydata o delivery_file_id i review_status: delivered, a opcjonalnie również Jobs o wybrany identyfikator kandydata. Aktualizację skieruj z powrotem do pętli. Identyfikator pliku pozwala stabilnie pobrać dostarczoną wersję i zapobiega uznawaniu wszystkich zatwierdzonych wierszy za niedokończone przy zwykłym drugim przebiegu.

Używamy kopii przez pobranie i przesłanie, bo przekazanie pliku binarnego jest jawne. Jeśli magazyn oferuje natywne kopiowanie zachowujące oryginalne bajty, możesz użyć go zamiast tego. Zasada twórcza pozostaje ta sama: dostarczenie kopiuje zatwierdzony obraz, nie uruchamia ponownie edytora.

Eksporty po skalowaniu, kadrowaniu lub kompresji przechowuj w osobnym folderze. Kwadratowa miniatura i pełnowymiarowy zatwierdzony portret są różnymi plikami, nawet z tego samego źródła. Zachowaj oryginalną zatwierdzoną wersję, aby robić kolejne eksporty bez nowej opłaty za generowanie. Jeśli kadr ucina fryzurę albo zmienia prezentację postaci, oceń eksport pod kątem jego miejsca publikacji.

Ten workflow nie zawiera węzła publikacji w mediach społecznościowych. Dostarczenie kończy się plikami i tabelą wybranych kandydatów. To wystarczy do przekazania zestawu projektantowi strony, przygotowania prywatnej galerii albo ręcznego wyboru miejsc publikacji. Publikację do konkretnych miejsc możesz dodać później, lecz nie powinna być nierozłącznie związana z generowaniem i oceną obrazów.

Wyceń rzeczywistą paczkę referencji, nie samą listę modeli

Cena początkowa węzła pomaga przeglądać modele. Wycena żądania zależy od kompletnych referencji i ustawień. Katalog podaje dla Qwen Image 2.1 Edit ceny początkowe $0.036 przy 1k, $0.048 przy 2k i $0.072 przy 1.5k. Publiczne wyceny dla trzech referencji wynoszą $0.060 przy 1k i $0.048 przy 2k, przy nieprzezroczystym wyjściu PNG i wyłączonym rozwijaniu promptu. Przy 1k dwie dodatkowe referencje dodają $0.024; wycenione żądanie 2k nie ma takiego dodatku. Nie zakładaj, że pośrednia rozdzielczość jest tańsza od 2k albo że dopłata za referencje działa identycznie w każdym poziomie.

Użyj Model → Get Quote z tymi samymi image_urls, promptem i ustawieniami, zanim oznaczysz pięć kolejnych wierszy jako gotowe. Węzeł zwraca złożone wejście razem z wyceną, co pomaga sprawdzić, czy trzy referencje przetrwały mapowanie. Ta operacja planowania przesyła binarne referencje, jeśli trzeba, ale nie generuje obrazu.

W planowanej konfiguracji 2k z trzema referencjami obecna wycena $0.048 daje budżet pierwszych sześciu kandydatów $0.288; dwanaście żądań kosztowałoby $0.576. Sześć takich żądań w wycenie 1k dałoby $0.360. To budżety produkcji oparte na wycenie, nie rachunki z wykonanej serii ani porównanie jakości obrazów. Przed uruchomieniem ponownie wyceń własne źródła i ustawienia. Magazyn oraz hosting lub abonament n8n są osobnymi kosztami.

Licz próby jako zadania. Sześć zatwierdzonych zdjęć może wymagać więcej niż sześciu udanych generowań, ponieważ część płatnych kandydatów nie pasuje do briefu. Jeśli wycenisz pierwsze podejście i ustalisz dwie próby na ujęcie, maksymalna liczba planowanych prób wyniesie dwanaście. To użyteczniejszy budżet niż „jedna seria sześciu obrazów” bez zapasu na zamienniki.

Plugin wysyła klucz idempotencji dla każdego elementu. Powtórzenie tego samego wywołania węzła w tym samym wykonaniu ma odzyskać istniejące zadanie zamiast naliczyć duplikat. Nowe wykonanie, zmienione wejście lub kolejny przebieg pętli to nowa praca. Ponowne kliknięcie Execute Workflow nie jest odzyskaniem pierwotnego identyfikatora zadania.

Gdy wiersz ma identyfikator zadania, odzyskaj lub sprawdź to zadanie przed zamówieniem zamiennika z powodu przerwy technicznej. Jeśli się udało, lecz plik nie został zapisany przez awarię Drive, pobierz wynik i dokończ zapis. Wygaśnięcie poświadczeń magazynu nie poprawiło twarzy, więc nie ma twórczego powodu do opłacenia nowego renderu.

Dokumentacja pluginu mówi, że nieudane i wygasłe zadania zwykle zwalniają blokadę środków, a odrzucone żądania nie są płatne, chyba że strona modelu stanowi inaczej. Udany kandydat odrzucony w twojej ocenie to inna sytuacja niż błąd API. Zachowuj actual_cost z rozliczonego rekordu, aby później zobaczyć, ile rzeczywiście kosztowało każde dostarczone ujęcie.

Przeprowadź pierwsze zadanie od źródła do dostarczenia, a potem rozszerz serię

Zanim włączysz wszystkie sześć wierszy, przeprowadź M01 przez generowanie, zapis i ocenę. Otwórz rzeczywisty plik w folderze oceny. Sprawdź, czy wiersz wskazuje M01, prompt używa właściwych ról referencji, a zwrócony plik jest tym, który oglądasz. Poprawny podgląd w panelu wykonania nie dowodzi, że zapisany kandydat ma właściwą nazwę lub powiązanie z tabelą.

Zatwierdź kandydata i uruchom raz workflow dostarczenia. Otwórz plik w zatwierdzonym folderze i sprawdź, czy to wybrany obraz. Uruchom dostarczenie ponownie bez zmiany stanu tabeli; powinno pominąć wiersz z istniejącym identyfikatorem dostarczenia. Jeśli później ręcznie usuniesz ten identyfikator, workflow ponownie uzna wiersz za kwalifikujący się, więc rób to tylko wtedy, gdy rzeczywiście potrzebujesz kolejnej kopii.

Następnie oznacz M02–M06 jako gotowe. Pętla generowania powinna utworzyć rekord kandydata dla każdego zadania albo konkretny rekord błędu. Obejrzyj arkusz miniatur, napisz krótkie konkretne uwagi i twórz tylko te zamienniki, które uzasadniają notatki. Obraz główny pozostaje źródłem zwykłych zamiennych ujęć.

Masz teraz użyteczny workflow n8n NSFW image-to-image: zdefiniowane źródło postaci, referencje z rolami, osobne zadania edycji, poprawną obsługę plików binarnych i URI, czytelne instrukcje twórcze i folder docelowy z wybranymi zdjęciami. Automatyzacja przenosi materiały i zapisuje pracę. Projekt ujęć oraz selekcja decydują, czy serię warto opublikować.

Także w językach English · 日本語 · 한국어 · Deutsch · Français · Español · Português (Brasil) · Русский · Italiano

Wykorzystaj ten poradnik w praktyce

Pobierz workflow

Stwórz serię NSFW swojej postaci z n8n.

Zbuduj spójną galerię twórcy NSFW wokół wybranej dorosłej postaci. Twórz 4, 8 lub 12 wariantów strojów i scen w n8n, używając tego samego oryginalnego portretu przy każdej edycji w Qwen Image 2.1.

Wypróbuj samodzielnie

Płacisz tylko za to, co uruchomisz — bez planów i subskrypcji.

Zrobione w MiniMax H3 · ByteDance Seedance 2.0 Fast