ComfyUI 节点插件开发指南从零搭建并分发你的第一个自定义节点【免费下载链接】ComfyUIThe most powerful and modular diffusion model GUI, api and backend with a graph/nodes interface.项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUIComfyUI 是一款高度模块化的扩散模型 GUI核心是图/节点式的工作流接口。而 ComfyUI 节点插件开发就是让你不改一行核心代码只写一个 Python 文件就能把任何自定义功能变成工作流里可拖拽、可连线、可保存分享的节点。读完这篇你可以独立写出第一个节点并让它像官方节点一样跑进真实工作流。先想清楚你要解决什么场景写插件之前先看看自己卡在哪个环节场景决定了节点的形态批量图像调优官方节点给的是一个参数一种效果但你的产线要先锐化再调对比度再合并。痛点是流程被锁死在固定节点里 → 插件化解法写一个多模式增强节点把整条调优逻辑收进一个节点工作流一眼看完。接入外部 AI 服务想用某个云端 API图像生成、视频生成、3D却找不到现成节点。痛点是接口分散在各家文档里 → 插件化解法一个节点封装配置 → 请求 → 容错全流程工作流里只露出一根输入线和一根输出线。自定义工作流逻辑两个节点之间总要做点胶水逻辑靠手动连线很繁琐。痛点是重复操作无法沉淀 → 插件化解法把胶水逻辑固化成节点整张图保存后别人直接复用。30 秒看懂扩展机制ComfyUI 的新式节点 API 集中在comfy_api/latest里骨架只有三件事H3 节点的生命周期注册ComfyUI 启动时扫描custom_nodes目录找到文件里的comfy_entrypoint()函数并调用它拿到你提供的节点类清单。声明输入输出define_schema返回一张节点身份证——叫什么名、归哪个分类、有哪些输入控件、输出什么类型。前端就是靠它自动画出输入控件。执行工作流被触发时调用execute输入参数按声明顺序作为实参传入。返回结果把结果包进NodeOutput返回下游节点自动接上。H3 最小骨架代码下面这个 14 行骨架是一个图像反色节点也是 custom_nodes/example_node.py.example 的精髓from comfy_api.latest import ComfyExtension, io class Invert(io.ComfyNode): classmethod def define_schema(cls): return io.Schema( node_idInvert, display_nameInvert Image, categoryexample, inputs[io.Image.Input(image)], outputs[io.Image.Output()], ) classmethod def execute(cls, image): return io.NodeOutput(1.0 - image)每个概念配一句白话node_id是节点的唯一标识旧工作流靠它找回你的节点category决定节点在菜单的哪个分类下io.Image.Input(image)声明我要一张图参数名就叫 imageexecute(cls, image)里的实参名字必须和它一致。从零搭建你的第一个扩展H3 从模板文件起步在 ComfyUI 根目录执行git clone https://gitcode.com/GitHub_Trending/co/ComfyUI拿到仓库或更新你本地已有的仓库。然后在custom_nodes/目录下新建my_first_node.py——这个目录就是插件的插座重启 ComfyUI 后会自动加载里面所有能识别的 Python 文件。H3 写一个完整的示例节点下面是一个中等复杂度的图像锐化节点带滑杆参数、带取值范围校验并附上把节点注册进 ComfyUI 所需的入口代码from typing_extensions import override from comfy_api.latest import ComfyExtension, io class Sharpen(io.ComfyNode): classmethod def define_schema(cls): return io.Schema( node_idMySharpen, display_nameSharpen, categoryimage/adjust, inputs[ io.Image.Input(image), io.Float.Input( strength, default1.5, min0.5, max3.0, step0.1, display_modeio.NumberDisplay.slider, tooltipSharpening strength, ), ], outputs[io.Image.Output(display_nameimage)], ) classmethod def execute(cls, image, strength): blurred image - image.mean(dim(-2, -1), keepdimTrue) return io.NodeOutput(image strength * blurred) class MyExtension(ComfyExtension): override async def get_node_list(self): return [Sharpen] async def comfy_entrypoint() - MyExtension: return MyExtension()几个容易踩的点min/max/step会直接约束前端滑杆的行程tooltip会显示成控件的悬浮提示execute的参数顺序必须和inputs声明顺序完全一致。H3 在界面里验证它真的生效了保存文件后重启 ComfyUI或在管理界面点刷新自定义节点。然后在前端节点菜单里按CtrlK搜索 Sharpen——只要能从分类image/adjust下拉出来说明注册成功。把它拖进画布左侧会同时出现image输入线和strength滑杆。接着跑一遍看看效果随便接一张图进来点队列执行输出图会变锐说明execute也通了。让扩展真正好用的几个关键机制H3 懒加载输入省掉没必要的计算这个机制解决上游参数还没被用到就先算了一遍的浪费——延迟求值即系统先判断到底需不需要真的去算这个参数不需要就跳过。class PrintToScreen(io.ComfyNode): # 声明时标记 lazyTrue inputs [io.String.Input(text, lazyTrue), io.Combo.Input(mode, options[enable, disable])] classmethod def check_lazy_status(cls, text, mode): return [text] if mode enable else []不处理会怎样每次运行工作流text都会无条件被计算哪怕这个开关根本没开白白消耗上游算力。H3 输入指纹精确控制重跑时机这个机制解决输入其实没变节点却被反复重新执行的重复劳动——指纹值变了才重跑。classmethod def fingerprint_inputs(cls, image, strength): # 图像哈希 强度两者都没变就沿用缓存结果 return f{image.sum().item()}_{strength}不处理会怎样节点只能靠上游输出变了来触发重跑你自己内部的执行逻辑比如依赖外部状态变化时它永远不重跑结果停在旧值上。H3 异步执行别把界面卡死这个机制解决网络请求阻塞整个事件循环的卡死问题——execute可以声明成async。classmethod async def execute(cls, prompt): image await call_external_api(prompt) # 等待期间不阻塞其他任务 comfy_api.ExecutionSync.set_progress(0.5, 1.0) return io.NodeOutput(image)不处理会怎样一次两分钟的云端生成会把整台 ComfyUI 的事件循环挂住其他队列任务全部排队干等界面看起来像死机。对接外部生态与分发H3 接入外部 API 的四步模式comfy_api_nodes/ 目录是集成的样板间所有 API 节点都走同一条路配置把密钥、端点做成输入或走统一代理不硬编码。请求async发出请求上传大文件时用工具函数处理编码。容错超时、限流、格式错误都有明确的异常分支别让用户看到裸 traceback。回调用set_progress回报进度长任务里用户看得见你在干嘛。仓库里已覆盖的主流服务服务类型对应模块路径适用场景多模态生成comfy_api_nodes/nodes_gemini.py图像生成、图文理解3D 模型comfy_api_nodes/nodes_tripo.py文本/图片转 3D视频生成comfy_api_nodes/nodes_luma.py文生视频、图生视频语音合成comfy_api_nodes/nodes_elevenlabs.py文本转语音视频 APIcomfy_api_nodes/nodes_kling.py可灵视频生成H3 让别人找到并使用你的扩展分发一个节点其实只有四件事README 里放安装命令 一张工作流截图 节点菜单入口的截图用户 10 秒内能决定要不要用版本号走语义化破坏输入输出兼容就升大版本加参数升小版本display_name和category起得像人话这是节点在菜单里最容易被搜到的方式最后到社区渠道发一个带示例工作流 JSON的介绍比纯文字说明有说服力得多。动手清单克隆仓库git clone https://gitcode.com/GitHub_Trending/co/ComfyUI确认custom_nodes/目录存在。照模板建文件把 custom_nodes/example_node.py.example 复制成custom_nodes/my_first_node.py改类名、node_id和execute里的逻辑。重启 ComfyUI在节点菜单搜你的名字连线、执行确认输出正确。翻 comfy_extras/ 里的官方节点找灵感——每个文件都是生产级的写法示范。把节点打包发布补上 README、语义化版本号发到社区渠道并附上示例工作流。跑通第一个节点的那一刻你会明白这套扩展机制有多顺手——而你的工作流从此也能长出别人没有的节点。【免费下载链接】ComfyUIThe most powerful and modular diffusion model GUI, api and backend with a graph/nodes interface.项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考