隐藏输入 Hidden inputs
除了创建客户端相应输入或小部件的 required
和 optional
输入之外,还有三个 hidden
输入选项,允许自定义节点从服务器请求某些信息。
这些可以通过在 INPUT_TYPES
字典中返回 hidden
的值来访问,该字典具有 dict[str,str]
签名,包含一个或多个以下选项:PROMPT
、EXTRA_PNGINFO
或 UNIQUE_ID
。
@classmethod
def INPUT_TYPES(s):
return {
"required": {...},
"optional": {...},
"hidden": {
"unique_id": "UNIQUE_ID",
"prompt": "PROMPT",
"extra_pnginfo": "EXTRA_PNGINFO",
}
}
UNIQUE_ID
UNIQUE_ID
是节点的唯一标识符,与客户端上节点的 id
属性匹配。
它通常用于客户端-服务器通信(见 消息)。
提示
PROMPT
是客户端发送给服务器的完整提示。
有关完整描述,请参阅 提示对象。
EXTRA_PNGINFO
EXTRA_PNGINFO
是一个字典,它将被复制到保存的任何 .png
文件的元数据中。自定义节点可以在该字典中存储额外的信息以供保存(或作为与下游节点通信的一种方式)。
注意,如果使用 disable_metadata
选项启动 Comfy,则这些数据不会被保存。
DYNPROMPT
DYNPROMPT
是 comfy_execution.graph.DynamicPrompt
的一个实例。它与 PROMPT
不同,因为它可能在执行过程中由于 节点扩展 的响应而发生变化。
DYNPROMPT
应仅用于高级用例(如自定义节点中的循环实现)。
Flexible inputs
自定义数据类型
如果您想在自定义节点之间传递数据,定义一个自定义数据类型可能很有帮助。这(几乎)和为数据类型选择一个名称一样简单,该名称应该是大写字母的唯一字符串,例如 CHEESE
。
然后您可以在节点的 INPUT_TYPES
和 RETURN_TYPES
中使用 CHEESE
,Comfy 客户端将只允许 CHEESE
输出连接到 CHEESE
输入。
CHEESE
可以是任何 Python 对象。
唯一需要注意的一点是,因为 Comfy 客户端不了解 CHEESE
(除非您为 CHEESE
定义一个自定义小部件,这是一个留待另一天讨论的话题),您需要(除非您定义一个自定义小部件),强制它成为一个输入而不是小部件。这可以通过输入选项字典中的 forceInput
选项来完成:
@classmethod
def INPUT_TYPES(s):
return {
"required": { "my_cheese": ("CHEESE", {"forceInput":True}) }
}
通配符输入
@classmethod
def INPUT_TYPES(s):
return {
"required": { "anything": ("*",{})},
}
@classmethod
def VALIDATE_INPUTS(s, input_types):
return True
前端允许使用 *
来表示输入可以连接到任何源。因为后端不正式支持这一点,你可以在你的 VALIDATE_INPUTS
函数中接受一个名为 input_types
的参数来跳过后端类型的验证。(有关更多信息,请参阅 VALIDATE_INPUTS。)节点负责理解传递的数据。
动态创建的输入
如果输入在客户端动态创建,它们就不能在 Python 源代码中定义。
为了访问这些数据,我们需要一个 可选
的字典,它允许 Comfy 使用任意名称传递数据。由于 Comfy 服务器
class ContainsAnyDict(dict):
def __contains__(self, key):
return True
...
@classmethod
def INPUT_TYPES(s):
return {
"required": {},
"optional": ContainsAnyDict()
}
...
def main_method(self, **kwargs):
# the dynamically created input data will be in the dictionary kwargs
感谢rgthree分享这个Python技巧!