ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ComfyUI自定义节点7个步骤上手:从第一个节点到接上第三方API

ComfyUI自定义节点7个步骤上手:从第一个节点到接上第三方API ComfyUI自定义节点7个步骤上手从第一个节点到接上第三方API【免费下载链接】ComfyUIThe most powerful and modular diffusion model GUI, api and backend with a graph/nodes interface.项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI上周跑图的时候我卡在一个很具体的问题上想把手头几百张 4K 截图批量压到 1280 宽再存档官方节点里只有整图重绘没有一个按比例缩放并保存的小工具。翻了一圈 custom_nodes/ 目录发现答案并不在别处——自己写一个节点其实只有一百来行 Python 的事。这篇文章带你走完整个流程先跑通第一个 ComfyUI 自定义节点再讲清输入输出和缓存机制最后把它接上第三方 API。工作流里缺个节点先把它写出来咱们直接上手。这个需求拆成三块读一张图、缩放、存盘。前两件事官方都有现成节点缺的是缩放本身——这就是你的第一个自定义节点。下面是一个完整的最小节点功能是按指定宽度等比缩放图片class ResizeImage(io.ComfyNode): classmethod def define_schema(cls) - io.Schema: return io.Schema( node_idResizeImage, display_nameImage Resize, categoryimage/comfy, inputs[ io.Image.Input(image), io.Int.Input(target_width, default1280, min16, max16384), ], outputs[io.Image.Output()], ) classmethod def execute(cls, image, target_width) - io.NodeOutput: h, w image.shape[1], image.shape[2] new_h round(h * target_width / w) out torch.nn.functional.interpolate( image.permute(0, 3, 1, 2), size(new_h, target_width), modebicubic, align_cornersFalse, ).permute(0, 2, 3, 1) return io.NodeOutput(out.clamp(0, 1))文件末尾还要做三行收尾工作声明扩展类并注册节点class ResizeExtension(ComfyExtension): override async def get_node_list(self): return [ResizeImage] async def comfy_entrypoint() - ResizeExtension: return ResizeExtension()把文件丢进 custom_nodes/ 目录重启 ComfyUI在节点搜索框里输入 Image Resize 就能找到它。把 input/ 目录里那张 example.png 拖进 Load Image接上缩放再用 Save Image 存盘第一次就能跑通。ComfyUI节点输入怎么写先说结论参数写在define_schema里执行函数execute的参数名必须和 schema 里声明的名字、顺序一一对应少一个都会报错。常用输入类型对照下来不长输入类型界面长什么样适合传什么Image / Model / Vae / Latent / Conditioning节点连线工作流里流动的核心数据Int / Float数字框或滑块步数、宽度、系数这类数值String文本框提示词、文件名模板Combo下拉框有限选项如缩放模式界面上参数怎么摆、是滑块还是数字框都由这些声明驱动。这是 ComfyUI 的节点输入参数配置面板右侧面板从上到下依次是图片选择、整数和浮点数输入、下拉框与文本框再补一个容易忽略的点schema 里可以写search_aliases[resize, scale image]这样用户在节点搜索框里输这些词时你的节点会排在前面。执行时机怎么控制缓存、延迟求值和指纹输入参数没变为什么节点还是重新跑了一遍反过来问参数变了为什么有的输入明明没用到系统却算过了这就是执行时机要解决的三件事系统默认缓存输入没变、上次跑成功就不重跑直接复用结果check_lazy_status延迟求值给某参数标了lazyTrue后它的值是否计算由你说了算fingerprint_inputs指纹输入返回值一变就强制重跑哪怕输入原封不动。延迟求值的意思是参数标了lazyTrue系统就不会自动算它。下面这段演示了开关不开就不算重参数io.Int.Input(target_width, default1280, min16, max16384, lazyTrue), io.Combo.Input(dry_run, options[normal, skip] ) classmethod def check_lazy_status(cls, image, target_width, dry_run): # 只有 dry_run 选中 skip 时才要求系统去计算 target_width return [target_width] if dry_run skip else []指纹输入则适合每次都要新鲜结果的场景比如带随机种子的处理classmethod def fingerprint_inputs(cls, image): import time return str(time.time()) # 返回值每次都变节点就被强制重跑三者的分工一句话就能分清对照这张表就够了机制系统问你的问题回答方式默认缓存输入变了吗没变就不重跑不用管自动生效check_lazy_status哪些输入需要算返回参数名列表不在列表里的保持不计算fingerprint_inputs要不要强制重跑返回一个字符串变了就重跑把节点串成一条工作流单个节点跑通之后下一步是看数据怎么流动。这条链路是Load Image → Image Resize → Save Image。数据流的规则很朴素每个节点的输出端口接到下一个节点的输入端口类型对不上根本连不了线。这里的 image 在节点之间是一个 torch 张量形状为 (batch, 高, 宽, 4)第 4 维是含 alpha 的 RGBASave Image 会把它转回 PNG 写进 output/ 目录文件名里自带批次编号不会互相覆盖。批量压缩的玩法由此展开把 Load Image 换成一个遍历 input/ 目录的加载节点中间接你的 ResizeImage后面挂 Save Image整批图就流水线式地过了一遍。ComfyUI 里图像处理的节点很多值得抄作业comfy_extras/nodes_images.py 这种官方文件就是现成的参考。自定义节点怎么接外部API想让节点调第三方服务比如在线超分、文生图套路和上面完全一样只差一个asyncclassmethod async def execute(cls, image) - io.NodeOutput: import aiohttp async with aiohttp.ClientSession() as session: async with session.post(API_URL, dataencode(image)) as resp: if resp.status ! 200: raise Exception(fAPI error: {await resp.text()}) return io.NodeOutput(decode(await resp.read()))三个细节值得注意密钥别做成节点参数摆在界面上从环境变量或配置文件读避免泄露execute声明为 async 后ComfyUI 的执行引擎会把它放进事件循环跑网络等待不会阻塞整个工作流错误一定要抛带上下文的异常让用户能看到是哪一步、哪个服务出了问题。官方仓库里的 comfy_api_nodes/ 目录集成了几十家第三方服务每个都是这个模式挑一个读一遍比看十篇教程都值。发布前的踩坑清单最后收个尾按踩到就疼的顺序列一下节点撞车node_id 和别的插件重了会互相覆盖起名字前先全局搜一下签名对不上execute 的参数必须和 schema 的名称、顺序严格一致这是新手第一大坑默认值不友好target_width 默认 1280 是合理的默认 16384 就会让小白用户先爆显存忘了重启custom_nodes/ 里改完代码必须重启服务才生效热重载不管新插件。分发给别人的时候记得把 README 和节点描述补齐category 也按官方习惯分类这样才容易被搜到。想动手的话第一步就很具体打开 custom_nodes/ 目录下的 example_node.py.example复制一份改名为 resize_node.py把里面 define_schema 中的Example类名和node_idExample换成ResizeImage再照着本文第二段补齐 inputs 和 execute重启一次你的第一个自定义节点就上线了。【免费下载链接】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),仅供参考
返回列表