Para editar una serie de personajes NSFW por lotes en n8n, convierte cada imagen solicitada en un trabajo, mantén juntas sus referencias y envía cada variación desde el mismo original aprobado. Descarga los archivos devueltos a una carpeta de revisión y mueve a la carpeta de entrega solo las imágenes que apruebes. Así tienes un proceso repetible sin considerar una solicitud de API completada como prueba de que se conservó el rostro.
La dificultad no suele estar en escribir seis prompts. Está en asegurar que seis elementos reciban el original y las referencias correctas de ropa y habitación; mantener cada resultado asociado a sus instrucciones, y encontrar la versión elegida cuando deje de funcionar el enlace temporal. Un flujo puede ejecutarse perfectamente y entregar el personaje incorrecto si faltan esas decisiones.
Esta guía desarrolla un ejemplo completo: una serie nocturna de seis imágenes de Mara, un personaje ficticio de 34 años. Cambiaremos vestuario, luz y encuadre conservando una identidad establecida. El ejemplo público utiliza ropa opaca e instrucciones no explícitas. Puedes aplicar la misma mecánica a trabajo adulto permitido, pero n8n y este tutorial no prometen que todas las solicitudes NSFW se acepten o representen como quieres.
El flujo es una configuración propuesta basada en el nodo comunitario publicado de SpicyAPI y el esquema actual de edición. No informa de un lote nuevo de seis imágenes ejecutado. Las instrucciones distinguen lo que automatiza el nodo de las decisiones creativas que siguen a tu cargo.
Construye la serie alrededor de una imagen aprobada
Empieza con la imagen que mostrarías si alguien preguntara quién es Mara. Elige una vista limpia y relativamente cercana con rostro legible, el peinado que quieres conservar y una iluminación que no oculte la mitad de las facciones. En el ejemplo tiene rizos oscuros hasta los hombros, sonrisa algo asimétrica y una camiseta opaca de tirantes azul oscuro bajo chaqueta gris carbón. Está sentada junto a un sofá verde. Estos detalles concretan la edición sin inventar una biografía larga.
Guarda ese archivo como original maestro. Debe seguir disponible en tu almacenamiento aunque después lo subas a SpicyAPI. Una URI temporal de entrada facilita referir al archivo durante producción; no constituye el archivo permanente del personaje. Dale una versión, como mara-master-v1, para que un cambio posterior de peinado no altere silenciosamente las fuentes de una serie anterior.
Prepara dos imágenes adicionales. La referencia de vestuario muestra un vestido opaco de satén burdeos en una percha o maniquí, sin otro rostro que compita. La de habitación muestra una sala vacía con lámpara de latón y muebles de terciopelo verde. El modelo debe recibir tres instrucciones distintas: persona de la primera imagen, prenda de la segunda y lugar de la tercera.
Una foto de habitación con otra persona destacada confunde esa división. Una imagen de ropa con la cara de otro modelo introduce el mismo problema. Si son las únicas referencias disponibles, recórtalas a lo necesario antes de subirlas. No buscas la colección de referencias más grande, sino eliminar la ambigüedad sobre la contribución de cada imagen.
Mantén la primera solicitud de cámara cerca del original. Un retrato sentado de tres cuartos apoya otro retrato sentado más directamente que una vista cenital extrema con la cabeza girada. Es una recomendación de trabajo, no una tasa medida de éxito. Hay menos información visible que transferir cuando el ángulo exige inventar facciones que el original nunca mostró.
No construyas la serie como maestra → cambio de ropa → habitación nueva → pose nueva → primer plano. Cada salida de esa cadena reinterpreta el rostro. Una deriva introducida en el segundo paso puede convertirse en base del tercero. Las seis filas apuntan a mara-master-v1, no al resultado anterior. Puedes elegir una cadena para una reparación pequeña, pero debería ser una decisión independiente, no una consecuencia accidental de las conexiones.

