Pour construire un workflow n8n de génération d’images IA NSFW, reliez une liste de scènes à un modèle text-to-image orienté adulte, puis enregistrez chaque image terminée avant de lancer la suivante. Sur n8n auto-hébergé, le nœud communautaire SpicyAPI gère le devis, la soumission, l’attente et le téléchargement. Sur n8n Cloud, utilisez plutôt le template HTTP Request avec les nœuds intégrés : le package n’est actuellement pas vérifié pour une installation directe sur Cloud.
Pour une première série de personnages adultes fictifs, utilisez Z-Image Spicy en 1 024 × 1 536 avec l’expansion du prompt désactivée. Son prix de base est $0.01235 par image ; six requêtes réussies coûtent donc $0.07410 de génération d’images. Fixez une limite par élément, gardez le premier essai manuel et stockez les fichiers réels dans un dossier de projet. L’hébergement n8n et le stockage ont des coûts distincts.
Le workflow ci-dessous crée une série de portraits de soirée autour d’un adulte fictif. Vous fournissez la description du personnage et six scènes ; n8n répète la préparation et la livraison. Il garde le brief écrit cohérent, mais le text-to-image seul ne garantit pas un visage identique. De plus, n8n ne modifie pas la politique de contenu d’un modèle : ajouter un nœud d’automatisation à une API restreinte ne la rend pas sans censure.
C’est un tutoriel de configuration fondé sur le code actuel du plugin, le catalogue de modèles et la documentation n8n. L’exemple est un workflow proposé, pas le compte rendu d’un nouveau test de six images. Les illustrations publiques expliquent la configuration ; elles ne prouvent pas les performances des modèles.
Ce que vous allez construire
La séquence est :
Manual Trigger → Build scene list → Split Out → Build prompts → Loop Over Items → SpicyAPI Generate → Google Drive Upload → retour dans la boucle.
La boucle traite une scène à la fois. Le nœud de génération termine et télécharge son image, Drive l’enregistre, puis seulement la scène suivante commence. La sortie Done de la boucle marque la fin de la série.
Cet ordre compte pour un ensemble plutôt qu’une seule image. Si la scène quatre échoue, les scènes un à trois doivent déjà être dans le dossier. Vous pouvez récupérer la quatre et poursuivre, au lieu de relancer toute la série. Cela attribue aussi un nom reconnaissable à chaque image tant que ses informations de scène restent disponibles.
Le nœud SpicyAPI sait déjà traiter plusieurs éléments d’entrée. Nous ajoutons la boucle précisément pour enregistrer chaque résultat avant de poursuivre ; elle n’est pas nécessaire pour simplement envoyer plusieurs prompts. Une génération multi-éléments plus large pourra servir plus tard, mais un workflow image par image se comprend mieux quand on apprend la différence entre une exécution, une tâche et un fichier téléchargé.
Cette première version n’a besoin ni d’AI Agent, ni de frontend, ni de Telegram, ni de LLM rédacteur de prompts. Ajoutez-les lorsqu’ils résolvent un vrai problème. Pour l’instant, leur absence laisse un emplacement clair pour le personnage, un autre pour la scène et un dossier clair contenant les résultats.
Choisissez le modèle d’image avant le template
Pour les personnages adultes, le choix du modèle précède l’automatisation. Un template peut offrir un formulaire utile ou une belle démonstration tout en utilisant un endpoint qui refuse le contenu prévu. Certains exemples génériques n8n ajoutent aussi volontairement leur propre liste de blocage NSFW. Les importer sans modification conserve ce comportement.
Voici les options text-to-image SpicyAPI pertinentes pour ce guide :
| Modèle | Prix de génération sans expansion | Réglages de taille | Quand il convient au workflow |
|---|---|---|---|
| Z-Image Spicy | $0.01235 par image | Largeur et hauteur de 256 à 1 536 pixels chacune ; défaut 1 024 × 1 536 | Commencer une série de portraits avec un endpoint adulte et un coût modeste |
| Z-Image Spicy Pro | $0.019 par image | Largeur et hauteur de 256 à 2 560 pixels chacune ; défaut 1 024 × 1 024 | L’image finale nécessite un côté supérieur à 1 536 pixels |
| Z-Image Turbo | $0.010 par image | Choix parmi les ratios pris en charge ; défaut 1:1 | Un pilote moins coûteux ou des concepts avec ses propres paramètres |
Les deux familles Spicy sont annoncées comme des endpoints adultes sans restriction. C’est le périmètre produit fourni, pas un nouveau taux d’acceptation mesuré pour tous les prompts. Choisissez l’endpoint adapté à la tâche automatisée, puis faites un petit pilote avec le brief réel avant d’étendre la série.
Pro est un choix pratique pour un canevas plus grand ; son nom ne démontre pas une meilleure conservation du visage. Si le portrait final n’exige que 1 024 × 1 536, Spicy standard accepte déjà cette taille. Payer Pro doit répondre à un besoin concret plutôt qu’à l’idée qu’un nom plus cher corrige la dérive des personnages.
Ne copiez pas les réglages entre lignes comme s’il s’agissait de la même API. Spicy et Spicy Pro utilisent width et height. Turbo utilise aspect_ratio et limite le prompt à 1 000 caractères. Les prompts Spicy n’ont pas de plafond de caractères imposé. Ces endpoints reçoivent du texte, pas des références ; ajouter une image au workflow ne leur donne pas une capacité de référence qu’ils n’exposent pas.
Gardez l’expansion désactivée pour la première série. Vous allez écrire une description réfléchie du personnage et une scène précise. Un expandeur ajoute une transformation entre ces consignes et la requête d’image, compliquant l’identification des formulations qui produisent le résultat. Il change aussi le prix de Spicy standard et Turbo : avec expansion, ils coûtent respectivement $0.0133 et $0.016 par image. Pro affiche un seul prix par image.
Pour commencer, choisissez Spicy standard, fixez explicitement 1 024 × 1 536 et gardez l’expansion désactivée par défaut. L’exemple aura une taille cohérente et un calcul simple. Après avoir ouvert les images sauvegardées, vous pourrez décider d’une composition plus large, d’un canevas plus grand ou d’un modèle de retouche pour mieux contrôler l’identité.
Installez le nœud et connectez le compte
Pour le package, la clé API et les templates HTTP n8n Cloud, ouvrez le guide officiel du nœud SpicyAPI pour n8n. Suivez ensuite la préparation des scènes ou références ci-dessous pour ce workflow précis.
La voie directe avec nœud communautaire demande une instance n8n auto-hébergée autorisant ces packages. Dans Settings, trouvez Community Nodes et installez @spicyapi/n8n-nodes-spicyapi. La version publiée est 0.1.1. Si l’administrateur a désactivé l’installation communautaire, demandez-lui d’activer ou d’installer le package ; le rechercher sans fin dans le sélecteur ne l’ajoutera pas.
Un package publié n’est pas nécessairement vérifié par n8n. n8n Cloud autorise les nœuds communautaires vérifiés et ce package n’en fait pas actuellement partie. Sur Cloud, passez à la section du template HTTP. Cette distinction vient de la documentation d’installation communautaire n8n, pas d’une limite de l’API d’image.
Après installation, ajoutez un nœud SpicyAPI et créez son credential. Récupérez la clé dans la console de clés SpicyAPI, collez-la dans API Key et gardez la Base URL par défaut, https://api.spicyapi.ai. Enregistrez et utilisez le test de connexion. La clé appartient au credential, pas au prompt, à un nœud Edit Fields ou à un export partagé.
Un test réussi établit que le compte est accessible. Il ne signifie pas qu’une image a été générée, que le modèle accepte toutes les entrées ou que le solde suffit à un grand lot. Vérifiez le solde avant le pilote et laissez les déclencheurs programmés inactifs jusqu’à ce que le parcours manuel fonctionne.
Si le nœud apparaît mais que le sélecteur de modèles ne charge pas, commencez par le credential et la connexion plutôt que par le prompt. Une requête de liste de modèles échouée relève de la configuration. Vous pouvez aussi passer le champ Model en mode ID et entrer l’identifiant public exact ; cela ne répare pas une clé invalide et ne contourne pas les règles des paramètres.
L’identifiant de cet exemple est alibaba/z-image-spicy/text-to-image. Le nom de page et l’identifiant API ont des fonctions différentes : la page explique le produit, l’identifiant complet sélectionne la tâche exacte. Utilisez celui-ci dans le nœud, pas le slug court du site.
Générez et enregistrez d’abord une image
Avant la liste de six scènes, reliez Manual Trigger à un nœud SpicyAPI. Choisissez Resource Image et Operation Generate. Sélectionnez Z-Image Spicy ou le mode ID avec l’identifiant précédent. Laissez Media Inputs vide puisqu’il s’agit de text-to-image.
Utilisez ce prompt initial complet :
Photographie éditoriale de Mara, femme fictive de 34 ans aux boucles brunes aux épaules, aux yeux marron, au visage doucement anguleux et portant un petit pendentif en or. Elle porte une robe de soirée de satin vert profond opaque à fines bretelles. Elle se tient près d’une haute fenêtre d’appartement au crépuscule, une main légèrement posée sur le rideau, regardant la caméra avec une assurance calme. Portrait à mi-corps, lumière intérieure chaude mêlée à la lumière bleue fraîche du soir, texture cutanée naturelle, plis textiles réalistes, atmosphère romantique retenue, aucune autre personne dans le cadre.
Ce prompt décrit un adulte précis et un seul moment visible. Il donne une place à la caméra, précise les vêtements importants et sépare la lumière intérieure chaude de la fenêtre plus froide. Il n’exige pas de reconstruire une histoire complexe dans une image fixe.
Réglez Model Parameters sur largeur 1024, hauteur 1536 et expansion false. Laissez le seed non défini pour ce pilote. Dans Additional Parameters, gardez l’objet vide {}. Ce champ peut remplacer le prompt et les réglages visibles ; une valeur oubliée peut envoyer autre chose que ce qu’affiche le formulaire.
Fixez Max Cost per Item (USD) à 0.015, au-dessus du prix actuel de $0.01235 mais bien en dessous du défaut de $2 par élément. Gardez Wait for Completion et Download Output activés dans les options. Utilisez data comme propriété binaire. Gardez Max Wait Time à sa valeur par défaut pour la première image ; le nœud utilise l’échéance de la tâche plutôt qu’une attente indéfinie.
Exécutez une fois. Le nœud obtient un devis avant de créer la tâche et vérifie la limite. Quand la tâche réussit et que la sortie est prête, il télécharge l’image en données binaires. Ouvrez la vue Binary de la sortie et prévisualisez ou téléchargez data.
Trois éléments doivent maintenant correspondre : tâche réussie, image binaire ouvrable et image raisonnablement conforme au brief. Une tâche réussie avec une mauvaise tenue est un problème créatif. Un credential défaillant est un problème de configuration. Une tâche réussie sans fichier enregistré est un problème de livraison. Les distinguer évite de payer une autre génération alors que l’original n’a simplement pas atteint sa destination.
Examinez l’image à sa taille d’utilisation. Pour une carte de compagnon, le visage doit se lire dans un petit cadrage. Pour une illustration de chapitre, la pose et la pièce peuvent compter davantage. Si le pendentif détourne l’attention, simplifiez-le avant d’étendre la série. Si l’expression est trop neutre, changez le regard ou la pose plutôt que d’ajouter une douzaine d’adjectifs généraux de qualité.
Ajoutez ensuite Google Drive après Generate. Choisissez Resource File, Operation Upload et Input Data Field Name data. Sélectionnez le credential Drive et un dossier de projet, puis exécutez le téléversement avec la sortie réussie. Ouvrez le fichier dans Drive. Terminez cet enregistrement avant le lot ; sinon six générations réussies peuvent vous laisser résoudre six fois le même fichier absent.
Préparez un brief de personnage et six scènes distinctes
Pour un ensemble cohérent, placez l’apparence et le style photographique dans deux champs réutilisables. Faites varier la scène séparément. C’est plus contrôlable que de demander à un LLM d’inventer chaque prompt, puisque vous voyez les parties fixes et variables.
Ajoutez un nœud Edit Fields après Manual Trigger et nommez-le Build scene list. Dans Manual Mapping, créez ces champs :
| Champ | Type | Exemple de valeur |
|---|---|---|
seriesId | String | mara-evening-v1 |
characterBase | String | Âge, visage, cheveux, pendentif et robe de satin vert opaque de l’adulte fictif |
styleBase | String | Photographie éditoriale, texture naturelle, tissu réaliste, atmosphère romantique retenue |
scenes | Array | Les six objets de scène ci-dessous |
Pour characterBase, utilisez une phrase complète : « Mara est une femme fictive de 34 ans aux boucles brunes aux épaules, aux yeux marron, au visage doucement anguleux et portant un petit pendentif en or, vêtue d’une robe de soirée de satin vert profond opaque à fines bretelles. » Pour styleBase : « Photographie éditoriale, texture cutanée naturelle, plis textiles réalistes, atmosphère romantique retenue, un seul personnage adulte. »
Ne placez pas toutes vos préférences dans le champ du personnage. « Souriante », « assise », « près d’une fenêtre » et « lumière bleue » sont des choix de scène. Fixés dans la base, ils peuvent contredire un portrait debout sous lumière chaude. La base décrit qui apparaît ; la scène décrit ce que le spectateur voit se passer.
Collez ceci comme valeur du champ Array scenes :
[
{"sceneId":"01","scene":"Waist-up beside an apartment window at dusk, hand on the curtain, cool evening light and warm interior light, looking toward the camera."},
{"sceneId":"02","scene":"Seated sideways on a velvet armchair in the same apartment, relaxed shoulders, hands resting separately, warm floor-lamp light, medium portrait."},
{"sceneId":"03","scene":"Standing in the apartment doorway, one hand on the doorframe, softly playful expression, three-quarter portrait, warm light behind her."},
{"sceneId":"04","scene":"Close portrait beside the window, curls tucked behind one ear, pendant visible, steady direct gaze, soft side light."},
{"sceneId":"05","scene":"Standing on a quiet balcony at blue hour, dress moving slightly in the breeze, looking back toward the apartment, medium portrait."},
{"sceneId":"06","scene":"Seated on the armchair near the window, looking down with a small smile, hands resting in her lap, gentle mixed evening light, waist-up portrait."}
]Ces six prompts forment une petite séance photo plutôt que six demandes indépendantes. La pièce, la tenue et le personnage restent stables tandis que la distance, la pose et l’attention varient. Vous obtenez assez de diversité pour une histoire ou un profil sans demander de tout changer à la fois.
L’exemple public reste entièrement habillé. Pour un projet adulte, adaptez la tenue autorisée et l’atmosphère à votre brief fictif. Gardez des instructions visuelles et concrètes. Une étiquette adulte seule ne dit pas au modèle si vous voulez un portrait rapproché intime, une mode de soirée dramatique ou une scène de pièce détendue.
Ne commencez pas par six poses difficiles en pied. Les plans larges donnent davantage d’éléments à organiser et compliquent l’évaluation des différences de visage. Le gros plan de la scène quatre sert précisément à comparer les traits déterminants sans que la pièce occupe tout le cadre.

