当前位置: 首页 > article >正文

ComfyUI自定义节点开发指南:从零构建你的专属AI工具链

1. 为什么需要自定义ComfyUI节点第一次用ComfyUI做AI绘画时我就被它灵活的节点式操作吸引了。但用着用着发现一个问题官方提供的节点虽然强大但总有些特殊需求无法满足。比如想给生成的图片自动打水印、批量处理文件夹里的图片、或者接入自己训练的特殊模型这时候就需要开发自定义节点了。自定义节点就像是给ComfyUI安装外挂让它具备原本没有的能力。我去年给电商公司做产品图生成系统时就开发过自动添加产品参数的节点把商品SKU、价格等信息直接合成到图片上省去了后期PS的麻烦。这种定制化功能用官方节点根本实现不了。2. 开发环境准备2.1 基础软件安装开发ComfyUI节点需要准备以下工具我用的是Windows 11系统其他系统也大同小异Python 3.10建议用Miniconda管理环境避免版本冲突。我习惯创建一个专门的环境conda create -n comfydev python3.10 conda activate comfydevGit用来下载ComfyUI源码和示例项目。如果没安装在conda环境里运行conda install git代码编辑器VS Code或PyCharm都行我个人更喜欢VS Code的轻量化装上Python插件就能直接调试。2.2 ComfyUI源码获取直接从GitHub克隆最新代码git clone https://github.com/comfyanonymous/ComfyUI.git cd ComfyUI pip install -r requirements.txt建议把代码放在固态硬盘上我第一次开发时放在机械硬盘启动速度慢了近3倍。现在我的项目结构是这样的D:\AI_Projects\ ├── ComfyUI/ # 主程序 └── custom_nodes/ # 自定义节点目录3. 第一个Hello World节点3.1 创建节点文件在custom_nodes文件夹下新建hello_world.py这是最简单的节点模板import torch from comfy.sd import CLIP from nodes import SaveImage class HelloWorld: classmethod def INPUT_TYPES(cls): return { required: { text: (STRING, {default: Hello World!}), } } RETURN_TYPES (STRING,) FUNCTION do_action CATEGORY custom def do_action(self, text): print(fReceived: {text}) return (text,) NODE_CLASS_MAPPINGS { HelloWorld: HelloWorld } NODE_DISPLAY_NAME_MAPPINGS { HelloWorld: Hello World Node }这个节点接收一个文本输入原样输出到控制台。关键点INPUT_TYPES定义输入参数RETURN_TYPES声明输出类型FUNCTION指定处理函数CATEGORY决定节点在UI中的分类位置3.2 测试运行启动ComfyUI后右键菜单里就能看到新增的custom分类下的Hello World节点。连上调试器后我在VS Code里设置了断点可以实时观察变量变化。第一次运行时我遇到了ModuleNotFoundError原因是没把custom_nodes目录添加到Python路径。解决方法是在启动脚本前加上import sys sys.path.append(D:/AI_Projects/custom_nodes)4. 开发实用功能节点4.1 图片水印节点下面这个实战案例是我给摄影工作室开发的批量水印工具from PIL import Image, ImageDraw, ImageFont import numpy as np import torch import os from nodes import PreviewImage class WatermarkNode: def __init__(self): self.font ImageFont.truetype(arial.ttf, 36) classmethod def INPUT_TYPES(cls): return { required: { images: (IMAGE,), text: (STRING, {default: Sample Watermark}), opacity: (FLOAT, {default: 0.5, min: 0, max: 1}), } } RETURN_TYPES (IMAGE,) FUNCTION apply_watermark CATEGORY image/postprocessing def apply_watermark(self, images, text, opacity): batch_size images.shape[0] results [] for i in range(batch_size): img 255. * images[i].cpu().numpy() img Image.fromarray(np.clip(img, 0, 255).astype(np.uint8)) # 创建水印层 watermark Image.new(RGBA, img.size) draw ImageDraw.Draw(watermark) # 计算文字位置右下角 text_width, text_height draw.textsize(text, self.font) x img.width - text_width - 20 y img.height - text_height - 20 # 绘制半透明文字 draw.text((x, y), text, fontself.font, fill(255,255,255,int(255*opacity))) # 合成图片 img Image.alpha_composite( img.convert(RGBA), watermark ).convert(RGB) results.append(torch.from_numpy(np.array(img).astype(np.float32) / 255.0)) return (torch.stack(results),)开发时踩过的坑忘记处理batch输入导致只能处理单张图片透明度参数没做范围限制有用户输入了1.5导致报错字体路径写死在其他电脑上运行时找不到字体4.2 模型集成节点如果想接入自定义Stable Diffusion模型可以这样实现from comfy.sd import load_checkpoint from nodes import CheckpointLoader class CustomModelLoader(CheckpointLoader): classmethod def INPUT_TYPES(cls): return { required: { model_name: ([custom_model1, custom_model2],), } } FUNCTION load_model def load_model(self, model_name): # 自定义模型路径映射 model_map { custom_model1: D:/models/custom1.safetensors, custom_model2: D:/models/custom2.ckpt } return load_checkpoint(model_map[model_name])5. 调试与优化技巧5.1 常见错误排查节点不显示检查文件是否放在custom_nodes目录确认类名是否添加到NODE_CLASS_MAPPINGS查看控制台是否有导入错误参数类型错误ComfyUI对类型要求严格注意IMAGE类型是torch.Tensor使用isinstance(input, torch.Tensor)做类型检查内存泄漏大图像处理时用del及时释放中间变量可以用torch.cuda.empty_cache()清空显存5.2 性能优化建议批量处理 尽量设计支持batch处理的节点比如水印节点同时处理8张图比循环处理快3倍GPU加速 把numpy操作替换为torch操作# 慢 img_np img.cpu().numpy() # 快 img_tensor img.to(devicecuda)缓存机制 对于模型加载等耗时操作可以添加缓存_models_cache {} def load_model(model_name): if model_name not in _models_cache: _models_cache[model_name] load_checkpoint(model_name) return _models_cache[model_name]6. 发布与分享你的节点6.1 打包发布建议的项目结构my_custom_nodes/ ├── __init__.py ├── watermark.py ├── model_loader.py └── README.md在__init__.py中集中注册所有节点from .watermark import WatermarkNode from .model_loader import CustomModelLoader NODE_CLASS_MAPPINGS { WatermarkNode: WatermarkNode, CustomModelLoader: CustomModelLoader }6.2 通过ComfyUI-Manager分发在GitHub创建仓库在manifest.json中声明依赖和兼容性{ name: My Custom Nodes, version: 1.0.0, comfyui: 0.3.58, dependencies: [Pillow9.0.0] }用户可以通过ComfyUI-Manager直接安装https://github.com/yourname/yournodes.git我去年发布过一个图片增强节点包从开发到上架花了2周时间现在已经有500用户在使用。关键是要写好文档特别是输入输出示例## 水印节点使用说明 输入参数 - images: 要加水印的图片批次 (BATCHxHxWxC) - text: 水印文字 - opacity: 透明度 (0-1) 输出 - 带水印的图片批次 示例工作流 json { nodes: [ { type: WatermarkNode, inputs: { images: [5, 0], text: Confidential, opacity: 0.7 } } ] }开发自定义节点最爽的时刻就是看到自己写的代码被集成到别人的工作流中解决实际问题。从最简单的Hello World开始逐步挑战更复杂的功能你会发现ComfyUI的扩展性超乎想象。最近我在开发一个视频转GIF的节点遇到时间轴同步的问题正在研究用FFmpeg集成方案。

