该资料说明 ComfyUI 自定义节点的缓存签名机制,以及签名不正确时节点为何会静默地每次重算。
用途与背景 节点通过 fingerprint_inputs(V3)或 IS_CHANGED(V1)声明自己的缓存签名。两者都不声明时,由节点声明的输入决定缓存,这是正确的默认做法;仅当输出依赖那些输入未捕获的信息时,才需要自行添加签名声明。
签名采集时机与可用数据 签名在计算图运行之前采集,因此链接输入到达时是 None,只有控件值、字面量和 UNIQUE_ID 隐藏项是真实可用的。其余隐藏项不可用:签名阶段调用 get_input_data 时不带动态 prompt 和额外数据,所以 PROMPT 到达时是 {},而 DYNPROMPT、EXTRA_PNGINFO、EXECUTION_LIST 和认证令牌类隐藏项到达时是 None。对这些内容做指纹会得到常量,从而造成资料所警告的过期输出故障。例外是声明了 rawLink 的输入,它会拿到 [node_id, output_index] 引用。通过上述任一形式深入张量或模型会抛出异常,执行器会捕获该异常、记录警告,并把签名设为一个不与自身相等的非数值;因此损坏的签名表现为节点每次运行都重算,而不是崩溃。应返回标量,或键类型统一且值为标量的列表、元组、字典;集合、非字符串枚举或数据类会变成不可哈希的哨兵值,导致每次重算;键类型混合的字典会在该处理器之外抛出异常。
签名的传递性 签名不是局部的:节点的缓存键会嵌入所有祖先的签名,因此一个永不重复的值会迫使它整个下游锥重算。墙钟读数通常是常见原因——对于必须始终重新读取的实时获取是正确的,但对之后的一切都是缓存失效。应从输出所依赖的内容派生该值:解析后的控件值,加上节点读取的外部状态,例如文件的大小与修改时间——当文件可能被原地重写且大小和修改时间都不变时,改用内容摘要,正如核心 LoadImage 所做的那样——以及环境变量,和行为变化时递增的版本常量。
验证方法 应同时验证两个方面:用相同参数调用签名两次并要求相等,然后更改一个字段并要求结果不同。第一项失败是缓存失效,第二项失败是过期输出缺陷。将节点标记为非幂等或标记为产生中间输出会单独改变缓存行为,不能替代正确的签名。
适用场景与限制 该资料面向 ComfyUI 自定义节点开发者,用于排查节点每次运行都重算或返回过期输出的问题。资料未提供具体安装命令、代码示例、平台要求或性能数据;相关细节暂未提供。