Illustration : le gros plan souligne les détails d’apparence conservés dans la description réutilisable du personnage.
Séparez les scènes et construisez les prompts finaux
Après Build scene list, ajoutez Split Out. Réglez Field to Split Out sur scenes, Include sur All Other Fields et Destination Field Name sur scene. La sortie doit contenir six éléments, chacun gardant seriesId, characterBase et styleBase, plus son objet scene. Ces réglages suivent la documentation Split Out.
Ouvrez la sortie avant de poursuivre. L’élément un doit avoir scene.sceneId égal à 01, le deux à 02. Si un seul élément contient encore les six scènes, le champ de séparation est incorrect. Si le personnage a disparu, le réglage Include est incorrect. Corriger ces points ne coûte aucune génération.
Ajoutez un autre Edit Fields nommé Build prompts. Conservez les champs entrants. Ajoutez sceneId en String et mode Expression avec {{ $json.scene.sceneId }}. Ajoutez prompt en String avec {{ $json.characterBase + '. ' + $json.styleBase + '. ' + $json.scene.scene }}. La documentation Edit Fields décrit ces champs et expressions.
Cette expression assemble trois morceaux de texte ordinaire. Elle ne demande pas à un LLM de paraphraser le personnage ou réinterpréter la scène. Examinez les six prompts finaux : la base de personnage et la base de style doivent être identiques ; seule la fin décrivant la scène change.
Vérifiez que l’expression est évaluée plutôt qu’enregistrée comme texte littéral. L’aperçu doit montrer la description photographique complète, pas des accolades et $json. Si le prompt contient undefined, un nom de champ diffère de celui créé. L’orthographe exacte de characterBase, styleBase et scene compte.
Pour un tableur ultérieur, gardez cette organisation. Chaque ligne peut contenir seriesId, sceneId et la scène variable, avec les champs fixes de personnage et style ajoutés avant Build prompts. Un tableur n’est pas nécessaire aux six premières images, mais des IDs de scène stables facilitent cette évolution.
N’ajoutez pas un AI Agent entre ces nœuds pour donner une impression de sophistication. Il peut introduire des frais de modèle texte, de la latence et des refus à une autre étape. L’endpoint d’image peut accepter le brief adulte tandis que le rédacteur de prompts facultatif refuse de le composer. Ce refus arrive alors avant la génération. Gardez le prompt préparé et envoyez-le directement à la tâche choisie.
Enregistrez chaque image avant la scène suivante
Ajoutez Loop Over Items après Build prompts, avec Batch Size 1. Reliez sa sortie Loop à SpicyAPI Generate, Generate à Google Drive Upload et Upload en retour à Loop Over Items. La sortie Done termine la série. Gardez Reset désactivé : la liste de six éléments est finie et ne doit pas être recréée indéfiniment. Consultez la documentation Loop Over Items.
Remplacez le prompt fixe du pilote dans Generate par {{ $json.prompt }}. Gardez modèle, dimensions, limite de coût et téléchargement du pilote réussi. La boucle présente un élément à Generate ; le nœud doit donc montrer un prompt complet à chaque passage.
La connexion importante est le retour depuis Upload. Revenir directement depuis Generate lance la scène suivante avant la fin du stockage. Utiliser Done au lieu de Loop saute le parcours prévu par scène. Suivez le graphe : une scène entre dans Generate, son fichier dans Upload, puis l’enregistrement terminé revient chercher la suivante.
Dans Drive Upload, gardez Input Data Field Name à data. Pour File Name, utilisez {{ $('Build prompts').item.json.seriesId + '-' + $('Build prompts').item.json.sceneId + '-' + $binary.data.fileName }}. Cela préfixe le vrai nom téléchargé par la série et la scène tout en conservant son extension. Choisissez le dossier du pilote. Les champs sont documentés dans l’opération Upload de Google Drive.
Pourquoi revenir à Build prompts ? Le nœud de génération retourne l’enregistrement de tâche et le binaire téléchargé, sans copier automatiquement les champs de scène personnalisés dans son JSON. Les liens d’éléments n8n permettent à l’expression de retrouver les seriesId et sceneId antérieurs correspondants. Utiliser $json.sceneId après Generate peut produire un nom vide, car le JSON courant décrit désormais la tâche.
Dans cette recette à une seule image de sortie, data est le seul champ binaire à envoyer. Si une autre tâche retourne plusieurs ressources, les binaires supplémentaires se nomment data_1, data_2, etc. Un Upload configuré sur data ne les envoie pas tous automatiquement. Gardez cette distinction si vous changez ensuite de tâche ; le premier fichier enregistré n’est pas forcément toute la réponse.
Exécutez encore une fois le workflow avec seulement la scène 01. Confirmez que le nom contient série et scène, et que le fichier s’ouvre dans le bon dossier. Restaurez ensuite les six objets et exécutez la série complète. Ce passage supplémentaire vérifie la boucle et les expressions de nom avant que six requêtes payantes n’en dépendent.
Le dossier final doit présenter une séquence reconnaissable, pas six téléchargements anonymes. L’image sauvegardée est la vraie fin utile du workflow. L’URL de sortie API et l’aperçu d’exécution n8n aident pendant la génération, mais aucun ne constitue le dossier permanent à construire.