Usa la primera para identidad, la segunda para ropa y la tercera para habitación. Ilustración.
Elige el endpoint de edición antes de automatizar
Usa un modelo de edición, no uno de texto a imagen con la descripción del personaje pegada. El nodo Edit Image integrado de n8n recorta, redimensiona y compone archivos; no es el editor generativo que cambia ropa o habitación. En el ejemplo, el ID es alibaba/qwen-image-2.1/edit. Su página de edición de Qwen Image 2.1 describe la tarea y los controles reales.
El endpoint actual acepta image_urls como lista de una a diez imágenes, un prompt obligatorio de hasta 5,000 caracteres, relación de aspecto, nivel de resolución y formato de salida. Devuelve una imagen por solicitud. Seis imágenes deseadas significan seis tareas. Añadir tres referencias a una solicitud sigue pidiendo una salida, no tres variaciones.
Para el lote normal con varias referencias, elige resolution: 2k, aspect_ratio: 4:5, output_format: png y background: opaque. Establece enable_prompt_expansion en false si quieres comenzar sin modificar las instrucciones. Desactivar expansión está disponible a 1k y 2k; sirve para comparar, no bloquea identidad. Deja inicialmente vacía la semilla. Repetirla no garantiza el mismo rostro ni reproduce el mismo archivo.
El esquema actual no tiene intensidad, CFG, pasos de muestreo ni prompt negativo separado. No añadas campos familiares de Stable Diffusion porque otro tutorial los use. Incluye conservación y exclusiones en el prompt principal. Si necesitas controles locales, elige un flujo que realmente los exponga.
El endpoint también tiene mask_url para otra tarea: reparación local con exactamente una referencia. No usamos ese modo en esta serie de tres referencias. Reparar el borde de una prenda después de elegir una imagen aprovechable puede ser otro trabajo con máscara. Enviar personaje, ropa y habitación junto con una máscara incumpliría el requisito de entrada local.
El catálogo describe el endpoint como sin restricciones. Eso importa al creador NSFW que elige editor, pero no garantiza las imágenes del próximo lote. El artículo de edición de Qwen cubre otro conjunto observado de resultados. Este tutorial añade mecánica de producción por referencias; no transforma aquellas observaciones en otra comparativa de consistencia.
Instala el nodo real y asigna nombres al flujo
Para paquete, clave y plantillas HTTP de n8n Cloud, abre la guía oficial del nodo n8n de SpicyAPI. Después sigue la configuración de escenas o referencias de este flujo.
El paquete es @spicyapi/n8n-nodes-spicyapi, versión 0.1.1. En n8n autohospedado, abre Settings → Community Nodes → Install, introduce el nombre e instálalo. Crea la credencial SpicyAPI (spicyapi.ai) API con la clave de la consola de API Keys. Conserva la URL base predeterminada salvo que tengas una razón concreta para cambiarla.
Cloud permite nodos comunitarios verificados; publicar en npm no significa que el paquete esté verificado. Esta guía utiliza el nodo en n8n autohospedado. Los usuarios de Cloud pueden implementar las llamadas con HTTP Request integrado, pero no deberían esperar allí los selectores y cargas automáticas del paquete. La documentación actual de instalación de n8n explica esa diferencia.
No hay una operación separada de SpicyAPI llamada «Edit Character» o «Batch NSFW». Elige Resource: Image → Operation: Generate y selecciona el modelo de edición. Generate es la operación del nodo para modelos de imagen, incluida edición; el modelo determina qué hace la tarea. El selector muestra precios iniciales, no una cotización completa de tus referencias.
Construiremos dos flujos pequeños. El primero genera candidatos y los guarda para revisión. El segundo lee las filas aprobadas y coloca los archivos elegidos en entrega. Separarlos permite revisar seis imágenes juntas sin dejar una ejecución esperándote. También permite repetir entrega sin pagar otra vez la misma imagen.
Nombra los nodos importantes al crearlos: Read Jobs, Ready Jobs, Loop Jobs, Prepare Edit, Edit Character, Attach Job, Save Candidate y Record Candidate. Las expresiones posteriores los usan. Si cambias nombres, actualiza expresiones. Es una guía de montaje manual, no una afirmación de que exista una plantilla oficial importable para esta serie exacta.
Empieza con Manual Trigger. Puedes programar después de que funcione como quieres, pero la primera ejecución debe contener un trabajo deliberado. Una carpeta con cargas nuevas todavía no es un encargo de producción. La tabla especifica qué referencias van juntas y qué salida se solicita.
Crea seis filas de trabajo, no una carpeta de archivos vagamente relacionados
Usa una hoja de Google con una pestaña Jobs. Cada fila solicita una salida. Dale un job_id único, nombre de lote, prompt, tres ubicaciones originales, resolución, relación de aspecto, intento y estado. Permite reintentar algo específico sin regenerar las demás imágenes.
Las seis solicitudes creativas forman una serie variada y útil:
| Trabajo | Imagen solicitada | Cambio principal | Qué permanece familiar |
|---|---|---|---|
| M01 | Retrato sentado en la sala | Vestido burdeos, misma pose sentada | Rostro, rizos, sonrisa y sofá verde |
| M02 | Retrato de cintura hacia arriba junto a lámpara | Luz lateral más cálida y encuadre cercano | Rostro, peinado y construcción del vestido |
| M03 | Retrato de pie junto al sofá | Cambiar postura y mostrar más habitación | Identidad, color de ropa y paleta de la sala |
| M04 | Retrato de tres cuartos junto a ventana | Luz fría de ventana y lámpara detrás | Identidad, longitud del cabello y vestido burdeos |
| M05 | Primer plano con chaqueta | Añadir la chaqueta original gris carbón | Proporciones faciales, rizos y expresión discreta |
| M06 | Composición sentada más amplia | Espacio para título o recorte | Identidad, vestido y distribución de muebles |
Usa batch_id: mara-evening-01 y attempt: 1 en las seis. Al principio marca solo M01 como ready y deja las otras cinco en draft. Cuando un candidato llegue al almacenamiento con información correcta de fila, marca las demás listas. Así pruebas la edición real, no solo una credencial aislada.
Conserva character_uri, wardrobe_uri y room_uri en columnas distintas. Pueden contener URI recién cargadas o URL públicas que la API pueda obtener. Es más legible que una cadena con un arreglo JSON completo. Prepare Edit las combina en el arreglo image_urls exigido por el modelo, con orden fijo.
Añade columnas de resultado sin sobrescribir el encargo: task_id, candidate_file_id, candidate_name, review_status, review_note, delivery_file_id y actual_cost. Si hay varios candidatos por trabajo, colócalos en una pestaña Candidates identificados por candidate_id, mientras Jobs conserva la toma solicitada. La primera pasada tiene uno por fila, pero separar sirve en cuanto M03 necesita dos intentos.
Un ID puede ser mara-evening-01-M03-a2. Indica lote, toma e intento a simple vista. El ID de tarea permite recuperarla, pero no informa qué cambio de ropa pediste. Guarda ambos.
Trata los estados como producción normal: draft, ready, pending_review, approved, identity_fix, creative_fix, task_error y delivered. Son valores de tu tabla, no estados de SpicyAPI. La API puede decir succeeded mientras tu tabla dice identity_fix, porque la imagen existe pero el rostro no coincide.

