ComfyUI 新增原生循环:Start Loop 与 End Loop 节点

ComfyUI Wikinews

ComfyUI 核心现已支持原生循环工作流。将 Start Loop 与 End Loop 配对,即可按迭代次数、索引范围或列表对图进行迭代,并支持携带值与累积输出。

ComfyUI 核心现在无需自定义节点即可循环执行图。 PR #16227 添加了一套通用的循环机制,由两个边界节点组成:Start LoopEnd Loop,它已包含在 2026-09-15 发布的核心版本中。更新 ComfyUI 后,这两个节点会出现在 utilities/looping 类别下。

循环是如何绘制的

没有需要配置的循环容器。一个循环由一对节点组成,循环体就是它们之间的任何内容:任何从 Start Loop 连接到 End Loop 的部分都会在每次迭代中运行一次。

循环结构会在正常的提示验证过程中检查,因此结构错误的循环会在执行开始前就失败。每个 Start Loop 都必须无歧义地与恰好一个 End Loop 配对,嵌套作用域必须保持一致,循环分支不能逃出它的 End Loop。Start Loop 和 End Loop 会在各自的节点 schema 中声明自己是循环边界,配对检查正是读取这一声明。

在执行时,原始循环体会被抑制,每次迭代都会被投影为全新的排队图节点,包括第一次迭代。迭代仍属于普通的调度器工作,而不是由独立的循环解释器处理,迭代进度会以 Iteration n / total 的形式报告在节点上。

三种计算迭代次数的方式

Start Loop 的 mode 输入决定迭代计数器如何生成,并且只显示所选模式对应的输入。

模式迭代对象自有输入
simple固定的重复次数num_iterations(默认 4)
For数值索引范围start_iteration_index(默认 0)、max_iteration(默认 4,不含上界)、step(默认 1)
List连接式列表中的每个项目执行一次list

step 至少为 1,取值为 0 会报错。如果计算出的迭代次数为零,循环体不会运行,并且 is_last 会报告为 true。

Start Loop 返回什么

输出含义
iteration_index当前迭代的索引
is_first第一次迭代时为 true
is_last最后一次迭代时为 true
list_itemList 模式下的当前项目,其他模式为空
current_iteration_value本次迭代的循环携带值

is_first 通常用于对首次迭代做特殊处理,例如用源帧而不是上一个窗口的最后一帧来初始化视频循环。

Start Loop 与 End Loop 包裹一个小型图像生成图

最小案例:一个 Start Loop、一个小型生成循环体、一个 End Loop。保存图像的直通输出连接到终止输入,因此它仍会在每次迭代中执行一次。

闭合循环

End Loop 会关闭作用域,并决定哪些内容离开作用域。

输入作用
output_value循环结束后返回的值
next_iteration_value作为下一次迭代的 current_iteration_value 回传给 Start Loop
accumulate启用后,返回每次迭代的 output_value,而不只是最终值
termination 输入动态增长的输入,用于预览、保存器等必须在每次迭代运行的副作用。它们的值不会被返回

End Loop 只有一个输出插槽,其类型跟随 output_value。启用 accumulate 时,这些值会按迭代顺序拼接,以普通 ComfyUI 列表的形式输出。

termination 输入解决了一个常见的意外:位于循环体内的预览图像或保存图像节点,否则只会在最后一次迭代触发,因为更早投影的循环体会被取代。将该节点的直通输出连接到终止输入,就能让它在每次迭代运行一次,并保持在循环边界内。

累积每次迭代的输出

启用 accumulate 后,四次生成会作为同一个列表返回。预览图像被终止,因此每次迭代完成时都可见。

让每次迭代的工作有所不同

由于 iteration_index 是普通整数输出,它可以驱动下游的任何内容:分辨率、步数、提示词变体或 LoRA 强度渐变。

For 模式为每次迭代驱动不同的分辨率

For 模式把 iteration_index 输入分辨率,最终累积出不同尺寸的结果。

在迭代之间携带状态

initial_iteration_value 在第一次迭代时播种携带值,每次迭代的 next_iteration_value 会成为下一次迭代的 current_iteration_value。这就是整个状态通道,每对 Start Loop 与 End Loop 恰好有一个。

要携带多个内容,就把它们放进列表。现有的Create List 节点现在接受异构输入,因此一个携带值可以容纳混合状态,例如一张图像以及生成它时使用的文本提示词。utilities 类别中有两个节点支持这一模式:

  • Create List:从混合输入构建携带值。
  • Get Item From List:同一版本新增。它接受一个列表和一个索引,并将该项目作为普通值返回,因此携带状态的各个组成部分可以在下一次迭代内部解包。
两次生成通过携带的图像和提示词值相互传递

Z-Image 生成与视觉语言描述通过单个携带的图像与文本值来回传递。

嵌套与缓存

Start Loop 上的 parent_iteration 是强制输入:将外层循环的 iteration_index 连接到它,即可把一个循环嵌套在另一个循环内。嵌套是显式的,而非推断的,并且每个 Start Loop 仍然需要恰好一个 End Loop。

Start Loop 上的 cache_iterations 属于高级选项,默认关闭。启用后,投影的迭代节点可能会复用更早执行中的缓存结果。End Loop 节点本身是普通执行节点,因此无论是否启用,其最终输出都会正常缓存。

内层循环嵌套在由列表驱动外层循环中

一个 List 模式的外层循环遍历提示词,生成循环通过 parent_iteration 嵌套在其中。

视频与 Latent 示例

该机制的构建初衷就是视频扩展,其中每个窗口都依赖上一个窗口。两个已发布的示例直接展示了这一模式。

通过携带的最后一帧串联视频窗口

一个最后一帧到第一帧的视频循环:源图像为 initial_iteration_value 播种,每个已生成窗口的最后一帧成为下一个窗口的第一帧,帧批次被累积并重新分批成一个片段。

在循环中携带 Latent 并渐变 LoRA

一个 Latent 直接穿过循环传递并关闭 accumulate,因此只返回最终 Latent,另有用于首次迭代处理的惰性开关,以及随采样推进而逐渐变化的 LoRA 强度。

最简单的起点,一个无携带状态的四次迭代生成循环,只需一对 Start Loop 与 End Loop:

节点所在位置

Start Loop 和 End Loop 是 utilities/looping 类别中的核心节点,随 ComfyUI 本体一起发布,因此不需要节点包。Create List 和 Get Item From List 位于 utilities。循环行为记录在官方内置节点页面 Start LoopEnd Loop 中。

现有工作流不受影响:循环是选择性启用的,没有 Start Loop 与 End Loop 配对的图会像以前一样正常排队执行。

评论

使用 GitHub 登录后即可参与讨论。

评论加载中…
ComfyUI 新增原生循环:Start Loop 与 End Loop 节点 | ComfyUI Wiki