Illustration : enregistrez l’image actuelle avant que la boucle ne lance la scène suivante.
Fixez un vrai budget pour la série
Les frais d’image sont le nombre de requêtes réussies facturables multiplié par le prix applicable. Une scène seulement présente dans la liste ne coûte rien. Une autre génération réussie délibérément demandée pour remplacer une image déplaisante est facturée.
Pour six scènes sans expansion :
| Plan | Spicy standard à $0.01235 | Spicy Pro à $0.019 | Turbo à $0.010 |
|---|---|---|---|
| Un passage complet de six scènes | $0.07410 | $0.11400 | $0.06000 |
| Premier passage plus six remplacements | $0.14820 | $0.22800 | $0.12000 |
| Trois candidats pour chacune des six scènes | $0.22230 | $0.34200 | $0.18000 |
Ce sont des frais de génération, pas une affirmation que chaque sortie sera utilisable. Si vous créez dix-huit candidats et en gardez six, vous payez dix-huit images réussies. Un téléchargement fiable évite de perdre des tâches terminées ; il ne rend pas gratuits les candidats écartés.
Le champ Max Cost a un autre rôle. Le plugin le compare au devis de chaque élément avant de créer sa tâche. Ce n’est pas le budget de tout le workflow de six scènes. Le défaut est $2 par élément, bien au-dessus du prix de l’exemple. Le régler à zéro désactive la limite ; zéro ne signifie pas génération gratuite.
Avec six éléments et un plafond individuel de $0.015, la somme des plafonds est $0.09. C’est une borne utile pour ces six soumissions, à condition de ne pas ajouter d’éléments, refaire la boucle, changer de tâche ou lancer d’autres exécutions. Au tarif actuel de Spicy standard, les frais attendus sont inférieurs : $0.07410.
Pour Pro, un plafond de $0.015 bloque la requête avant création puisque le devis est $0.019. Relevez volontairement la limite si vous choisissez Pro ; un plafond de $0.025 permet son devis actuel. Les six plafonds totalisent alors $0.15. Vous changez à la fois le modèle et la dépense autorisée, sans laisser un basculement silencieux modifier le coût.
Le plugin gère aussi un conflit de prix en obtenant un nouveau devis et en revérifiant la limite. Vous n’avez pas besoin d’un nœud de devis séparé pour cette protection dans la voie communautaire. Le secours HTTP ci-dessous est une autre implémentation ; ne supposez pas qu’il possède tout ce comportement automatique.
Avant toute programmation, multipliez le coût du lot par les exécutions prévues. Un passage quotidien de six scènes Spicy standard coûte $2.223 sur trente jours au tarif indiqué. Trois candidats par scène chaque jour coûtent $6.669. Doubler la fréquence double ces montants. L’abonnement ou serveur n8n, le stockage et un modèle texte facultatif s’ajoutent séparément.
Gardez le workflow manuel jusqu’à connaître le nombre de candidats nécessaire. Une programmation quotidienne qui reproduit une série déjà terminée est une commande récurrente de génération. Donnez à chaque exécution un nouveau projet ou une nouvelle liste, ou ne fournissez que les scènes sans image. Une requête économique devient coûteuse si le déclencheur la répète sans raison.
Un timeout n’autorise pas à générer de nouveau
Attendre et générer sont deux activités différentes. Max Wait Time contrôle la durée d’attente du nœud. Atteindre la limite n’annule pas la tâche d’image sous-jacente. Elle peut terminer ensuite et une génération réussie peut encore être facturée.
Supposons un timeout de la scène 04 dans n8n. Ne relancez pas immédiatement tout le workflow avec les six scènes. Ouvrez l’exécution échouée, cherchez l’ID créé dans la sortie ou le message d’erreur et récupérez d’abord cette tâche. Toutes les erreurs n’ont pas un champ JSON taskId dédié ; lisez le message et le tableau de sortie.
Avec les nœuds communautaires, créez un petit workflow de reprise : Manual Trigger → SpicyAPI Resource Task, Operation Get → stockage. Entrez l’ID existant. Si la tâche attend ou tourne, activez Wait for Completion ; Task Get n’attend pas par défaut. Gardez Download Output activé et la propriété binaire data pour réutiliser l’envoi de l’image récupérée.
Dans ce workflow séparé, nommez le fichier Drive avec la série et la scène connues : pour la quatre, {{ 'mara-evening-v1-04-' + $binary.data.fileName }}. Ne copiez pas l’expression précédente qui pointe vers Build prompts, absent du workflow de reprise. Gardez Input Data Field Name à data et le même dossier.
Examinez le statut réel. Une tâche en cours demande plus de temps. Une tâche réussie demande l’enregistrement du fichier. Une tâche failed ou expired demande de corriger l’erreur indiquée avant une nouvelle requête. Un refus du modèle n’est pas un timeout réseau ; attendre davantage ou le resoumettre en boucle serrée ne résout pas cette catégorie d’échec.
Les tâches failed ou expired libèrent normalement leur réservation. Les requêtes refusées pour contenu ne sont normalement pas facturées, sauf indication contraire sur la page du modèle. Pour la requête réelle, examinez le règlement et le coût de la tâche au lieu de déduire la facture d’un nœud rouge. Une attente arrêtée et une génération échouée ne sont pas des résultats de facturation interchangeables.
Après récupération et enregistrement de 04, retirez 01 à 04 de la liste et lancez 05 et 06. Si 04 a réellement échoué et que vous voulez une nouvelle génération, gardez la scène 04 dans la liste restante après correction de l’entrée. Les IDs restent stables même lorsque le tableau raccourcit ; les noms indiquent donc toujours la place des images.
Voilà l’intérêt de la boucle à un élément. Elle laisse les scènes antérieures en stockage avant qu’une suivante interrompe la série. Elle ne fait pas disparaître la tâche externe lorsque n8n s’arrête, mais réduit le travail à reconstituer après coup.
Comprenez ce que les retries peuvent dédupliquer
Le plugin ajoute une clé d’idempotence interne à la création. Dans la même exécution, le même passage du nœud et le même élément, une entrée identique peut récupérer la même requête plutôt que créer aveuglément un doublon. C’est utile quand la réponse réseau est perdue après acceptation par l’API.
Cette protection n’est pas une vérification permanente de type « ce prompt a déjà été généré ». Une nouvelle exécution possède un autre périmètre. Un passage ultérieur dans la boucle a aussi un autre indice d’exécution. Changer le prompt ou les paramètres change la requête. Ces situations peuvent créer une nouvelle tâche payante même si la scène vous paraît familière.
Adoptez donc trois réponses à trois problèmes. Si la communication de soumission est incertaine, récupérez la tâche existante avant d’en demander une autre. Si une image terminée n’a pas été envoyée, répétez le stockage ou récupérez la sortie existante. Si l’image est enregistrée mais la pose incorrecte, changez la scène et commandez volontairement un remplacement.
Gardez les retries automatiques modestes. Ils servent aux erreurs de transport temporaires, pas à la sélection créative. Une dimension invalide, un mauvais champ binaire ou une entrée incompatible restent faux au prochain essai. Corrigez d’abord le réglage. Un retry dans le périmètre d’exécution existant diffère aussi d’un utilisateur lançant un workflow neuf.
Pour une série programmée, ajoutez un petit tableau de statuts quand la reprise manuelle devient pénible. Les champs utiles sont seriesId, sceneId, statut, ID de tâche et lien du fichier enregistré. Avant génération, incluez seulement les lignes prêtes ; après stockage, marquez la scène enregistrée. Un retry dispose alors d’un ID à récupérer plutôt que d’une supposition sur l’arrivée de la requête à l’API.
N’ajoutez pas ce suivi au premier pilote sans besoin. Six scènes examinées manuellement se gèrent en modifiant le tableau. Le suivi devient utile pour un déclencheur récurrent sans surveillance ou plusieurs contributeurs. Sa valeur est d’éviter qu’une scène terminée soit traitée comme une nouvelle commande, pas de créer de la paperasse.
Conservez les fichiers, pas les liens temporaires
Les liens signés de sortie API durent environ vingt minutes. C’est la fenêtre d’accès d’un lien précis, pas la promesse que la tâche et sa ressource disparaissent simultanément. Récupérez la tâche existante pour un accès actualisé tant que la ressource est conservée, puis téléchargez et stockez l’image.
Si vous collez l’URL dans un tableur et revenez demain, son expiration peut ressembler à une génération perdue. Ne payez pas pour refaire l’image parce que l’ancien lien échoue. Récupérez d’abord la tâche. Dans un workflow récurrent, conservez le lien Drive durable après téléversement plutôt que le lien API temporaire comme visuel terminé.
Avec Download Output activé, le plugin fournit des données binaires au nœud suivant. Désactivé, vous avez un enregistrement et des liens, mais pas le binaire data nécessaire à Drive. Une chaîne URL n’est pas le fichier image. Si Upload ne trouve pas les données, vérifiez Download Output et la correspondance des noms de propriété.
La distinction compte aussi pour un futur frontend. Dans le tutoriel no-code de Leon van Zyl, la transcription montre une exécution n8n réussie suivie d’une erreur frontend, car le traitement de réponse attendait autre chose que le binaire reçu. La leçon utile est d’examiner le consommateur de l’image avant d’accuser la génération.
Drive attend un champ binaire. Une page web peut demander une URL de stockage permanente. Un dossier local est écrit sur la machine qui exécute n8n, peut-être un serveur plutôt que votre portable. Choisissez la destination consciemment et ouvrez-y un résultat avant d’ajouter des scènes.
Si le stockage échoue après génération, gardez l’ID et réessayez le stockage. Vérifiez credential Drive, accès au dossier et champ data. Si le fichier existe déjà, évitez une seconde copie parce que la confirmation finale est ambiguë. L’idempotence protège la création dans son périmètre ; elle ne déduplique pas automatiquement tous les envois de fichiers suivants.
Utilisez le template HTTP sur n8n Cloud
Sur Cloud, les nœuds intégrés permettent d’utiliser l’API sans installer le package non vérifié. Téléchargez l’exemple du dépôt officiel SpicyAPI n8n, puis importez-le. Commencez par sa structure à une image plutôt que de reconstruire toutes les fonctions communautaires d’un coup.
Le template contient Settings, un devis, un contrôle de budget, une création de tâche, des vérifications de statut avec boucle Wait et un téléchargement final. Settings commence avec Z-Image Turbo et un ratio. Changez le prompt pour votre pilote adulte fictif en gardant les champs pris en charge.
Créez le credential HTTP Bearer Auth demandé et sélectionnez-le sur GetQuote, CreateTask et GetTask. Placez-y la clé. DownloadImage récupère l’URL signée de la ressource et n’a pas besoin du credential SpicyAPI ajouté à cette requête de stockage.
Les réponses HTTP brutes utilisent une enveloppe data, donc les expressions peuvent viser data.taskId ou data.output. Le nœud communautaire retourne la tâche sans cette enveloppe. Copier son expression dans un nœud HTTP brut sans adaptation peut faire paraître vide une réponse valide.
Le téléchargement doit traiter la réponse comme un fichier. La documentation HTTP Request n8n décrit Response Format File et le champ de sortie. Examinez le champ binaire réel, puis dirigez Drive Upload vers celui-ci. Le template télécharge la première ressource ; ce n’est pas un téléchargeur automatique de toutes les sorties.
Si vous passez de Turbo à Spicy standard, changez les entrées avec l’identifiant. Utilisez largeur et hauteur plutôt que aspect_ratio. Mettez à jour le devis et la création pour qu’ils décrivent la même image. Changer seulement Settings.model en gardant l’ancien corps n’est pas une migration correcte entre schémas.
Pour un premier essai Cloud, gardez une image par exécution. La clé de création du template repose sur l’exécution et l’indice d’élément ; ce n’est pas la clé plus riche du plugin, liée à l’entrée et au passage de boucle. N’enveloppez pas le template inchangé dans une boucle en supposant le même comportement de retry. Un lot Cloud correct demande des identités distinctes par scène et des entrées quote/create correspondantes.
Le polling nécessite aussi un arrêt délibéré sans surveillance. L’exemple répète attente et statut jusqu’à l’état terminal ; il ne fournit pas Max Wait Time du nœud communautaire. Fixez un timeout d’exécution adapté avant de programmer. Arrêter le workflow n’annule toujours pas la tâche API. Récupérez l’existant par GetTask avant de commander une autre génération.
Si le prix change entre devis et création, résolvez le conflit retourné et obtenez un nouveau devis. Le plugin automatise cette étape ; l’exemple HTTP n’est pas identique en tout point. Cette voie intégrée est un départ fonctionnel sur Cloud, mais la recette communautaire auto-hébergée est plus simple pour la boucle de six scènes enseignée ici.
Améliorez la série sans payer les mauvais changements
Une fois les six fichiers enregistrés, comparez l’ensemble. Vérifiez d’abord l’histoire visuelle : même soirée, tenue et adulte, vus sous plusieurs angles. Décidez ensuite des cadres précis à remplacer. Ne relancez pas les bonnes scènes parce qu’une seule est faible.
Si le visage dérive, réduisez les changements entre scènes. Gardez cheveux, structure faciale et pendentif, et retirez le nouveau maquillage ou l’indice d’âge dramatique présent dans une seule scène. Un angle nouveau peut modifier l’apparence ; un brief cohérent contrôle les entrées mais ne verrouille pas l’identité faciale.
Si l’identité exacte est essentielle, cessez de chercher la solution dans un autre paragraphe d’adjectifs. Ces endpoints textuels ne peuvent pas consommer le portrait accepté comme référence. Passez l’image choisie à un modèle possédant une véritable tâche de référence ou de retouche. Le guide de préservation du visage explique ce workflow différent. Utilisez ici le text-to-image pour établir le personnage et la séance, puis la retouche lorsque garder le visage accepté devient prioritaire.

