ComfyUI ajoute les boucles natives : Start Loop et End Loop

ComfyUI Wikinews

Le cœur de ComfyUI boucle désormais nativement un flux de travail. Associez Start Loop à End Loop pour itérer un graphe par nombre, plage d’index ou liste.

Le cœur de ComfyUI peut désormais boucler un graphique sans nœuds personnalisés. PR #16227 a ajouté un mécanisme de bouclage générique reposant sur deux nœuds de délimitation, Start Loop et End Loop, intégré à la version du cœur publiée le 2026-09-15. Mettez à jour ComfyUI et les deux nœuds apparaissent dans la catégorie utilities/looping.

Comment se dessine une boucle

Il n’y a aucun conteneur de boucle à configurer. Une boucle est une paire de nœuds, et le corps correspond à tout ce qui se trouve entre eux : tout ce qui est connecté de Start Loop jusqu’à End Loop s’exécute une fois par itération.

La structure de la boucle est vérifiée lors de la validation normale du prompt, donc une boucle mal formée échoue avant le début de l’exécution. Chaque Start Loop doit s’associer sans ambiguïté à exactement un End Loop, les portées imbriquées doivent rester cohérentes, et une branche de boucle ne peut pas s’échapper de son End Loop. Start Loop et End Loop se déclarent comme limites de boucle dans leur schéma de nœud, et c’est ce que lit la vérification d’appariement.

Au moment de l’exécution, le corps d’origine est inhibé et chaque itération est projetée sous forme de nouveaux nœuds de graphique mis en file d’attente, y compris la première. Les itérations restent un travail ordinaire du planificateur plutôt que d’être gérées par un interpréteur de boucle séparé, et la progression de l’itération est indiquée sur le nœud sous la forme Iteration n / total.

Trois façons de compter les itérations

L’entrée mode de Start Loop détermine comment le compteur d’itérations est produit, et seules les entrées du mode sélectionné sont affichées.

ModeItère surEntrées propres
simpleUn nombre fixe de répétitionsnum_iterations (par défaut 4)
ForUne plage d’index numériquesstart_iteration_index (par défaut 0), max_iteration (par défaut 4, exclusif), step (par défaut 1)
ListUne passe par élément d’une liste connectéelist

step vaut au moins 1 et une valeur de 0 déclenche une erreur. Si le nombre d’itérations calculé est nul, le corps de la boucle ne s’exécute pas et is_last est signalé comme vrai.

Ce que renvoie Start Loop

SortieSignification
iteration_indexIndex de l’itération en cours
is_firstVrai à la première itération
is_lastVrai à la dernière itération
list_itemL’élément en cours en mode List, vide dans les autres modes
current_iteration_valueLa valeur transportée par la boucle pour cette itération

is_first est le point d’accroche habituel pour une première passe différente, par exemple pour amorcer une boucle vidéo à partir d’une image source plutôt qu’à partir de la dernière image de la fenêtre précédente.

Start Loop et End Loop englobant un petit graphique de génération d’images

Le cas minimal : un Start Loop, un petit corps de génération, un End Loop. Le passthrough d’Enregistrer l’image est connecté à une entrée de terminaison afin qu’il s’exécute tout de même une fois par itération.

Fermer la boucle

End Loop ferme la portée et décide de ce qui en sort.

EntréeRôle
output_valueLa valeur renvoyée une fois la boucle terminée
next_iteration_valueRenvoyée à Start Loop comme current_iteration_value pour l’itération suivante
accumulateLorsqu’elle est activée, l’output_value de chaque itération est renvoyée au lieu de la seule valeur finale
entrées terminationEntrées à croissance dynamique pour les aperçus, les nœuds d’enregistrement et autres effets de bord qui doivent s’exécuter à chaque itération. Leurs valeurs ne sont pas renvoyées

End Loop possède une seule prise de sortie dont le type suit output_value. Lorsque accumulate est activé, les valeurs sortent sous la forme d’une liste ComfyUI normale, concaténées dans l’ordre des itérations.

Les entrées termination corrigent une surprise fréquente : un nœud Aperçu Image ou Enregistrer l’image placé dans le corps ne se déclencherait sinon que pour l’itération finale, car les corps projetés antérieurs sont remplacés. Relier le passthrough de ce nœud à une entrée de terminaison le maintient en exécution une fois par itération et le garde à l’intérieur de la limite de la boucle.

