关注不迷路,点赞走好运!!!
ComfyUI如同乐高积木,基础节点是基础积木块,而插件就是你的定制化特殊积木。例如设计师常需快速切换提示词,手动操作如同反复拆装积木——而一个提示词选择器插件能一键切换,效率提升200%。
案例:设计师预置"科幻风"、"水墨画"等提示词模板,避免重复输入。
git clone https://github.com/comfyanonymous/ComfyUI.git
修改extra_model_paths.yaml
实现模型共享,避免重复下载大文件:
base_path: "F:/你的WebUI目录/models"
checkpoints: "Stable-diffusion"
vae: "VAE"
custom_nodes/
└── your_plugin/
├── nodes.py # 节点核心逻辑
├── __init__.py # 插件入口
└── js/ # 前端组件
提示:使用VS Code的Python环境,安装Pylance插件可自动补全ComfyUI API。
用户需预置多组提示词(如"科幻飞船"、“水墨山水”),避免手动输入。
class PromptSelectorNode:
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"prompt_pairs": ("STRING", {
"multiline": True,
"default": '"科幻":"spaceship, futuristic",\n"水墨":"ink wash painting"'
}),
"selected_key": (["科幻", "水墨"],) # 动态选项
},
"hidden": {"node_id": "UNIQUE_ID"} # 用于前后端同步
}
FUNCTION = "process"
RETURN_TYPES = ("STRING",)
def process(self, prompt_pairs, selected_key):
# 解析键值对(示例)
pairs = dict(line.split(":") for line in prompt_pairs.split(","))
return (pairs.get(selected_key, ""),)
选择"科幻"时输出
spaceship, futuristic
通过hidden
字段传递node_id
实现实时同步:
# 前端js/widget.js
app.registerExtension({
nodeType: "PromptSelectorNode",
widget: {
update: function(node, inputName, value) {
if(inputName === "prompt_pairs") {
// 解析value并更新下拉选项
node.widgets[1].options = parsed_keys;
}
}
}
})
防止用户输入错误格式:
@classmethod
def VALIDATE_INPUTS(cls, selected_key):
if selected_key not in cls.current_keys:
return "无效选项"
return True
节点创建时自动初始化选项:
nodeType.prototype.onNodeCreated = function() {
const promptWidget = this.widgets.find(w => w.name === "prompt_pairs");
promptWidget.callback(promptWidget.value); // 触发初始解析
}
在节点代码中添加:
print(f"【插件调试】收到参数: {selected_key}")
def test_prompt_selector():
node = PromptSelectorNode()
result = node.process('"a":"1", "b":"2"', "a")
assert result[0] == "1", "测试失败!"
修改代码后按Ctrl+Shift+R
重载节点,无需重启服务。
NODE_CLASS_MAPPINGS = {"PromptSelector": PromptSelectorNode}
NODE_DISPLAY_NAME_MAPPINGS = {"PromptSelector": "提示词选择器"}
WEB_DIRECTORY = "./js"
用户可通过命令安装:
cd ComfyUI/custom_nodes
git clone https://github.com/yourname/your-plugin.git
在管理器界面搜索插件名称,点击安装并重启:
传统尺寸修改需反复连接节点,本插件一键设置多种分辨率。
class ResizeTool:
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"image": ("IMAGE",),
"preset": (["手机壁纸", "电脑桌面", "自定义"],)
},
"optional": {"custom_size": ("TUPLE", {"default": (1024,768)})}
}
FUNCTION = "resize"
CATEGORY = "图像工具"
def resize(self, image, preset, custom_size=None):
size_dict = {"手机壁纸":(1080,1920), "电脑桌面":(1920,1080)}
target_size = custom_size if preset=="自定义" else size_dict[preset]
resized_image = F.interpolate(image, size=target_size, mode='bilinear')
return (resized_image,)
双线性插值公式:
output [ x , y ] = ∑ i , j input [ i , j ] ⋅ W ( i , j , x , y ) \text{output}[x,y] = \sum_{i,j} \text{input}[i,j] \cdot W(i,j,x,y) output[x,y]=i,j∑input[i,j]⋅W(i,j,x,y)
其中 W W W为双线性权重函数,实现平滑缩放。
动态选项同步
后端无法直接获取前端状态,需通过node_id
传递
依赖管理陷阱
额外库需在__init__.py
中检查:
try:
import missing_lib
except ImportError:
print("请执行: pip install missing_lib")
前端样式冲突
使用唯一CSS类名前缀:
.yourplugin-slider { /* 专用样式 */ }
版本兼容性
在README中明确适配版本:
ComfyUI版本 | 插件版本 |
---|---|
v1.0+ | v1.2 |
开发插件如同打造瑞士军刀——每个功能都是解决实际痛点的利器。立即动手,让你的创意成为ComfyUI生态的一部分!