diff --git a/README.md b/README.md new file mode 100644 index 0000000..7a56188 --- /dev/null +++ b/README.md @@ -0,0 +1,70 @@ +# ComfyUI-Toggle-Pass + +DynamicRef 系列节点——多参考图动态编码,支持 1~10 张参考图,每张图独立编码输出。 + +--- + +## 节点说明 + +### DynamicRefIndependent — 多参考图独立编码(核心节点) + +每张参考图独立 VAE 编码,输出各自独立的 CONDITIONING 和 LATENT,适合多图各自控制风格/内容的场景。 + +**输入**(动态,由 `num_images` 控制): +- `clip` — CLIP 模型 +- `vae` — VAE 模型 +- `num_images` — 参考图数量(1~10) +- `instruction` — 系统提示词(可留空使用默认) +- `image1` ~ `imageN` — 参考图 +- `prompt1` ~ `promptN` — 每张图对应的提示词(控件在节点内,可折叠) + +**输出**(动态,N×2 个): +- `cond_1`, `latent1`, `cond_2`, `latent2`, ... `cond_N`, `latentN` + +**用法**: +1. 拖入节点,默认 1 张参考图 +2. 调整 `num_images` 到需要的数量(1~10),输入槽和输出槽自动增减 +3. 每张图连接自己的参考图,填写对应 prompt +4. `cond_N` 连到 sampler 的 conditioning,`latentN` 连到 VAE Encode 的 latent(供参考图编码使用) + +--- + +### DynamicRefImageEncode — 动态参考图编码 + +单张 prompt 控制,动态增删参考图输入槽。 + +**输入**:`clip`, `num_images`, `prompt`, `image1` ~ `imageN` +**输出**:`CONDITIONING`, `LATENT`(所有图共享同一份 conditioning,分别输出 latent) + +--- + +### DynamicRefLatentInput — 动态 Latent 输入 + +动态增删 LATENT 输入槽,配合 DynamicRef 系列使用。 + +--- + +### ImageBatcher — 图像批处理 + +动态增删 IMAGE 输入槽,将多张图打包成批次。 + +--- + +### OneImageMultiPrompt — 单图多提示词 + +一张参考图对应多个提示词,分别输出 conditioning。 + +--- + +## 注意事项 + +- `num_images` 调整时,输入/输出槽会自动增减,**已有连线不会被断开** +- 切换页面再回来,节点会自动恢复到正确的槽位数量 +- 需要 Qwen2.5-VL 或兼容的 CLIP 模型支持 +- 默认 instruction 适用于 Qwen-Image-Edit 类模型,可按需修改 + +--- + +## 安装 + +将本文件夹放到 `ComfyUI/custom_nodes/` 下,重启 ComfyUI 即可。 diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..28745b0 --- /dev/null +++ b/__init__.py @@ -0,0 +1,197 @@ +""" +ComfyUI Toggle Pass - Toggle nodes + Image IO + Multi-Ref Encode +Author: Clever +""" +from .multi_ref_encode import NODE_CLASS_MAPPINGS as MULTI_REF_NODES, NODE_DISPLAY_NAME_MAPPINGS as MULTI_REF_NAMES + +import os +import json +import torch +import numpy as np +from PIL import Image, ImageOps, ImageSequence, ImageFile +from PIL.PngImagePlugin import PngInfo +import comfy.model_management +import comfy.utils +import folder_paths +import node_helpers + + +WEB_DIRECTORY = "./js" + +_last_saved_path = {} + + +class SaveLoadImage: + """Save image AND output it. Toggle OFF to auto-load last saved image instead.""" + + def __init__(self): + self.output_dir = folder_paths.get_output_directory() + self.type = "output" + self.prefix_append = "" + self.compress_level = 4 + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "images": ("IMAGE",), + "use_saved": (["Save", "Load"],), + }, + "optional": { + "filename_prefix": ("STRING", {"default": "ComfyUI"}), + }, + "hidden": { + "prompt": "PROMPT", "extra_pnginfo": "EXTRA_PNGINFO" + }, + } + + RETURN_TYPES = ("IMAGE", "MASK") + RETURN_NAMES = ("IMAGE", "MASK") + OUTPUT_NODE = True + FUNCTION = "execute" + CATEGORY = "Toggle-Pass" + DESCRIPTION = "Save image and output IMAGE. Toggle use_saved=ON to reuse last saved image." + + def execute(self, images, use_saved="Save", filename_prefix="ComfyUI", prompt=None, extra_pnginfo=None): + if use_saved == "Load": + return self._load_last() + else: + return self._save(images, filename_prefix, prompt, extra_pnginfo) + + def _save(self, images, filename_prefix, prompt, extra_pnginfo): + if images is None: + images = torch.zeros((1, 64, 64, 3), dtype=torch.float32) + + filename_prefix += self.prefix_append + full_output_folder, filename, counter, subfolder, filename_prefix = folder_paths.get_save_image_path( + filename_prefix, self.output_dir, images[0].shape[1], images[0].shape[0] + ) + results = list() + for (batch_number, image) in enumerate(images): + i = 255. * image.cpu().numpy() + img = Image.fromarray(np.clip(i, 0, 255).astype(np.uint8)) + metadata = None + if not comfy.utils.args.disable_metadata: + metadata = PngInfo() + if prompt is not None: + metadata.add_text("prompt", json.dumps(prompt)) + if extra_pnginfo is not None: + for x in extra_pnginfo: + metadata.add_text(x, json.dumps(extra_pnginfo[x])) + + filename_with_batch_num = filename.replace("%batch_num%", str(batch_number)) + file = f"{filename_with_batch_num}_{counter:05}_.png" + filepath = os.path.join(full_output_folder, file) + img.save(filepath, pnginfo=metadata, compress_level=self.compress_level) + results.append({ + "filename": file, + "subfolder": subfolder, + "type": self.type + }) + + if id(self) not in _last_saved_path: + _last_saved_path[id(self)] = filepath + + counter += 1 + + last_file = os.path.join(full_output_folder, results[0]["filename"]) + _last_saved_path[id(self)] = last_file + + mask = torch.zeros((images.shape[0], images.shape[1], images.shape[2]), dtype=torch.float32) + return {"result": (images, mask), "ui": {"images": results}} + + def _load_last(self): + node_id = id(self) + if node_id in _last_saved_path and os.path.isfile(_last_saved_path[node_id]): + filepath = _last_saved_path[node_id] + img = node_helpers.pillow(Image.open, filepath) + output_images = [] + output_masks = [] + w, h = None, None + dtype = comfy.model_management.intermediate_dtype() + + for i in ImageSequence.Iterator(img): + i = node_helpers.pillow(ImageOps.exif_transpose, i) + if i.mode == 'I': + i = i.point(lambda x: x * (1 / 255)) + image = i.convert("RGB") + if len(output_images) == 0: + w = image.size[0] + h = image.size[1] + if image.size[0] != w or image.size[1] != h: + continue + image = np.array(image).astype(np.float32) / 255.0 + image = torch.from_numpy(image)[None,] + if 'A' in i.getbands(): + mask = np.array(i.getchannel('A')).astype(np.float32) / 255.0 + mask = 1. - torch.from_numpy(mask) + elif i.mode == 'P' and 'transparency' in i.info: + mask = np.array(i.convert('RGBA').getchannel('A')).astype(np.float32) / 255.0 + mask = 1. - torch.from_numpy(mask) + else: + mask = torch.zeros((h, w), dtype=torch.float32, device="cpu") + output_images.append(image.to(dtype=dtype)) + output_masks.append(mask.unsqueeze(0).to(dtype=dtype)) + if img.format == "MPO": + break + + if len(output_images) > 1: + output_image = torch.cat(output_images, dim=0) + output_mask = torch.cat(output_masks, dim=0) + else: + output_image = output_images[0] + output_mask = output_masks[0] + + return {"result": (output_image, output_mask), "ui": {"images": []}} + + dummy = torch.zeros((1, 64, 64, 3), dtype=torch.float32) + dummy_mask = torch.zeros((1, 64, 64), dtype=torch.float32) + return {"result": (dummy, dummy_mask), "ui": {"images": []}} + + +class ToggleEmptyLatent: + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "width": ("INT", {"default": 1024, "min": 16, "max": 16384, "step": 8}), + "height": ("INT", {"default": 1024, "min": 16, "max": 16384, "step": 8}), + "batch_size": ("INT", {"default": 1, "min": 1, "max": 4096}), + "enabled": (["ON", "OFF"],), + }, + "optional": { + "fallback_width": ("INT", {"default": 1024, "min": 16, "max": 16384, "step": 8}), + "fallback_height": ("INT", {"default": 1024, "min": 16, "max": 16384, "step": 8}), + }, + } + + RETURN_TYPES = ("LATENT",) + RETURN_NAMES = ("LATENT",) + FUNCTION = "generate" + CATEGORY = "Toggle-Pass" + + def generate(self, width, height, batch_size=1, enabled="ON", fallback_width=None, fallback_height=None): + if fallback_width is None: + fallback_width = 1024 + if fallback_height is None: + fallback_height = 1024 + if enabled != "ON": + width = fallback_width + height = fallback_height + latent = torch.zeros([batch_size, 4, height // 8, width // 8], + device=comfy.model_management.intermediate_device(), + dtype=comfy.model_management.intermediate_dtype()) + return ({"samples": latent, "downscale_ratio_spacial": 8},) + + +NODE_CLASS_MAPPINGS = { + **MULTI_REF_NODES, + "ToggleEmptyLatent": ToggleEmptyLatent, + "SaveLoadImage": SaveLoadImage, +} + +NODE_DISPLAY_NAME_MAPPINGS = { + **MULTI_REF_NAMES, + "ToggleEmptyLatent": "Toggle Empty Latent", + "SaveLoadImage": "Save/Load Image", +} diff --git a/example_workflows/Batch Editing.json b/example_workflows/Batch Editing.json new file mode 100644 index 0000000..8fa3d79 --- /dev/null +++ b/example_workflows/Batch Editing.json @@ -0,0 +1 @@ +{"id":"03217309-ef16-4dc7-b729-693560b20d16","revision":0,"last_node_id":348,"last_link_id":1352,"nodes":[{"id":254,"type":"LoadImage","pos":[-2041.0857538918049,749.0715154487548],"size":[270,314],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"图像","name":"image","type":"COMBO","widget":{"name":"image"},"link":null},{"localized_name":"选择文件上传","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[1291]},{"localized_name":"遮罩","name":"MASK","type":"MASK","links":[]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"LoadImage","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"},"image":"clipspace/clipspace-painted-masked-1777677019656.png [input]"},"widgets_values":["downloaded-image.jpg","image"]},{"id":255,"type":"LoadImage","pos":[-1642.8140989741064,749.0715154487548],"size":[270,314.0000000000001],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"图像","name":"image","type":"COMBO","widget":{"name":"image"},"link":null},{"localized_name":"选择文件上传","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[1292]},{"localized_name":"遮罩","name":"MASK","type":"MASK","links":[]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"LoadImage","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["downloaded-image3 (1).jpg","image"]},{"id":257,"type":"LoadImage","pos":[-2038.6288344203308,1264.2942864291144],"size":[270,314.0000000000002],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"图像","name":"image","type":"COMBO","widget":{"name":"image"},"link":null},{"localized_name":"选择文件上传","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[1294]},{"localized_name":"遮罩","name":"MASK","type":"MASK","links":[]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"LoadImage","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["CB96F35EEE8C4C82C813F6A6225462D7.png","image"]},{"id":329,"type":"LoadImage","pos":[-1637.9002600311583,1264.2942864291144],"size":[270,314.0000000000002],"flags":{},"order":3,"mode":0,"inputs":[{"localized_name":"图像","name":"image","type":"COMBO","widget":{"name":"image"},"link":null},{"localized_name":"选择文件上传","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[1295]},{"localized_name":"遮罩","name":"MASK","type":"MASK","links":[]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"LoadImage","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["ComfyUI_00195_.png","image"]},{"id":305,"type":"7259f872-02a6-43fd-9204-ec0cf6399476","pos":[522.9086422789626,887.2737647266054],"size":[140,406],"flags":{},"order":12,"mode":0,"inputs":[{"name":"samples","type":"LATENT","link":1245},{"name":"samples_1","type":"LATENT","link":1327},{"name":"samples_2","type":"LATENT","link":1328},{"name":"samples_3","type":"LATENT","link":1329},{"name":"samples_4","type":"LATENT","link":1330},{"name":"samples_5","type":"LATENT","link":1331},{"name":"samples_6","type":"LATENT","link":null},{"name":"samples_7","type":"LATENT","link":null},{"name":"samples_8","type":"LATENT","link":null},{"name":"samples_9","type":"LATENT","link":null},{"name":"vae","type":"VAE","link":1161},{"name":"vae_1","type":"VAE","link":1343},{"name":"vae_2","type":"VAE","link":1344},{"name":"vae_3","type":"VAE","link":1345},{"name":"vae_4","type":"VAE","link":1346},{"name":"vae_5","type":"VAE","link":1347},{"name":"vae_6","type":"VAE","link":null},{"name":"vae_7","type":"VAE","link":null},{"name":"vae_8","type":"VAE","link":null},{"name":"vae_9","type":"VAE","link":null}],"outputs":[{"name":"any","type":"*","links":[1116]},{"name":"any_1","type":"*","links":[1332]},{"name":"any_2","type":"*","links":[1333]},{"name":"any_3","type":"*","links":[1334]},{"name":"any_4","type":"*","links":[1335]},{"name":"any_5","type":"*","links":[1336]},{"name":"any_6","type":"*","links":null},{"name":"any_7","type":"*","links":null},{"name":"any_8","type":"*","links":null},{"name":"any_9","type":"*","links":null}],"properties":{"proxyWidgets":[],"cnr_id":"comfy-core","ver":"0.20.1","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":227,"type":"VAELoader","pos":[-1164.6289352663825,1260.8174627145318],"size":[270,58],"flags":{},"order":4,"mode":0,"inputs":[{"localized_name":"vae名称","name":"vae_name","type":"COMBO","widget":{"name":"vae_name"},"link":null}],"outputs":[{"localized_name":"VAE","name":"VAE","type":"VAE","links":[852,1161,1343,1344,1345,1346,1347]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"VAELoader","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["flux2-vae.safetensors"]},{"id":215,"type":"LoadImage","pos":[-2439.3574088095033,1264.2942864291144],"size":[270,314],"flags":{},"order":5,"mode":0,"inputs":[{"localized_name":"图像","name":"image","type":"COMBO","widget":{"name":"image"},"link":null},{"localized_name":"选择文件上传","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[1293]},{"localized_name":"遮罩","name":"MASK","type":"MASK","links":null}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"LoadImage","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["ComfyUI_00304_.png","image"]},{"id":256,"type":"LoadImage","pos":[-2439.3574088095033,749.0715154487548],"size":[270,314.00000000000006],"flags":{},"order":6,"mode":0,"inputs":[{"localized_name":"图像","name":"image","type":"COMBO","widget":{"name":"image"},"link":null},{"localized_name":"选择文件上传","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[944]},{"localized_name":"遮罩","name":"MASK","type":"MASK","links":[]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"LoadImage","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"},"image":"clipspace/clipspace-painted-masked-1777677019656.png [input]"},"widgets_values":["downloaded-image1.jpg","image"]},{"id":212,"type":"DynamicRefIndependent","pos":[-600.9056794164404,887.2737647266054],"size":[210,656],"flags":{},"order":9,"mode":0,"inputs":[{"localized_name":"clip","name":"clip","type":"CLIP","link":860},{"localized_name":"vae","name":"vae","type":"VAE","link":852},{"localized_name":"image1","name":"image1","shape":7,"type":"IMAGE","link":944},{"localized_name":"num_images","name":"num_images","type":"INT","widget":{"name":"num_images"},"link":null},{"localized_name":"instruction","name":"instruction","type":"STRING","widget":{"name":"instruction"},"link":null},{"localized_name":"prompt1","name":"prompt1","shape":7,"type":"STRING","widget":{"name":"prompt1"},"link":null},{"localized_name":"prompt2","name":"prompt2","shape":7,"type":"STRING","widget":{"name":"prompt2"},"link":null},{"localized_name":"prompt3","name":"prompt3","shape":7,"type":"STRING","widget":{"name":"prompt3"},"link":null},{"localized_name":"prompt4","name":"prompt4","shape":7,"type":"STRING","widget":{"name":"prompt4"},"link":null},{"localized_name":"prompt5","name":"prompt5","shape":7,"type":"STRING","widget":{"name":"prompt5"},"link":null},{"localized_name":"prompt6","name":"prompt6","shape":7,"type":"STRING","widget":{"name":"prompt6"},"link":null},{"localized_name":"prompt7","name":"prompt7","shape":7,"type":"STRING","widget":{"name":"prompt7"},"link":null},{"localized_name":"prompt8","name":"prompt8","shape":7,"type":"STRING","widget":{"name":"prompt8"},"link":null},{"localized_name":"prompt9","name":"prompt9","shape":7,"type":"STRING","widget":{"name":"prompt9"},"link":null},{"localized_name":"prompt10","name":"prompt10","shape":7,"type":"STRING","widget":{"name":"prompt10"},"link":null},{"name":"image2","type":"IMAGE","link":1291},{"name":"image3","type":"IMAGE","link":1292},{"name":"image4","type":"IMAGE","link":1293},{"name":"image5","type":"IMAGE","link":1294},{"name":"image6","type":"IMAGE","link":1295}],"outputs":[{"localized_name":"cond_1","name":"cond_1","type":"CONDITIONING","links":[1130,1242]},{"localized_name":"latent1","name":"latent1","type":"LATENT","links":[1244]},{"name":"cond_2","type":"CONDITIONING","links":[1296,1312]},{"name":"latent2","type":"LATENT","links":[1322]},{"name":"cond_3","type":"CONDITIONING","links":[1297,1321]},{"name":"latent3","type":"LATENT","links":[1323]},{"name":"cond_4","type":"CONDITIONING","links":[1298,1320]},{"name":"latent4","type":"LATENT","links":[1324]},{"name":"cond_5","type":"CONDITIONING","links":[1299,1319]},{"name":"latent5","type":"LATENT","links":[1325]},{"name":"cond_6","type":"CONDITIONING","links":[1300,1318]},{"name":"latent6","type":"LATENT","links":[1326]}],"properties":{"Node name for S&R":"DynamicRefIndependent","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[6,"Describe the key features of the input image (color, shape, size, texture, objects, background), then explain how the user's text instruction should alter or modify the image. Generate a new image that meets the user's requirements while maintaining consistency with the original input where appropriate.","推按变清晰,头发变成紫色","图片变清晰,背景换成海边","图片变清晰,背景换成蓝色","背景换成树林","背景换成海边","背景换成游乐场","","","",""]},{"id":326,"type":"1719b7cd-9c4e-4176-a353-91c2b2fcef6d","pos":[-240.33503919539353,887.2737647266054],"size":[229.716796875,206],"flags":{},"order":10,"mode":0,"inputs":[{"name":"conditioning","type":"CONDITIONING","link":1130},{"name":"conditioning_1","type":"CONDITIONING","link":1296},{"name":"conditioning_2","type":"CONDITIONING","link":1297},{"name":"conditioning_3","type":"CONDITIONING","link":1298},{"name":"conditioning_4","type":"CONDITIONING","link":1299},{"name":"conditioning_5","type":"CONDITIONING","link":1300},{"name":"conditioning_6","type":"CONDITIONING","link":null},{"name":"conditioning_7","type":"CONDITIONING","link":null},{"name":"conditioning_8","type":"CONDITIONING","link":null},{"name":"conditioning_9","type":"CONDITIONING","link":null}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[1243,1306]},{"name":"CONDITIONING_1","type":"CONDITIONING","links":[1307]},{"name":"CONDITIONING_2","type":"CONDITIONING","links":[1308]},{"name":"CONDITIONING_3","type":"CONDITIONING","links":[1309]},{"name":"CONDITIONING_4","type":"CONDITIONING","links":[1310]},{"name":"CONDITIONING_5","type":"CONDITIONING","links":[1311]},{"name":"CONDITIONING_6","type":"CONDITIONING","links":null},{"name":"CONDITIONING_7","type":"CONDITIONING","links":null},{"name":"CONDITIONING_8","type":"CONDITIONING","links":null},{"name":"CONDITIONING_9","type":"CONDITIONING","links":null}],"properties":{"proxyWidgets":[],"cnr_id":"comfy-core","ver":"0.20.1","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":343,"type":"cbcec8c8-6c32-4123-8949-981d98400c37","pos":[169.84488400549492,887.2737647266054],"size":[187.546875,806],"flags":{},"order":11,"mode":0,"inputs":[{"localized_name":"模型","name":"model","type":"MODEL","link":1241},{"localized_name":"正面条件","name":"positive","type":"CONDITIONING","link":1242},{"localized_name":"负面条件","name":"negative","type":"CONDITIONING","link":1243},{"localized_name":"Latent图像","name":"latent_image","type":"LATENT","link":1244},{"name":"model_1","type":"MODEL","link":1338},{"name":"model_2","type":"MODEL","link":1339},{"name":"model_3","type":"MODEL","link":1340},{"name":"model_4","type":"MODEL","link":1341},{"name":"model_5","type":"MODEL","link":1342},{"name":"model_6","type":"MODEL","link":null},{"name":"model_7","type":"MODEL","link":null},{"name":"model_8","type":"MODEL","link":null},{"name":"model_9","type":"MODEL","link":null},{"name":"positive_1","type":"CONDITIONING","link":1312},{"name":"positive_2","type":"CONDITIONING","link":1321},{"name":"positive_3","type":"CONDITIONING","link":1320},{"name":"positive_4","type":"CONDITIONING","link":1319},{"name":"positive_5","type":"CONDITIONING","link":1318},{"name":"positive_6","type":"CONDITIONING","link":null},{"name":"positive_7","type":"CONDITIONING","link":null},{"name":"positive_8","type":"CONDITIONING","link":null},{"name":"positive_9","type":"CONDITIONING","link":null},{"name":"negative_1","type":"CONDITIONING","link":1306},{"name":"negative_2","type":"CONDITIONING","link":1307},{"name":"negative_3","type":"CONDITIONING","link":1308},{"name":"negative_4","type":"CONDITIONING","link":1309},{"name":"negative_5","type":"CONDITIONING","link":1310},{"name":"negative_6","type":"CONDITIONING","link":1311},{"name":"negative_7","type":"CONDITIONING","link":null},{"name":"negative_8","type":"CONDITIONING","link":null},{"name":"negative_9","type":"CONDITIONING","link":null},{"name":"latent_image_1","type":"LATENT","link":1322},{"name":"latent_image_2","type":"LATENT","link":1323},{"name":"latent_image_3","type":"LATENT","link":1324},{"name":"latent_image_4","type":"LATENT","link":1325},{"name":"latent_image_5","type":"LATENT","link":1326},{"name":"latent_image_6","type":"LATENT","link":null},{"name":"latent_image_7","type":"LATENT","link":null},{"name":"latent_image_8","type":"LATENT","link":null},{"name":"latent_image_9","type":"LATENT","link":null}],"outputs":[{"localized_name":"Latent","name":"LATENT","type":"LATENT","links":[1245]},{"name":"LATENT_1","type":"LATENT","links":[1327]},{"name":"LATENT_2","type":"LATENT","links":[1328]},{"name":"LATENT_3","type":"LATENT","links":[1329]},{"name":"LATENT_4","type":"LATENT","links":[1330]},{"name":"LATENT_5","type":"LATENT","links":[1331]},{"name":"LATENT_6","type":"LATENT","links":null},{"name":"LATENT_7","type":"LATENT","links":null},{"name":"LATENT_8","type":"LATENT","links":null},{"name":"LATENT_9","type":"LATENT","links":null}],"properties":{"proxyWidgets":[],"cnr_id":"comfy-core","ver":"0.20.1","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":228,"type":"UNETLoader","pos":[-1164.6289352663825,936.8858850602469],"size":[270,82],"flags":{},"order":7,"mode":0,"inputs":[{"localized_name":"UNet名称","name":"unet_name","type":"COMBO","widget":{"name":"unet_name"},"link":null},{"localized_name":"数据类型","name":"weight_dtype","type":"COMBO","widget":{"name":"weight_dtype"},"link":null}],"outputs":[{"localized_name":"模型","name":"MODEL","type":"MODEL","links":[1241,1338,1339,1340,1341,1342]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"UNETLoader","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["flux-2\\flux-2-klein-4b.safetensors","default"]},{"id":229,"type":"CLIPLoader","pos":[-1164.6289352663825,1086.8516738873893],"size":[270,106],"flags":{},"order":8,"mode":0,"inputs":[{"localized_name":"CLIP名称","name":"clip_name","type":"COMBO","widget":{"name":"clip_name"},"link":null},{"localized_name":"类型","name":"type","type":"COMBO","widget":{"name":"type"},"link":null},{"localized_name":"设备","name":"device","shape":7,"type":"COMBO","widget":{"name":"device"},"link":null}],"outputs":[{"localized_name":"CLIP","name":"CLIP","type":"CLIP","links":[860]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"CLIPLoader","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["qwen_3_4b.safetensors","flux2","default"]},{"id":327,"type":"ImageBatcher","pos":[828.4255255524303,887.2737647266054],"size":[210,158],"flags":{},"order":13,"mode":0,"inputs":[{"localized_name":"image1","name":"image1","shape":7,"type":"IMAGE","link":1116},{"localized_name":"num_images","name":"num_images","type":"INT","widget":{"name":"num_images"},"link":null},{"name":"image2","type":"IMAGE","link":1332},{"name":"image3","type":"IMAGE","link":1333},{"name":"image4","type":"IMAGE","link":1334},{"name":"image5","type":"IMAGE","link":1335},{"name":"image6","type":"IMAGE","link":1336}],"outputs":[{"localized_name":"images","name":"images","type":"IMAGE","links":[1126]}],"properties":{"Node name for S&R":"ImageBatcher","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[6]},{"id":330,"type":"RTXVideoSuperResolution","pos":[1195.8606707130511,1266.3347378791025],"size":[285.81015625,106],"flags":{},"order":15,"mode":0,"inputs":[{"localized_name":"images","name":"images","type":"IMAGE","link":1128},{"localized_name":"resize_type","name":"resize_type","type":"COMFY_DYNAMICCOMBO_V3","widget":{"name":"resize_type"},"link":null},{"localized_name":"resize_type.scale","name":"resize_type.scale","type":"FLOAT","widget":{"name":"resize_type.scale"},"link":null},{"localized_name":"quality","name":"quality","type":"COMBO","widget":{"name":"quality"},"link":null}],"outputs":[{"localized_name":"upscaled_images","name":"upscaled_images","type":"IMAGE","links":[1129]}],"properties":{"cnr_id":"comfyui_nvidia_rtx_nodes","ver":"0.1.3","Node name for S&R":"RTXVideoSuperResolution","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["scale by multiplier",2,"ULTRA"]},{"id":328,"type":"SaveLoadImage","pos":[1201.884581081517,887.2737647266054],"size":[270,314],"flags":{},"order":14,"mode":0,"inputs":[{"localized_name":"images","name":"images","type":"IMAGE","link":1126},{"localized_name":"use_saved","name":"use_saved","type":"COMBO","widget":{"name":"use_saved"},"link":null},{"localized_name":"filename_prefix","name":"filename_prefix","shape":7,"type":"STRING","widget":{"name":"filename_prefix"},"link":null}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[1128]},{"localized_name":"遮罩","name":"MASK","type":"MASK","links":null}],"properties":{"Node name for S&R":"SaveLoadImage","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["Save","ComfyUI"]},{"id":331,"type":"PreviewImage","pos":[1599.523101094011,891.0141990710824],"size":[460.2671136744061,313.04055433066367],"flags":{},"order":16,"mode":0,"inputs":[{"localized_name":"图像","name":"images","type":"IMAGE","link":1129}],"outputs":[],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"PreviewImage","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]}],"links":[[852,227,0,212,1,"VAE"],[860,229,0,212,0,"CLIP"],[944,256,0,212,2,"IMAGE"],[1116,305,0,327,0,"IMAGE"],[1126,327,0,328,0,"IMAGE"],[1128,328,0,330,0,"IMAGE"],[1129,330,0,331,0,"IMAGE"],[1130,212,0,326,0,"CONDITIONING"],[1161,227,0,305,10,"VAE"],[1241,228,0,343,0,"MODEL"],[1242,212,0,343,1,"CONDITIONING"],[1243,326,0,343,2,"CONDITIONING"],[1244,212,1,343,3,"LATENT"],[1245,343,0,305,0,"LATENT"],[1291,254,0,212,15,"IMAGE"],[1292,255,0,212,16,"IMAGE"],[1293,215,0,212,17,"IMAGE"],[1294,257,0,212,18,"IMAGE"],[1295,329,0,212,19,"IMAGE"],[1296,212,2,326,1,"CONDITIONING"],[1297,212,4,326,2,"CONDITIONING"],[1298,212,6,326,3,"CONDITIONING"],[1299,212,8,326,4,"CONDITIONING"],[1300,212,10,326,5,"CONDITIONING"],[1306,326,0,343,22,"CONDITIONING"],[1307,326,1,343,23,"CONDITIONING"],[1308,326,2,343,24,"CONDITIONING"],[1309,326,3,343,25,"CONDITIONING"],[1310,326,4,343,26,"CONDITIONING"],[1311,326,5,343,27,"CONDITIONING"],[1312,212,2,343,13,"CONDITIONING"],[1318,212,10,343,17,"CONDITIONING"],[1319,212,8,343,16,"CONDITIONING"],[1320,212,6,343,15,"CONDITIONING"],[1321,212,4,343,14,"CONDITIONING"],[1322,212,3,343,31,"LATENT"],[1323,212,5,343,32,"LATENT"],[1324,212,7,343,33,"LATENT"],[1325,212,9,343,34,"LATENT"],[1326,212,11,343,35,"LATENT"],[1327,343,1,305,1,"LATENT"],[1328,343,2,305,2,"LATENT"],[1329,343,3,305,3,"LATENT"],[1330,343,4,305,4,"LATENT"],[1331,343,5,305,5,"LATENT"],[1332,305,1,327,2,"IMAGE"],[1333,305,2,327,3,"IMAGE"],[1334,305,3,327,4,"IMAGE"],[1335,305,4,327,5,"IMAGE"],[1336,305,5,327,6,"IMAGE"],[1338,228,0,343,4,"MODEL"],[1339,228,0,343,5,"MODEL"],[1340,228,0,343,6,"MODEL"],[1341,228,0,343,7,"MODEL"],[1342,228,0,343,8,"MODEL"],[1343,227,0,305,11,"VAE"],[1344,227,0,305,12,"VAE"],[1345,227,0,305,13,"VAE"],[1346,227,0,305,14,"VAE"],[1347,227,0,305,15,"VAE"]],"groups":[],"definitions":{"subgraphs":[{"id":"7259f872-02a6-43fd-9204-ec0cf6399476","version":1,"state":{"lastGroupId":0,"lastNodeId":348,"lastLinkId":1352,"lastRerouteId":0},"revision":0,"config":{},"name":"New Subgraph","inputNode":{"id":-10,"bounding":[1280.0548281797685,1600.227968705626,120,440]},"outputNode":{"id":-20,"bounding":[2238.651322851694,1813.2205717312872,120,240]},"inputs":[{"id":"a25d8d98-74ea-41e2-942a-7943ca9c8d2f","name":"samples","type":"LATENT","linkIds":[986],"pos":[1380.0548281797685,1620.227968705626]},{"id":"315d8ccd-572b-4786-9a73-dbf215f250dc","name":"samples_1","type":"LATENT","linkIds":[987],"pos":[1380.0548281797685,1640.227968705626]},{"id":"471d39b7-61c8-48d0-abe1-04974cac07bf","name":"samples_2","type":"LATENT","linkIds":[988],"pos":[1380.0548281797685,1660.227968705626]},{"id":"4e4d4e4f-0f22-4938-a8e2-bab13585e494","name":"samples_3","type":"LATENT","linkIds":[989],"pos":[1380.0548281797685,1680.227968705626]},{"id":"d4139a57-7c8b-40f0-8604-bbf5c906508e","name":"samples_4","type":"LATENT","linkIds":[990],"pos":[1380.0548281797685,1700.227968705626]},{"id":"d21fdffe-8e91-45eb-936a-2cd92e7cba38","name":"samples_5","type":"LATENT","linkIds":[991],"pos":[1380.0548281797685,1720.227968705626]},{"id":"f6d0b28c-41c8-44f4-8978-225cb03ec4a2","name":"samples_6","type":"LATENT","linkIds":[992],"pos":[1380.0548281797685,1740.227968705626]},{"id":"22c11f7e-2490-4570-9344-2ce2b25127cd","name":"samples_7","type":"LATENT","linkIds":[993],"pos":[1380.0548281797685,1760.227968705626]},{"id":"5cd28846-ab60-4864-b099-8ced18188012","name":"samples_8","type":"LATENT","linkIds":[994],"pos":[1380.0548281797685,1780.227968705626]},{"id":"e3d23272-40a4-4e7b-b881-dea29b674881","name":"samples_9","type":"LATENT","linkIds":[995],"pos":[1380.0548281797685,1800.227968705626]},{"id":"7580a0a8-2707-4515-9381-1d9e6ca1ac07","name":"vae","type":"VAE","linkIds":[996],"pos":[1380.0548281797685,1820.227968705626]},{"id":"f19aa7ed-3ab0-4614-b84a-240d3c3e7487","name":"vae_1","type":"VAE","linkIds":[997],"pos":[1380.0548281797685,1840.227968705626]},{"id":"543acfd6-a882-45e7-9f6c-30df07829bd0","name":"vae_2","type":"VAE","linkIds":[998],"pos":[1380.0548281797685,1860.227968705626]},{"id":"9618372a-d6e7-4ed8-802f-1f53533fab11","name":"vae_3","type":"VAE","linkIds":[999],"pos":[1380.0548281797685,1880.227968705626]},{"id":"04957920-2c50-43b4-b78d-5d47ef3c29f1","name":"vae_4","type":"VAE","linkIds":[1000],"pos":[1380.0548281797685,1900.227968705626]},{"id":"25f7264a-639f-45ea-abd9-0abf22e48ea7","name":"vae_5","type":"VAE","linkIds":[1001],"pos":[1380.0548281797685,1920.227968705626]},{"id":"e114e6a5-86fc-49ff-8047-c9ad03d29161","name":"vae_6","type":"VAE","linkIds":[1002],"pos":[1380.0548281797685,1940.227968705626]},{"id":"b2d6c977-dc1e-4948-9bca-140af41beff4","name":"vae_7","type":"VAE","linkIds":[1003],"pos":[1380.0548281797685,1960.227968705626]},{"id":"04b61ef3-9aa5-4e03-9747-f868e0096de1","name":"vae_8","type":"VAE","linkIds":[1004],"pos":[1380.0548281797685,1980.227968705626]},{"id":"02ee0b32-f399-452c-be66-39fed133f58f","name":"vae_9","type":"VAE","linkIds":[1005],"pos":[1380.0548281797685,2000.227968705626]}],"outputs":[{"id":"00670258-fb7a-4278-b12f-9fa1c5410429","name":"any","type":"*","linkIds":[1105],"pos":[2258.651322851694,1833.2205717312872]},{"id":"570f25e0-ffb7-4ad2-b3f1-59b51d585f02","name":"any_1","type":"*","linkIds":[1106],"pos":[2258.651322851694,1853.2205717312872]},{"id":"56d0800b-639f-4d44-a9e4-3a85717dea46","name":"any_2","type":"*","linkIds":[1107],"pos":[2258.651322851694,1873.2205717312872]},{"id":"1f9e7c1a-771b-4fe1-bc86-2dedf6206d81","name":"any_3","type":"*","linkIds":[1108],"pos":[2258.651322851694,1893.2205717312872]},{"id":"88e9d6a3-8b9e-492b-b6b4-719500831837","name":"any_4","type":"*","linkIds":[1109],"pos":[2258.651322851694,1913.2205717312872]},{"id":"62421528-c695-4c87-bed2-bd877d241ab6","name":"any_5","type":"*","linkIds":[1110],"pos":[2258.651322851694,1933.2205717312872]},{"id":"c34c5681-46db-43ff-b53a-2ba196d78969","name":"any_6","type":"*","linkIds":[1111],"pos":[2258.651322851694,1953.2205717312872]},{"id":"ea9fa54c-a4ba-44e2-9d63-145f6f7d6dbe","name":"any_7","type":"*","linkIds":[1112],"pos":[2258.651322851694,1973.2205717312872]},{"id":"79459665-58c6-49d3-8bbe-805289210e43","name":"any_8","type":"*","linkIds":[1113],"pos":[2258.651322851694,1993.2205717312872]},{"id":"d0b77dcf-a744-4116-a885-df584bc640ee","name":"any_9","type":"*","linkIds":[1115],"pos":[2258.651322851694,2013.2205717312872]}],"widgets":[],"nodes":[{"id":286,"type":"VAEDecode","pos":[1515.5172912078606,1078.2205717312875],"size":[140,46],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"Latent","name":"samples","type":"LATENT","link":986},{"localized_name":"vae","name":"vae","type":"VAE","link":996}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[1105]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"VAEDecode","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":287,"type":"VAEDecode","pos":[1515.5172912078606,1204.2205717312875],"size":[140,46],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"Latent","name":"samples","type":"LATENT","link":987},{"localized_name":"vae","name":"vae","type":"VAE","link":997}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[1106]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"VAEDecode","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":299,"type":"VAEDecode","pos":[1515.5172912078606,1330.2205717312875],"size":[140,46],"flags":{},"order":4,"mode":0,"inputs":[{"localized_name":"Latent","name":"samples","type":"LATENT","link":988},{"localized_name":"vae","name":"vae","type":"VAE","link":998}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[1107]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"VAEDecode","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":300,"type":"VAEDecode","pos":[1515.5172912078606,1456.2205717312875],"size":[140,46],"flags":{},"order":5,"mode":0,"inputs":[{"localized_name":"Latent","name":"samples","type":"LATENT","link":989},{"localized_name":"vae","name":"vae","type":"VAE","link":999}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[1108]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"VAEDecode","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":301,"type":"VAEDecode","pos":[1515.5172912078606,1582.2205717312875],"size":[140,46],"flags":{},"order":6,"mode":0,"inputs":[{"localized_name":"Latent","name":"samples","type":"LATENT","link":990},{"localized_name":"vae","name":"vae","type":"VAE","link":1000}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[1109]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"VAEDecode","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":302,"type":"VAEDecode","pos":[1515.5172912078606,1708.2205717312875],"size":[140,46],"flags":{},"order":7,"mode":0,"inputs":[{"localized_name":"Latent","name":"samples","type":"LATENT","link":991},{"localized_name":"vae","name":"vae","type":"VAE","link":1001}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[1110]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"VAEDecode","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":303,"type":"VAEDecode","pos":[1515.5172912078606,1834.2205717312875],"size":[140,46],"flags":{},"order":8,"mode":0,"inputs":[{"localized_name":"Latent","name":"samples","type":"LATENT","link":992},{"localized_name":"vae","name":"vae","type":"VAE","link":1002}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[1111]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"VAEDecode","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":304,"type":"VAEDecode","pos":[1515.5172912078606,1960.2205717312875],"size":[140,46],"flags":{"collapsed":false},"order":9,"mode":0,"inputs":[{"localized_name":"Latent","name":"samples","type":"LATENT","link":993},{"localized_name":"vae","name":"vae","type":"VAE","link":1003}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[1112]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"VAEDecode","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":296,"type":"VAEDecode","pos":[1515.5172912078606,2086.2205717312872],"size":[140,46],"flags":{"collapsed":false},"order":2,"mode":0,"inputs":[{"localized_name":"Latent","name":"samples","type":"LATENT","link":994},{"localized_name":"vae","name":"vae","type":"VAE","link":1004}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[1113]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"VAEDecode","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":298,"type":"VAEDecode","pos":[1515.5172912078606,2212.2205717312872],"size":[140,46],"flags":{"collapsed":false},"order":3,"mode":0,"inputs":[{"localized_name":"Latent","name":"samples","type":"LATENT","link":995},{"localized_name":"vae","name":"vae","type":"VAE","link":1005}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[1115]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"VAEDecode","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]}],"groups":[],"links":[{"id":986,"origin_id":-10,"origin_slot":0,"target_id":286,"target_slot":0,"type":"LATENT"},{"id":987,"origin_id":-10,"origin_slot":1,"target_id":287,"target_slot":0,"type":"LATENT"},{"id":988,"origin_id":-10,"origin_slot":2,"target_id":299,"target_slot":0,"type":"LATENT"},{"id":989,"origin_id":-10,"origin_slot":3,"target_id":300,"target_slot":0,"type":"LATENT"},{"id":990,"origin_id":-10,"origin_slot":4,"target_id":301,"target_slot":0,"type":"LATENT"},{"id":991,"origin_id":-10,"origin_slot":5,"target_id":302,"target_slot":0,"type":"LATENT"},{"id":992,"origin_id":-10,"origin_slot":6,"target_id":303,"target_slot":0,"type":"LATENT"},{"id":993,"origin_id":-10,"origin_slot":7,"target_id":304,"target_slot":0,"type":"LATENT"},{"id":994,"origin_id":-10,"origin_slot":8,"target_id":296,"target_slot":0,"type":"LATENT"},{"id":995,"origin_id":-10,"origin_slot":9,"target_id":298,"target_slot":0,"type":"LATENT"},{"id":996,"origin_id":-10,"origin_slot":10,"target_id":286,"target_slot":1,"type":"VAE"},{"id":997,"origin_id":-10,"origin_slot":11,"target_id":287,"target_slot":1,"type":"VAE"},{"id":998,"origin_id":-10,"origin_slot":12,"target_id":299,"target_slot":1,"type":"VAE"},{"id":999,"origin_id":-10,"origin_slot":13,"target_id":300,"target_slot":1,"type":"VAE"},{"id":1000,"origin_id":-10,"origin_slot":14,"target_id":301,"target_slot":1,"type":"VAE"},{"id":1001,"origin_id":-10,"origin_slot":15,"target_id":302,"target_slot":1,"type":"VAE"},{"id":1002,"origin_id":-10,"origin_slot":16,"target_id":303,"target_slot":1,"type":"VAE"},{"id":1003,"origin_id":-10,"origin_slot":17,"target_id":304,"target_slot":1,"type":"VAE"},{"id":1004,"origin_id":-10,"origin_slot":18,"target_id":296,"target_slot":1,"type":"VAE"},{"id":1005,"origin_id":-10,"origin_slot":19,"target_id":298,"target_slot":1,"type":"VAE"},{"id":1105,"origin_id":286,"origin_slot":0,"target_id":-20,"target_slot":0,"type":"IMAGE"},{"id":1106,"origin_id":287,"origin_slot":0,"target_id":-20,"target_slot":1,"type":"IMAGE"},{"id":1107,"origin_id":299,"origin_slot":0,"target_id":-20,"target_slot":2,"type":"IMAGE"},{"id":1108,"origin_id":300,"origin_slot":0,"target_id":-20,"target_slot":3,"type":"IMAGE"},{"id":1109,"origin_id":301,"origin_slot":0,"target_id":-20,"target_slot":4,"type":"IMAGE"},{"id":1110,"origin_id":302,"origin_slot":0,"target_id":-20,"target_slot":5,"type":"IMAGE"},{"id":1111,"origin_id":303,"origin_slot":0,"target_id":-20,"target_slot":6,"type":"IMAGE"},{"id":1112,"origin_id":304,"origin_slot":0,"target_id":-20,"target_slot":7,"type":"IMAGE"},{"id":1113,"origin_id":296,"origin_slot":0,"target_id":-20,"target_slot":8,"type":"IMAGE"},{"id":1115,"origin_id":298,"origin_slot":0,"target_id":-20,"target_slot":9,"type":"IMAGE"}],"extra":{"ue_links":[],"links_added_by_ue":[]}},{"id":"1719b7cd-9c4e-4176-a353-91c2b2fcef6d","version":1,"state":{"lastGroupId":0,"lastNodeId":348,"lastLinkId":1352,"lastRerouteId":0},"revision":0,"config":{},"name":"New Subgraph","inputNode":{"id":-10,"bounding":[76.84300145866504,1754.3634921360415,122.658203125,240]},"outputNode":{"id":-20,"bounding":[662.7264670135017,1786.412706685318,142.05859375,240]},"inputs":[{"id":"0a23dc6a-1b73-4736-96aa-47587a7a8d6d","name":"conditioning","type":"CONDITIONING","linkIds":[1095],"pos":[179.50120458366504,1774.3634921360415]},{"id":"a6261fa0-177f-4699-b5f4-ae40dd606819","name":"conditioning_1","type":"CONDITIONING","linkIds":[1096],"pos":[179.50120458366504,1794.3634921360415]},{"id":"e33144fb-d2d9-4e65-9622-3913effa273a","name":"conditioning_2","type":"CONDITIONING","linkIds":[1097],"pos":[179.50120458366504,1814.3634921360415]},{"id":"8fd8aabc-eaea-462f-8b13-aa884b30b5e2","name":"conditioning_3","type":"CONDITIONING","linkIds":[1098],"pos":[179.50120458366504,1834.3634921360415]},{"id":"d9d8703b-4b46-4ba8-8d18-20495f94ff11","name":"conditioning_4","type":"CONDITIONING","linkIds":[1099],"pos":[179.50120458366504,1854.3634921360415]},{"id":"b17b69cf-b685-4ba4-98ac-a98011d77f53","name":"conditioning_5","type":"CONDITIONING","linkIds":[1100],"pos":[179.50120458366504,1874.3634921360415]},{"id":"be177820-c4f0-4550-ac24-28cf17c10142","name":"conditioning_6","type":"CONDITIONING","linkIds":[1101],"pos":[179.50120458366504,1894.3634921360415]},{"id":"ee6fedf6-932e-4543-bd2b-dd1f133e6f7e","name":"conditioning_7","type":"CONDITIONING","linkIds":[1102],"pos":[179.50120458366504,1914.3634921360415]},{"id":"680412be-7b18-4f8d-bf1b-d3d6bb53dc8e","name":"conditioning_8","type":"CONDITIONING","linkIds":[1103],"pos":[179.50120458366504,1934.3634921360415]},{"id":"8cdd870d-11d4-455c-af7a-50dcd04d899e","name":"conditioning_9","type":"CONDITIONING","linkIds":[1104],"pos":[179.50120458366504,1954.3634921360415]}],"outputs":[{"id":"1286d672-f2aa-4606-9641-cf8f1ad38a8a","name":"CONDITIONING","type":"CONDITIONING","linkIds":[1085],"pos":[682.7264670135017,1806.412706685318]},{"id":"8e6067a7-58c6-4a1d-a629-e12ed8147d0a","name":"CONDITIONING_1","type":"CONDITIONING","linkIds":[1086],"pos":[682.7264670135017,1826.412706685318]},{"id":"236469b8-778e-4b3f-b2c6-34f075a821ea","name":"CONDITIONING_2","type":"CONDITIONING","linkIds":[1087],"pos":[682.7264670135017,1846.412706685318]},{"id":"3ec64d75-6c19-4623-be99-3649cfda5b1b","name":"CONDITIONING_3","type":"CONDITIONING","linkIds":[1088],"pos":[682.7264670135017,1866.412706685318]},{"id":"2bec5b13-b976-456a-b76e-74ab4ee7a919","name":"CONDITIONING_4","type":"CONDITIONING","linkIds":[1089],"pos":[682.7264670135017,1886.412706685318]},{"id":"02a51525-4824-42bb-a0ae-3a5fd083512f","name":"CONDITIONING_5","type":"CONDITIONING","linkIds":[1090],"pos":[682.7264670135017,1906.412706685318]},{"id":"0dda2751-9ae5-47c9-b2e8-6853607441a5","name":"CONDITIONING_6","type":"CONDITIONING","linkIds":[1091],"pos":[682.7264670135017,1926.412706685318]},{"id":"ee1ab45d-015e-457f-92e1-05b9cc1f4afd","name":"CONDITIONING_7","type":"CONDITIONING","linkIds":[1092],"pos":[682.7264670135017,1946.412706685318]},{"id":"cdc712a9-9263-4b81-a02d-de33375888b8","name":"CONDITIONING_8","type":"CONDITIONING","linkIds":[1093],"pos":[682.7264670135017,1966.412706685318]},{"id":"4d909654-6d07-4e1d-a720-b2dc55a5e20a","name":"CONDITIONING_9","type":"CONDITIONING","linkIds":[1094],"pos":[682.7264670135017,1986.412706685318]}],"widgets":[],"nodes":[{"id":318,"type":"ConditioningZeroOut","pos":[287.5868815178434,1313.0243147702606],"size":[284.1648235988848,103.80323813273162],"flags":{"collapsed":false},"order":2,"mode":0,"inputs":[{"localized_name":"条件","name":"conditioning","type":"CONDITIONING","link":1097}],"outputs":[{"localized_name":"条件","name":"CONDITIONING","type":"CONDITIONING","links":[1087]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"ConditioningZeroOut","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":320,"type":"ConditioningZeroOut","pos":[287.5868815178434,1490.6845754417736],"size":[284.1648235988848,103.80323813273162],"flags":{"collapsed":false},"order":4,"mode":0,"inputs":[{"localized_name":"条件","name":"conditioning","type":"CONDITIONING","link":1098}],"outputs":[{"localized_name":"条件","name":"CONDITIONING","type":"CONDITIONING","links":[1088]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"ConditioningZeroOut","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":321,"type":"ConditioningZeroOut","pos":[287.5868815178434,1668.3448361132866],"size":[284.1648235988848,103.80323813273162],"flags":{"collapsed":false},"order":5,"mode":0,"inputs":[{"localized_name":"条件","name":"conditioning","type":"CONDITIONING","link":1099}],"outputs":[{"localized_name":"条件","name":"CONDITIONING","type":"CONDITIONING","links":[1089]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"ConditioningZeroOut","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":319,"type":"ConditioningZeroOut","pos":[287.5868815178434,1846.0050967847997],"size":[284.1648235988848,103.80323813273162],"flags":{"collapsed":false},"order":3,"mode":0,"inputs":[{"localized_name":"条件","name":"conditioning","type":"CONDITIONING","link":1100}],"outputs":[{"localized_name":"条件","name":"CONDITIONING","type":"CONDITIONING","links":[1090]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"ConditioningZeroOut","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":323,"type":"ConditioningZeroOut","pos":[287.5868815178434,2023.6653574563127],"size":[284.1648235988848,103.80323813273162],"flags":{"collapsed":false},"order":7,"mode":0,"inputs":[{"localized_name":"条件","name":"conditioning","type":"CONDITIONING","link":1101}],"outputs":[{"localized_name":"条件","name":"CONDITIONING","type":"CONDITIONING","links":[1091]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"ConditioningZeroOut","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":324,"type":"ConditioningZeroOut","pos":[287.5868815178434,2201.3256181278257],"size":[284.1648235988848,103.80323813273162],"flags":{"collapsed":false},"order":8,"mode":0,"inputs":[{"localized_name":"条件","name":"conditioning","type":"CONDITIONING","link":1102}],"outputs":[{"localized_name":"条件","name":"CONDITIONING","type":"CONDITIONING","links":[1092]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"ConditioningZeroOut","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":322,"type":"ConditioningZeroOut","pos":[287.5868815178434,2378.985878799339],"size":[284.1648235988848,103.80323813273162],"flags":{"collapsed":false},"order":6,"mode":0,"inputs":[{"localized_name":"条件","name":"conditioning","type":"CONDITIONING","link":1103}],"outputs":[{"localized_name":"条件","name":"CONDITIONING","type":"CONDITIONING","links":[1093]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"ConditioningZeroOut","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":325,"type":"ConditioningZeroOut","pos":[287.5868815178434,2556.646139470852],"size":[284.1648235988848,103.80323813273162],"flags":{"collapsed":false},"order":9,"mode":0,"inputs":[{"localized_name":"条件","name":"conditioning","type":"CONDITIONING","link":1104}],"outputs":[{"localized_name":"条件","name":"CONDITIONING","type":"CONDITIONING","links":[1094]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"ConditioningZeroOut","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":241,"type":"ConditioningZeroOut","pos":[287.5868815178434,957.7037934272345],"size":[284.1648235988848,103.80323813273162],"flags":{"collapsed":false},"order":0,"mode":0,"inputs":[{"localized_name":"条件","name":"conditioning","type":"CONDITIONING","link":1095}],"outputs":[{"localized_name":"条件","name":"CONDITIONING","type":"CONDITIONING","links":[1085]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"ConditioningZeroOut","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":317,"type":"ConditioningZeroOut","pos":[287.5868815178434,1135.3640540987476],"size":[284.1648235988848,103.80323813273162],"flags":{"collapsed":false},"order":1,"mode":0,"inputs":[{"localized_name":"条件","name":"conditioning","type":"CONDITIONING","link":1096}],"outputs":[{"localized_name":"条件","name":"CONDITIONING","type":"CONDITIONING","links":[1086]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"ConditioningZeroOut","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]}],"groups":[],"links":[{"id":1085,"origin_id":241,"origin_slot":0,"target_id":-20,"target_slot":0,"type":"CONDITIONING"},{"id":1086,"origin_id":317,"origin_slot":0,"target_id":-20,"target_slot":1,"type":"CONDITIONING"},{"id":1087,"origin_id":318,"origin_slot":0,"target_id":-20,"target_slot":2,"type":"CONDITIONING"},{"id":1088,"origin_id":320,"origin_slot":0,"target_id":-20,"target_slot":3,"type":"CONDITIONING"},{"id":1089,"origin_id":321,"origin_slot":0,"target_id":-20,"target_slot":4,"type":"CONDITIONING"},{"id":1090,"origin_id":319,"origin_slot":0,"target_id":-20,"target_slot":5,"type":"CONDITIONING"},{"id":1091,"origin_id":323,"origin_slot":0,"target_id":-20,"target_slot":6,"type":"CONDITIONING"},{"id":1092,"origin_id":324,"origin_slot":0,"target_id":-20,"target_slot":7,"type":"CONDITIONING"},{"id":1093,"origin_id":322,"origin_slot":0,"target_id":-20,"target_slot":8,"type":"CONDITIONING"},{"id":1094,"origin_id":325,"origin_slot":0,"target_id":-20,"target_slot":9,"type":"CONDITIONING"},{"id":1095,"origin_id":-10,"origin_slot":0,"target_id":241,"target_slot":0,"type":"CONDITIONING"},{"id":1096,"origin_id":-10,"origin_slot":1,"target_id":317,"target_slot":0,"type":"CONDITIONING"},{"id":1097,"origin_id":-10,"origin_slot":2,"target_id":318,"target_slot":0,"type":"CONDITIONING"},{"id":1098,"origin_id":-10,"origin_slot":3,"target_id":320,"target_slot":0,"type":"CONDITIONING"},{"id":1099,"origin_id":-10,"origin_slot":4,"target_id":321,"target_slot":0,"type":"CONDITIONING"},{"id":1100,"origin_id":-10,"origin_slot":5,"target_id":319,"target_slot":0,"type":"CONDITIONING"},{"id":1101,"origin_id":-10,"origin_slot":6,"target_id":323,"target_slot":0,"type":"CONDITIONING"},{"id":1102,"origin_id":-10,"origin_slot":7,"target_id":324,"target_slot":0,"type":"CONDITIONING"},{"id":1103,"origin_id":-10,"origin_slot":8,"target_id":322,"target_slot":0,"type":"CONDITIONING"},{"id":1104,"origin_id":-10,"origin_slot":9,"target_id":325,"target_slot":0,"type":"CONDITIONING"}],"extra":{"ue_links":[],"links_added_by_ue":[]}},{"id":"cbcec8c8-6c32-4123-8949-981d98400c37","version":1,"state":{"lastGroupId":0,"lastNodeId":348,"lastLinkId":1352,"lastRerouteId":0},"revision":0,"config":{},"name":"New Subgraph","inputNode":{"id":-10,"bounding":[-208.10100658004544,997.5182976546756,124.64453125,840.0000000000001]},"outputNode":{"id":-20,"bounding":[755.1679668196978,1254.7135591625972,120,240]},"inputs":[{"id":"79c459ff-b208-451d-917f-080ea0974709","name":"model","type":"MODEL","linkIds":[1236],"localized_name":"模型","pos":[-103.45647533004544,1017.5182976546756]},{"id":"ef81dce2-5102-4a94-9623-18fe768da0a8","name":"positive","type":"CONDITIONING","linkIds":[1237],"localized_name":"正面条件","pos":[-103.45647533004544,1037.5182976546757]},{"id":"faeb33a8-a28c-4065-ae3f-5990533b7ec7","name":"negative","type":"CONDITIONING","linkIds":[1238],"localized_name":"负面条件","pos":[-103.45647533004544,1057.5182976546757]},{"id":"b434f0a8-c0d9-4292-a253-b9fc7bcf9897","name":"latent_image","type":"LATENT","linkIds":[1239],"localized_name":"Latent图像","pos":[-103.45647533004544,1077.5182976546757]},{"id":"781bfebd-af57-47c1-9e69-669ebdd227d5","name":"model_1","type":"MODEL","linkIds":[1246],"pos":[-103.45647533004544,1097.5182976546757]},{"id":"01f83212-5cda-4fae-bfb2-ffbf8f44ff1a","name":"model_2","type":"MODEL","linkIds":[1247],"pos":[-103.45647533004544,1117.5182976546757]},{"id":"c388a508-d0a4-425a-898e-80093aa3c160","name":"model_3","type":"MODEL","linkIds":[1248],"pos":[-103.45647533004544,1137.5182976546757]},{"id":"cc8a7a4e-7ab2-4f60-8e09-663856cba81d","name":"model_4","type":"MODEL","linkIds":[1249],"pos":[-103.45647533004544,1157.5182976546757]},{"id":"fa134ed1-89aa-4f40-872b-92e353114f43","name":"model_5","type":"MODEL","linkIds":[1250],"pos":[-103.45647533004544,1177.5182976546757]},{"id":"8910edf0-5fd8-457e-87f7-042e4f589aee","name":"model_6","type":"MODEL","linkIds":[1251],"pos":[-103.45647533004544,1197.5182976546757]},{"id":"851c0a97-be39-42c3-a123-9aa7ecc1c79c","name":"model_7","type":"MODEL","linkIds":[1252],"pos":[-103.45647533004544,1217.5182976546757]},{"id":"94b20185-84f3-4821-a594-5426a13f555c","name":"model_8","type":"MODEL","linkIds":[1253],"pos":[-103.45647533004544,1237.5182976546757]},{"id":"8b4c004e-6948-4763-aeae-2b1a16998ce6","name":"model_9","type":"MODEL","linkIds":[1254],"pos":[-103.45647533004544,1257.5182976546757]},{"id":"ff6e2535-9513-42dc-b4bc-e537a333b33b","name":"positive_1","type":"CONDITIONING","linkIds":[1255],"pos":[-103.45647533004544,1277.5182976546757]},{"id":"7259190d-0fe2-4210-b514-66248f3a4d52","name":"positive_2","type":"CONDITIONING","linkIds":[1256],"pos":[-103.45647533004544,1297.5182976546757]},{"id":"f88f6b70-6b88-4494-a0f1-03bb1a385348","name":"positive_3","type":"CONDITIONING","linkIds":[1257],"pos":[-103.45647533004544,1317.5182976546757]},{"id":"7e0d82c8-8051-4737-9137-a3e16dbc05ec","name":"positive_4","type":"CONDITIONING","linkIds":[1258],"pos":[-103.45647533004544,1337.5182976546757]},{"id":"d7aa192f-03b3-4468-ae69-b662c0c6f6e0","name":"positive_5","type":"CONDITIONING","linkIds":[1259],"pos":[-103.45647533004544,1357.5182976546757]},{"id":"160202a8-2c03-4783-abb9-11413e66878c","name":"positive_6","type":"CONDITIONING","linkIds":[1260],"pos":[-103.45647533004544,1377.5182976546757]},{"id":"91c16317-fb62-4692-917a-7621dbc0d3a8","name":"positive_7","type":"CONDITIONING","linkIds":[1261],"pos":[-103.45647533004544,1397.5182976546757]},{"id":"015f2481-a698-4078-901d-1ef2726b5aa2","name":"positive_8","type":"CONDITIONING","linkIds":[1262],"pos":[-103.45647533004544,1417.5182976546757]},{"id":"9a6c119d-7007-4098-a401-2bfd57eb0841","name":"positive_9","type":"CONDITIONING","linkIds":[1263],"pos":[-103.45647533004544,1437.5182976546757]},{"id":"9cb82466-5b8b-4c6f-9a14-becdaaa7dc4c","name":"negative_1","type":"CONDITIONING","linkIds":[1264],"pos":[-103.45647533004544,1457.5182976546757]},{"id":"7823d83b-e6cb-4a15-9ccb-b385a22d487d","name":"negative_2","type":"CONDITIONING","linkIds":[1265],"pos":[-103.45647533004544,1477.5182976546757]},{"id":"cebc5926-b65a-4ac4-b1c6-add8de9e345f","name":"negative_3","type":"CONDITIONING","linkIds":[1266],"pos":[-103.45647533004544,1497.5182976546757]},{"id":"1f2dd118-d66f-427b-b445-1f194d754f83","name":"negative_4","type":"CONDITIONING","linkIds":[1267],"pos":[-103.45647533004544,1517.5182976546757]},{"id":"b99f4658-0544-460a-8c38-2f6c6f7f9f16","name":"negative_5","type":"CONDITIONING","linkIds":[1268],"pos":[-103.45647533004544,1537.5182976546757]},{"id":"9873f093-6ea2-4b8a-b6dd-965ec3150e9a","name":"negative_6","type":"CONDITIONING","linkIds":[1269],"pos":[-103.45647533004544,1557.5182976546757]},{"id":"71174fc1-72fb-42aa-853f-4acdb3dd7f3f","name":"negative_7","type":"CONDITIONING","linkIds":[1270],"pos":[-103.45647533004544,1577.5182976546757]},{"id":"8379db24-68bc-4d7f-aaf4-e8248dd87f85","name":"negative_8","type":"CONDITIONING","linkIds":[1271],"pos":[-103.45647533004544,1597.5182976546757]},{"id":"69cb05a7-6b3c-4b98-af66-f7c5fda26b55","name":"negative_9","type":"CONDITIONING","linkIds":[1272],"pos":[-103.45647533004544,1617.5182976546757]},{"id":"a1614c6b-16ab-448d-8d34-fcea5afc566b","name":"latent_image_1","type":"LATENT","linkIds":[1273],"pos":[-103.45647533004544,1637.5182976546757]},{"id":"70d43ba9-d934-4ef6-978e-7ad9ac0e5088","name":"latent_image_2","type":"LATENT","linkIds":[1274],"pos":[-103.45647533004544,1657.5182976546757]},{"id":"81aa2d27-2793-4aba-b373-f5b9c3977caf","name":"latent_image_3","type":"LATENT","linkIds":[1275],"pos":[-103.45647533004544,1677.5182976546757]},{"id":"490103a3-63bb-4788-a0eb-9bf0ca499371","name":"latent_image_4","type":"LATENT","linkIds":[1276],"pos":[-103.45647533004544,1697.5182976546757]},{"id":"9f39e6b1-e767-404a-9ab3-a785115eb376","name":"latent_image_5","type":"LATENT","linkIds":[1277],"pos":[-103.45647533004544,1717.5182976546757]},{"id":"f6e7bc30-f978-41f5-bd51-a5ab0a9b8b14","name":"latent_image_6","type":"LATENT","linkIds":[1278],"pos":[-103.45647533004544,1737.5182976546757]},{"id":"f9bf053c-6ec6-4417-9100-43d57d916f90","name":"latent_image_7","type":"LATENT","linkIds":[1279],"pos":[-103.45647533004544,1757.5182976546757]},{"id":"868d8a69-467a-4779-8694-ed42a633c20b","name":"latent_image_8","type":"LATENT","linkIds":[1280],"pos":[-103.45647533004544,1777.5182976546757]},{"id":"6ea07a29-cc54-46ca-9618-e5196d954662","name":"latent_image_9","type":"LATENT","linkIds":[1281],"pos":[-103.45647533004544,1797.5182976546757]}],"outputs":[{"id":"608d7a82-a1e4-4c90-97eb-654b429c6abd","name":"LATENT","type":"LATENT","linkIds":[1240],"localized_name":"Latent","pos":[775.1679668196978,1274.7135591625972]},{"id":"56687e1e-d7ee-42ea-b886-0c63b1a8c3c3","name":"LATENT_1","type":"LATENT","linkIds":[1282],"pos":[775.1679668196978,1294.7135591625972]},{"id":"b45b4be9-5a31-4296-86c0-9c03d775fc61","name":"LATENT_2","type":"LATENT","linkIds":[1283],"pos":[775.1679668196978,1314.7135591625972]},{"id":"1b3fd908-2b4a-4302-be4b-75a8b016c596","name":"LATENT_3","type":"LATENT","linkIds":[1284],"pos":[775.1679668196978,1334.7135591625972]},{"id":"c30f7414-256b-4740-bfab-17e322ded66b","name":"LATENT_4","type":"LATENT","linkIds":[1285],"pos":[775.1679668196978,1354.7135591625972]},{"id":"92681c54-0f4f-467c-95e8-a803831da48b","name":"LATENT_5","type":"LATENT","linkIds":[1286],"pos":[775.1679668196978,1374.7135591625972]},{"id":"f871ab54-27f8-4432-8d21-6736ac5279be","name":"LATENT_6","type":"LATENT","linkIds":[1287],"pos":[775.1679668196978,1394.7135591625972]},{"id":"2b42985b-6ff2-4e14-861e-fc370cb24065","name":"LATENT_7","type":"LATENT","linkIds":[1288],"pos":[775.1679668196978,1414.7135591625972]},{"id":"91ac2c44-f7b9-4e5f-8c9d-8d9b8bc5c7fc","name":"LATENT_8","type":"LATENT","linkIds":[1289],"pos":[775.1679668196978,1434.7135591625972]},{"id":"729fa982-d2bf-483a-ba1c-efe5a220a20f","name":"LATENT_9","type":"LATENT","linkIds":[1290],"pos":[775.1679668196978,1454.7135591625972]}],"widgets":[],"nodes":[{"id":341,"type":"KSamplerAdvanced","pos":[35.72386481755882,305.9602427601367],"size":[270,334],"flags":{},"order":8,"mode":0,"inputs":[{"localized_name":"模型","name":"model","type":"MODEL","link":1236},{"localized_name":"正面条件","name":"positive","type":"CONDITIONING","link":1237},{"localized_name":"负面条件","name":"negative","type":"CONDITIONING","link":1238},{"localized_name":"Latent图像","name":"latent_image","type":"LATENT","link":1239},{"localized_name":"添加噪波","name":"add_noise","type":"COMBO","widget":{"name":"add_noise"},"link":null},{"localized_name":"随机种","name":"noise_seed","type":"INT","widget":{"name":"noise_seed"},"link":null},{"localized_name":"步数","name":"steps","type":"INT","widget":{"name":"steps"},"link":null},{"localized_name":"cfg","name":"cfg","type":"FLOAT","widget":{"name":"cfg"},"link":null},{"localized_name":"采样器名称","name":"sampler_name","type":"COMBO","widget":{"name":"sampler_name"},"link":null},{"localized_name":"调度器","name":"scheduler","type":"COMBO","widget":{"name":"scheduler"},"link":null},{"localized_name":"开始步数","name":"start_at_step","type":"INT","widget":{"name":"start_at_step"},"link":null},{"localized_name":"结束步数","name":"end_at_step","type":"INT","widget":{"name":"end_at_step"},"link":null},{"localized_name":"返回剩余噪波","name":"return_with_leftover_noise","type":"COMBO","widget":{"name":"return_with_leftover_noise"},"link":null}],"outputs":[{"localized_name":"Latent","name":"LATENT","type":"LATENT","links":[1240]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"KSamplerAdvanced","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["enable",656578624827715,"randomize",4,1,"euler","simple",0,5,"disable"]},{"id":342,"type":"KSamplerAdvanced","pos":[413.67646171641644,301.2983029256898],"size":[270,334],"flags":{},"order":9,"mode":0,"inputs":[{"localized_name":"模型","name":"model","type":"MODEL","link":1246},{"localized_name":"正面条件","name":"positive","type":"CONDITIONING","link":1255},{"localized_name":"负面条件","name":"negative","type":"CONDITIONING","link":1264},{"localized_name":"Latent图像","name":"latent_image","type":"LATENT","link":1273},{"localized_name":"添加噪波","name":"add_noise","type":"COMBO","widget":{"name":"add_noise"},"link":null},{"localized_name":"随机种","name":"noise_seed","type":"INT","widget":{"name":"noise_seed"},"link":null},{"localized_name":"步数","name":"steps","type":"INT","widget":{"name":"steps"},"link":null},{"localized_name":"cfg","name":"cfg","type":"FLOAT","widget":{"name":"cfg"},"link":null},{"localized_name":"采样器名称","name":"sampler_name","type":"COMBO","widget":{"name":"sampler_name"},"link":null},{"localized_name":"调度器","name":"scheduler","type":"COMBO","widget":{"name":"scheduler"},"link":null},{"localized_name":"开始步数","name":"start_at_step","type":"INT","widget":{"name":"start_at_step"},"link":null},{"localized_name":"结束步数","name":"end_at_step","type":"INT","widget":{"name":"end_at_step"},"link":null},{"localized_name":"返回剩余噪波","name":"return_with_leftover_noise","type":"COMBO","widget":{"name":"return_with_leftover_noise"},"link":null}],"outputs":[{"localized_name":"Latent","name":"LATENT","type":"LATENT","links":[1282]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"KSamplerAdvanced","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["enable",656578624827715,"randomize",4,1,"euler","simple",0,5,"disable"]},{"id":333,"type":"KSamplerAdvanced","pos":[35.72386481755882,719.9602427601367],"size":[270,334],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"模型","name":"model","type":"MODEL","link":1247},{"localized_name":"正面条件","name":"positive","type":"CONDITIONING","link":1256},{"localized_name":"负面条件","name":"negative","type":"CONDITIONING","link":1265},{"localized_name":"Latent图像","name":"latent_image","type":"LATENT","link":1274},{"localized_name":"添加噪波","name":"add_noise","type":"COMBO","widget":{"name":"add_noise"},"link":null},{"localized_name":"随机种","name":"noise_seed","type":"INT","widget":{"name":"noise_seed"},"link":null},{"localized_name":"步数","name":"steps","type":"INT","widget":{"name":"steps"},"link":null},{"localized_name":"cfg","name":"cfg","type":"FLOAT","widget":{"name":"cfg"},"link":null},{"localized_name":"采样器名称","name":"sampler_name","type":"COMBO","widget":{"name":"sampler_name"},"link":null},{"localized_name":"调度器","name":"scheduler","type":"COMBO","widget":{"name":"scheduler"},"link":null},{"localized_name":"开始步数","name":"start_at_step","type":"INT","widget":{"name":"start_at_step"},"link":null},{"localized_name":"结束步数","name":"end_at_step","type":"INT","widget":{"name":"end_at_step"},"link":null},{"localized_name":"返回剩余噪波","name":"return_with_leftover_noise","type":"COMBO","widget":{"name":"return_with_leftover_noise"},"link":null}],"outputs":[{"localized_name":"Latent","name":"LATENT","type":"LATENT","links":[1283]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"KSamplerAdvanced","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["enable",656578624827715,"randomize",4,1,"euler","simple",0,5,"disable"]},{"id":334,"type":"KSamplerAdvanced","pos":[413.67646171641644,717.0059310441436],"size":[270,334],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"模型","name":"model","type":"MODEL","link":1248},{"localized_name":"正面条件","name":"positive","type":"CONDITIONING","link":1257},{"localized_name":"负面条件","name":"negative","type":"CONDITIONING","link":1266},{"localized_name":"Latent图像","name":"latent_image","type":"LATENT","link":1275},{"localized_name":"添加噪波","name":"add_noise","type":"COMBO","widget":{"name":"add_noise"},"link":null},{"localized_name":"随机种","name":"noise_seed","type":"INT","widget":{"name":"noise_seed"},"link":null},{"localized_name":"步数","name":"steps","type":"INT","widget":{"name":"steps"},"link":null},{"localized_name":"cfg","name":"cfg","type":"FLOAT","widget":{"name":"cfg"},"link":null},{"localized_name":"采样器名称","name":"sampler_name","type":"COMBO","widget":{"name":"sampler_name"},"link":null},{"localized_name":"调度器","name":"scheduler","type":"COMBO","widget":{"name":"scheduler"},"link":null},{"localized_name":"开始步数","name":"start_at_step","type":"INT","widget":{"name":"start_at_step"},"link":null},{"localized_name":"结束步数","name":"end_at_step","type":"INT","widget":{"name":"end_at_step"},"link":null},{"localized_name":"返回剩余噪波","name":"return_with_leftover_noise","type":"COMBO","widget":{"name":"return_with_leftover_noise"},"link":null}],"outputs":[{"localized_name":"Latent","name":"LATENT","type":"LATENT","links":[1284]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"KSamplerAdvanced","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["enable",656578624827715,"randomize",4,1,"euler","simple",0,5,"disable"]},{"id":335,"type":"KSamplerAdvanced","pos":[35.72386481755882,1133.9602427601367],"size":[270,334],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"模型","name":"model","type":"MODEL","link":1249},{"localized_name":"正面条件","name":"positive","type":"CONDITIONING","link":1258},{"localized_name":"负面条件","name":"negative","type":"CONDITIONING","link":1267},{"localized_name":"Latent图像","name":"latent_image","type":"LATENT","link":1276},{"localized_name":"添加噪波","name":"add_noise","type":"COMBO","widget":{"name":"add_noise"},"link":null},{"localized_name":"随机种","name":"noise_seed","type":"INT","widget":{"name":"noise_seed"},"link":null},{"localized_name":"步数","name":"steps","type":"INT","widget":{"name":"steps"},"link":null},{"localized_name":"cfg","name":"cfg","type":"FLOAT","widget":{"name":"cfg"},"link":null},{"localized_name":"采样器名称","name":"sampler_name","type":"COMBO","widget":{"name":"sampler_name"},"link":null},{"localized_name":"调度器","name":"scheduler","type":"COMBO","widget":{"name":"scheduler"},"link":null},{"localized_name":"开始步数","name":"start_at_step","type":"INT","widget":{"name":"start_at_step"},"link":null},{"localized_name":"结束步数","name":"end_at_step","type":"INT","widget":{"name":"end_at_step"},"link":null},{"localized_name":"返回剩余噪波","name":"return_with_leftover_noise","type":"COMBO","widget":{"name":"return_with_leftover_noise"},"link":null}],"outputs":[{"localized_name":"Latent","name":"LATENT","type":"LATENT","links":[1285]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"KSamplerAdvanced","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["enable",656578624827715,"randomize",4,1,"euler","simple",0,5,"disable"]},{"id":336,"type":"KSamplerAdvanced","pos":[413.67646171641644,1132.7135591625974],"size":[270,334],"flags":{},"order":3,"mode":0,"inputs":[{"localized_name":"模型","name":"model","type":"MODEL","link":1250},{"localized_name":"正面条件","name":"positive","type":"CONDITIONING","link":1259},{"localized_name":"负面条件","name":"negative","type":"CONDITIONING","link":1268},{"localized_name":"Latent图像","name":"latent_image","type":"LATENT","link":1277},{"localized_name":"添加噪波","name":"add_noise","type":"COMBO","widget":{"name":"add_noise"},"link":null},{"localized_name":"随机种","name":"noise_seed","type":"INT","widget":{"name":"noise_seed"},"link":null},{"localized_name":"步数","name":"steps","type":"INT","widget":{"name":"steps"},"link":null},{"localized_name":"cfg","name":"cfg","type":"FLOAT","widget":{"name":"cfg"},"link":null},{"localized_name":"采样器名称","name":"sampler_name","type":"COMBO","widget":{"name":"sampler_name"},"link":null},{"localized_name":"调度器","name":"scheduler","type":"COMBO","widget":{"name":"scheduler"},"link":null},{"localized_name":"开始步数","name":"start_at_step","type":"INT","widget":{"name":"start_at_step"},"link":null},{"localized_name":"结束步数","name":"end_at_step","type":"INT","widget":{"name":"end_at_step"},"link":null},{"localized_name":"返回剩余噪波","name":"return_with_leftover_noise","type":"COMBO","widget":{"name":"return_with_leftover_noise"},"link":null}],"outputs":[{"localized_name":"Latent","name":"LATENT","type":"LATENT","links":[1286]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"KSamplerAdvanced","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["enable",656578624827715,"randomize",4,1,"euler","simple",0,5,"disable"]},{"id":337,"type":"KSamplerAdvanced","pos":[35.72386481755882,1547.9602427601367],"size":[270,334],"flags":{},"order":4,"mode":0,"inputs":[{"localized_name":"模型","name":"model","type":"MODEL","link":1251},{"localized_name":"正面条件","name":"positive","type":"CONDITIONING","link":1260},{"localized_name":"负面条件","name":"negative","type":"CONDITIONING","link":1269},{"localized_name":"Latent图像","name":"latent_image","type":"LATENT","link":1278},{"localized_name":"添加噪波","name":"add_noise","type":"COMBO","widget":{"name":"add_noise"},"link":null},{"localized_name":"随机种","name":"noise_seed","type":"INT","widget":{"name":"noise_seed"},"link":null},{"localized_name":"步数","name":"steps","type":"INT","widget":{"name":"steps"},"link":null},{"localized_name":"cfg","name":"cfg","type":"FLOAT","widget":{"name":"cfg"},"link":null},{"localized_name":"采样器名称","name":"sampler_name","type":"COMBO","widget":{"name":"sampler_name"},"link":null},{"localized_name":"调度器","name":"scheduler","type":"COMBO","widget":{"name":"scheduler"},"link":null},{"localized_name":"开始步数","name":"start_at_step","type":"INT","widget":{"name":"start_at_step"},"link":null},{"localized_name":"结束步数","name":"end_at_step","type":"INT","widget":{"name":"end_at_step"},"link":null},{"localized_name":"返回剩余噪波","name":"return_with_leftover_noise","type":"COMBO","widget":{"name":"return_with_leftover_noise"},"link":null}],"outputs":[{"localized_name":"Latent","name":"LATENT","type":"LATENT","links":[1287]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"KSamplerAdvanced","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["enable",656578624827715,"randomize",4,1,"euler","simple",0,5,"disable"]},{"id":338,"type":"KSamplerAdvanced","pos":[413.67646171641644,1548.421187281051],"size":[270,334],"flags":{},"order":5,"mode":0,"inputs":[{"localized_name":"模型","name":"model","type":"MODEL","link":1252},{"localized_name":"正面条件","name":"positive","type":"CONDITIONING","link":1261},{"localized_name":"负面条件","name":"negative","type":"CONDITIONING","link":1270},{"localized_name":"Latent图像","name":"latent_image","type":"LATENT","link":1279},{"localized_name":"添加噪波","name":"add_noise","type":"COMBO","widget":{"name":"add_noise"},"link":null},{"localized_name":"随机种","name":"noise_seed","type":"INT","widget":{"name":"noise_seed"},"link":null},{"localized_name":"步数","name":"steps","type":"INT","widget":{"name":"steps"},"link":null},{"localized_name":"cfg","name":"cfg","type":"FLOAT","widget":{"name":"cfg"},"link":null},{"localized_name":"采样器名称","name":"sampler_name","type":"COMBO","widget":{"name":"sampler_name"},"link":null},{"localized_name":"调度器","name":"scheduler","type":"COMBO","widget":{"name":"scheduler"},"link":null},{"localized_name":"开始步数","name":"start_at_step","type":"INT","widget":{"name":"start_at_step"},"link":null},{"localized_name":"结束步数","name":"end_at_step","type":"INT","widget":{"name":"end_at_step"},"link":null},{"localized_name":"返回剩余噪波","name":"return_with_leftover_noise","type":"COMBO","widget":{"name":"return_with_leftover_noise"},"link":null}],"outputs":[{"localized_name":"Latent","name":"LATENT","type":"LATENT","links":[1288]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"KSamplerAdvanced","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["enable",656578624827715,"randomize",4,1,"euler","simple",0,5,"disable"]},{"id":339,"type":"KSamplerAdvanced","pos":[35.72386481755882,1961.9602427601367],"size":[270,334],"flags":{},"order":6,"mode":0,"inputs":[{"localized_name":"模型","name":"model","type":"MODEL","link":1253},{"localized_name":"正面条件","name":"positive","type":"CONDITIONING","link":1262},{"localized_name":"负面条件","name":"negative","type":"CONDITIONING","link":1271},{"localized_name":"Latent图像","name":"latent_image","type":"LATENT","link":1280},{"localized_name":"添加噪波","name":"add_noise","type":"COMBO","widget":{"name":"add_noise"},"link":null},{"localized_name":"随机种","name":"noise_seed","type":"INT","widget":{"name":"noise_seed"},"link":null},{"localized_name":"步数","name":"steps","type":"INT","widget":{"name":"steps"},"link":null},{"localized_name":"cfg","name":"cfg","type":"FLOAT","widget":{"name":"cfg"},"link":null},{"localized_name":"采样器名称","name":"sampler_name","type":"COMBO","widget":{"name":"sampler_name"},"link":null},{"localized_name":"调度器","name":"scheduler","type":"COMBO","widget":{"name":"scheduler"},"link":null},{"localized_name":"开始步数","name":"start_at_step","type":"INT","widget":{"name":"start_at_step"},"link":null},{"localized_name":"结束步数","name":"end_at_step","type":"INT","widget":{"name":"end_at_step"},"link":null},{"localized_name":"返回剩余噪波","name":"return_with_leftover_noise","type":"COMBO","widget":{"name":"return_with_leftover_noise"},"link":null}],"outputs":[{"localized_name":"Latent","name":"LATENT","type":"LATENT","links":[1289]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"KSamplerAdvanced","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["enable",656578624827715,"randomize",4,1,"euler","simple",0,5,"disable"]},{"id":340,"type":"KSamplerAdvanced","pos":[413.67646171641644,1964.1288153995047],"size":[270,334],"flags":{},"order":7,"mode":0,"inputs":[{"localized_name":"模型","name":"model","type":"MODEL","link":1254},{"localized_name":"正面条件","name":"positive","type":"CONDITIONING","link":1263},{"localized_name":"负面条件","name":"negative","type":"CONDITIONING","link":1272},{"localized_name":"Latent图像","name":"latent_image","type":"LATENT","link":1281},{"localized_name":"添加噪波","name":"add_noise","type":"COMBO","widget":{"name":"add_noise"},"link":null},{"localized_name":"随机种","name":"noise_seed","type":"INT","widget":{"name":"noise_seed"},"link":null},{"localized_name":"步数","name":"steps","type":"INT","widget":{"name":"steps"},"link":null},{"localized_name":"cfg","name":"cfg","type":"FLOAT","widget":{"name":"cfg"},"link":null},{"localized_name":"采样器名称","name":"sampler_name","type":"COMBO","widget":{"name":"sampler_name"},"link":null},{"localized_name":"调度器","name":"scheduler","type":"COMBO","widget":{"name":"scheduler"},"link":null},{"localized_name":"开始步数","name":"start_at_step","type":"INT","widget":{"name":"start_at_step"},"link":null},{"localized_name":"结束步数","name":"end_at_step","type":"INT","widget":{"name":"end_at_step"},"link":null},{"localized_name":"返回剩余噪波","name":"return_with_leftover_noise","type":"COMBO","widget":{"name":"return_with_leftover_noise"},"link":null}],"outputs":[{"localized_name":"Latent","name":"LATENT","type":"LATENT","links":[1290]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"KSamplerAdvanced","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["enable",656578624827715,"randomize",4,1,"euler","simple",0,5,"disable"]}],"groups":[],"links":[{"id":1236,"origin_id":-10,"origin_slot":0,"target_id":341,"target_slot":0,"type":"MODEL"},{"id":1237,"origin_id":-10,"origin_slot":1,"target_id":341,"target_slot":1,"type":"CONDITIONING"},{"id":1238,"origin_id":-10,"origin_slot":2,"target_id":341,"target_slot":2,"type":"CONDITIONING"},{"id":1239,"origin_id":-10,"origin_slot":3,"target_id":341,"target_slot":3,"type":"LATENT"},{"id":1240,"origin_id":341,"origin_slot":0,"target_id":-20,"target_slot":0,"type":"LATENT"},{"id":1246,"origin_id":-10,"origin_slot":4,"target_id":342,"target_slot":0,"type":"MODEL"},{"id":1247,"origin_id":-10,"origin_slot":5,"target_id":333,"target_slot":0,"type":"MODEL"},{"id":1248,"origin_id":-10,"origin_slot":6,"target_id":334,"target_slot":0,"type":"MODEL"},{"id":1249,"origin_id":-10,"origin_slot":7,"target_id":335,"target_slot":0,"type":"MODEL"},{"id":1250,"origin_id":-10,"origin_slot":8,"target_id":336,"target_slot":0,"type":"MODEL"},{"id":1251,"origin_id":-10,"origin_slot":9,"target_id":337,"target_slot":0,"type":"MODEL"},{"id":1252,"origin_id":-10,"origin_slot":10,"target_id":338,"target_slot":0,"type":"MODEL"},{"id":1253,"origin_id":-10,"origin_slot":11,"target_id":339,"target_slot":0,"type":"MODEL"},{"id":1254,"origin_id":-10,"origin_slot":12,"target_id":340,"target_slot":0,"type":"MODEL"},{"id":1255,"origin_id":-10,"origin_slot":13,"target_id":342,"target_slot":1,"type":"CONDITIONING"},{"id":1256,"origin_id":-10,"origin_slot":14,"target_id":333,"target_slot":1,"type":"CONDITIONING"},{"id":1257,"origin_id":-10,"origin_slot":15,"target_id":334,"target_slot":1,"type":"CONDITIONING"},{"id":1258,"origin_id":-10,"origin_slot":16,"target_id":335,"target_slot":1,"type":"CONDITIONING"},{"id":1259,"origin_id":-10,"origin_slot":17,"target_id":336,"target_slot":1,"type":"CONDITIONING"},{"id":1260,"origin_id":-10,"origin_slot":18,"target_id":337,"target_slot":1,"type":"CONDITIONING"},{"id":1261,"origin_id":-10,"origin_slot":19,"target_id":338,"target_slot":1,"type":"CONDITIONING"},{"id":1262,"origin_id":-10,"origin_slot":20,"target_id":339,"target_slot":1,"type":"CONDITIONING"},{"id":1263,"origin_id":-10,"origin_slot":21,"target_id":340,"target_slot":1,"type":"CONDITIONING"},{"id":1264,"origin_id":-10,"origin_slot":22,"target_id":342,"target_slot":2,"type":"CONDITIONING"},{"id":1265,"origin_id":-10,"origin_slot":23,"target_id":333,"target_slot":2,"type":"CONDITIONING"},{"id":1266,"origin_id":-10,"origin_slot":24,"target_id":334,"target_slot":2,"type":"CONDITIONING"},{"id":1267,"origin_id":-10,"origin_slot":25,"target_id":335,"target_slot":2,"type":"CONDITIONING"},{"id":1268,"origin_id":-10,"origin_slot":26,"target_id":336,"target_slot":2,"type":"CONDITIONING"},{"id":1269,"origin_id":-10,"origin_slot":27,"target_id":337,"target_slot":2,"type":"CONDITIONING"},{"id":1270,"origin_id":-10,"origin_slot":28,"target_id":338,"target_slot":2,"type":"CONDITIONING"},{"id":1271,"origin_id":-10,"origin_slot":29,"target_id":339,"target_slot":2,"type":"CONDITIONING"},{"id":1272,"origin_id":-10,"origin_slot":30,"target_id":340,"target_slot":2,"type":"CONDITIONING"},{"id":1273,"origin_id":-10,"origin_slot":31,"target_id":342,"target_slot":3,"type":"LATENT"},{"id":1274,"origin_id":-10,"origin_slot":32,"target_id":333,"target_slot":3,"type":"LATENT"},{"id":1275,"origin_id":-10,"origin_slot":33,"target_id":334,"target_slot":3,"type":"LATENT"},{"id":1276,"origin_id":-10,"origin_slot":34,"target_id":335,"target_slot":3,"type":"LATENT"},{"id":1277,"origin_id":-10,"origin_slot":35,"target_id":336,"target_slot":3,"type":"LATENT"},{"id":1278,"origin_id":-10,"origin_slot":36,"target_id":337,"target_slot":3,"type":"LATENT"},{"id":1279,"origin_id":-10,"origin_slot":37,"target_id":338,"target_slot":3,"type":"LATENT"},{"id":1280,"origin_id":-10,"origin_slot":38,"target_id":339,"target_slot":3,"type":"LATENT"},{"id":1281,"origin_id":-10,"origin_slot":39,"target_id":340,"target_slot":3,"type":"LATENT"},{"id":1282,"origin_id":342,"origin_slot":0,"target_id":-20,"target_slot":1,"type":"LATENT"},{"id":1283,"origin_id":333,"origin_slot":0,"target_id":-20,"target_slot":2,"type":"LATENT"},{"id":1284,"origin_id":334,"origin_slot":0,"target_id":-20,"target_slot":3,"type":"LATENT"},{"id":1285,"origin_id":335,"origin_slot":0,"target_id":-20,"target_slot":4,"type":"LATENT"},{"id":1286,"origin_id":336,"origin_slot":0,"target_id":-20,"target_slot":5,"type":"LATENT"},{"id":1287,"origin_id":337,"origin_slot":0,"target_id":-20,"target_slot":6,"type":"LATENT"},{"id":1288,"origin_id":338,"origin_slot":0,"target_id":-20,"target_slot":7,"type":"LATENT"},{"id":1289,"origin_id":339,"origin_slot":0,"target_id":-20,"target_slot":8,"type":"LATENT"},{"id":1290,"origin_id":340,"origin_slot":0,"target_id":-20,"target_slot":9,"type":"LATENT"}],"extra":{"ue_links":[],"links_added_by_ue":[]}}]},"config":{},"extra":{"ue_links":[],"links_added_by_ue":[],"ds":{"scale":0.2673486306413777,"offset":[2499.6357863309004,195.22844898339702]}},"version":0.4} \ No newline at end of file diff --git a/example_workflows/Batch Editing.png b/example_workflows/Batch Editing.png new file mode 100644 index 0000000..1504dce Binary files /dev/null and b/example_workflows/Batch Editing.png differ diff --git a/example_workflows/Graphic-Text Integration Editing.json b/example_workflows/Graphic-Text Integration Editing.json new file mode 100644 index 0000000..d12da58 --- /dev/null +++ b/example_workflows/Graphic-Text Integration Editing.json @@ -0,0 +1 @@ +{"id":"f83d416f-db1a-47ba-9789-da6380bcd9df","revision":0,"last_node_id":73,"last_link_id":55,"nodes":[{"id":61,"type":"CLIPLoader","pos":[-570.2948694052488,193.4476560543626],"size":[270,106],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"CLIP名称","name":"clip_name","type":"COMBO","widget":{"name":"clip_name"},"link":null},{"localized_name":"类型","name":"type","type":"COMBO","widget":{"name":"type"},"link":null},{"localized_name":"设备","name":"device","shape":7,"type":"COMBO","widget":{"name":"device"},"link":null}],"outputs":[{"localized_name":"CLIP","name":"CLIP","type":"CLIP","links":[39]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"CLIPLoader","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["qwen_3_4b.safetensors","flux2","default"]},{"id":62,"type":"VAELoader","pos":[-570.2948694052488,374.568036956869],"size":[270,58],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"vae名称","name":"vae_name","type":"COMBO","widget":{"name":"vae_name"},"link":null}],"outputs":[{"localized_name":"VAE","name":"VAE","type":"VAE","links":[40,46]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"VAELoader","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["flux2-vae.safetensors"]},{"id":67,"type":"UNETLoader","pos":[-570.2948694052488,507.68841785937536],"size":[270,82],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"UNet名称","name":"unet_name","type":"COMBO","widget":{"name":"unet_name"},"link":null},{"localized_name":"数据类型","name":"weight_dtype","type":"COMBO","widget":{"name":"weight_dtype"},"link":null}],"outputs":[{"localized_name":"模型","name":"MODEL","type":"MODEL","links":[48]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"UNETLoader","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["flux-2\\flux-2-klein-4b.safetensors","default"]},{"id":64,"type":"KSamplerAdvanced","pos":[74.56880995118763,193.4476560543626],"size":[270,334],"flags":{},"order":6,"mode":0,"inputs":[{"localized_name":"模型","name":"model","type":"MODEL","link":48},{"localized_name":"正面条件","name":"positive","type":"CONDITIONING","link":42},{"localized_name":"负面条件","name":"negative","type":"CONDITIONING","link":43},{"localized_name":"Latent图像","name":"latent_image","type":"LATENT","link":44},{"localized_name":"添加噪波","name":"add_noise","type":"COMBO","widget":{"name":"add_noise"},"link":null},{"localized_name":"随机种","name":"noise_seed","type":"INT","widget":{"name":"noise_seed"},"link":null},{"localized_name":"步数","name":"steps","type":"INT","widget":{"name":"steps"},"link":null},{"localized_name":"cfg","name":"cfg","type":"FLOAT","widget":{"name":"cfg"},"link":null},{"localized_name":"采样器名称","name":"sampler_name","type":"COMBO","widget":{"name":"sampler_name"},"link":null},{"localized_name":"调度器","name":"scheduler","type":"COMBO","widget":{"name":"scheduler"},"link":null},{"localized_name":"开始步数","name":"start_at_step","type":"INT","widget":{"name":"start_at_step"},"link":null},{"localized_name":"结束步数","name":"end_at_step","type":"INT","widget":{"name":"end_at_step"},"link":null},{"localized_name":"返回剩余噪波","name":"return_with_leftover_noise","type":"COMBO","widget":{"name":"return_with_leftover_noise"},"link":null}],"outputs":[{"localized_name":"Latent","name":"LATENT","type":"LATENT","links":[45]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"KSamplerAdvanced","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["enable",0,"randomize",4,1,"euler","simple",0,5,"disable"]},{"id":65,"type":"VAEDecode","pos":[427.00064962940587,193.4476560543626],"size":[140,46],"flags":{},"order":7,"mode":0,"inputs":[{"localized_name":"Latent","name":"samples","type":"LATENT","link":45},{"localized_name":"vae","name":"vae","type":"VAE","link":46}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[54]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"VAEDecode","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":53,"type":"LoadImage","pos":[-923.2522256688294,193.4476560543626],"size":[270,314],"flags":{},"order":3,"mode":0,"inputs":[{"localized_name":"图像","name":"image","type":"COMBO","widget":{"name":"image"},"link":null},{"localized_name":"选择文件上传","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[53]},{"localized_name":"遮罩","name":"MASK","type":"MASK","links":null}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"LoadImage","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["ComfyUI_00257_.png","image"]},{"id":54,"type":"LoadImage","pos":[-921.0429625349889,590.1585536661325],"size":[270,314.00000000000006],"flags":{},"order":4,"mode":0,"inputs":[{"localized_name":"图像","name":"image","type":"COMBO","widget":{"name":"image"},"link":null},{"localized_name":"选择文件上传","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[55]},{"localized_name":"遮罩","name":"MASK","type":"MASK","links":null}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"LoadImage","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["ComfyUI_00236_.png","image"]},{"id":55,"type":"DynamicRefImageEncode","pos":[-217.8630297270306,193.4476560543626],"size":[210,342],"flags":{},"order":5,"mode":0,"inputs":[{"localized_name":"clip","name":"clip","type":"CLIP","link":39},{"localized_name":"vae","name":"vae","type":"VAE","link":40},{"localized_name":"image1","name":"image1","shape":7,"type":"IMAGE","link":53},{"localized_name":"num_images","name":"num_images","type":"INT","widget":{"name":"num_images"},"link":null},{"localized_name":"prompt","name":"prompt","type":"STRING","widget":{"name":"prompt"},"link":null},{"localized_name":"instruction","name":"instruction","type":"STRING","widget":{"name":"instruction"},"link":null},{"localized_name":"模型类型","name":"模型类型","shape":7,"type":"COMBO","widget":{"name":"模型类型"},"link":null},{"localized_name":"匹配原图尺寸","name":"匹配原图尺寸","shape":7,"type":"COMBO","widget":{"name":"匹配原图尺寸"},"link":null},{"localized_name":"输出宽度","name":"输出宽度","shape":7,"type":"INT","widget":{"name":"输出宽度"},"link":null},{"localized_name":"输出高度","name":"输出高度","shape":7,"type":"INT","widget":{"name":"输出高度"},"link":null},{"localized_name":"image2","name":"image2","shape":7,"type":"IMAGE","link":55},{"localized_name":"image3","name":"image3","shape":7,"type":"IMAGE","link":null}],"outputs":[{"localized_name":"conditioning","name":"conditioning","type":"CONDITIONING","links":[42,43]},{"localized_name":"latent","name":"latent","type":"LATENT","links":[44]}],"properties":{"Node name for S&R":"DynamicRefImageEncode","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[3,"图一图二衣服互换,然后一起合照","Describe the key features of the input image (color, shape, size, texture, objects, background), then explain how the user's text instruction should alter or modify the image. Generate a new image that meets the user's requirements while maintaining consistency with the original input where appropriate.","Flux2","OFF",1536,1024]},{"id":73,"type":"SaveLoadImage","pos":[649.4324893076241,193.4476560543626],"size":[270,314],"flags":{},"order":8,"mode":0,"inputs":[{"localized_name":"images","name":"images","type":"IMAGE","link":54},{"localized_name":"use_saved","name":"use_saved","type":"COMBO","widget":{"name":"use_saved"},"link":null},{"localized_name":"filename_prefix","name":"filename_prefix","shape":7,"type":"STRING","widget":{"name":"filename_prefix"},"link":null}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":null},{"localized_name":"遮罩","name":"MASK","type":"MASK","links":null}],"properties":{"Node name for S&R":"SaveLoadImage","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["Save","ComfyUI"]}],"links":[[39,61,0,55,0,"CLIP"],[40,62,0,55,1,"VAE"],[42,55,0,64,1,"CONDITIONING"],[43,55,0,64,2,"CONDITIONING"],[44,55,1,64,3,"LATENT"],[45,64,0,65,0,"LATENT"],[46,62,0,65,1,"VAE"],[48,67,0,64,0,"MODEL"],[53,53,0,55,2,"IMAGE"],[54,65,0,73,0,"IMAGE"],[55,54,0,55,10,"IMAGE"]],"groups":[],"config":{},"extra":{"ue_links":[],"ds":{"scale":0.9229599817706643,"offset":[452.8035621069091,124.06184603878773]},"links_added_by_ue":[]},"version":0.4} \ No newline at end of file diff --git a/example_workflows/Graphic-Text Integration Editing.png b/example_workflows/Graphic-Text Integration Editing.png new file mode 100644 index 0000000..f0d2dfd Binary files /dev/null and b/example_workflows/Graphic-Text Integration Editing.png differ diff --git a/example_workflows/Lazy Person's Multi-angle View.json b/example_workflows/Lazy Person's Multi-angle View.json new file mode 100644 index 0000000..1d31de0 --- /dev/null +++ b/example_workflows/Lazy Person's Multi-angle View.json @@ -0,0 +1 @@ +{"id":"18f7c06e-79a7-4abb-84fe-70cf6acfe1e8","revision":0,"last_node_id":358,"last_link_id":1377,"nodes":[{"id":349,"type":"VAELoader","pos":[945.8133888248695,1133.4356126793418],"size":[270,58],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"vae名称","name":"vae_name","type":"COMBO","widget":{"name":"vae_name"},"link":null}],"outputs":[{"localized_name":"VAE","name":"VAE","type":"VAE","links":[1361,1366]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"VAELoader","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["flux2-vae.safetensors"]},{"id":350,"type":"55632ac9-8fba-4ba5-9906-dca704711cf5","pos":[1755.2631647419314,818.9049110658409],"size":[210,258],"flags":{},"order":5,"mode":0,"inputs":[{"localized_name":"条件","name":"conditioning","type":"CONDITIONING","link":1353},{"localized_name":"条件_1","name":"conditioning_1","type":"CONDITIONING","link":1354},{"localized_name":"条件_2","name":"conditioning_2","type":"CONDITIONING","link":1355},{"localized_name":"条件_3","name":"conditioning_3","type":"CONDITIONING","link":1356},{"localized_name":"条件_4","name":"conditioning_4","type":"CONDITIONING","link":1357},{"localized_name":"条件_5","name":"conditioning_5","type":"CONDITIONING","link":1358},{"localized_name":"条件_6","name":"conditioning_6","type":"CONDITIONING","link":1359},{"localized_name":"条件_7","name":"conditioning_7","type":"CONDITIONING","link":1360},{"localized_name":"vae","name":"vae","type":"VAE","link":1361},{"localized_name":"模型","name":"model","type":"MODEL","link":1362},{"localized_name":"Latent图像","name":"latent_image","type":"LATENT","link":1363}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[1367]},{"localized_name":"图像_1","name":"IMAGE_1","type":"IMAGE","links":[1368]},{"localized_name":"图像_2","name":"IMAGE_2","type":"IMAGE","links":[1369]},{"localized_name":"图像_3","name":"IMAGE_3","type":"IMAGE","links":[1370]},{"localized_name":"图像_4","name":"IMAGE_4","type":"IMAGE","links":[1371]},{"localized_name":"图像_5","name":"IMAGE_5","type":"IMAGE","links":[1372]},{"localized_name":"图像_6","name":"IMAGE_6","type":"IMAGE","links":[1373]},{"localized_name":"图像_7","name":"IMAGE_7","type":"IMAGE","links":[1374]}],"properties":{"proxyWidgets":[["174","seed"]],"cnr_id":"comfy-core","ver":"0.20.1","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":351,"type":"CLIPLoader","pos":[945.8133888248695,966.4787544494935],"size":[270,106],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"CLIP名称","name":"clip_name","type":"COMBO","widget":{"name":"clip_name"},"link":null},{"localized_name":"类型","name":"type","type":"COMBO","widget":{"name":"type"},"link":null},{"localized_name":"设备","name":"device","shape":7,"type":"COMBO","widget":{"name":"device"},"link":null}],"outputs":[{"localized_name":"CLIP","name":"CLIP","type":"CLIP","links":[1364]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"CLIPLoader","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["qwen_3_4b.safetensors","flux2","default"]},{"id":352,"type":"LoadImage","pos":[946.8603529610047,1276.6471400629403],"size":[270,314],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"图像","name":"image","type":"COMBO","widget":{"name":"image"},"link":null},{"localized_name":"选择文件上传","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[1365]},{"localized_name":"遮罩","name":"MASK","type":"MASK","links":null}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"LoadImage","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["ComfyUI_00257_.png","image"]},{"id":353,"type":"UNETLoader","pos":[945.8133888248695,818.9049110658409],"size":[270,82],"flags":{},"order":3,"mode":0,"inputs":[{"localized_name":"UNet名称","name":"unet_name","type":"COMBO","widget":{"name":"unet_name"},"link":null},{"localized_name":"数据类型","name":"weight_dtype","type":"COMBO","widget":{"name":"weight_dtype"},"link":null}],"outputs":[{"localized_name":"模型","name":"MODEL","type":"MODEL","links":[1362]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"UNETLoader","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["flux-2\\flux-2-klein-4b.safetensors","default"]},{"id":355,"type":"ImageBatcher","pos":[2034.9880527004636,818.9049110658409],"size":[210,198],"flags":{},"order":6,"mode":0,"inputs":[{"localized_name":"image1","name":"image1","shape":7,"type":"IMAGE","link":1367},{"localized_name":"num_images","name":"num_images","type":"INT","widget":{"name":"num_images"},"link":null},{"localized_name":"image2","name":"image2","shape":7,"type":"IMAGE","link":1368},{"localized_name":"image3","name":"image3","shape":7,"type":"IMAGE","link":1369},{"localized_name":"image4","name":"image4","shape":7,"type":"IMAGE","link":1370},{"localized_name":"image5","name":"image5","shape":7,"type":"IMAGE","link":1371},{"localized_name":"image6","name":"image6","shape":7,"type":"IMAGE","link":1372},{"localized_name":"image7","name":"image7","shape":7,"type":"IMAGE","link":1373},{"localized_name":"image8","name":"image8","shape":7,"type":"IMAGE","link":1374}],"outputs":[{"localized_name":"images","name":"images","type":"IMAGE","links":[1375]}],"properties":{"Node name for S&R":"ImageBatcher","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[8]},{"id":356,"type":"SaveLoadImage","pos":[2314.7129406589947,818.9049110658409],"size":[270,102],"flags":{},"order":7,"mode":0,"inputs":[{"localized_name":"images","name":"images","type":"IMAGE","link":1375},{"localized_name":"use_saved","name":"use_saved","type":"COMBO","widget":{"name":"use_saved"},"link":null},{"localized_name":"filename_prefix","name":"filename_prefix","shape":7,"type":"STRING","widget":{"name":"filename_prefix"},"link":null}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[1376]},{"localized_name":"遮罩","name":"MASK","type":"MASK","links":null}],"properties":{"Node name for S&R":"SaveLoadImage","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["Save","ComfyUI"]},{"id":357,"type":"CR Upscale Image","pos":[2653.3188011307193,818.9049110658409],"size":[275.45703125,222],"flags":{},"order":8,"mode":0,"inputs":[{"label":"图像","localized_name":"图像","name":"image","type":"IMAGE","link":1376},{"label":"放大模型","localized_name":"放大模型","name":"upscale_model","type":"COMBO","widget":{"name":"upscale_model"},"link":null},{"label":"模式","localized_name":"模式","name":"mode","type":"COMBO","widget":{"name":"mode"},"link":null},{"label":"缩放系数","localized_name":"缩放系数","name":"rescale_factor","type":"FLOAT","widget":{"name":"rescale_factor"},"link":null},{"label":"拉伸宽度","localized_name":"拉伸宽度","name":"resize_width","type":"INT","widget":{"name":"resize_width"},"link":null},{"label":"重采样方法","localized_name":"重采样方法","name":"resampling_method","type":"COMBO","widget":{"name":"resampling_method"},"link":null},{"label":"超采样","localized_name":"超采样","name":"supersample","type":"COMBO","widget":{"name":"supersample"},"link":null},{"label":"舍入到倍数","localized_name":"舍入到倍数","name":"rounding_modulus","type":"INT","widget":{"name":"rounding_modulus"},"link":null}],"outputs":[{"label":"图像","localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[1377]},{"localized_name":"show_help","name":"show_help","type":"STRING","links":null}],"title":"放大图像","properties":{"Node name for S&R":"CR Upscale Image","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["1x-ITF-SkinDiffDetail-Lite-v1.pth","rescale",2,1024,"lanczos","true",8]},{"id":358,"type":"PreviewImage","pos":[3014.268606853021,818.9049110658409],"size":[291.1005474956073,213.95433956770648],"flags":{},"order":9,"mode":0,"inputs":[{"localized_name":"图像","name":"images","type":"IMAGE","link":1377}],"outputs":[],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"PreviewImage","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":354,"type":"OneImageMultiPrompt","pos":[1285.5382767834005,818.9049110658409],"size":[400,800.0000000000005],"flags":{},"order":4,"mode":0,"inputs":[{"localized_name":"clip","name":"clip","type":"CLIP","link":1364},{"localized_name":"image","name":"image","type":"IMAGE","link":1365},{"localized_name":"vae","name":"vae","shape":7,"type":"VAE","link":1366},{"localized_name":"prompt数量","name":"prompt数量","type":"INT","widget":{"name":"prompt数量"},"link":null},{"localized_name":"instruction","name":"instruction","shape":7,"type":"STRING","widget":{"name":"instruction"},"link":null},{"localized_name":"模型类型","name":"模型类型","shape":7,"type":"COMBO","widget":{"name":"模型类型"},"link":null},{"localized_name":"匹配原图尺寸","name":"匹配原图尺寸","shape":7,"type":"COMBO","widget":{"name":"匹配原图尺寸"},"link":null},{"localized_name":"输出宽度","name":"输出宽度","shape":7,"type":"INT","widget":{"name":"输出宽度"},"link":null},{"localized_name":"输出高度","name":"输出高度","shape":7,"type":"INT","widget":{"name":"输出高度"},"link":null},{"localized_name":"prompt1","name":"prompt1","shape":7,"type":"STRING","widget":{"name":"prompt1"},"link":null},{"localized_name":"prompt2","name":"prompt2","shape":7,"type":"STRING","widget":{"name":"prompt2"},"link":null},{"localized_name":"prompt3","name":"prompt3","shape":7,"type":"STRING","widget":{"name":"prompt3"},"link":null},{"localized_name":"prompt4","name":"prompt4","shape":7,"type":"STRING","widget":{"name":"prompt4"},"link":null},{"localized_name":"prompt5","name":"prompt5","shape":7,"type":"STRING","widget":{"name":"prompt5"},"link":null},{"localized_name":"prompt6","name":"prompt6","shape":7,"type":"STRING","widget":{"name":"prompt6"},"link":null},{"localized_name":"prompt7","name":"prompt7","shape":7,"type":"STRING","widget":{"name":"prompt7"},"link":null},{"localized_name":"prompt8","name":"prompt8","shape":7,"type":"STRING","widget":{"name":"prompt8"},"link":null}],"outputs":[{"localized_name":"cond_1","name":"cond_1","type":"CONDITIONING","links":[1353]},{"localized_name":"cond_2","name":"cond_2","type":"CONDITIONING","links":[1356]},{"localized_name":"cond_3","name":"cond_3","type":"CONDITIONING","links":[1354]},{"localized_name":"cond_4","name":"cond_4","type":"CONDITIONING","links":[1355]},{"localized_name":"cond_5","name":"cond_5","type":"CONDITIONING","links":[1357]},{"localized_name":"cond_6","name":"cond_6","type":"CONDITIONING","links":[1360]},{"localized_name":"cond_7","name":"cond_7","type":"CONDITIONING","links":[1358]},{"localized_name":"cond_8","name":"cond_8","type":"CONDITIONING","links":[1359]},{"localized_name":"latent","name":"latent","type":"LATENT","links":[1363]}],"properties":{"Node name for S&R":"OneImageMultiPrompt","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[8,"Describe the key features of the input image (color, shape, size, texture, objects, background), then explain how the user's text instruction should alter or modify the image. Generate a new image that meets the user's requirements while maintaining consistency with the original input where appropriate.","Flux2","ON",720,1280,"正面视角‌","侧面视角","背面视角","‌俯视/鸟瞰","仰视/低角度","特写镜头","中景/全景‌","广角镜头‌"]}],"links":[[1353,354,0,350,0,"CONDITIONING"],[1354,354,2,350,1,"CONDITIONING"],[1355,354,3,350,2,"CONDITIONING"],[1356,354,1,350,3,"CONDITIONING"],[1357,354,4,350,4,"CONDITIONING"],[1358,354,6,350,5,"CONDITIONING"],[1359,354,7,350,6,"CONDITIONING"],[1360,354,5,350,7,"CONDITIONING"],[1361,349,0,350,8,"VAE"],[1362,353,0,350,9,"MODEL"],[1363,354,8,350,10,"LATENT"],[1364,351,0,354,0,"CLIP"],[1365,352,0,354,1,"IMAGE"],[1366,349,0,354,2,"VAE"],[1367,350,0,355,0,"IMAGE"],[1368,350,1,355,2,"IMAGE"],[1369,350,2,355,3,"IMAGE"],[1370,350,3,355,4,"IMAGE"],[1371,350,4,355,5,"IMAGE"],[1372,350,5,355,6,"IMAGE"],[1373,350,6,355,7,"IMAGE"],[1374,350,7,355,8,"IMAGE"],[1375,355,0,356,0,"IMAGE"],[1376,356,0,357,0,"IMAGE"],[1377,357,0,358,0,"IMAGE"]],"groups":[],"definitions":{"subgraphs":[{"id":"55632ac9-8fba-4ba5-9906-dca704711cf5","version":1,"state":{"lastGroupId":0,"lastNodeId":358,"lastLinkId":1377,"lastRerouteId":0},"revision":0,"config":{},"name":"New Subgraph","inputNode":{"id":-10,"bounding":[-329.5417770830341,3125.385133953968,120,260]},"outputNode":{"id":-20,"bounding":[1280.9738331521096,3155.385133953968,120,200]},"inputs":[{"id":"fadee1b7-8807-4231-8f6b-e1c409b18881","name":"conditioning","type":"CONDITIONING","linkIds":[332,331],"localized_name":"条件","pos":[-229.5417770830341,3145.385133953968]},{"id":"f1ea127c-9e22-410c-b405-b2ae0d808ef2","name":"conditioning_1","type":"CONDITIONING","linkIds":[338,337],"localized_name":"条件_1","pos":[-229.5417770830341,3165.385133953968]},{"id":"e336259a-d4d9-4dab-9e6b-9f7e4a05c837","name":"conditioning_2","type":"CONDITIONING","linkIds":[340,339],"localized_name":"条件_2","pos":[-229.5417770830341,3185.385133953968]},{"id":"04e542d9-7c26-4320-b636-d97d07b83915","name":"conditioning_3","type":"CONDITIONING","linkIds":[325,326],"localized_name":"条件_3","pos":[-229.5417770830341,3205.385133953968]},{"id":"9e9234fb-b1ce-4d8d-8352-fefdea7297df","name":"conditioning_4","type":"CONDITIONING","linkIds":[361,368],"localized_name":"条件_4","pos":[-229.5417770830341,3225.385133953968]},{"id":"7e5dd420-a7ba-4e6a-9e50-4ff6c8ff736b","name":"conditioning_5","type":"CONDITIONING","linkIds":[363,370],"localized_name":"条件_5","pos":[-229.5417770830341,3245.385133953968]},{"id":"e2a57ef1-067f-45a8-b76b-700651d92f6d","name":"conditioning_6","type":"CONDITIONING","linkIds":[364,390],"localized_name":"条件_6","pos":[-229.5417770830341,3265.385133953968]},{"id":"5347c3c2-ca54-46fa-a7d0-eae1851042aa","name":"conditioning_7","type":"CONDITIONING","linkIds":[362,369],"localized_name":"条件_7","pos":[-229.5417770830341,3285.385133953968]},{"id":"6f32a209-08cb-49c9-9c5e-fa82d2433470","name":"vae","type":"VAE","linkIds":[478,479,480,475,476,477,474,473],"localized_name":"vae","pos":[-229.5417770830341,3305.385133953968]},{"id":"8c464101-4500-4ddf-bf7f-d08adf64e901","name":"model","type":"MODEL","linkIds":[462,463,468,467,469,472,470,471],"localized_name":"模型","pos":[-229.5417770830341,3325.385133953968]},{"id":"6e3d5476-0693-48be-9b0d-f1a0e2d6f3a5","name":"latent_image","type":"LATENT","linkIds":[333,334,336,335,365,367,366,389],"localized_name":"Latent图像","pos":[-229.5417770830341,3345.385133953968]}],"outputs":[{"id":"68af37e6-efc6-41fc-90e5-77cbbc2ee78b","name":"IMAGE","type":"IMAGE","linkIds":[454],"localized_name":"图像","pos":[1300.9738331521096,3175.385133953968]},{"id":"43a98dfc-bfc5-454f-a231-0ac92b9d8f31","name":"IMAGE_1","type":"IMAGE","linkIds":[455],"localized_name":"图像_1","pos":[1300.9738331521096,3195.385133953968]},{"id":"6186dcd3-bd71-48c7-b994-8278f42f6519","name":"IMAGE_2","type":"IMAGE","linkIds":[458],"localized_name":"图像_2","pos":[1300.9738331521096,3215.385133953968]},{"id":"092d2bd1-fd4a-4099-b38b-a4e0ce4c48be","name":"IMAGE_3","type":"IMAGE","linkIds":[453],"localized_name":"图像_3","pos":[1300.9738331521096,3235.385133953968]},{"id":"fb8aab90-774b-4ac1-baa5-6694bbd6b34f","name":"IMAGE_4","type":"IMAGE","linkIds":[459],"localized_name":"图像_4","pos":[1300.9738331521096,3255.385133953968]},{"id":"a0a7f088-d8fd-49b9-b8d3-41ece6b657b4","name":"IMAGE_5","type":"IMAGE","linkIds":[457],"localized_name":"图像_5","pos":[1300.9738331521096,3275.385133953968]},{"id":"f892607a-6ce7-4a28-b8b9-e270ef9492fb","name":"IMAGE_6","type":"IMAGE","linkIds":[452],"localized_name":"图像_6","pos":[1300.9738331521096,3295.385133953968]},{"id":"122e0c71-074d-483f-8982-5a557fcb44bd","name":"IMAGE_7","type":"IMAGE","linkIds":[456],"localized_name":"图像_7","pos":[1300.9738331521096,3315.385133953968]}],"widgets":[],"nodes":[{"id":147,"type":"ConditioningZeroOut","pos":[-149.5417770830341,2514.435916849264],"size":[192.39486425838766,51.363261366732786],"flags":{"collapsed":false},"order":7,"mode":0,"inputs":[{"localized_name":"条件","name":"conditioning","type":"CONDITIONING","link":332}],"outputs":[{"localized_name":"条件","name":"CONDITIONING","type":"CONDITIONING","links":[317]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"ConditioningZeroOut","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":148,"type":"ConditioningZeroOut","pos":[-149.5417770830341,2859.400915818326],"size":[192.39486425838766,51.363261366732786],"flags":{"collapsed":false},"order":8,"mode":0,"inputs":[{"localized_name":"条件","name":"conditioning","type":"CONDITIONING","link":338}],"outputs":[{"localized_name":"条件","name":"CONDITIONING","type":"CONDITIONING","links":[319]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"ConditioningZeroOut","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":149,"type":"ConditioningZeroOut","pos":[-149.5417770830341,3031.8834153028574],"size":[192.39486425838766,51.363261366732786],"flags":{"collapsed":false},"order":9,"mode":0,"inputs":[{"localized_name":"条件","name":"conditioning","type":"CONDITIONING","link":340}],"outputs":[{"localized_name":"条件","name":"CONDITIONING","type":"CONDITIONING","links":[320]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"ConditioningZeroOut","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":141,"type":"ConditioningZeroOut","pos":[-149.5417770830341,2686.918416333795],"size":[192.39486425838766,51.363261366732786],"flags":{"collapsed":false},"order":1,"mode":0,"inputs":[{"localized_name":"条件","name":"conditioning","type":"CONDITIONING","link":325}],"outputs":[{"localized_name":"条件","name":"CONDITIONING","type":"CONDITIONING","links":[318]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"ConditioningZeroOut","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":157,"type":"ConditioningZeroOut","pos":[-149.5417770830341,3204.3659147873886],"size":[192.39486425838766,51.363261366732786],"flags":{"collapsed":false},"order":13,"mode":0,"inputs":[{"localized_name":"条件","name":"conditioning","type":"CONDITIONING","link":361}],"outputs":[{"localized_name":"条件","name":"CONDITIONING","type":"CONDITIONING","links":[349]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"ConditioningZeroOut","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":158,"type":"ConditioningZeroOut","pos":[-149.5417770830341,3549.330913756451],"size":[192.39486425838766,51.363261366732786],"flags":{"collapsed":false},"order":14,"mode":0,"inputs":[{"localized_name":"条件","name":"conditioning","type":"CONDITIONING","link":363}],"outputs":[{"localized_name":"条件","name":"CONDITIONING","type":"CONDITIONING","links":[351]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"ConditioningZeroOut","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":159,"type":"ConditioningZeroOut","pos":[-149.5417770830341,3721.8134132409823],"size":[192.39486425838766,51.363261366732786],"flags":{"collapsed":false},"order":15,"mode":0,"inputs":[{"localized_name":"条件","name":"conditioning","type":"CONDITIONING","link":364}],"outputs":[{"localized_name":"条件","name":"CONDITIONING","type":"CONDITIONING","links":[352]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"ConditioningZeroOut","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":160,"type":"ConditioningZeroOut","pos":[-149.5417770830341,3376.84841427192],"size":[192.39486425838766,51.363261366732786],"flags":{"collapsed":false},"order":16,"mode":0,"inputs":[{"localized_name":"条件","name":"conditioning","type":"CONDITIONING","link":362}],"outputs":[{"localized_name":"条件","name":"CONDITIONING","type":"CONDITIONING","links":[350]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"ConditioningZeroOut","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":165,"type":"VAEDecode","pos":[1080.9738331521096,3435.2664428634844],"size":[140,46],"flags":{},"order":21,"mode":0,"inputs":[{"localized_name":"Latent","name":"samples","type":"LATENT","link":353},{"localized_name":"vae","name":"vae","type":"VAE","link":478}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[454]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"VAEDecode","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":167,"type":"VAEDecode","pos":[1080.9738331521096,3630.307779816616],"size":[140,46],"flags":{},"order":23,"mode":0,"inputs":[{"localized_name":"Latent","name":"samples","type":"LATENT","link":355},{"localized_name":"vae","name":"vae","type":"VAE","link":479}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[455]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"VAEDecode","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":172,"type":"VAEDecode","pos":[1080.9738331521096,3825.3491167697475],"size":[140,46],"flags":{},"order":24,"mode":0,"inputs":[{"localized_name":"Latent","name":"samples","type":"LATENT","link":360},{"localized_name":"vae","name":"vae","type":"VAE","link":480}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[458]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"VAEDecode","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":142,"type":"KSamplerAdvanced","pos":[210,2400],"size":[270,334],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"模型","name":"model","type":"MODEL","link":462},{"localized_name":"正面条件","name":"positive","type":"CONDITIONING","link":331},{"localized_name":"负面条件","name":"negative","type":"CONDITIONING","link":317},{"localized_name":"Latent图像","name":"latent_image","type":"LATENT","link":333},{"localized_name":"添加噪波","name":"add_noise","type":"COMBO","widget":{"name":"add_noise"},"link":null},{"localized_name":"随机种","name":"noise_seed","type":"INT","widget":{"name":"noise_seed"},"link":377},{"localized_name":"步数","name":"steps","type":"INT","widget":{"name":"steps"},"link":null},{"localized_name":"cfg","name":"cfg","type":"FLOAT","widget":{"name":"cfg"},"link":null},{"localized_name":"采样器名称","name":"sampler_name","type":"COMBO","widget":{"name":"sampler_name"},"link":null},{"localized_name":"调度器","name":"scheduler","type":"COMBO","widget":{"name":"scheduler"},"link":null},{"localized_name":"开始步数","name":"start_at_step","type":"INT","widget":{"name":"start_at_step"},"link":null},{"localized_name":"结束步数","name":"end_at_step","type":"INT","widget":{"name":"end_at_step"},"link":null},{"localized_name":"返回剩余噪波","name":"return_with_leftover_noise","type":"COMBO","widget":{"name":"return_with_leftover_noise"},"link":null}],"outputs":[{"localized_name":"Latent","name":"LATENT","type":"LATENT","links":[321]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"KSamplerAdvanced","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["enable",1117442138707040,"randomize",4,1,"euler","simple",0,5,"disable"]},{"id":151,"type":"KSamplerAdvanced","pos":[577.8408570594762,2400],"size":[270,334],"flags":{},"order":11,"mode":0,"inputs":[{"localized_name":"模型","name":"model","type":"MODEL","link":463},{"localized_name":"正面条件","name":"positive","type":"CONDITIONING","link":326},{"localized_name":"负面条件","name":"negative","type":"CONDITIONING","link":318},{"localized_name":"Latent图像","name":"latent_image","type":"LATENT","link":334},{"localized_name":"添加噪波","name":"add_noise","type":"COMBO","widget":{"name":"add_noise"},"link":null},{"localized_name":"随机种","name":"noise_seed","type":"INT","widget":{"name":"noise_seed"},"link":378},{"localized_name":"步数","name":"steps","type":"INT","widget":{"name":"steps"},"link":null},{"localized_name":"cfg","name":"cfg","type":"FLOAT","widget":{"name":"cfg"},"link":null},{"localized_name":"采样器名称","name":"sampler_name","type":"COMBO","widget":{"name":"sampler_name"},"link":null},{"localized_name":"调度器","name":"scheduler","type":"COMBO","widget":{"name":"scheduler"},"link":null},{"localized_name":"开始步数","name":"start_at_step","type":"INT","widget":{"name":"start_at_step"},"link":null},{"localized_name":"结束步数","name":"end_at_step","type":"INT","widget":{"name":"end_at_step"},"link":null},{"localized_name":"返回剩余噪波","name":"return_with_leftover_noise","type":"COMBO","widget":{"name":"return_with_leftover_noise"},"link":null}],"outputs":[{"localized_name":"Latent","name":"LATENT","type":"LATENT","links":[324]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"KSamplerAdvanced","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["enable",572997928368409,"randomize",4,1,"euler","simple",0,5,"disable"]},{"id":152,"type":"KSamplerAdvanced","pos":[577.8408570594762,2802.6025534507985],"size":[270,334],"flags":{},"order":12,"mode":0,"inputs":[{"localized_name":"模型","name":"model","type":"MODEL","link":468},{"localized_name":"正面条件","name":"positive","type":"CONDITIONING","link":339},{"localized_name":"负面条件","name":"negative","type":"CONDITIONING","link":320},{"localized_name":"Latent图像","name":"latent_image","type":"LATENT","link":336},{"localized_name":"添加噪波","name":"add_noise","type":"COMBO","widget":{"name":"add_noise"},"link":null},{"localized_name":"随机种","name":"noise_seed","type":"INT","widget":{"name":"noise_seed"},"link":379},{"localized_name":"步数","name":"steps","type":"INT","widget":{"name":"steps"},"link":null},{"localized_name":"cfg","name":"cfg","type":"FLOAT","widget":{"name":"cfg"},"link":null},{"localized_name":"采样器名称","name":"sampler_name","type":"COMBO","widget":{"name":"sampler_name"},"link":null},{"localized_name":"调度器","name":"scheduler","type":"COMBO","widget":{"name":"scheduler"},"link":null},{"localized_name":"开始步数","name":"start_at_step","type":"INT","widget":{"name":"start_at_step"},"link":null},{"localized_name":"结束步数","name":"end_at_step","type":"INT","widget":{"name":"end_at_step"},"link":null},{"localized_name":"返回剩余噪波","name":"return_with_leftover_noise","type":"COMBO","widget":{"name":"return_with_leftover_noise"},"link":null}],"outputs":[{"localized_name":"Latent","name":"LATENT","type":"LATENT","links":[322]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"KSamplerAdvanced","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["enable",96269734102942,"randomize",4,1,"euler","simple",0,5,"disable"]},{"id":150,"type":"KSamplerAdvanced","pos":[215.8587441172288,2805.6595029299883],"size":[270,334],"flags":{},"order":10,"mode":0,"inputs":[{"localized_name":"模型","name":"model","type":"MODEL","link":467},{"localized_name":"正面条件","name":"positive","type":"CONDITIONING","link":337},{"localized_name":"负面条件","name":"negative","type":"CONDITIONING","link":319},{"localized_name":"Latent图像","name":"latent_image","type":"LATENT","link":335},{"localized_name":"添加噪波","name":"add_noise","type":"COMBO","widget":{"name":"add_noise"},"link":null},{"localized_name":"随机种","name":"noise_seed","type":"INT","widget":{"name":"noise_seed"},"link":380},{"localized_name":"步数","name":"steps","type":"INT","widget":{"name":"steps"},"link":null},{"localized_name":"cfg","name":"cfg","type":"FLOAT","widget":{"name":"cfg"},"link":null},{"localized_name":"采样器名称","name":"sampler_name","type":"COMBO","widget":{"name":"sampler_name"},"link":null},{"localized_name":"调度器","name":"scheduler","type":"COMBO","widget":{"name":"scheduler"},"link":null},{"localized_name":"开始步数","name":"start_at_step","type":"INT","widget":{"name":"start_at_step"},"link":null},{"localized_name":"结束步数","name":"end_at_step","type":"INT","widget":{"name":"end_at_step"},"link":null},{"localized_name":"返回剩余噪波","name":"return_with_leftover_noise","type":"COMBO","widget":{"name":"return_with_leftover_noise"},"link":null}],"outputs":[{"localized_name":"Latent","name":"LATENT","type":"LATENT","links":[323]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"KSamplerAdvanced","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["enable",939052489603551,"randomize",4,1,"euler","simple",0,5,"disable"]},{"id":161,"type":"KSamplerAdvanced","pos":[221.71748823445762,3211.3190058599766],"size":[270,334],"flags":{},"order":17,"mode":0,"inputs":[{"localized_name":"模型","name":"model","type":"MODEL","link":469},{"localized_name":"正面条件","name":"positive","type":"CONDITIONING","link":368},{"localized_name":"负面条件","name":"negative","type":"CONDITIONING","link":349},{"localized_name":"Latent图像","name":"latent_image","type":"LATENT","link":365},{"localized_name":"添加噪波","name":"add_noise","type":"COMBO","widget":{"name":"add_noise"},"link":null},{"localized_name":"随机种","name":"noise_seed","type":"INT","widget":{"name":"noise_seed"},"link":381},{"localized_name":"步数","name":"steps","type":"INT","widget":{"name":"steps"},"link":null},{"localized_name":"cfg","name":"cfg","type":"FLOAT","widget":{"name":"cfg"},"link":null},{"localized_name":"采样器名称","name":"sampler_name","type":"COMBO","widget":{"name":"sampler_name"},"link":null},{"localized_name":"调度器","name":"scheduler","type":"COMBO","widget":{"name":"scheduler"},"link":null},{"localized_name":"开始步数","name":"start_at_step","type":"INT","widget":{"name":"start_at_step"},"link":null},{"localized_name":"结束步数","name":"end_at_step","type":"INT","widget":{"name":"end_at_step"},"link":null},{"localized_name":"返回剩余噪波","name":"return_with_leftover_noise","type":"COMBO","widget":{"name":"return_with_leftover_noise"},"link":null}],"outputs":[{"localized_name":"Latent","name":"LATENT","type":"LATENT","links":[354]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"KSamplerAdvanced","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["enable",63785875749102,"randomize",4,1,"euler","simple",0,5,"disable"]},{"id":164,"type":"KSamplerAdvanced","pos":[577.8408570594762,3623.533505885715],"size":[270,334],"flags":{},"order":20,"mode":0,"inputs":[{"localized_name":"模型","name":"model","type":"MODEL","link":472},{"localized_name":"正面条件","name":"positive","type":"CONDITIONING","link":390},{"localized_name":"负面条件","name":"negative","type":"CONDITIONING","link":352},{"localized_name":"Latent图像","name":"latent_image","type":"LATENT","link":367},{"localized_name":"添加噪波","name":"add_noise","type":"COMBO","widget":{"name":"add_noise"},"link":null},{"localized_name":"随机种","name":"noise_seed","type":"INT","widget":{"name":"noise_seed"},"link":382},{"localized_name":"步数","name":"steps","type":"INT","widget":{"name":"steps"},"link":null},{"localized_name":"cfg","name":"cfg","type":"FLOAT","widget":{"name":"cfg"},"link":null},{"localized_name":"采样器名称","name":"sampler_name","type":"COMBO","widget":{"name":"sampler_name"},"link":null},{"localized_name":"调度器","name":"scheduler","type":"COMBO","widget":{"name":"scheduler"},"link":null},{"localized_name":"开始步数","name":"start_at_step","type":"INT","widget":{"name":"start_at_step"},"link":null},{"localized_name":"结束步数","name":"end_at_step","type":"INT","widget":{"name":"end_at_step"},"link":null},{"localized_name":"返回剩余噪波","name":"return_with_leftover_noise","type":"COMBO","widget":{"name":"return_with_leftover_noise"},"link":null}],"outputs":[{"localized_name":"Latent","name":"LATENT","type":"LATENT","links":[360]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"KSamplerAdvanced","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["enable",815166053868242,"randomize",4,1,"euler","simple",0,5,"disable"]},{"id":162,"type":"KSamplerAdvanced","pos":[577.8408570594762,3205.205106901597],"size":[270,334],"flags":{},"order":18,"mode":0,"inputs":[{"localized_name":"模型","name":"model","type":"MODEL","link":470},{"localized_name":"正面条件","name":"positive","type":"CONDITIONING","link":369},{"localized_name":"负面条件","name":"negative","type":"CONDITIONING","link":350},{"localized_name":"Latent图像","name":"latent_image","type":"LATENT","link":366},{"localized_name":"添加噪波","name":"add_noise","type":"COMBO","widget":{"name":"add_noise"},"link":null},{"localized_name":"随机种","name":"noise_seed","type":"INT","widget":{"name":"noise_seed"},"link":384},{"localized_name":"步数","name":"steps","type":"INT","widget":{"name":"steps"},"link":null},{"localized_name":"cfg","name":"cfg","type":"FLOAT","widget":{"name":"cfg"},"link":null},{"localized_name":"采样器名称","name":"sampler_name","type":"COMBO","widget":{"name":"sampler_name"},"link":null},{"localized_name":"调度器","name":"scheduler","type":"COMBO","widget":{"name":"scheduler"},"link":null},{"localized_name":"开始步数","name":"start_at_step","type":"INT","widget":{"name":"start_at_step"},"link":null},{"localized_name":"结束步数","name":"end_at_step","type":"INT","widget":{"name":"end_at_step"},"link":null},{"localized_name":"返回剩余噪波","name":"return_with_leftover_noise","type":"COMBO","widget":{"name":"return_with_leftover_noise"},"link":null}],"outputs":[{"localized_name":"Latent","name":"LATENT","type":"LATENT","links":[353]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"KSamplerAdvanced","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["enable",969212845375458,"randomize",4,1,"euler","simple",0,5,"disable"]},{"id":145,"type":"VAEDecode","pos":[1080.9738331521096,2850.1424320040896],"size":[140,46],"flags":{},"order":5,"mode":0,"inputs":[{"localized_name":"Latent","name":"samples","type":"LATENT","link":323},{"localized_name":"vae","name":"vae","type":"VAE","link":475}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[453]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"VAEDecode","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":144,"type":"VAEDecode","pos":[1080.9738331521096,3045.183768957221],"size":[140,46],"flags":{},"order":4,"mode":0,"inputs":[{"localized_name":"Latent","name":"samples","type":"LATENT","link":322},{"localized_name":"vae","name":"vae","type":"VAE","link":476}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[459]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"VAEDecode","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":166,"type":"VAEDecode","pos":[1080.9738331521096,3240.225105910353],"size":[140,46],"flags":{},"order":22,"mode":0,"inputs":[{"localized_name":"Latent","name":"samples","type":"LATENT","link":354},{"localized_name":"vae","name":"vae","type":"VAE","link":477}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[457]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"VAEDecode","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":163,"type":"KSamplerAdvanced","pos":[229.49566660126393,3613.9363346378273],"size":[270,334],"flags":{},"order":19,"mode":0,"inputs":[{"localized_name":"模型","name":"model","type":"MODEL","link":471},{"localized_name":"正面条件","name":"positive","type":"CONDITIONING","link":370},{"localized_name":"负面条件","name":"negative","type":"CONDITIONING","link":351},{"localized_name":"Latent图像","name":"latent_image","type":"LATENT","link":389},{"localized_name":"添加噪波","name":"add_noise","type":"COMBO","widget":{"name":"add_noise"},"link":null},{"localized_name":"随机种","name":"noise_seed","type":"INT","widget":{"name":"noise_seed"},"link":383},{"localized_name":"步数","name":"steps","type":"INT","widget":{"name":"steps"},"link":null},{"localized_name":"cfg","name":"cfg","type":"FLOAT","widget":{"name":"cfg"},"link":null},{"localized_name":"采样器名称","name":"sampler_name","type":"COMBO","widget":{"name":"sampler_name"},"link":null},{"localized_name":"调度器","name":"scheduler","type":"COMBO","widget":{"name":"scheduler"},"link":null},{"localized_name":"开始步数","name":"start_at_step","type":"INT","widget":{"name":"start_at_step"},"link":null},{"localized_name":"结束步数","name":"end_at_step","type":"INT","widget":{"name":"end_at_step"},"link":null},{"localized_name":"返回剩余噪波","name":"return_with_leftover_noise","type":"COMBO","widget":{"name":"return_with_leftover_noise"},"link":null}],"outputs":[{"localized_name":"Latent","name":"LATENT","type":"LATENT","links":[355]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"KSamplerAdvanced","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["enable",87655647235042,"randomize",4,1,"euler","simple",0,5,"disable"]},{"id":146,"type":"VAEDecode","pos":[1080.9738331521096,2655.101095050958],"size":[140,46],"flags":{},"order":6,"mode":0,"inputs":[{"localized_name":"Latent","name":"samples","type":"LATENT","link":324},{"localized_name":"vae","name":"vae","type":"VAE","link":474}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[452]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"VAEDecode","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":143,"type":"VAEDecode","pos":[1080.9738331521096,2460.0597580978265],"size":[140,46],"flags":{},"order":3,"mode":0,"inputs":[{"localized_name":"Latent","name":"samples","type":"LATENT","link":321},{"localized_name":"vae","name":"vae","type":"VAE","link":473}],"outputs":[{"localized_name":"图像","name":"IMAGE","type":"IMAGE","links":[456]}],"properties":{"cnr_id":"comfy-core","ver":"0.20.1","Node name for S&R":"VAEDecode","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":174,"type":"easy seed","pos":[233.43497646891524,4034.770267907936],"size":[270,106],"flags":{},"order":0,"mode":0,"inputs":[{"label":"随机种子","localized_name":"随机种子","name":"seed","type":"INT","widget":{"name":"seed"},"link":null}],"outputs":[{"label":"随机种子","localized_name":"随机种子","name":"seed","type":"INT","links":[377,378,379,380,381,382,383,384]}],"properties":{"cnr_id":"comfyui-easy-use","ver":"1.3.6","Node name for S&R":"easy seed","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[323934959482359,"randomize",null]}],"groups":[],"links":[{"id":353,"origin_id":162,"origin_slot":0,"target_id":165,"target_slot":0,"type":"LATENT"},{"id":355,"origin_id":163,"origin_slot":0,"target_id":167,"target_slot":0,"type":"LATENT"},{"id":360,"origin_id":164,"origin_slot":0,"target_id":172,"target_slot":0,"type":"LATENT"},{"id":317,"origin_id":147,"origin_slot":0,"target_id":142,"target_slot":2,"type":"CONDITIONING"},{"id":377,"origin_id":174,"origin_slot":0,"target_id":142,"target_slot":5,"type":"INT"},{"id":318,"origin_id":141,"origin_slot":0,"target_id":151,"target_slot":2,"type":"CONDITIONING"},{"id":378,"origin_id":174,"origin_slot":0,"target_id":151,"target_slot":5,"type":"INT"},{"id":320,"origin_id":149,"origin_slot":0,"target_id":152,"target_slot":2,"type":"CONDITIONING"},{"id":379,"origin_id":174,"origin_slot":0,"target_id":152,"target_slot":5,"type":"INT"},{"id":319,"origin_id":148,"origin_slot":0,"target_id":150,"target_slot":2,"type":"CONDITIONING"},{"id":380,"origin_id":174,"origin_slot":0,"target_id":150,"target_slot":5,"type":"INT"},{"id":349,"origin_id":157,"origin_slot":0,"target_id":161,"target_slot":2,"type":"CONDITIONING"},{"id":381,"origin_id":174,"origin_slot":0,"target_id":161,"target_slot":5,"type":"INT"},{"id":352,"origin_id":159,"origin_slot":0,"target_id":164,"target_slot":2,"type":"CONDITIONING"},{"id":382,"origin_id":174,"origin_slot":0,"target_id":164,"target_slot":5,"type":"INT"},{"id":350,"origin_id":160,"origin_slot":0,"target_id":162,"target_slot":2,"type":"CONDITIONING"},{"id":384,"origin_id":174,"origin_slot":0,"target_id":162,"target_slot":5,"type":"INT"},{"id":323,"origin_id":150,"origin_slot":0,"target_id":145,"target_slot":0,"type":"LATENT"},{"id":322,"origin_id":152,"origin_slot":0,"target_id":144,"target_slot":0,"type":"LATENT"},{"id":354,"origin_id":161,"origin_slot":0,"target_id":166,"target_slot":0,"type":"LATENT"},{"id":351,"origin_id":158,"origin_slot":0,"target_id":163,"target_slot":2,"type":"CONDITIONING"},{"id":383,"origin_id":174,"origin_slot":0,"target_id":163,"target_slot":5,"type":"INT"},{"id":324,"origin_id":151,"origin_slot":0,"target_id":146,"target_slot":0,"type":"LATENT"},{"id":321,"origin_id":142,"origin_slot":0,"target_id":143,"target_slot":0,"type":"LATENT"},{"id":332,"origin_id":-10,"origin_slot":0,"target_id":147,"target_slot":0,"type":"CONDITIONING"},{"id":331,"origin_id":-10,"origin_slot":0,"target_id":142,"target_slot":1,"type":"CONDITIONING"},{"id":338,"origin_id":-10,"origin_slot":1,"target_id":148,"target_slot":0,"type":"CONDITIONING"},{"id":337,"origin_id":-10,"origin_slot":1,"target_id":150,"target_slot":1,"type":"CONDITIONING"},{"id":340,"origin_id":-10,"origin_slot":2,"target_id":149,"target_slot":0,"type":"CONDITIONING"},{"id":339,"origin_id":-10,"origin_slot":2,"target_id":152,"target_slot":1,"type":"CONDITIONING"},{"id":325,"origin_id":-10,"origin_slot":3,"target_id":141,"target_slot":0,"type":"CONDITIONING"},{"id":326,"origin_id":-10,"origin_slot":3,"target_id":151,"target_slot":1,"type":"CONDITIONING"},{"id":361,"origin_id":-10,"origin_slot":4,"target_id":157,"target_slot":0,"type":"CONDITIONING"},{"id":368,"origin_id":-10,"origin_slot":4,"target_id":161,"target_slot":1,"type":"CONDITIONING"},{"id":363,"origin_id":-10,"origin_slot":5,"target_id":158,"target_slot":0,"type":"CONDITIONING"},{"id":370,"origin_id":-10,"origin_slot":5,"target_id":163,"target_slot":1,"type":"CONDITIONING"},{"id":364,"origin_id":-10,"origin_slot":6,"target_id":159,"target_slot":0,"type":"CONDITIONING"},{"id":390,"origin_id":-10,"origin_slot":6,"target_id":164,"target_slot":1,"type":"CONDITIONING"},{"id":362,"origin_id":-10,"origin_slot":7,"target_id":160,"target_slot":0,"type":"CONDITIONING"},{"id":369,"origin_id":-10,"origin_slot":7,"target_id":162,"target_slot":1,"type":"CONDITIONING"},{"id":478,"origin_id":-10,"origin_slot":8,"target_id":165,"target_slot":1,"type":"VAE"},{"id":479,"origin_id":-10,"origin_slot":8,"target_id":167,"target_slot":1,"type":"VAE"},{"id":480,"origin_id":-10,"origin_slot":8,"target_id":172,"target_slot":1,"type":"VAE"},{"id":475,"origin_id":-10,"origin_slot":8,"target_id":145,"target_slot":1,"type":"VAE"},{"id":476,"origin_id":-10,"origin_slot":8,"target_id":144,"target_slot":1,"type":"VAE"},{"id":477,"origin_id":-10,"origin_slot":8,"target_id":166,"target_slot":1,"type":"VAE"},{"id":474,"origin_id":-10,"origin_slot":8,"target_id":146,"target_slot":1,"type":"VAE"},{"id":473,"origin_id":-10,"origin_slot":8,"target_id":143,"target_slot":1,"type":"VAE"},{"id":462,"origin_id":-10,"origin_slot":9,"target_id":142,"target_slot":0,"type":"MODEL"},{"id":463,"origin_id":-10,"origin_slot":9,"target_id":151,"target_slot":0,"type":"MODEL"},{"id":468,"origin_id":-10,"origin_slot":9,"target_id":152,"target_slot":0,"type":"MODEL"},{"id":467,"origin_id":-10,"origin_slot":9,"target_id":150,"target_slot":0,"type":"MODEL"},{"id":469,"origin_id":-10,"origin_slot":9,"target_id":161,"target_slot":0,"type":"MODEL"},{"id":472,"origin_id":-10,"origin_slot":9,"target_id":164,"target_slot":0,"type":"MODEL"},{"id":470,"origin_id":-10,"origin_slot":9,"target_id":162,"target_slot":0,"type":"MODEL"},{"id":471,"origin_id":-10,"origin_slot":9,"target_id":163,"target_slot":0,"type":"MODEL"},{"id":333,"origin_id":-10,"origin_slot":10,"target_id":142,"target_slot":3,"type":"LATENT"},{"id":334,"origin_id":-10,"origin_slot":10,"target_id":151,"target_slot":3,"type":"LATENT"},{"id":336,"origin_id":-10,"origin_slot":10,"target_id":152,"target_slot":3,"type":"LATENT"},{"id":335,"origin_id":-10,"origin_slot":10,"target_id":150,"target_slot":3,"type":"LATENT"},{"id":365,"origin_id":-10,"origin_slot":10,"target_id":161,"target_slot":3,"type":"LATENT"},{"id":367,"origin_id":-10,"origin_slot":10,"target_id":164,"target_slot":3,"type":"LATENT"},{"id":366,"origin_id":-10,"origin_slot":10,"target_id":162,"target_slot":3,"type":"LATENT"},{"id":389,"origin_id":-10,"origin_slot":10,"target_id":163,"target_slot":3,"type":"LATENT"},{"id":454,"origin_id":165,"origin_slot":0,"target_id":-20,"target_slot":0,"type":"IMAGE"},{"id":455,"origin_id":167,"origin_slot":0,"target_id":-20,"target_slot":1,"type":"IMAGE"},{"id":458,"origin_id":172,"origin_slot":0,"target_id":-20,"target_slot":2,"type":"IMAGE"},{"id":453,"origin_id":145,"origin_slot":0,"target_id":-20,"target_slot":3,"type":"IMAGE"},{"id":459,"origin_id":144,"origin_slot":0,"target_id":-20,"target_slot":4,"type":"IMAGE"},{"id":457,"origin_id":166,"origin_slot":0,"target_id":-20,"target_slot":5,"type":"IMAGE"},{"id":452,"origin_id":146,"origin_slot":0,"target_id":-20,"target_slot":6,"type":"IMAGE"},{"id":456,"origin_id":143,"origin_slot":0,"target_id":-20,"target_slot":7,"type":"IMAGE"}],"extra":{"ue_links":[],"links_added_by_ue":[]}}]},"config":{},"extra":{"ue_links":[],"ds":{"scale":0.4177248169415948,"offset":[52.44595464790132,-350.3836050610214]}},"version":0.4} \ No newline at end of file diff --git a/example_workflows/Lazy Person's Multi-angle View.png b/example_workflows/Lazy Person's Multi-angle View.png new file mode 100644 index 0000000..859976e Binary files /dev/null and b/example_workflows/Lazy Person's Multi-angle View.png differ diff --git a/js/multi_ref_encode.js b/js/multi_ref_encode.js new file mode 100644 index 0000000..3a275e7 --- /dev/null +++ b/js/multi_ref_encode.js @@ -0,0 +1,170 @@ +/** + * ComfyUI-Toggle-Pass 前端扩展 + * 支持动态输入/输出槽: + * - DynamicRefLatentInput: 动态 LATENT 输入槽 + * - ImageBatcher: 动态 IMAGE 输入槽 + * - DynamicRefImageEncode: 动态 IMAGE 输入槽 + * - DynamicRefIndependent: 四项同步增删(IMAGE + prompt + cond + latent) + * + * 架构说明: + * 使用 beforeRegisterNodeDef + onConfigure/onNodeCreated 模式, + * 而非 nodeCreated/nodeAdded + setTimeout。 + * 原因:nodeCreated/nodeAdded 触发时 widget 值可能尚未从 JSON 恢复, + * setTimeout 无法可靠保证时序,且切页面时可能与 onConfigure 打架。 + * onConfigure 在 widget 值恢复之后触发,可安全读取 w.value。 + */ + +import { app } from "../../scripts/app.js"; + +const EXT_NAME = "ComfyUI-Toggle-Pass"; + +/* ============ 通用节点(DynamicRefLatentInput / ImageBatcher / DynamicRefImageEncode)============ */ + +const DYNAMIC_NODES = { + "DynamicRefLatentInput": { widget: "num_latents", inputType: "LATENT", max: 10, prefix: "latent" }, + "ImageBatcher": { widget: "num_images", inputType: "IMAGE", max: 10, prefix: "image" }, + "DynamicRefImageEncode": { widget: "num_images", inputType: "IMAGE", max: 10, prefix: "image" }, +}; + +app.registerExtension({ + name: EXT_NAME + "-generic", + beforeRegisterNodeDef(nodeType, nodeData, app) { + const cfg = DYNAMIC_NODES[nodeData.name]; + if (!cfg) return; + + // onConfigure:从 JSON 恢复后触发,widget 值已正确 + const origConfigure = nodeType.prototype.onConfigure; + nodeType.prototype.onConfigure = function () { + origConfigure?.apply(this, arguments); + requestAnimationFrame(() => { + const w = this.widgets?.find(w => w.name === cfg.widget); + if (w) syncInputs(this, cfg, Math.max(1, Math.min(cfg.max, w.value || 1))); + }); + }; + + // onNodeCreated:新拖入的节点(无 JSON 恢复),用默认值初始化 + const origCreated = nodeType.prototype.onNodeCreated; + nodeType.prototype.onNodeCreated = function () { + origCreated?.apply(this, arguments); + if (this._tpInit) return; + this._tpInit = true; + const w = this.widgets?.find(w => w.name === cfg.widget); + if (!w) return; + syncInputs(this, cfg, Math.max(1, Math.min(cfg.max, w.value || 1))); + const prev = w.callback; + w.callback = function (v) { + if (prev) prev.call(this, v); + syncInputs(this._node || this, cfg, Math.max(1, Math.min(cfg.max, v || 1))); + }; + }; + }, +}); + +function syncInputs(node, cfg, target) { + const inputs = node.inputs || []; + let count = 0; + for (const inp of inputs) if (inp.type === cfg.inputType) count++; + if (count === target) return; + + if (count < target) { + for (let i = count + 1; i <= target; i++) node.addInput(`${cfg.prefix}${i}`, cfg.inputType); + } else { + const idx = []; + for (let i = 0; i < inputs.length; i++) if (inputs[i].type === cfg.inputType) idx.push(i); + for (let i = 0; i < count - target; i++) node.removeInput(idx[idx.length - 1 - i]); + } + node.setSize(node.computeSize()); + app.graph.change(); +} + +/* ============ Ref Independent(四项同步增删)============ */ + +app.registerExtension({ + name: EXT_NAME + "-refind", + beforeRegisterNodeDef(nodeType, nodeData, app) { + if (nodeData.name !== "DynamicRefIndependent") return; + + // onConfigure:从 JSON 恢复后触发,此时 widget 值已正确,输出槽为后端全量(20个) + // 用 w.value 裁剪到 N*2 个 + const origConfigure = nodeType.prototype.onConfigure; + nodeType.prototype.onConfigure = function () { + origConfigure?.apply(this, arguments); + requestAnimationFrame(() => { + const w = this.widgets?.find(w => w.name === "num_images"); + if (!w) return; + const n = Math.max(1, Math.min(10, w.value || 1)); + applyRefInd(this, n); + }); + }; + + // onNodeCreated:新拖入的节点(首次创建,无 JSON 恢复) + const origCreated = nodeType.prototype.onNodeCreated; + nodeType.prototype.onNodeCreated = function () { + origCreated?.apply(this, arguments); + if (this._tpRefInd) return; + this._tpRefInd = true; + const w = this.widgets?.find(w => w.name === "num_images"); + if (!w) return; + const n = Math.max(1, Math.min(10, w.value || 1)); + applyRefInd(this, n); + const prev = w.callback; + w.callback = function (v) { + if (prev) prev.call(this, v); + applyRefInd(this._node || this, Math.max(1, Math.min(10, v || 1))); + }; + }; + }, +}); + +/** + * Ref Independent:同步增删 + * 1. IMAGE 输入槽:image1 ~ imageN(增删) + * 2. prompt 控件:prompt1 ~ promptN(hidden 显示/隐藏) + * 3. 输出槽:cond_1, latent1, cond_2, latent2, ..., cond_N, latentN(增删,交替排列) + * + * 关键:输出顺序必须和后端 RETURN_TYPES 交替排列一致: + * RETURN_TYPES = (CONDITIONING, LATENT, CONDITIONING, LATENT, ...) + * 后端固定 20 个输出,前端通过 removeOutput 裁剪到 N*2 个 + * 裁剪时从末尾移除,保留前 N*2 个(index 0~2N-1),这样已有连线不受影响 + */ +function applyRefInd(node, n) { + // ---- 1. 增删 IMAGE 输入槽 ---- + const inputs = node.inputs || []; + let imgCount = 0; + for (const inp of inputs) if (inp.type === "IMAGE") imgCount++; + if (imgCount < n) { + for (let i = imgCount + 1; i <= n; i++) node.addInput(`image${i}`, "IMAGE"); + } else if (imgCount > n) { + const idx = []; + for (let i = 0; i < inputs.length; i++) if (inputs[i].type === "IMAGE") idx.push(i); + for (let i = 0; i < imgCount - n; i++) node.removeInput(idx[idx.length - 1 - i]); + } + + // ---- 2. 隐藏/显示 prompt 控件 ---- + for (const w of (node.widgets || [])) { + if (w.name && w.name.startsWith("prompt")) { + const num = parseInt(w.name.replace("prompt", ""), 10); + w.hidden = num > n; + } + } + + // ---- 3. 调整输出槽 ---- + // 后端固定 20 个输出(10 对 cond_X/latentX),需要裁剪到 N*2 个 + // 策略:只从末尾 removeOutput,不重建前面的,保护已有连线 + const expectedCount = n * 2; + while (node.outputs && node.outputs.length > expectedCount) { + node.removeOutput(node.outputs.length - 1); + } + // 如果不够(理论上不应该发生,除非后端定义改了),补齐 + while (node.outputs && node.outputs.length < expectedCount) { + const i = Math.floor(node.outputs.length / 2) + 1; + if (node.outputs.length % 2 === 0) { + node.addOutput(`cond_${i}`, "CONDITIONING"); + } else { + node.addOutput(`latent${i}`, "LATENT"); + } + } + + node.setSize(node.computeSize()); + app.graph.change(); +} diff --git a/multi_ref_encode.py b/multi_ref_encode.py new file mode 100644 index 0000000..aa8fcf5 --- /dev/null +++ b/multi_ref_encode.py @@ -0,0 +1,576 @@ +""" +Multi-Reference Image Encode Node +Supports 3/5/10 reference images for Qwen2.5-VL / FLUX2 workflows. +Each image is encoded into a reference latent and injected into conditioning. + +Version: 3.0 - Multiple node classes (3/5/10 images) + Custom output size for img2img +""" + +import math +import torch +import comfy.utils +import node_helpers + + +class DynamicRefImageEncode: + """ + 动态 Ref Image Encode 节点,合并原 III/V/X 三个节点。 + 前端 JS 根据 num_images 增删 IMAGE 输入槽(1~10)。 + 所有参考图共享同一个 prompt,输出 1 个 conditioning + 1 个 latent。 + """ + + @classmethod + def INPUT_TYPES(cls): + opt = {} + for i in range(1, 11): + opt[f"image{i}"] = ("IMAGE",) + return { + "required": { + "clip": ("CLIP",), + "vae": ("VAE",), + "num_images": ("INT", {"default": 1, "min": 1, "max": 10, "step": 1}), + "prompt": ("STRING", {"multiline": True, "dynamicPrompts": True}), + "instruction": ("STRING", { + "multiline": True, + "default": ( + "Describe the key features of the input image (color, shape, size, " + "texture, objects, background), then explain how the user's text " + "instruction should alter or modify the image. Generate a new image " + "that meets the user's requirements while maintaining consistency " + "with the original input where appropriate." + ), + }), + }, + "optional": { + **opt, + "模型类型": (["Flux2", "SD / SDXL"], {"default": "Flux2"}), + "匹配原图尺寸": (["OFF", "ON"], {"default": "OFF"}), + "输出宽度": ("INT", {"default": 1024, "min": 256, "max": 4096, "step": 8}), + "输出高度": ("INT", {"default": 1024, "min": 256, "max": 4096, "step": 8}), + }, + } + + RETURN_TYPES = ("CONDITIONING", "LATENT") + RETURN_NAMES = ("conditioning", "latent") + FUNCTION = "encode" + CATEGORY = "Toggle-Pass" + + def _get_system_prompt(self, instruction): + prefix = "<|im_start|>system\n" + suffix = "<|im_end|>\n<|im_start|>user\n{}<|im_end|>\n<|im_start|>assistant\n" + content = instruction if instruction.strip() else ( + "Describe the key features of the input image (color, shape, size, " + "texture, objects, background), then explain how the user's text " + "instruction should alter or modify the image. Generate a new image " + "that meets the user's requirements while maintaining consistency " + "with the original input where appropriate." + ) + if prefix in content: + content = content.split(prefix)[1] + if suffix in content: + content = content.split(suffix)[0] + content = content.replace("{}", "") + return prefix + content + suffix + + def encode(self, clip, num_images, prompt, instruction="", + vae=None, 模型类型="Flux2", 匹配原图尺寸="OFF", + 输出宽度=1024, 输出高度=1024, **kwargs): + + n = max(1, min(10, int(num_images))) + llama_template = self._get_system_prompt(instruction) + + ref_latents = [] + vl_images = [] + image_prompt = "" + + for i in range(1, n + 1): + image = kwargs.get(f"image{i}", None) + if image is None: + continue + + samples = image.movedim(-1, 1) # [B, C, H, W] + current_total = samples.shape[3] * samples.shape[2] + + if 匹配原图尺寸 == "ON": + pixel_width = samples.shape[3] + pixel_height = samples.shape[2] + else: + pixel_width = 输出宽度 + pixel_height = 输出高度 + + if vae is not None: + s = comfy.utils.common_upscale(samples, pixel_width, pixel_height, "lanczos", "center") + img_for_vae = s.movedim(1, -1) + ref_latents.append(vae.encode(img_for_vae[:, :, :, :3])) + + # VL image: resize down for vision-language token + vl_total = 384 * 384 + vl_scale = math.sqrt(vl_total / current_total) + vl_w = round(samples.shape[3] * vl_scale) + vl_h = round(samples.shape[2] * vl_scale) + s_vl = comfy.utils.common_upscale(samples, vl_w, vl_h, "lanczos", "center") + img_vl = s_vl.movedim(1, -1) + + vl_images.append(img_vl) + # 注意:不要手动加 <|vision_start|><|image_pad|><|vision_end|> + # ComfyUI 的 Qwen2.5-VL CLIP tokenizer 会在 images 参数传入时自动插入这些 token + image_prompt += "Picture {}: ".format(len(vl_images)) + + full_prompt = image_prompt + prompt + tokens = clip.tokenize(full_prompt, images=vl_images, llama_template=llama_template) + conditioning = clip.encode_from_tokens_scheduled(tokens) + + if len(ref_latents) > 0: + conditioning = node_helpers.conditioning_set_values( + conditioning, + {"reference_latents": ref_latents}, + append=True, + ) + latent_out = {"samples": ref_latents[0]} + else: + scale = 16 if 模型类型 == "Flux2" else 8 + lw = 输出宽度 // scale + lh = 输出高度 // scale + latent_out = {"samples": torch.zeros(1, 4, lh, lw)} + + return (conditioning, latent_out) + + +NODE_CLASS_MAPPINGS = { + "DynamicRefImageEncode": DynamicRefImageEncode, +} + +NODE_DISPLAY_NAME_MAPPINGS = { + "DynamicRefImageEncode": "Ref Image Encode", +} + + + + +# ==================== Multi Ref Latent Input Nodes ==================== +# 接收多个 LATENT 输入,打包进 conditioning 的 reference_latents +# 和图片版本不同:这些节点直接接收 latent,不需要 VAE 编码 +# ==================================================================== + + +class DynamicRefLatentInput: + """ + 动态 LATENT 输入节点,前端 JS 提供 +/- 按钮增减输入槽。 + 后端固定定义 latent1~latent10,由 num_latents 控制生效数量。 + """ + @classmethod + def INPUT_TYPES(cls): + optional = {} + for i in range(1, 11): + optional[f"latent{i}"] = ("LATENT",) + return { + "required": { + "conditioning": ("CONDITIONING",), + "num_latents": ("INT", {"default": 1, "min": 1, "max": 10, "step": 1}), + }, + "optional": optional, + } + + RETURN_TYPES = ("CONDITIONING",) + RETURN_NAMES = ("conditioning",) + FUNCTION = "pack" + CATEGORY = "Toggle-Pass" + + def pack(self, conditioning, num_latents, **kwargs): + ref_latents = [] + n = max(1, min(10, int(num_latents))) + for i in range(1, n + 1): + lat = kwargs.get(f"latent{i}", None) + if lat is not None and "samples" in lat: + ref_latents.append(lat["samples"]) + + if len(ref_latents) == 0: + return (conditioning,) + + return (node_helpers.conditioning_set_values( + conditioning, + {"reference_latents": ref_latents}, + append=True, + ),) + + +NODE_CLASS_MAPPINGS["DynamicRefLatentInput"] = DynamicRefLatentInput +NODE_DISPLAY_NAME_MAPPINGS["DynamicRefLatentInput"] = "Ref Latent Input" + + + + + +# ==================== Image Batcher ==================== +# 把多个独立 IMAGE 输入打包成 1 个 batch IMAGE 输出 +# ====================================================== + + +class ImageBatcher: + """ + 动态 IMAGE 输入节点,前端 JS 提供 +/- 按钮增减输入槽。 + 把多个独立 IMAGE 打包成一个 batch IMAGE 输出。 + 后端固定定义 image1~image10,由 num_images 控制生效数量。 + """ + + @classmethod + def INPUT_TYPES(cls): + optional = {} + for i in range(1, 11): + optional[f"image{i}"] = ("IMAGE",) + return { + "required": { + "num_images": ("INT", {"default": 1, "min": 1, "max": 10, "step": 1}), + }, + "optional": optional, + } + + RETURN_TYPES = ("IMAGE",) + RETURN_NAMES = ("images",) + FUNCTION = "batch" + CATEGORY = "Toggle-Pass" + + def batch(self, num_images, **kwargs): + images = [] + n = max(1, min(10, int(num_images))) + for i in range(1, n + 1): + img = kwargs.get(f"image{i}", None) + if img is not None: + images.append(img) + + if len(images) == 0: + return (torch.zeros(1, 64, 64, 3),) + + # 把所有图片缩放成相同尺寸(以第一张图为基准) + target_h = images[0].shape[1] + target_w = images[0].shape[2] + + resized = [] + for img in images: + h, w = img.shape[1], img.shape[2] + if h != target_h or w != target_w: + img = img.movedim(-1, 1) # [B, H, W, C] -> [B, C, H, W] + img = comfy.utils.common_upscale(img, target_w, target_h, "lanczos", "center") + img = img.movedim(1, -1) # [B, C, H, W] -> [B, H, W, C] + resized.append(img) + + result = torch.cat(resized, dim=0) + return (result,) + + +NODE_CLASS_MAPPINGS["ImageBatcher"] = ImageBatcher +NODE_DISPLAY_NAME_MAPPINGS["ImageBatcher"] = "Image Batcher" + + +# ==================== One Image Multi Prompt ==================== +# 1 张参考图 + 多个 prompt → 多组 conditioning + 1 个共享 latent +# 顺序执行,避免显存爆炸 +# ================================================================ + + +class OneImageMultiPrompt: + """ + 1 张参考图 + 多个 prompt → 多组独立 conditioning + 1 个共享 latent。 + 图片只预处理一次,然后逐个 prompt 顺序编码(节省显存)。 + 每组 conditioning 可外接独立的 Sampler 采样不同效果。 + """ + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "clip": ("CLIP",), + "image": ("IMAGE",), + "prompt数量": ("INT", {"default": 4, "min": 2, "max": 8, "step": 1}), + }, + "optional": { + "vae": ("VAE",), + "instruction": ("STRING", { + "multiline": True, + "default": ( + "Describe the key features of the input image (color, shape, size, " + "texture, objects, background), then explain how the user's text " + "instruction should alter or modify the image. Generate a new image " + "that meets the user's requirements while maintaining consistency " + "with the original input where appropriate." + ), + }), + "模型类型": (["Flux2", "SD / SDXL"], {"default": "Flux2"}), + "匹配原图尺寸": (["OFF", "ON"], {"default": "OFF"}), + "输出宽度": ("INT", {"default": 1024, "min": 256, "max": 4096, "step": 8}), + "输出高度": ("INT", {"default": 1024, "min": 256, "max": 4096, "step": 8}), + "prompt1": ("STRING", {"multiline": True, "default": ""}), + "prompt2": ("STRING", {"multiline": True, "default": ""}), + "prompt3": ("STRING", {"multiline": True, "default": ""}), + "prompt4": ("STRING", {"multiline": True, "default": ""}), + "prompt5": ("STRING", {"multiline": True, "default": ""}), + "prompt6": ("STRING", {"multiline": True, "default": ""}), + "prompt7": ("STRING", {"multiline": True, "default": ""}), + "prompt8": ("STRING", {"multiline": True, "default": ""}), + }, + } + + RETURN_TYPES = ("CONDITIONING",) * 8 + ("LATENT",) + RETURN_NAMES = ("cond_1", "cond_2", "cond_3", "cond_4", + "cond_5", "cond_6", "cond_7", "cond_8", "latent") + FUNCTION = "encode" + CATEGORY = "Toggle-Pass" + + def _get_system_prompt(self, instruction): + prefix = "<|im_start|>system\n" + suffix = "<|im_end|>\n<|im_start|>user\n{}<|im_end|>\n<|im_start|>assistant\n" + content = instruction if instruction.strip() else ( + "Describe the key features of the input image (color, shape, size, " + "texture, objects, background), then explain how the user's text " + "instruction should alter or modify the image. Generate a new image " + "that meets the user's requirements while maintaining consistency " + "with the original input where appropriate." + ) + if prefix in content: + content = content.split(prefix)[1] + if suffix in content: + content = content.split(suffix)[0] + content = content.replace("{}", "") + return prefix + content + suffix + + def encode(self, clip, image, prompt数量=4, + vae=None, instruction="", 模型类型="Flux2", + 匹配原图尺寸="OFF", 输出宽度=1024, 输出高度=1024, + **kwargs): + + n = max(2, min(8, int(prompt数量))) + llama_template = self._get_system_prompt(instruction) + + # ---- 图片预处理(只做一次)---- + samples = image.movedim(-1, 1) # [B, C, H, W] + current_total = samples.shape[3] * samples.shape[2] + + if 匹配原图尺寸 == "ON": + pixel_width = samples.shape[3] + pixel_height = samples.shape[2] + else: + pixel_width = 输出宽度 + pixel_height = 输出高度 + + # VAE 编码参考图(图生图用) + ref_latent = None + if vae is not None: + s = comfy.utils.common_upscale(samples, pixel_width, pixel_height, "lanczos", "center") + img_for_vae = s.movedim(1, -1) + ref_latent = vae.encode(img_for_vae[:, :, :, :3]) + + # VL 缩放(给 CLIP vision encoder 用的图) + vl_total = 384 * 384 + vl_scale = math.sqrt(vl_total / current_total) + vl_w = round(samples.shape[3] * vl_scale) + vl_h = round(samples.shape[2] * vl_scale) + s_vl = comfy.utils.common_upscale(samples, vl_w, vl_h, "lanczos", "center") + vl_image = s_vl.movedim(1, -1) # [B, H, W, C] + + # 图片 prompt 片段(固定不变) + # 注意:不要手动加 <|vision_start|><|image_pad|><|vision_end|> + # ComfyUI 的 Qwen2.5-VL CLIP tokenizer 会在 images 参数传入时自动插入这些 token + image_prompt = "Picture 1: " + + # ---- 顺序编码每个 prompt ---- + results = [] + for i in range(n): + p = kwargs.get(f"prompt{i + 1}", "") + full_prompt = image_prompt + p + tokens = clip.tokenize(full_prompt, images=[vl_image], llama_template=llama_template) + cond = clip.encode_from_tokens_scheduled(tokens) + + if ref_latent is not None: + cond = node_helpers.conditioning_set_values( + cond, + {"reference_latents": [ref_latent]}, + append=True, + ) + + results.append(cond) + + # ---- 共享 latent 输出 ---- + if ref_latent is not None: + latent_out = {"samples": ref_latent} + else: + # 纯文生图 + scale = 16 if 模型类型 == "Flux2" else 8 + lw = 输出宽度 // scale + lh = 输出高度 // scale + latent_out = {"samples": torch.zeros(1, 4, lh, lw)} + + # 补齐到 8 个 conditioning(未使用的填空 conditioning) + while len(results) < 8: + results.append((torch.zeros(1, 768), {})) + + # 释放临时张量 + del samples, vl_image + if ref_latent is not None: + del ref_latent + + return (*results, latent_out) + + +NODE_CLASS_MAPPINGS["OneImageMultiPrompt"] = OneImageMultiPrompt +NODE_DISPLAY_NAME_MAPPINGS["OneImageMultiPrompt"] = "一图多视角" +# ==================== Ref Independent Output ==================== +# 每张图片独立编码,conditioning 和 latent 完全隔离,无交叉 +# 每张图走独立通道,适合需要完全独立控制每张参考图的场景 +# ================================================================ + + + +class DynamicRefIndependent: + """ + 动态独立参考图编码节点。 + 前端 JS 根据 num_images 同步增删: + - IMAGE 输入槽 (image1~imageN) + - prompt 控件 (prompt1~promptN) + - CONDITIONING 输出槽 (cond_1~cond_N) + - LATENT 输出槽 (latent1~latentN) + 每张图独立编码,输出自己的 CONDITIONING 和 LATENT。 + 共 2*N 个输出:cond_1, latent1, cond_2, latent2, ..., cond_N, latentN + """ + + @classmethod + def INPUT_TYPES(cls): + opt = {} + for i in range(1, 11): + opt[f"image{i}"] = ("IMAGE",) + opt[f"prompt{i}"] = ("STRING", {"multiline": True, "default": ""}) + return { + "required": { + "clip": ("CLIP",), + "vae": ("VAE",), + "num_images": ("INT", {"default": 1, "min": 1, "max": 10, "step": 1}), + "instruction": ("STRING", { + "multiline": True, + "default": ( + "Describe the key features of the input image (color, shape, size, " + "texture, objects, background), then explain how the user's text " + "instruction should alter or modify the image. Generate a new image " + "that meets the user's requirements while maintaining consistency " + "with the original input where appropriate." + ), + }), + }, + "optional": { + **opt, + }, + } + + # 输出顺序:cond_1, latent1, cond_2, latent2, ..., cond_10, latent10(交替) + # 每组:1个 CONDITIONING + 1个 LATENT(每张图各自独立的 latent) + # 前端通过 removeOutput 只保留 N 组(N*2 个输出槽) + RETURN_TYPES = tuple( + item + for i in range(10) + for item in ("CONDITIONING", "LATENT") + ) + RETURN_NAMES = tuple( + item + for i in range(1, 11) + for item in (f"cond_{i}", f"latent{i}") + ) + FUNCTION = "encode" + CATEGORY = "Toggle-Pass" + + def _get_system_prompt(self, instruction): + prefix = "<|im_start|>system\n" + suffix = "<|im_end|>\n<|im_start|>user\n{}<|im_end|>\n<|im_start|>assistant\n" + content = instruction if instruction.strip() else ( + "Describe the key features of the input image (color, shape, size, " + "texture, objects, background), then explain how the user's text " + "instruction should alter or modify the image. Generate a new image " + "that meets the user's requirements while maintaining consistency " + "with the original input where appropriate." + ) + if prefix in content: + content = content.split(prefix)[1] + if suffix in content: + content = content.split(suffix)[0] + content = content.replace("{}", "") + return prefix + content + suffix + + def encode(self, clip, num_images, instruction="", vae=None, **kwargs): + n = max(1, min(10, int(num_images))) + llama_template = self._get_system_prompt(instruction) + conds = [] + latents = [] # 每张图自己的 latent + first_latent = None # 第一张非空图的 latent,用于共享 latent_out + + for i in range(1, n + 1): + img = kwargs.get(f"image{i}", None) + prompt = kwargs.get(f"prompt{i}", "") + + if img is None: + # 空槽:用纯文本 prompt 编码,不带图片,格式正确 + text = prompt or "" + tokens = clip.tokenize(text, llama_template=llama_template) + cond = clip.encode_from_tokens_scheduled(tokens) + conds.append(cond) + latents.append(None) # 空槽没有 latent + continue + + samples = img.movedim(-1, 1) + current_total = samples.shape[3] * samples.shape[2] + + # ---- VAE 编码(每张图独立编码自己的 latent)---- + img_latent = None + if vae is not None: + s = comfy.utils.common_upscale(samples, samples.shape[3], samples.shape[2], "lanczos", "center") + img_for_vae = s.movedim(1, -1) + img_latent = vae.encode(img_for_vae[:, :, :, :3]) + del s, img_for_vae + if first_latent is None: + first_latent = img_latent # 记录第一张图的 latent 作为 latent_out + + # ---- VL 编码 ---- + vl_total = 384 * 384 + vl_scale = math.sqrt(vl_total / current_total) + vl_w = round(samples.shape[3] * vl_scale) + vl_h = round(samples.shape[2] * vl_scale) + s_vl = comfy.utils.common_upscale(samples, vl_w, vl_h, "lanczos", "center") + vl_image = s_vl.movedim(1, -1) + + # ---- tokenize + encode ---- + image_tag = "Picture 1: " + full_prompt = image_tag + (prompt or "") + tokens = clip.tokenize(full_prompt, images=[vl_image], llama_template=llama_template) + cond = clip.encode_from_tokens_scheduled(tokens) + + # ---- 每张图的 conditioning 绑定自己的 latent ---- + if img_latent is not None: + cond = node_helpers.conditioning_set_values( + cond, + {"reference_latents": [img_latent]}, + append=True, + ) + + conds.append(cond) + latents.append(img_latent) + del samples, s_vl, vl_image + + # 补齐到 10 个 conditioning + while len(conds) < 10: + conds.append((torch.zeros(1, 768), {})) + while len(latents) < 10: + latents.append(None) + + # 共享 latent_out(取第一张非空图的 latent,供下游 Empty Latent 参考尺寸用) + if first_latent is None: + first_latent = torch.zeros(1, 4, 1, 1) + latent_out = {"samples": first_latent} + + # 返回:交替排列 cond_1, latent1, cond_2, latent2, ... + # 每个 latentN 槽输出对应图的 latent(空槽用 latent_out 兜底) + results = [] + for i in range(10): + results.append(conds[i]) + lat_i = latents[i] + results.append({"samples": lat_i} if lat_i is not None else latent_out) + return (*results,) + + +NODE_CLASS_MAPPINGS["DynamicRefIndependent"] = DynamicRefIndependent +NODE_DISPLAY_NAME_MAPPINGS["DynamicRefIndependent"] = "Ref Independent" diff --git a/workflow_to_png.py b/workflow_to_png.py new file mode 100644 index 0000000..d137547 --- /dev/null +++ b/workflow_to_png.py @@ -0,0 +1,70 @@ +""" +把 example_workflows/ 目录下的 .json 工作流 +转成可直接拖入 ComfyUI 的 PNG 图片。 + +用法: + python workflow_to_png.py + +输出:每个 JSON 文件旁边生成同名 .png +(PIL 未安装时会自动提示安装命令) +""" + +import json +import os +import sys + +WORKFLOWS_DIR = os.path.join(os.path.dirname(__file__), "example_workflows") + +# ---------- 尝试导入 PIL ---------- +try: + from PIL import Image, PngImagePlugin +except ImportError: + print("缺少 Pillow,请先运行:") + print(" pip install Pillow") + sys.exit(1) + + +def json_to_png(json_path: str) -> str: + """把单个 JSON 工作流嵌入 PNG,返回输出路径。""" + with open(json_path, "r", encoding="utf-8") as f: + workflow_text = f.read() + + # 解析一次确保合法 JSON + json.loads(workflow_text) + + # 生成一张 1×1 的透明占位图(ComfyUI 只需要元数据,图像内容无关紧要) + img = Image.new("RGB", (1, 1), color=(30, 30, 30)) + + meta = PngImagePlugin.PngInfo() + meta.add_text("workflow", workflow_text) + + out_path = os.path.splitext(json_path)[0] + ".png" + img.save(out_path, pnginfo=meta, compress_level=9) + return out_path + + +def main(): + json_files = [ + os.path.join(WORKFLOWS_DIR, f) + for f in os.listdir(WORKFLOWS_DIR) + if f.endswith(".json") + ] + + if not json_files: + print("没有找到 .json 文件") + return + + print(f"共找到 {len(json_files)} 个工作流文件:\n") + for jf in json_files: + try: + out = json_to_png(jf) + print(f" ✓ {os.path.basename(jf)}") + print(f" → {os.path.basename(out)}") + except Exception as e: + print(f" ✗ {os.path.basename(jf)} 错误: {e}") + + print("\n完成!把生成的 .png 直接拖入 ComfyUI 即可恢复工作流。") + + +if __name__ == "__main__": + main()