comfyui自定义节点

一个最基本的自定义节点就是一个 .py Python 文件。ComfyUI 在启动时会扫描 ComfyUI/custom_nodes/ 文件夹,并加载其中的节点。这个 Python 文件必须告诉 ComfyUI 四件核心事情:

  1. “ 我需要什么?” (Inputs):定义节点的输入接口。
  2. “ 我能产出什么?” (Outputs):定义节点的输出接口。
  3. “ 我的核心工作是什么?” (Function):实现节点功能的具体代码。
  4. “ 我叫什么,怎么找到我?” (Registration):给节点一个唯一的名称,并注册到系统中。

1.1 相乘实践

1.1 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# 这是一个最简单的自定义节点示例
class DoubleNumber:
# 1. “我需要什么?” -> 定义输入
@classmethod
def INPUT_TYPES(s):
return {
"required": {
# 输入接口的名字叫 "number"
# 它的类型是整数 (INT),有一些附加设置
"number": ("INT", {"default": 1, "min": 0, "max": 1000, "step": 1}),
}
}

# 2. “我能产出什么?” -> 定义输出
RETURN_TYPES = ("INT",)
# 定义输出接口的名称
RETURN_NAMES = ("doubled_number",)

# 3. “我的核心工作是什么?” -> 节点要执行的函数
FUNCTION = "execute"

# 节点在UI上显示的分类
CATEGORY = "LW's Nodes"

# 这是实际执行加倍操作的函数
def execute(self, number):
# 核心逻辑:将输入的数字乘以 2
doubled = number * 2
# 将结果通过输出接口返回
# 注意:必须用元组 (tuple) 的格式返回,即使只有一个值
return (doubled,)

# 4. “我叫什么,怎么找到我?” -> 注册节点
# 这是 ComfyUI 识别节点的“登记处”
NODE_CLASS_MAPPINGS = {
# "DoubleNumberNode" 是 ComfyUI 在后台使用的唯一ID
"DoubleNumberNode": DoubleNumber
}

# 方便在UI菜单里搜索的显示名称
NODE_DISPLAY_NAME_MAPPINGS = {
"DoubleNumberNode": "LW Double Number"
}

1.2 注意事项

  • 文件结构:始终将你的自定义节点放在 ComfyUI/custom_nodes/ 目录下的一个子文件夹里。例如:ComfyUI/custom_nodes/LW_Nodes/double_number.py
  • __init__.py 文件:为了让 ComfyUI 更好地识别你的文件夹,最好在文件夹里(例如 LW_Nodes/)创建一个空的 __init__.py 文件。这会将文件夹标记为 Python 的一个 “ 包 “。
  • 重启服务:每次修改或添加了自定义节点代码后,必须完全关闭并重启 ComfyUI 的后台服务,刷新浏览器是没用的。
  • 数据类型:输入和输出的类型必须严格匹配。ComfyUI 对数据类型非常敏感,例如 INT 和 FLOAT 是不同的,IMAGE 和 MASK 也是不同的。
  • 调试:在你的 execute 函数里使用 print() 语句是最好的调试方法。输出的信息会显示在启动 ComfyUI 的命令行窗口中。

1.3 测试

file-20250816140047108