相关文章:

ComfyUI自定义节点开发指南:从零构建你的专属AI工具链

1. 为什么需要自定义ComfyUI节点? 第一次用ComfyUI做AI绘画时,我就被它灵活的节点式操作吸引了。但用着用着发现一个问题:官方提供的节点虽然强大,但总有些特殊需求无法满足。比如想给生成的图片自动打水印、批量处理文件夹里的图…...

Ryujinx零门槛全攻略:开源Switch模拟器从入门到精通

Ryujinx零门槛全攻略:开源Switch模拟器从入门到精通 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx 价值定位:为什么Ryujinx能重新定义Switch游戏体验&#xff…...

MAI-UI-8B部署全攻略:开箱即用,快速体验GUI智能体强大功能

MAI-UI-8B部署全攻略:开箱即用,快速体验GUI智能体强大功能 1. 认识MAI-UI-8B:能"动手"的AI智能体 大多数AI助手只能回答问题或生成内容,而MAI-UI-8B却能做到真正意义上的"动手操作"。这是一个能够理解图形用…...

别再只升级OpenSSH了!一次搞懂Linux离线环境下的依赖包管理与编译安装避坑指南

离线环境下的Linux软件编译:从OpenSSH升级到通用依赖管理方法论 当你面对一台无法连接互联网的Linux服务器时,软件升级和安装往往会变成一场噩梦。想象一下:你下载了最新版OpenSSH的源码包,满怀希望地执行./configure,…...

