Cómo hacer un loop en ComfyUI con WAS Node Suite

ComfyUI no incluye bucles nativos como un `for` tradicional. Para lograr iteraciones automáticas, necesitas utilizar nodos especializados, principalmente los del paquete WAS Node Suite. Este enfoque permite definir claramente cuántas veces debe repetirse una tarea y gestionar el estado entre cada paso.

Diagrama mostrando la conexión entre los nodos WAS_Loop_Start, WAS_Load_Image_Batch, ImageResize y SaveImage dentro de ComfyUI.
Esquema del flujo de trabajo para procesar 10 imágenes en un bucle automático.

Para procesar imágenes de un directorio, redimensionarlas y guardar 10 versiones consecutivas, se sigue una lógica específica. El nodo `WAS_Loop_Start` actúa como el disparador inicial, estableciendo la cantidad total de iteraciones (en este caso, 10). A medida que avanza el bucle, el índice se incrementa automáticamente.

El flujo interno conecta directamente estas operaciones: el `WAS_Load_Image_Batch` lee la imagen correspondiente al índice actual, luego el nodo `ImageResize` ajusta las dimensiones a un tamaño fijo como 512×512 píxeles usando Lanczos, y finalmente `SaveImage` guarda el resultado con una nomenclatura que incluye el número de iteración.

Es vital conectar correctamente la salida del bucle al nodo final. Si el índice no avanza o el loop se detiene prematuramente, suele deberse a una conexión incorrecta entre los nodos WAS o a un error en la lectura del directorio de entrada. A continuación, puedes implementar este patrón directamente copiando y pegando el código JSON proporcionado.

Código del Workflow

{
  "last_node_id": 10,
  "last_link_id": 15,
  "nodes": [
    {
      "id": 1,
      "type": "WAS_Loop_Start",
      "pos": [50, 50],
      "inputs": [],
      "outputs": [
        { "name": "index", "type": "INT" },
        { "name": "loop", "type": "LOOP" }
      ],
      "widgets_values": [10]
    },
    {
      "id": 2,
      "type": "WAS_Load_Image_Batch",
      "pos": [300, 50],
      "inputs": [
        { "name": "index", "type": "INT", "link": 1 }
      ],
      "outputs": [
        { "name": "IMAGE", "type": "IMAGE" }
      ],
      "widgets_values": [
        "input_images",
        false
      ]
    },
    {
      "id": 3,
      "type": "ImageResize",
      "pos": [550, 50],
      "inputs": [
        { "name": "image", "type": "IMAGE", "link": 2 }
      ],
      "outputs": [
        { "name": "IMAGE", "type": "IMAGE" }
      ],
      "widgets_values": [
        512,
        512,
        "lanczos",
        false
      ]
    },
    {
      "id": 4,
      "type": "SaveImage",
      "pos": [800, 50],
      "inputs": [
        { "name": "images", "type": "IMAGE", "link": 3 }
      ],
      "widgets_values": [
        "resized_%index%"
      ]
    },
    {
      "id": 5,
      "type": "WAS_Loop_End",
      "pos": [1050, 50],
      "inputs": [
        { "name": "loop", "type": "LOOP", "link": 1 }
      ],
      "outputs": []
    }
  ],
  "links": [
    [1, 1, 0, 2, 0, "INT"],
    [2, 2, 0, 3, 0, "IMAGE"],
    [3, 3, 0, 4, 0, "IMAGE"],
    [4, 1, 1, 5, 0, "LOOP"]
  ]
}

Consideraciones Finales

Asegúrate de que el directorio `input_images` exista dentro de la carpeta principal de ComfyUI. El nodo `SaveImage` respeta el marcador `%index%`, lo cual es fundamental para mantener un orden en tus archivos.