Planifica vestuario, pose y encuadre de cada trabajo conservando una referencia de personaje. Ilustración.
Lleva los archivos a n8n sin confundir bytes y URL
n8n puede llevar campos JSON y datos binarios en el mismo elemento. Una URL es una cadena de JSON. Una foto descargada va en una propiedad binaria como data o character. Ni el nombre de esa propiedad ni el ID de almacenamiento son URL públicas.
Para una configuración rápida de un trabajo, descarga el personaje desde su integración de almacenamiento al campo character. Descarga ropa a wardrobe y habitación a room, y asegúrate de que lleguen en el mismo elemento que el prompt. Si interpones Edit Fields antes de generación, activa Include Binary Data. Si no, puede sobrevivir JSON y desaparecer las fotos.
En SpicyAPI, abre Media Inputs y añade tres entradas. En cada una, selecciona image_urls, elige Source: Binary File e introduce el Input Binary Field correspondiente: character, wardrobe o room. Repetir el campo de lista es intencional. El nodo carga los binarios y forma un arreglo en el orden añadido.
No añadas tres entradas a un campo de archivo único como mask_url. El plugin comprueba la diferencia y devuelve error si varias apuntan allí. El selector de campos multimedia deriva del esquema del modelo. Si muestra algo desconocido, comprueba el modelo antes de copiar un campo de otro flujo.
Para reutilizar las tres fuentes, una carga explícita facilita gestionarlas. Descarga los originales en n8n y usa SpicyAPI → File → Upload con su campo binario. El resultado contiene uri, fileId, fileName, mimeType y bytes. Copia la uri devuelta a la columna fuente correspondiente del lote.
Upload devuelve un JSON nuevo. No copia automáticamente campos anteriores como reference_role. Si cargas tres elementos, conserva el rol con expresiones de enlace o combínalo explícitamente después. Para principiantes, tres nodos de carga separados con nombres son más fáciles de revisar: personaje, ropa y habitación. Copiar cada URI a la hoja hace visibles los roles antes de editar pagando.
Las entradas cargadas son temporales; la implementación del paquete las describe como conservadas un día. Vuelve a cargarlas desde los originales guardados para otro lote. No supongas que un spicy:// pegado el mes pasado seguirá funcionando. Conserva al lado los ID originales de Drive o claves de almacenamiento para recrearlas.
Una URL de página compartida de Drive es otro error habitual. La API necesita bytes, no una página HTML con vista previa tras iniciar sesión. En vez de compartir públicamente las maestras, permite al nodo Drive descargar el binario con tu credencial y cárgalo con SpicyAPI. La carpeta privada puede seguir privada.
Para las seis filas, usa URI recién cargadas. Establece tres Media Inputs como Source: URL y usa {{ $json.character_uri }}, {{ $json.wardrobe_uri }} y {{ $json.room_uri }}. En esta interfaz, URL también admite URI Spicy. Evita arrastrar tres binarios completos por todas las operaciones de tabla.
Mantén varias referencias dentro de un elemento
Hay dos tipos de «varias imágenes». Tienes seis trabajos, que deben ser seis elementos de n8n. Cada trabajo tiene tres referencias, que deben seguir como arreglo de tres dentro del trabajo. Dividirlo en tres elementos cambia el significado: el editor podría recibir tres solicitudes independientes con una referencia cada una.
La diferencia aparece en consultas reales. En una conversación de Reddit sobre álbumes de Telegram, varias imágenes activaban ejecuciones separadas; añadir Wait retrasaba cada una sin agrupar el álbum. La discusión propone almacenar temporalmente por ID compartido de álbum o separar recopilación y procesamiento. No establece una solución universal, pero muestra por qué «esperar un poco» no equivale a «armar un conjunto de referencias».
Nuestra tabla evita ese problema al declarar las tres antes de editar. Si después añades un formulario de varias cargas, haz que la recopilación produzca un elemento con todos los archivos y sus roles. No permitas que cada archivo active independientemente Edit Character. Una carga de ropa no debe convertirse en una solicitud para rediseñar solo esa prenda.
Puedes repetir Media Inputs o construir la lista en Additional Parameters (JSON). El cuadro espera un objeto y se combina al final. Sus claves sobrescriben Prompt, Model Parameters y Media Inputs. Sirve para un arreglo dinámico, pero puede ocultar lo que creías haber elegido.
Esta expresión produce una entrada completa desde la fila preparada:
{{ {
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
} }}Elige un método para el arreglo. Si usas JSON, deja Media Inputs vacío para no cargar archivos que el reemplazo final elimina. Si prefieres la lista visual, excluye image_urls de Additional Parameters. La entrada debe contener un arreglo de tres, no otro arreglo anidado ni una cadena separada por comas.
Una columna de hoja que parece JSON puede llegar como texto. Las columnas URI separadas evitan la duda. Si prefieres references_json, conviértela a arreglo antes de generar y detén la fila si falla. Una cadena como "[first,second,third]" no es una lista de URL de imágenes.
Lo mismo vale para resolución y booleanos. Introduce false como booleano, no el texto "false". Introduce 2k como valor válido de enumeración, no una dimensión adivinada. El formulario generado del esquema sirve precisamente porque muestra lo admitido.
Escribe la primera instrucción con roles claros
En Prepare Edit, construye edit_prompt con una introducción fija de roles y la toma individual. Puedes combinar cadenas con Edit Fields; no necesitas Code para seis filas sencillas. Conserva instrucciones de identidad mientras la fila aporta el cambio.
Una instrucción adecuada para M01 es:
La imagen 1 es Mara, personaje adulto ficticio de 34 años. Conserva proporciones faciales, rizos oscuros hasta los hombros, sonrisa ligeramente asimétrica y pose sentada. La imagen 2 aporta únicamente el vestido opaco de satén burdeos: copia color, escote y ubicación de costuras, no la identidad de otra persona. La imagen 3 aporta solo sala, sofá verde de terciopelo y lámpara de latón. Coloca a Mara allí con el vestido. Mantén un retrato natural con ojos legibles y luz cálida suave. Encuadra un retrato sentado de tres cuartos a 4:5. No añadas otra persona, texto ni accesorios adicionales.
Es un prompt propuesto, no ejecutado y evaluado. Asigna roles, describe el cambio y nombra rasgos reconocibles. También resuelve desacuerdos entre referencias: rostro de la imagen 1, prenda de la 2.
Para M02, cambia la frase de toma a retrato de cintura hacia arriba con la lámpara iluminando un lado del rostro. No repitas M01 y añadas diez términos contradictorios de cámara. Para M03, sustituye la conservación de pose sentada por una postura explícita de pie junto al sofá con manos relajadas visibles. Pedir conservar sentada y hacerla ponerse de pie crea una contradicción evitable.
M04 pide luz de ventana. Conserva rizos y ropa, pero especifica luz fría de ventana con lámpara al fondo. Cambian relación de luces y posición, no la descripción del personaje. M05 reutiliza la chaqueta gris carbón de la maestra sobre el vestido; dilo directamente, porque el modelo podría seguir razonablemente la referencia solo de ropa.
M06 pide una composición sentada amplia con espacio libre a un lado. Es distinto de hacer pequeño el rostro mediante un recorte aleatorio posterior. Da la composición prevista y revisa el rostro completo. Un encuadre amplio puede servir para cabecera y ofrecer menos detalle para decidir identidad.
Mantén el estilo NSFW deseado en el encargo cuando corresponda al endpoint y al público. Una etiqueta «hazlo NSFW» no describe ropa, expresión, recorte ni ambiente. Debes especificarlos. En el ejemplo público, ambiente nocturno adulto, satén opaco y mirada directa transmiten el tono sin instrucciones explícitas.
Si necesitas una pose exacta que no muestra la maestra, créala como referencia aprobada antes de programar un conjunto grande. Un flujo no sustituye información visual ausente repitiendo una solicitud vaga. La primera pasada puede servir para mejorar referencias, no obtener seis imágenes aprovechables inmediatas.
Conecta el bucle con un camino separado de errores
Añade Google Sheets Get Row(s) en Read Jobs, selecciona Jobs y obtiene las filas del lote. Usa un Filter llamado Ready Jobs para conservar status igual a ready. Si filtras dentro de Sheets, asegúrate de devolver todas las coincidencias, no solo la primera. Una tabla de seis filas que devuelve un elemento no es un lote de seis.
Conecta los elementos a Loop Jobs, un Loop Over Items con Batch Size 1 y Reset apagado. Conecta loop a Prepare Edit y después a Edit Character. SpicyAPI ya procesa varias entradas; el bucle no se requiere solo para varias ediciones. Lo usamos para terminar guardado y estado de cada fila antes de avanzar.
Configura Edit Character como Image → Generate, elige el modelo exacto y asigna Prompt a la instrucción preparada. Añade referencias o JSON según lo elegido. Activa Wait for Completion y Download Output. Fija Max Cost per Item (USD) deliberadamente; para este ejemplo, $0.10 sirve como máximo inicial si la cotización completa cabe debajo.
Ese máximo se aplica a un elemento, no a toda la hoja. Cien filas pueden superar cada una la comprobación de diez centavos. Limita el lote a seis filas listas y fija un límite de gasto de cuenta en la clave si quieres otra barrera. Ni filas ni límites mejoran la imagen; evitan que una programación accidental ejecute una lista mucho mayor.
El nodo cotiza antes de crear. Si la solicitud completa supera el máximo, falla antes de generar. No añadas otro nodo de cotización salvo que necesites mostrar una estimación separada. Para planificar, Model → Get Quote calcula las mismas referencias y ajustes sin crear imagen.
En Settings, configura On Error para continuar con salida normal para el camino de errores. El resultado de error continuado contiene error, description e ID cuando existe. Añade If después de Edit Character para comprobar error. El camino de error registra task_error y mensaje y vuelve a Loop Jobs; el exitoso guarda y registra pending_review y vuelve al mismo bucle.
No uses done para generar otra imagen. Sirve para el resumen después del retorno de todas las filas. Puedes leer tabla actualizada o mostrar conteos. Mantén explícitos los caminos: un error no llega como archivo vacío a revisión, y un archivo completado no pasa directamente a entrega.
Para seis ediciones, conserva la espera integrada. No suele hacer falta otro sistema de callbacks. Si la ejecución deja de esperar con la tarea en marcha, copia su ID a Task → Get y activa Wait for Completion y Download Output. Task → Get no espera por defecto y puede devolver un registro en ejecución sin archivo. Para recuperar en otra ejecución, lee primero la fila Jobs correspondiente y pásala por Prepare Edit; conecta Task → Get → Attach Job → guardado de candidato. Conserva el contexto enlazado usado después; Manual Trigger directo a Task → Get dejaría Prepare Edit sin ejecutar. Cuando termine y descargue, guarda sin regresar a Generate. Un timeout puede mostrar el ID en description aunque taskId esté vacío; revísalo antes de pedir reemplazo. Generar de nuevo porque la página tarda puede crear otra tarea facturable aunque la original termine después.
Vuelve a asociar la identidad del trabajo antes de guardar
Al tener éxito, el nodo devuelve registro y binarios. JSON no es la fila original con algunos campos añadidos: contiene taskId, state, cost, settled y output. Por eso después {{ $json.job_id }} puede estar vacío aunque el prompt use la fila correcta.
Añade Attach Job, un Edit Fields, tras el camino exitoso. Conserva JSON, activa Include Binary Data y añade producción mediante expresiones de enlace. El nodo comunitario proporciona emparejamiento de elementos, por lo que puedes volver al Prepare Edit específico en vez de tomar la primera fila.
Usa {{ $('Prepare Edit').item.json.job_id }} para job_id y el mismo patrón para batch_id, attempt, edit_prompt y etiqueta de versión original. Usa el registro actual para task_id mediante {{ $json.taskId }}. Construye candidate_id con lote, trabajo e intento y úsalo como base de nombre.
No uses $('Read Jobs').first() para todas las identidades. Toma el primer resultado y puede llamar M01 a las seis salidas. Evita reconstruir relaciones por posición después de ordenar o filtrar una rama. El emparejamiento funciona mientras exista una relación clara; si divides o agrupas después, conserva explícitamente job_id.
El primer recurso descargado es el binario data por defecto. Los adicionales usan data_1, data_2 y así sucesivamente. El editor del ejemplo devuelve una imagen, así que se almacena data. Si cambias a otro modelo con varios recursos, no supongas que guardar data conserva todo. Decide cuál pertenece al candidato o expande los recursos a registros con nombres separados.
La ruta JSON output.assets[].url contiene enlaces, no archivos descargados. Expiran aproximadamente en veinte minutos según el paquete. Una hoja solo con esa URL sirve al revisar de inmediato y falla al regresar después. Download Output aporta bytes reales para almacenamiento.
Los binarios también necesitan destino permanente. No heredan la duración breve del enlace, pero n8n puede depurar datos de ejecución. Una ejecución exitosa no es tu archivo. Guardar durante ella permite regresar mañana sin regenerar.
Guarda candidatos y decide qué necesita otra pasada
Crea una carpeta privada mara-evening-01/review. Añade Google Drive File → Upload en Save Candidate, establece Input Data Field Name en data, nombre como ID de candidato más .png y elige esa carpeta. La documentación de Drive describe los campos binarios.
El nombre debe corresponder al formato real. Escribir .png en un JPEG no lo convierte; el ejemplo seleccionó PNG en la solicitud. Guarda el ID devuelto, no solo el nombre. Dos archivos pueden llamarse igual y entrega necesita una fuente inequívoca.
Drive devuelve metadatos, no todo el registro de candidato. En Record Candidate, usa el ID del elemento actual y valores enlazados de Attach Job para ID de candidato, trabajo, tarea y costo. Asigna manualmente a Candidates mediante Append or Update Row, coincidiendo por candidate_id. Evita que otro intento sobrescriba el primero.
Si actualizas también Jobs, establece la fila job_id en pending_review. Devuelve la actualización final a Loop Jobs. En errores, registra ID original desde Prepare Edit, descripción e ID de tarea antes de volver. Ambos caminos deben alcanzar el bucle; si no, puede detenerse tras el primer fallo o éxito.
Revisa las seis imágenes en dos tamaños. Como miniaturas, comprueba serie prevista, mismo personaje, ropa y habitación coherentes y suficiente variación. A tamaño completo, compara ojos, nariz, boca, mandíbula, nacimiento del cabello y asimetría distintiva entre original y candidato. Son puntos prácticos de observación, no un sistema biométrico automático.
Separa fallos de identidad y creatividad. Una Mara reconocible con lámpara mal situada necesita otra instrucción que un retrato bonito de otra persona. Si el rostro funciona y falla composición, marca creative_fix y escribe el cambio ausente. Si cambió el personaje, marca identity_fix y describe, por ejemplo, mandíbula más estrecha y otro nacimiento de cabello.
No apruebes por state exitoso ni porque una descripción automática diga la ropa correcta. Un modelo de descripción puede reconocer vestido burdeos sin decidir si el rostro pertenece a la serie. Puedes añadir asistencia para sugerir notas, pero conserva separada y visible la decisión real de aprobación.
Da a cada fallo una siguiente edición concreta
Supongamos que M01 casi funciona pero tomó el cabello del maniquí de vestuario. Confirma primero que la imagen 2 no contenga una cabeza competidora; si la tiene, recorta a la prenda. Aclara que solo aporta vestido y que rizos y nacimiento proceden exclusivamente de la imagen 1. Envía el intento 2 desde la maestra original, no el candidato que deriva.
Si M02 parece Mara pero cambia el escote, mejora la referencia de ropa. Una foto oscura que lo oculta ofrece poca información. Recorta una vista más clara de costuras y pide esa construcción conservando cintura hacia arriba. Más imágenes de vestidos vagamente parecidos pueden aumentar la ambigüedad.
M03 de pie puede fallar de dos maneras. Si la pose es plausible pero cambia rostro, reduce el cambio de cámara y prueba tres cuartos de pie con rostro hacia cámara. Si sobrevive rostro pero el cuerpo es extraño, pide postura simple junto al sofá con manos visibles relajadas. Exigir simultáneamente giro difícil, brazos cruzados y luz extrema dificulta saber qué falló.
M04 puede conservar rostro con luz tan fría y oscura que resulte difícil comparar. Antes de rechazar por identidad, observa una vista neutra y distingue iluminación de proporciones. El siguiente prompt puede mantener ventana pidiendo detalle facial legible y sombra suave. No añadas otra referencia de identidad automáticamente porque un color haga desconocido al mismo personaje.
M05 puede perder el vestido bajo una chaqueta que se convierte en otro atuendo. Indica que la chaqueta original gris carbón va abierta encima y deja visible la construcción del vestido. Si solo está mal un borde en una imagen excelente, considera un retoque local con máscara. Es otro trabajo que usa el candidato elegido como única fuente, no las tres referencias originales.
M06 puede dar espacio vacío pero una cabeza demasiado pequeña para portada. Ajusta composición: retrato medio sentado, habitación visible a izquierda y rostro suficientemente grande. Cambiar solo proporción no indica dónde va el título. Describe el diseño en la nota, no solo 4:5 o 16:9.
El rechazo de contenido pertenece a errores de tarea, no corrección de identidad. Lee la razón y elige solicitud o modelo permitidos adecuados; no repitas una entrada idéntica rechazada. Un resultado representado pero inadecuado es distinto: puede cobrarse porque la generación funcionó. Conserva esa distinción para ver el costo de intentos creativos inútiles.
Detén una rama tras un límite deliberado, por ejemplo dos intentos en la primera pasada. Es una decisión de producción, no una predicción de suficiencia. Una toma difícil puede volver a preparar fuentes o edición manual. La automatización ayuda cuando hace visible y repetible el problema, no cuando genera veinte alternativas desconectadas mientras estás fuera.