Illustration : changez pose, angle et décor en conservant l’apparence déterminante et la tenue du personnage.
Si l’ambiance est trop simple, ajustez un élément visible : regard, direction de lumière, distance de caméra ou matière de robe. « Plus NSFW » ne précise pas l’image voulue. Un adulte fictif regardant en arrière sur un balcon doucement éclairé diffère d’un gros plan avec regard direct, même si les deux appartiennent à un projet adulte.
Si la pose devient confuse, simplifiez les instructions physiques. La scène deux sépare volontairement les mains au repos plutôt que d’imposer une interaction complexe avec plusieurs objets. Ajoutez une interaction après réussite de la pose simple. L’automatisation transmet une série préparée avec constance ; elle ne supprime pas le besoin d’un moment dessinable.
Si le cadre coupe un élément important, changez le cadrage ou les dimensions avant de demander plus de détails. Le portrait Spicy standard peut accueillir facilement un personnage à mi-corps ; une pose en pied peut demander une distance de caméra plus explicite. Le canevas Pro ajoute des pixels, sans élargir automatiquement le champ ni réparer une consigne de composition.
Gardez seed, prompt et dimensions d’un cadre accepté pour une répétition contrôlée. Le seed stabilise la variation sous les mêmes réglages ; changer la scène ou la taille change le problème à dessiner. Dans les endpoints Spicy, seed zéro demande une valeur aléatoire. Un seed fixe non nul sert à comparer, pas à garantir le même visage dans toute scène.
Enfin, distinguez l’image techniquement réussie de l’image utile. Le tableau de frais doit compter chaque candidat réussi facturable. Le nombre d’images finales doit compter celles conservées. Si six finales exigent douze candidats, budgétez douze, puis améliorez les scènes faibles pour limiter les remplacements suivants.
Questions avant d’activer une programmation
n8n est-il lui-même un générateur d’images NSFW ?
Non. Il relie les entrées, requêtes API et destinations de fichiers. L’endpoint choisi détermine la génération et le périmètre de contenu. Un agent rédacteur facultatif ou un template importé peut imposer ses restrictions avant l’appel d’image.
Peut-on le faire sans écrire de script ?
La recette auto-hébergée utilise des nœuds visuels, un court tableau de scènes et deux petites expressions. Il faut quand même choisir le modèle, créer les credentials et connecter correctement la boucle. La voie HTTP Cloud demande plus d’attention au JSON et aux réponses ; elle évite l’installation du package, pas toute configuration API.
Un template n8n gratuit rend-il les images gratuites ?
Non. Importer un workflow et payer une requête d’image sont séparés. L’exemple utilise une API tarifée, et l’hébergement ou abonnement n8n peut ajouter un coût. Le chiffre utile est le prix de génération multiplié par les candidats réussis demandés.
Faut-il automatiser la publication après génération ?
Pour une nouvelle série, terminez aux fichiers sauvegardés et examinez d’abord les images. Ajoutez la diffusion ensuite, quand la destination et les exigences créatives sont définies. Un workflow qui enregistre fiablement six scènes est déjà utile ; la publication publique automatique est une action distincte avec d’autres exigences.
Commencez par une image générée manuellement et un envoi réussi. Étendez ensuite à six scènes avec limite de coût et boucle qui enregistre avant de poursuivre. En cas d’échec, récupérez la tâche existante avant de commander une autre image. Vous obtenez ainsi un workflow n8n pratique pour les personnages adultes : entrées compréhensibles, coûts prévisibles et fichiers faciles à retrouver.