从电网到实验室——10kW大功率电源的Psim仿真实战

基于Psim的Boost型 PFC移相全桥AC-DC电源设计仿真 1、前级电网输入220AC,50Hz,中间级母线电压为600V,后级600V输入,547V输出,电压可调,功率10kW 2、前级基于Boost电路PFC,平均电流控制&#xff…...

拆解RoboteX AVATAR机器人:4个电机如何驱动履带+摇臂?一份紧凑传动布局的保姆级图解

RoboteX AVATAR机器人传动系统深度解析:四电机协同驱动履带与摇臂的机械艺术 当第一次看到RoboteX AVATAR Tactical Robot在复杂地形中自如穿梭的视频时,很难不被它那看似简单却异常高效的移动方式所吸引。这款战术机器人的核心秘密,就藏在它…...

ZPL文件操作避坑指南:从OPEN到CLOSE的5个常见错误排查

ZPL文件操作避坑指南:从OPEN到CLOSE的5个常见错误排查 在光学设计领域,ZPL宏作为ZEMAX的自动化利器,文件操作是绕不开的核心技能。但当你从教程里的完美示例转向真实项目时,那些被刻意简化的场景往往会暴露出各种"坑"。…...

Qwen3-Reranker-8B企业落地:保险条款智能比对系统重排模块部署

Qwen3-Reranker-8B企业落地:保险条款智能比对系统重排模块部署 1. 项目背景与需求场景 保险行业每天需要处理大量的条款文档比对工作,比如新老条款对比、不同产品条款差异分析、合规性检查等。传统的人工比对方式效率低下,容易出错&#xf…...

2025年阿里云幻兽帕鲁联机服务器极速搭建指南

1. 为什么选择阿里云搭建幻兽帕鲁服务器? 最近很多朋友问我,为什么非要选择阿里云来搭建幻兽帕鲁的联机服务器?作为一个从游戏测试阶段就开始折腾服务器搭建的老玩家,我总结了几个关键原因。首先,阿里云的游戏服务器专…...

STM32主从定时器实战:用CubeMX搞定PWM移相+动态调占空比(附G474配置)

STM32主从定时器实战:CubeMX图形化配置PWM移相与动态调占空比 在电力电子和电机控制领域,精确的PWM信号控制是系统高效运行的关键。对于需要多路相位可调PWM的应用场景,如交错并联DC/DC变换器、三相逆变器等,传统的手动寄存器配置…...

Aspose.Words避坑指南:Java实现Word转PDF时如何去除水印(2023最新版)

