- - - - - - - - - - - - - - - - - - - - - - - - - -
🔽 GET THE FREE WORKFLOWS & 1000 BONUS COINS 🔽
✨ Register on RunningHub through my link to get 1000 FREE RH Coins!
💰 Plus, claim 100 extra coins every single day just by logging in.
1️⃣AI APP: Qwen edit AioV18Dual Image Edit(N SFW):
https://www.runninghub.ai/ai-detail/2006095458510311425/?inviteCode=rh-v1291
2️⃣AI APP: Qwen edit AioV18Single Image Edit(N SFW ZIPversio):
https://www.runninghub.ai/ai-detail/2006097925251796994/?inviteCode=rh-v1291
🔽Free download workflow and models/Loras 🔽
1️⃣Download link for Qwen Edit 2511 (Online storage):
https://pan.quark.cn/s/56442da3e9c5
2️⃣Comfy-Org/Qwen-Image-Edit_ComfyUI
https://huggingface.co/Comfy-Org/Qwen-Image-Edit_ComfyUI/tree/main/split_files/diffusion_models
3️⃣Download link for Qwen Edit Aio V18 (Online storage):
https://pan.quark.cn/s/56442da3e9c5
4️⃣Qwen-Image-Edit-Rapid-AIO:
https://huggingface.co/Phr00t/Qwen-Image-Edit-Rapid-AIO/tree/main/v18
Description
FAQ
Comments (24)
Great workflow, but i wonder if you can add inpaint cropping, so only the masked area will be affected instead of the entire image. Like often when i just want to change cloth, it also changes the face etc.
You may add a mask functionality. You can edit directly on the loaded image, then connect the mask output port to the mask of the "LayerUtility". Subsequently, connect the mask from the "LayerUtility" to the mask of the "Qwen Edit Config Preparer".
@BiuBoomFlow Thanks for the reply. I tried, but now the output is just always 1:1 the same as the input. Connected "Load Image" Mask to "LayerUtility: ImageScaleByAspectRatio V2" and from there i connected Mask to "Qwen Edit Config Preparer" but it doesnt work.
@HanaShiina It's rather odd. I just tried the connection myself, and my output results were perfectly fine. You need to save the mask you've drawn in the "Load Image" section before proceeding with the connection.
@BiuBoomFlow I saved it, this is how it looks like on my end HhFCTuR.png (1847×885)
@HanaShiina The connection is correct, but you need to right-click the "load image" node and select Edit Mask. Then paint over the eye area, click Save, and you will see the eye region in the "load image" node disappear. Only then will the mask be passed into the latent space.
还是有点偏移,不知道是不是图片的关系,总体好了很多,可用状态
如果想要完全0偏移,可以尝试在上传图片那里画mask,然后连接按照图片的连接顺序接入,可以实现0偏移
I am new to this. Overall this workflow does exactly what I was looking for. So I'm excited to be using it. But I have questions. Areolas have a slightly visible circles or swirl. and sometimes get a little messy around the outside. Is there a setting or even just prompt to help those little issues less of an issue. Also is there a way of creating a bit more variety to the nipples or even just changing them? I have seen loras that have really nice nipples that i would like to use. is there a way for me to add those in.
The aioV18 model has essentially integrated numerous NSFW-oriented LORA parameters. While incorporating additional LORA parameters is feasible, it is advisable to reduce their weighting. You might first experiment with refining your prompt descriptions to achieve your desired outcome. Should you seek exceptionally fair and smooth skin tones, consider utilising Zimage's model. For a more CG-inspired aesthetic, the Pony model may prove suitable. These can all be found within the community, where resources are plentiful.
@BiuBoomFlow alright. well thank you lots for this work flow creation though =D . i havent seen any others out there that do what this one does. i have been enjoying using it for sure. just needa find a img2img model that can do what i want it do and as easy to use right on load up as this one.
@scoutssfm What function are you referring to when you mention img2img?
@BiuBoomFlow add more detail to skin. but as i play more with this and prompts and such. im also noticing that the image itself is also a factor. cause some results will be pretty good. and others will not be as good. example around the waist will be a clear line and a weird color change where the panties were. like a 3d model and its edges not being connected and its texture was off. but another image will have just perfect waist generation. if i wanted to get deep id learn photoshop. but this is just for fun and messing around. in a month i probably wont even be messing this AI stuff anymore. so i wont even worry much about it anymore really.
@scoutssfm Never mind, models are advancing so rapidly these days that many issues may be perfectly resolved by the release of the next generation of models before a 100% solution is even found.
great workflow. I couldn't use your qwen edit because quark doesn't allow foreign phone numbers to sign up :(. I used Phr00t's qwen rapid edit and it worked very well
Comfyui-QwenEditUtils:
https://github.com/lrzjason/Comfyui-QwenEditUtils
Thank you for your interest. You may download the editor via this GitHub repository.
更新comfyui以后突然用不了了,报错
[GetNode] ✗ Variable 'output' not found! Available: STRING, INT, IMAGE Tip: Make sure SetNode runs BEFORE GetNode in the graph.
这个看上去是某个"get"节点链接的顺序错了或者丢失了
@BiuBoomFlow 没有进行过任何节点的改动,重新下载了工作流也还是不行o(╥﹏╥)o
@azur 有点奇怪..你有没有更新一下comfyui的本体,建议你先试一下官方的qwen 2511的工作流,如果能运行那本体就没问题. 另外报错的意思很明确是get跟set的问题.或者你可以尝试所有线都直连,跳过我设置的get跟set.
@BiuBoomFlow 谢谢老大,刚才让gemini写了个自动修复脚本居然突然能跑了,困扰了我好几天
import json
import sys
import os
def fix_workflow(file_path):
if not os.path.exists(file_path):
print(f"❌ 找不到文件: {file_path}")
return
print(f"📖 正在读取: {file_path} ...")
try:
with open(file_path, 'r', encoding='utf-8') as f:
data = json.load(f)
except Exception as e:
print(f"❌ JSON 读取失败: {e}")
return
nodes = data.get('nodes', [])
links = data.get('links', [])
# 1. 建立索引
# 找到所有的 Set 节点和 Get 节点
set_nodes = {} # Key: 变量名, Value: {node_id, source_link_id}
get_nodes = [] # List: {node_id, var_name, output_slot_links}
# 辅助:Link 查找表 {link_id: [origin_id, origin_slot, target_id, target_slot, type]}
link_map = {l[0]: l for l in links if l}
print("🔍 正在分析节点逻辑...")
for node in nodes:
node_type = str(node.get('type', '')).lower()
widgets = node.get('widgets_values', [])
# 提取变量名 (通常是 widget 的第一个字符串)
var_name = None
if widgets and isinstance(widgets, list):
for w in widgets:
if isinstance(w, str) and w.strip():
var_name = w
break
if not var_name:
continue
# 判断是否为 Set 节点 (KJNodes / RGThree 等)
if "set" in node_type and ("node" in node_type or "var" in node_type or "image" in node_type):
# 找到 Set 节点的输入源
inputs = node.get('inputs', [])
source_link_id = None
if inputs:
# 假设第一个输入就是数据源 (大部分 SetNode 只有一个主输入)
source_link_id = inputs[0].get('link')
if source_link_id:
if var_name not in set_nodes:
set_nodes[var_name] = []
set_nodes[var_name].append({
'id': node['id'],
'source_link_id': source_link_id
})
# 判断是否为 Get 节点
elif "get" in node_type and ("node" in node_type or "var" in node_type or "image" in node_type):
get_nodes.append({
'id': node['id'],
'var_name': var_name,
'outputs': node.get('outputs', [])
})
# 2. 生成新的 Link ID
# 找到当前最大的 link id,防止冲突
max_link_id = 0
for l in links:
if l and isinstance(l[0], int):
if l[0] > max_link_id:
max_link_id = l[0]
new_link_id_counter = max_link_id + 1
# 3. 执行修复 (重连线)
fixed_count = 0
print("-" * 50)
for get_node in get_nodes:
var_name = get_node['var_name']
# 检查是否有对应的 Set 节点
if var_name in set_nodes:
targets = set_nodes[var_name]
# 如果有多个同名 Set,默认取第一个(通常是最近修改的或唯一的)
target_set = targets[0]
source_link_id = target_set['source_link_id']
# 获取数据源头的节点信息
source_link_data = link_map.get(source_link_id)
if not source_link_data:
continue
origin_node_id = source_link_data[1]
origin_slot = source_link_data[2]
link_type = source_link_data[5]
# 遍历 Get 节点的所有输出,找到它连向的下游节点
for output in get_node['outputs']:
if not output.get('links'):
continue
# 复制一份列表遍历,因为我们要修改 links
current_links = list(output['links'])
for link_id in current_links:
link_data = link_map.get(link_id)
if not link_data:
continue
target_node_id = link_data[3]
target_slot = link_data[4]
# --- 核心操作 ---
# 1. 删除旧的 Link (Get -> 下游)
if link_data in links:
links.remove(link_data)
# 2. 创建新的 Link (源头 -> 下游)
# 格式: [id, origin_id, origin_slot, target_id, target_slot, type]
new_link = [
new_link_id_counter,
origin_node_id,
origin_slot,
target_node_id,
target_slot,
link_type
]
links.append(new_link)
# 3. 更新下游节点的 inputs 数据,让它指向新 Link ID
# 这一步至关重要,否则 UI 上线连上了,但逻辑没变
for node in nodes:
if node['id'] == target_node_id:
for inp in node.get('inputs', []):
# 只有 slot_index 匹配时才更新
# ComfyUI input 没有存 slot index,通常按顺序,或者需要名字匹配
# 这里我们通过旧 link_id 匹配最稳妥
if inp.get('link') == link_id:
inp['link'] = new_link_id_counter
print(f"🔧 修复: 变量 '{var_name}' | 下游节点 ID {target_node_id} 现已直接连接到源头 ID {origin_node_id}")
new_link_id_counter += 1
fixed_count += 1
# 4. 保存文件
if fixed_count > 0:
base, ext = os.path.splitext(file_path)
new_file_path = f"{base}_fixed{ext}"
# 更新数据
data['links'] = links
data['nodes'] = nodes
with open(new_file_path, 'w', encoding='utf-8') as f:
json.dump(data, f, indent=2)
print("-" * 50)
print(f"✅ 成功! 共修复了 {fixed_count} 处连接。")
print(f"📁 已保存修复文件为: {new_file_path}")
print("💡 请在 ComfyUI 中加载这个 '_fixed' 文件。连线可能比较乱,但逻辑是通的。")
else:
print("⚠️ 未发现可修复的 Set/Get 对应关系。请确认 Set 节点有输入连线,且变量名完全一致。")
if name == "__main__":
# 支持拖拽文件
target_file = ""
if len(sys.argv) > 1:
target_file = sys.argv[1]
else:
target_file = input("请输入 .json 工作流文件路径: ").strip().strip('"')
fix_workflow(target_file)
input("\n按回车键退出...")
不过这个gemini修改过的工作流虽然能正常跑了,但是速度慢好多不知为何
@azur 🤣你都动用gemini修复了..你可以让他帮你把set跟get的都去掉..然后直接链接到对应的端口.这样就是完整的工作流了.或者你自己连也很快的.因为名字我都是命名好的.你也可以顺带了解了工作流的构造了
We found the cause of the black image.
Deleted from the bat
--use-sage-attention
--fast
--force-fp16.
And everything worked.
MAIN REASON = SAGE ATTENTION!



