跳至主要内容

循环控制器节点

Loop Controller Node Screenshot

概述

循环控制器节点是一个功能强大的节点,允许您在图中创建循环。它是Rivet中唯一允许包含节点循环(包括自身)的节点。

循环控制器节点维护循环状态并控制值在循环中的流动。所有在循环中可能发生变化的值都必须通过循环控制器节点本身流动。

循环控制器节点具有动态数量的输入对。每对输入包含一个输入和一个默认输入。默认输入是循环的初始状态,而输入则是每次循环迭代中变化的值。

循环控制器节点还具有动态数量的输出端口。在第一次迭代时,每个输出端口的值是传入对应默认输入端口的值。在后续迭代中,每个输出端口的值是前一次迭代中传入对应输入端口的值。

循环控制器节点有一个Continue输入端口。如果传入Continue输入端口的值为真值,循环将继续执行。如果值为假值,循环将停止执行。

有关循环的更多信息,请参阅用户指南中的Loops部分。

输入项

标题数据类型描述默认值备注
ContinueanyIf the value is truthy, the loop will continue executing. If the value is falsy, the loop will stop.undefinedThe input will be coerced into a boolean. If the input is not provided, the loop will continue by default.
Input XanyThe value that changes in each iteration of the loop.(Required)
Input X DefaultanyThe initial value of the loop.(Required)

示例1:AI自我对话

以下示例展示了如何使用Loop Controller Node创建一个永不中断的循环。

AI通过单条消息被提示,该消息输入到Chat节点中。现有的消息历史和AI的响应被组合在一起形成新的消息历史,反馈回循环控制器。实际上,AI开始与自己对话。

Loop Controller Node Example 1

info

这个循环永远不会中断。如果您运行此图形,它最终会在默认的100次迭代后失败。

示例2:遍历数组

一个常见的用例是遍历数组。以下示例展示了如何使用Loop Controller节点遍历数组,并返回一个新数组,其中每个元素都附加了Mapped

在循环的每次迭代中,我们使用Pop Node从数组中弹出第一个值,并为其附加 Mapped。然后我们使用Array Node将新值推入输出数组,该节点是现有输出数组与新值的组合。当输入数组为空时,循环将通过Compare Node终止。

Graph Output节点连接到循环控制器的Break输出端。它以数组形式接收所有输入,因此第一个数组将为空,第二个数组将包含映射值。您可以使用Extract Object Path Node节点,通过$[1]来提取第二个数组。

Loop Controller Node Example 2

错误处理

如果循环超过Max Iterations设置中指定的最大迭代次数,循环控制器节点将报错。

常见问题

问:为什么我需要将某些东西连接到Break输出端口?

A: 由于处理机制的工作原理,图形需要从输出节点遍历到输入节点,因此需要有一个"叶子"节点作为图形执行的起点。即使循环永远不会中断,连接到"Break"输出端口也很方便。

问:为什么我的循环会无限运行?

A: 您可能没有将"Continue"输入端口连接到任何地方。如果"Continue"输入端口未连接任何内容,它将默认为true,这意味着循环永远不会中断。

如果有一个输出为"未运行"连接到输入端口,例如If Node,循环将永远不会中断,因为"未运行"输出始终为true

问:如果我不连接默认输入端口会发生什么?

A: 目前这是未定义行为,因此请尝试将所有默认值用某种方式连接起来。

问:如何更好地记住端口?

您可以为连接到输入端口的节点赋予描述性名称,因为连接到输入端口的节点名称会显示在循环控制器上。或者,您也可以记住循环控制器的输入是"成对"出现的,因此可以尝试以这种方式对它们进行分组。

问:为什么循环控制器有最大迭代次数限制?

A: 设置最大迭代次数的目的是为了防止意外的无限循环。如果你的循环没有正确终止,它最终会在达到最大迭代次数后报错。如果你确实需要一个真正的无限循环,可以将最大迭代次数设置为一个极高的数值。

另请参阅