Aspose.Words商业应用实战:Java版Word转PDF无水印解决方案深度解析 在企业级文档处理系统中,Word到PDF的转换需求几乎无处不在——合同归档、报告生成、电子发票导出等场景都依赖这一基础功能。作为Java开发者,当我们选择Aspose.Words这一业界…...

用Segment Anything Model (SAM) 做3D目标检测?手把手教你复现SAM3D论文核心流程

从BEV到3D检测:基于Segment Anything的零样本实践指南 当Meta的Segment Anything Model(SAM)横空出世时,计算机视觉领域掀起了一阵"分割一切"的浪潮。但大多数应用仍停留在2D图像领域,直到SAM3D论文提出将这…...

Kaggle Notebook中文乱码终结者:3分钟搞定Matplotlib字体配置(附Noto Sans CJK全流程)

Kaggle Notebook中文乱码终结者:3分钟搞定Matplotlib字体配置(附Noto Sans CJK全流程) 在数据可视化过程中,中文显示问题一直是困扰许多Kaggle用户的痛点。当你在Notebook中满怀期待地运行代码,却发现图表中的中文变成…...

Java Eclipse JDK 1.8.0_25安装与配置全指南

1. JDK 1.8.0_25的下载与安装 如果你是刚接触Java开发的新手,可能会被各种版本的JDK搞得一头雾水。别担心,JDK 1.8.0_25(也就是Java 8的一个子版本)至今仍是企业开发中最常用的稳定版本之一。我当年刚开始学Java时,导师…...

OWL ADVENTURE Java面试题实战:手写一个简单的图像加载器

OWL ADVENTURE Java面试题实战:手写一个简单的图像加载器 最近在准备Java面试的朋友,是不是经常被问到IO、多线程这些基础?光背八股文总觉得心里没底。今天咱们换个玩法,不搞虚的,直接动手写一个能用在真实项目里的东…...