Accumulation de la sortie de chaque itération

Avec accumulate activé, les quatre générations reviennent sous forme d’une seule liste. Aperçu Image est branché sur une terminaison afin que chaque itération soit visible au fur et à mesure qu’elle se termine.

Varier le travail à chaque itération

Comme iteration_index est une sortie entière normale, elle peut piloter n’importe quoi en aval : la résolution, le nombre de pas, des variantes de prompt ou une montée progressive de la force d’un LoRA.

Le mode For pilotant une résolution différente à chaque itération

Le mode For injecte iteration_index dans la résolution, avec des résultats de tailles différentes accumulés à la fin.

Transporter un état entre les itérations

initial_iteration_value initialise la valeur transportée lors de la première itération, et le next_iteration_value de chaque itération devient le current_iteration_value de l’itération suivante. Voilà tout le canal d’état, et il y en a exactement un par paire Start Loop / End Loop.

Pour transporter plusieurs choses, placez-les dans une liste. Le nœud Create List existant accepte désormais des entrées hétérogènes, de sorte qu’une seule valeur transportée peut contenir un état mixte, comme une image et le prompt texte qui l’a produite. Deux nœuds de la catégorie utilities prennent en charge ce schéma :

  • Create List : construit la valeur transportée à partir d’entrées mixtes.
  • Get Item From List : nouveau dans la même version. Il prend une liste et un index et renvoie cet élément comme une valeur normale, ce qui permet de déballer les composants de l’état transporté à l’intérieur de l’itération suivante.
Deux générations qui s’alimentent mutuellement via une image transportée et une valeur de prompt

Génération Z-Image et légendage vision-langage échangés dans les deux sens via une seule valeur transportée contenant une image et un texte.

Imbrication et mise en cache

parent_iteration sur Start Loop est une entrée forcée : connectez-lui l’iteration_index de la boucle externe pour imbriquer une boucle dans une autre. L’imbrication est explicite plutôt que déduite, et chaque Start Loop nécessite toujours exactement un End Loop.

cache_iterations sur Start Loop est une option avancée, désactivée par défaut. Lorsqu’elle est activée, les nœuds d’itération projetés peuvent réutiliser des résultats en cache issus d’exécutions antérieures. Le nœud End Loop est lui-même un nœud exécuté ordinaire, donc sa sortie finale est mise en cache normalement dans les deux cas.

Une boucle interne imbriquée dans une boucle externe pilotée par une liste

Une boucle externe en mode List sur des prompts, avec la boucle de génération imbriquée à l’intérieur via parent_iteration.

Exemples vidéo et latent

Le mécanisme a été conçu en pensant à l’extension vidéo, où chaque fenêtre dépend de la précédente. Deux exemples publiés illustrent directement ce schéma.

Enchaînement de fenêtres vidéo via une dernière image transportée

Une boucle vidéo de dernière image vers première image : l’image source initialise initial_iteration_value, la dernière image de chaque fenêtre générée devient la première image de la fenêtre suivante, et les lots d’images sont accumulés puis regroupés en un seul clip.

Transport d’un latent à travers la boucle et montée progressive d’un LoRA

Un latent transporté directement à travers la boucle avec accumulate désactivé, de sorte que seul le latent final est renvoyé, plus un basculement paresseux pour la gestion de la première itération et une force de LoRA qui évolue progressivement au fil de l’échantillonnage.

Le point de départ le plus simple, une boucle de génération de quatre itérations sans état transporté, est une seule paire Start Loop / End Loop :

Où se trouvent les nœuds

Start Loop et End Loop sont des nœuds du cœur dans la catégorie utilities/looping et sont fournis avec ComfyUI lui-même, donc aucun pack de nœuds n’est nécessaire. Create List et Get Item From List se trouvent dans utilities. Le comportement de bouclage est documenté sur les pages officielles des nœuds intégrés pour Start Loop et End Loop.

Les flux de travail existants ne sont pas affectés : les boucles sont facultatives, et un graphique sans paire Start Loop / End Loop est mis en file d’attente exactement comme avant.

Commentaires

Connectez-vous avec GitHub pour rejoindre la discussion.

Chargement des commentaires…
ComfyUI ajoute les boucles natives : Start Loop et End Loop | ComfyUI Wiki