Compara proporciones y rizos por separado de encuadre del fondo y posición de lámpara. Ilustración.
Entrega los archivos aprobados sin volver a generarlos
Al terminar, cambia los candidatos elegidos a approved. Conserva los otros en revisión con notas. Puedes aprobar intento 2 de M03 y conservar intento 1 como identity_fix. Entrega debe leer Candidates, no deducir ganador del archivo más reciente.
Construye el segundo flujo con Manual Trigger, Google Sheets Get Row(s) y Filter que seleccione review_status igual a approved y delivery_file_id vacío. Añade Loop Over Items con Batch Size 1. Descarga cada candidato por su ID de Drive a data y sube ese binario a la carpeta approved del lote con nombre previsto.
Usa el candidato almacenado, no la URL temporal de SpicyAPI. Es la imagen exacta revisada. No llames a Image → Generate para recrearla con igual semilla o resolución mayor suponiendo que sigue aprobada. Un render nuevo exige revisión porque puede cambiar rostro, ropa o encuadre.
Después de cargar, actualiza delivery_file_id y review_status: delivered, y opcionalmente Jobs con ID elegido. Devuelve la actualización al bucle. El ID da una forma estable de recuperar la entrega y evita que una segunda ejecución normal trate todas las filas aprobadas como pendientes.
Aquí usamos descargar y cargar por su transferencia binaria explícita. Si el almacenamiento ofrece copia nativa que conserve bytes, puedes usarla. La regla creativa sigue igual: entregar copia la imagen aprobada, no repite el editor.
Usa otra carpeta para exportaciones redimensionadas, recortadas o comprimidas. Miniatura cuadrada y retrato completo son archivos distintos aunque compartan original. Conserva la versión aprobada para crear otras exportaciones sin pagar generación. Si un recorte corta el peinado o cambia presentación, revisa esa exportación para el destino.
No hay nodo de publicación social. Entrega termina con archivos y tabla de candidatos seleccionados. Basta para pasar el conjunto a diseño de página, preparar galería privada o elegir destinos manualmente. Puedes añadir publicación específica después, pero no debe ser inseparable de generar y revisar.
Cotiza las referencias reales, no solo el selector
El precio inicial ayuda a explorar. Las referencias y los ajustes completos determinan la cotización. El catálogo indica $0.036 a 1k, $0.048 a 2k y $0.072 a 1.5k como precios iniciales de Qwen Image 2.1 Edit. Las cotizaciones públicas con tres referencias son $0.060 a 1k y $0.048 a 2k con PNG opaco y expansión apagada. A 1k, las dos adicionales suman $0.024; la solicitud 2k cotizada no tiene ese añadido. No supongas que resolución intermedia cuesta menos ni que el suplemento funciona igual en todos los niveles.
Usa Model → Get Quote con los mismos image_urls, prompt y ajustes antes de marcar listas cinco filas más. El nodo devuelve entrada formada y cotización, útil para ver si sobrevivieron las tres referencias. La planificación carga binarios si hace falta, pero no genera imagen.
Para tres referencias a 2k, los $0.048 actuales dan $0.288 para seis candidatos y $0.576 para doce. Las mismas seis solicitudes a 1k cotizadas suman $0.360. Son presupuestos por cotización, no recibos de un lote ejecutado ni comparación de calidad. Vuelve a cotizar tus fuentes y ajustes antes de ejecutar. Almacenamiento y alojamiento o suscripción de n8n son aparte.
Cuenta intentos como tareas. Seis imágenes aprobadas pueden requerir más de seis generaciones exitosas porque varios candidatos de pago no sirven. Si cotizas una pasada y limitas a dos por toma, planificas hasta doce. Informa más que «un lote de seis» sin reemplazos previstos.
El plugin envía idempotencia por elemento. Reintentar la misma llamada de nodo dentro de la misma ejecución busca recuperar la tarea existente, no cobrar duplicado. Otra ejecución, entrada cambiada o pasada de bucle es trabajo nuevo. Pulsar Execute Workflow no equivale a recuperar el ID original.
Cuando una fila tenga ID, recupera o consulta antes de reemplazar por interrupción técnica. Si tuvo éxito y Drive falló, recupera salida y termina guardado. La cara no mejoró porque caducara la credencial de almacenamiento, así que no hay razón creativa para pagar otro render.
El paquete indica que fallos y expiraciones normalmente liberan retención, y rechazos no se cobran salvo indicación del modelo. Un candidato exitoso rechazado por tu revisión difiere de un fallo de API. Guarda actual_cost del registro liquidado para ver después cuánto necesitó cada toma entregada.
Ejecuta el primer trabajo desde origen a entrega y amplía después
Antes de habilitar seis filas, lleva M01 por generación, almacenamiento y revisión. Abre el archivo guardado en revisión. Confirma fila M01, roles correctos del prompt y que miras el archivo devuelto correspondiente. Una vista previa correcta no demuestra nombre ni asociación correctos del candidato almacenado.
Aprueba y ejecuta entrega una vez. Abre el archivo y confirma que es el elegido. Repite entrega sin cambiar estado; debería omitir la fila con ID presente. Si lo borras manualmente después, volverá a considerarla elegible, así que hazlo solo si necesitas otra copia.
Después marca M02 a M06 listas. El bucle debe producir un candidato por trabajo o un error específico. Revisa el conjunto, escribe notas breves concretas y crea solo los reemplazos justificados. La maestra sigue siendo fuente de tomas normales de reemplazo.
Ya tienes un flujo útil de imagen a imagen NSFW con n8n: fuente definida, referencias con roles, trabajos separados, manejo correcto de binarios y URI, instrucciones legibles y carpeta con imágenes seleccionadas. La automatización transporta materiales y guarda trabajo. Diseño de tomas y selección determinan si vale la pena publicar la serie.