Unity游戏开发实战:用三阶贝塞尔曲线为你的角色设计一条丝滑的移动路径(附完整C#脚本)

Unity游戏开发实战:三阶贝塞尔曲线打造丝滑角色移动路径 想象一下,你的游戏角色需要完成一个优雅的空中翻转动作,或者赛车需要在弯道实现完美漂移轨迹。这些令人惊叹的运动效果背后,往往隐藏着一条看不见的数学曲线——贝塞尔曲线…...

PDF-Parser-1.0一键部署教程:5分钟搞定文档解析神器,小白也能轻松上手

PDF-Parser-1.0一键部署教程:5分钟搞定文档解析神器,小白也能轻松上手 1. 为什么你需要这个文档解析工具? 你是不是经常遇到这样的烦恼? 下载了一份重要的PDF报告,想把里面的表格数据整理到Excel里,结果…...

ABAP开发避坑指南:绕过SAP GUI安全弹窗的5种编程方案实测

ABAP开发实战:5种绕过SAP GUI安全弹窗的编程方案深度解析 引言:SAP GUI安全机制的困境与突破 在SAP系统的日常开发与运维中,频繁出现的"系统试图创建文件"安全弹窗堪称ABAP开发者的噩梦。这种设计初衷为保护本地文件安全的机制&…...

cv_resnet50_face-reconstruction效果对比:不同光照/姿态下人脸重建质量实测报告

cv_resnet50_face-reconstruction效果对比:不同光照/姿态下人脸重建质量实测报告 你是不是也好奇,一个基于ResNet50的人脸重建模型,到底能把一张照片还原到什么程度?它能不能处理好那些光线不好、角度刁钻的照片?今天…...

Wnt/β-catenin信号通路在组织修复与再生中的关键作用

1. Wnt/β-catenin信号通路:细胞修复的"总指挥" 想象一下你手指被划伤后伤口愈合的过程,或者肝脏在受损后自我修复的神奇能力。这些看似平常的现象背后,其实隐藏着一个精密的分子调控网络——Wnt/β-catenin信号通路。这条通路就像…...

【深度强化学习】DDPG算法在连续动作空间中的实战解析

1. DDPG算法初探:为什么我们需要它? 第一次接触DDPG(Deep Deterministic Policy Gradient)算法时,我完全被这个拗口的名字吓到了。但当我真正理解它的设计初衷后,才发现它其实解决了一个非常实际的问题——…...

低成本工业机器人:开源六轴机械臂从技术原理到生态落地全指南

低成本工业机器人:开源六轴机械臂从技术原理到生态落地全指南 【免费下载链接】Faze4-Robotic-arm All files for 6 axis robot arm with cycloidal gearboxes . 项目地址: https://gitcode.com/gh_mirrors/fa/Faze4-Robotic-arm 技术原理:打破工…...

OpenClaw技能扩展:基于nanobot开发自定义自动化模块

OpenClaw技能扩展:基于nanobot开发自定义自动化模块 1. 为什么选择nanobot作为技能开发基础 当我第一次尝试为OpenClaw开发自定义技能时,面对庞大的框架和复杂的依赖关系感到无从下手。直到发现nanobot这个轻量级解决方案,才真正找到了适合…...

Dify工作流架构:声明式编排与可视化执行引擎的技术实现

Dify工作流架构:声明式编排与可视化执行引擎的技术实现 【免费下载链接】Awesome-Dify-Workflow 分享一些好用的 Dify DSL 工作流程,自用、学习两相宜。 Sharing some Dify workflows. 项目地址: https://gitcode.com/GitHub_Trending/aw/Awesome-Dify…...

颠覆3种时间黑洞:用Obsidian日历重构你的工作流

颠覆3种时间黑洞:用Obsidian日历重构你的工作流 【免费下载链接】obsidian-full-calendar Keep events and manage your calendar alongside all your other notes in your Obsidian Vault. 项目地址: https://gitcode.com/gh_mirrors/obs/obsidian-full-calendar…...

百川2-13B-4bits模型微调指南:提升OpenClaw任务执行准确率

百川2-13B-4bits模型微调指南:提升OpenClaw任务执行准确率 1. 为什么需要微调百川模型? 去年夏天,当我第一次用OpenClaw自动化整理电脑上的数千份文档时,遇到了一个尴尬的问题——AI经常把技术文档和私人照片混在一起归类。这让…...

用华为ENSP模拟器复现智慧小区网络:从VLAN划分到三层架构的保姆级配置教程

华为ENSP模拟器实战:智慧小区网络从零搭建全流程指南 当你第一次拿到智慧小区网络设计方案时,那些抽象的拓扑图和配置参数是否让你望而生畏?作为网络工程师成长路上的必经之路,企业级网络搭建从来不是纸上谈兵的游戏。本文将带你用…...

用Image-to-Video为你的图片注入灵魂:动态效果生成全攻略

用Image-to-Video为你的图片注入灵魂:动态效果生成全攻略 1. 引言:让静态图片动起来 想象一下,你拍了一张完美的风景照,但总觉得少了点什么——如果云能飘动、树叶能摇曳、水面能泛起波纹,那该多好?这就是…...

霞鹜文楷GB:为什么选择这款免费开源的中文国标字体?

霞鹜文楷GB:为什么选择这款免费开源的中文国标字体? 【免费下载链接】LxgwWenkaiGB An open-source Simplified Chinese font derived from Klee One. 项目地址: https://gitcode.com/gh_mirrors/lx/LxgwWenkaiGB 霞鹜文楷GB是一款基于日本Klee O…...

FLUX.1-dev实战教程:像素幻梦中多LoRA叠加与风格混合生成技巧

FLUX.1-dev实战教程:像素幻梦中多LoRA叠加与风格混合生成技巧 1. 像素幻梦工坊简介 Pixel Dream Workshop(像素幻梦工坊)是基于FLUX.1-dev扩散模型构建的专业像素艺术生成工具。与传统AI绘图工具不同,它专为像素艺术创作优化&am…...