RioShiina commited on
Commit
81d2307
·
verified ·
1 Parent(s): 3cb1766

Add Mage-Flow architecture model.

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. README.md +5 -0
  2. chain_injectors/reference_image_injector.py +64 -0
  3. core/pipelines/pipeline_input_processor.py +12 -0
  4. core/pipelines/sd_image_pipeline.py +2 -0
  5. core/pipelines/workflow_executor.py +24 -0
  6. core/pipelines/workflow_recipes/_partials/_base_sampler_sd.yaml +0 -8
  7. core/pipelines/workflow_recipes/_partials/conditioning/anima.yaml +8 -0
  8. core/pipelines/workflow_recipes/_partials/conditioning/auraflow.yaml +56 -48
  9. core/pipelines/workflow_recipes/_partials/conditioning/boogu-image.yaml +66 -58
  10. core/pipelines/workflow_recipes/_partials/conditioning/chroma1-radiance.yaml +8 -0
  11. core/pipelines/workflow_recipes/_partials/conditioning/chroma1.yaml +8 -0
  12. core/pipelines/workflow_recipes/_partials/conditioning/cosmos-predict2.yaml +55 -47
  13. core/pipelines/workflow_recipes/_partials/conditioning/ernie-image.yaml +8 -0
  14. core/pipelines/workflow_recipes/_partials/conditioning/flux1.yaml +8 -0
  15. core/pipelines/workflow_recipes/_partials/conditioning/hidream-i1.yaml +8 -0
  16. core/pipelines/workflow_recipes/_partials/conditioning/hidream-o1.yaml +75 -67
  17. core/pipelines/workflow_recipes/_partials/conditioning/hunyuanimage.yaml +8 -0
  18. core/pipelines/workflow_recipes/_partials/conditioning/ideogram-4.yaml +8 -0
  19. core/pipelines/workflow_recipes/_partials/conditioning/joyai-image.yaml +86 -86
  20. core/pipelines/workflow_recipes/_partials/conditioning/kandinsky-5.yaml +8 -0
  21. core/pipelines/workflow_recipes/_partials/conditioning/krea-2.yaml +8 -0
  22. core/pipelines/workflow_recipes/_partials/conditioning/lens.yaml +8 -0
  23. core/pipelines/workflow_recipes/_partials/conditioning/longcat-image.yaml +8 -0
  24. core/pipelines/workflow_recipes/_partials/conditioning/lumina.yaml +8 -0
  25. core/pipelines/workflow_recipes/_partials/conditioning/mage-flow.yaml +77 -0
  26. core/pipelines/workflow_recipes/_partials/conditioning/newbie-image.yaml +8 -0
  27. core/pipelines/workflow_recipes/_partials/conditioning/omnigen2.yaml +8 -0
  28. core/pipelines/workflow_recipes/_partials/conditioning/ovis-image.yaml +8 -0
  29. core/pipelines/workflow_recipes/_partials/conditioning/pixeldit.yaml +8 -0
  30. core/pipelines/workflow_recipes/_partials/conditioning/qwen-image.yaml +8 -0
  31. core/pipelines/workflow_recipes/_partials/conditioning/sd15.yaml +8 -0
  32. core/pipelines/workflow_recipes/_partials/conditioning/sd35.yaml +8 -0
  33. core/pipelines/workflow_recipes/_partials/conditioning/sdxl.yaml +8 -0
  34. core/pipelines/workflow_recipes/_partials/conditioning/z-image.yaml +8 -0
  35. core/pipelines/workflow_recipes/_partials/input/txt2img_hidream_o1_latent.yaml +11 -11
  36. core/pipelines/workflow_recipes/_partials/input/txt2img_none.yaml +5 -0
  37. ui/events/chain_handlers.py +33 -0
  38. ui/events/change_handlers.py +4 -3
  39. ui/events/main.py +8 -3
  40. ui/events/run_handlers.py +3 -1
  41. ui/shared/hires_fix_ui.py +2 -1
  42. ui/shared/img2img_ui.py +2 -1
  43. ui/shared/inpaint_ui.py +2 -1
  44. ui/shared/outpaint_ui.py +2 -1
  45. ui/shared/txt2img_ui.py +2 -1
  46. ui/shared/ui_components.py +29 -0
  47. yaml/constants.yaml +10 -1
  48. yaml/file_list.yaml +22 -1
  49. yaml/image_gen_features.yaml +4 -0
  50. yaml/injectors.yaml +3 -0
README.md CHANGED
@@ -52,6 +52,7 @@ models:
52
  - Comfy-Org/Lens
53
  - Comfy-Org/LongCat-Image
54
  - Comfy-Org/Lumina_Image_2.0_Repackaged
 
55
  - Comfy-Org/NewBie-image-Exp0.1_repackaged
56
  - Comfy-Org/Omnigen2_ComfyUI_repackaged
57
  - Comfy-Org/Ovis-Image
@@ -144,6 +145,10 @@ models:
144
  - meituan-longcat/LongCat-Image
145
  - microsoft/Lens
146
  - microsoft/Lens-Turbo
 
 
 
 
147
  - NewBie-AI/NewBie-image-Exp0.1
148
  - nvidia/PiD
149
  - nvidia/PixelDiT-1300M-1024px
 
52
  - Comfy-Org/Lens
53
  - Comfy-Org/LongCat-Image
54
  - Comfy-Org/Lumina_Image_2.0_Repackaged
55
+ - Comfy-Org/Mage-Flow
56
  - Comfy-Org/NewBie-image-Exp0.1_repackaged
57
  - Comfy-Org/Omnigen2_ComfyUI_repackaged
58
  - Comfy-Org/Ovis-Image
 
145
  - meituan-longcat/LongCat-Image
146
  - microsoft/Lens
147
  - microsoft/Lens-Turbo
148
+ - microsoft/Mage-Flow
149
+ - microsoft/Mage-Flow-Edit
150
+ - microsoft/Mage-Flow-Edit-Turbo
151
+ - microsoft/Mage-Flow-Turbo
152
  - NewBie-AI/NewBie-image-Exp0.1
153
  - nvidia/PiD
154
  - nvidia/PixelDiT-1300M-1024px
chain_injectors/reference_image_injector.py ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+
3
+ def inject(assembler, chain_definition, chain_items):
4
+ if not chain_items:
5
+ return
6
+
7
+ valid_images = []
8
+ for item in chain_items:
9
+ if not item:
10
+ continue
11
+ img_path = item
12
+ if isinstance(item, dict):
13
+ img_path = item.get('image') or item.get('filename') or item.get('path')
14
+ if img_path:
15
+ valid_images.append(img_path)
16
+
17
+ if not valid_images:
18
+ return
19
+
20
+ text_encode_name = chain_definition.get('text_encode_node')
21
+ text_encode_id = None
22
+ if text_encode_name and text_encode_name in assembler.node_map:
23
+ text_encode_id = assembler.node_map[text_encode_name]
24
+ else:
25
+ for node_id, node in assembler.workflow.items():
26
+ if isinstance(node, dict) and node.get('class_type') == 'TextEncodeMageFlowEdit':
27
+ text_encode_id = node_id
28
+ break
29
+
30
+ if not text_encode_id or text_encode_id not in assembler.workflow:
31
+ print("Warning: TextEncodeMageFlowEdit node not found for Reference Image chain. Skipping.")
32
+ return
33
+
34
+ vae_node_name = chain_definition.get('vae_node', 'vae_loader')
35
+ vae_node_id = assembler.node_map.get(vae_node_name)
36
+ if not vae_node_id:
37
+ for node_id, node in assembler.workflow.items():
38
+ if isinstance(node, dict) and node.get('class_type') == 'VAELoader':
39
+ vae_node_id = node_id
40
+ break
41
+
42
+ if vae_node_id:
43
+ assembler.workflow[text_encode_id]['inputs']['vae'] = [vae_node_id, 0]
44
+
45
+ for i, img_filename in enumerate(valid_images):
46
+ load_id = assembler._get_unique_id()
47
+ load_node = assembler._get_node_template("LoadImage")
48
+ load_node['inputs']['image'] = img_filename
49
+ load_node['_meta']['title'] = f"Load Reference Image {i+1}"
50
+ assembler.workflow[load_id] = load_node
51
+
52
+ scale_id = assembler._get_unique_id()
53
+ scale_node = assembler._get_node_template("ImageScaleToTotalPixels")
54
+ scale_node['inputs']['megapixels'] = 1.0
55
+ scale_node['inputs']['upscale_method'] = "nearest-exact"
56
+ scale_node['inputs']['resolution_steps'] = 1
57
+ scale_node['inputs']['image'] = [load_id, 0]
58
+ scale_node['_meta']['title'] = f"Scale Reference {i+1}"
59
+ assembler.workflow[scale_id] = scale_node
60
+
61
+ input_key = f"images.image_{i+1}"
62
+ assembler.workflow[text_encode_id]['inputs'][input_key] = [scale_id, 0]
63
+
64
+ print(f"Reference Image injector applied. Injected {len(valid_images)} reference images to TextEncodeMageFlowEdit node '{text_encode_id}'.")
core/pipelines/pipeline_input_processor.py CHANGED
@@ -351,6 +351,17 @@ def process_pipeline_inputs(ui_inputs: Dict[str, Any], progress: gr.Progress, wo
351
  temp_files_to_clean.append(temp_path)
352
  active_joyai_reference.append(os.path.basename(temp_path))
353
 
 
 
 
 
 
 
 
 
 
 
 
354
  vae_source = ui_inputs.get('vae_source')
355
  vae_id = ui_inputs.get('vae_id')
356
  vae_name_override = None
@@ -390,6 +401,7 @@ def process_pipeline_inputs(ui_inputs: Dict[str, Any], progress: gr.Progress, wo
390
  "active_reference_latents": active_reference_latents,
391
  "active_hidream_o1_reference": active_hidream_o1_reference,
392
  "active_joyai_reference": active_joyai_reference,
 
393
  "active_conditioning": active_conditioning,
394
  "temp_files_to_clean": temp_files_to_clean
395
  }
 
351
  temp_files_to_clean.append(temp_path)
352
  active_joyai_reference.append(os.path.basename(temp_path))
353
 
354
+ reference_image_data = ui_inputs.get('reference_image_data', [])
355
+ active_reference_images = []
356
+ if reference_image_data:
357
+ for img in reference_image_data:
358
+ if img:
359
+ if not os.path.exists(INPUT_DIR): os.makedirs(INPUT_DIR)
360
+ temp_path = os.path.join(INPUT_DIR, f"temp_ref_img_{random.randint(1000, 9999)}.png")
361
+ img.save(temp_path, "PNG")
362
+ temp_files_to_clean.append(temp_path)
363
+ active_reference_images.append(os.path.basename(temp_path))
364
+
365
  vae_source = ui_inputs.get('vae_source')
366
  vae_id = ui_inputs.get('vae_id')
367
  vae_name_override = None
 
401
  "active_reference_latents": active_reference_latents,
402
  "active_hidream_o1_reference": active_hidream_o1_reference,
403
  "active_joyai_reference": active_joyai_reference,
404
+ "active_reference_images": active_reference_images,
405
  "active_conditioning": active_conditioning,
406
  "temp_files_to_clean": temp_files_to_clean
407
  }
core/pipelines/sd_image_pipeline.py CHANGED
@@ -117,6 +117,7 @@ class SdImagePipeline(BasePipeline):
117
  active_reference_latents = processed["active_reference_latents"]
118
  active_hidream_o1_reference = processed["active_hidream_o1_reference"]
119
  active_joyai_reference = processed.get("active_joyai_reference", [])
 
120
  active_conditioning = processed["active_conditioning"]
121
 
122
  loras_string = f"LoRAs: [{', '.join(active_loras_for_meta)}]" if active_loras_for_meta else ""
@@ -174,6 +175,7 @@ class SdImagePipeline(BasePipeline):
174
  "reference_latent_chain": active_reference_latents,
175
  "hidream_o1_reference_chain": active_hidream_o1_reference,
176
  "joyai_reference_chain": active_joyai_reference,
 
177
  "vae_chain": [ui_inputs.get('vae_name')] if ui_inputs.get('vae_name') else [],
178
  "hidream_o1_smoothing_chain": hidream_o1_smoothing_data,
179
  "pid_chain": [ui_inputs.get('pid_settings', 'OFF')] if is_pid_enabled else [],
 
117
  active_reference_latents = processed["active_reference_latents"]
118
  active_hidream_o1_reference = processed["active_hidream_o1_reference"]
119
  active_joyai_reference = processed.get("active_joyai_reference", [])
120
+ active_reference_images = processed.get("active_reference_images", [])
121
  active_conditioning = processed["active_conditioning"]
122
 
123
  loras_string = f"LoRAs: [{', '.join(active_loras_for_meta)}]" if active_loras_for_meta else ""
 
175
  "reference_latent_chain": active_reference_latents,
176
  "hidream_o1_reference_chain": active_hidream_o1_reference,
177
  "joyai_reference_chain": active_joyai_reference,
178
+ "reference_image_chain": active_reference_images,
179
  "vae_chain": [ui_inputs.get('vae_name')] if ui_inputs.get('vae_name') else [],
180
  "hidream_o1_smoothing_chain": hidream_o1_smoothing_data,
181
  "pid_chain": [ui_inputs.get('pid_settings', 'OFF')] if is_pid_enabled else [],
core/pipelines/workflow_executor.py CHANGED
@@ -42,6 +42,30 @@ class WorkflowExecutor:
42
 
43
  try:
44
  sorted_node_ids = WorkflowExecutor.topological_sort(workflow)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
45
  print(f"--- [Workflow Executor] Execution order: {sorted_node_ids}")
46
  except RuntimeError as e:
47
  print("--- [Workflow Executor] ERROR: Failed to sort workflow. Dumping graph details. ---")
 
42
 
43
  try:
44
  sorted_node_ids = WorkflowExecutor.topological_sort(workflow)
45
+
46
+ final_node_id = None
47
+ for node_id in reversed(sorted_node_ids):
48
+ if workflow[node_id].get('class_type') == 'SaveImage':
49
+ final_node_id = node_id
50
+ break
51
+
52
+ if final_node_id:
53
+ required_nodes = set()
54
+ nodes_to_visit = [final_node_id]
55
+ while nodes_to_visit:
56
+ curr_id = nodes_to_visit.pop()
57
+ if curr_id in required_nodes:
58
+ continue
59
+ required_nodes.add(curr_id)
60
+ curr_info = workflow.get(curr_id, {})
61
+ for input_val in curr_info.get('inputs', {}).values():
62
+ if isinstance(input_val, list) and len(input_val) == 2 and isinstance(input_val[0], str):
63
+ src_id = input_val[0]
64
+ if src_id in workflow and src_id not in required_nodes:
65
+ nodes_to_visit.append(src_id)
66
+
67
+ sorted_node_ids = [nid for nid in sorted_node_ids if nid in required_nodes]
68
+
69
  print(f"--- [Workflow Executor] Execution order: {sorted_node_ids}")
70
  except RuntimeError as e:
71
  print("--- [Workflow Executor] ERROR: Failed to sort workflow. Dumping graph details. ---")
core/pipelines/workflow_recipes/_partials/_base_sampler_sd.yaml CHANGED
@@ -1,10 +1,4 @@
1
  nodes:
2
- pos_prompt:
3
- class_type: CLIPTextEncode
4
- title: "CLIP Text Encode (Positive)"
5
- neg_prompt:
6
- class_type: CLIPTextEncode
7
- title: "CLIP Text Encode (Negative)"
8
  ksampler:
9
  class_type: KSampler
10
  title: "KSampler"
@@ -25,8 +19,6 @@ connections:
25
  to: "save_image:images"
26
 
27
  ui_map:
28
- positive_prompt: "pos_prompt:text"
29
- negative_prompt: "neg_prompt:text"
30
  seed: "ksampler:seed"
31
  steps: "ksampler:steps"
32
  cfg: "ksampler:cfg"
 
1
  nodes:
 
 
 
 
 
 
2
  ksampler:
3
  class_type: KSampler
4
  title: "KSampler"
 
19
  to: "save_image:images"
20
 
21
  ui_map:
 
 
22
  seed: "ksampler:seed"
23
  steps: "ksampler:steps"
24
  cfg: "ksampler:cfg"
core/pipelines/workflow_recipes/_partials/conditioning/anima.yaml CHANGED
@@ -1,4 +1,10 @@
1
  nodes:
 
 
 
 
 
 
2
  unet_loader:
3
  class_type: UNETLoader
4
  title: "Load Diffusion Model"
@@ -57,6 +63,8 @@ dynamic_pid_chains:
57
  ksampler_node: "ksampler"
58
 
59
  ui_map:
 
 
60
  unet_name: "unet_loader:unet_name"
61
  vae_name: "vae_loader:vae_name"
62
  clip_name: "clip_loader:clip_name"
 
1
  nodes:
2
+ pos_prompt:
3
+ class_type: CLIPTextEncode
4
+ title: "CLIP Text Encode (Positive)"
5
+ neg_prompt:
6
+ class_type: CLIPTextEncode
7
+ title: "CLIP Text Encode (Negative)"
8
  unet_loader:
9
  class_type: UNETLoader
10
  title: "Load Diffusion Model"
 
63
  ksampler_node: "ksampler"
64
 
65
  ui_map:
66
+ positive_prompt: "pos_prompt:text"
67
+ negative_prompt: "neg_prompt:text"
68
  unet_name: "unet_loader:unet_name"
69
  vae_name: "vae_loader:vae_name"
70
  clip_name: "clip_loader:clip_name"
core/pipelines/workflow_recipes/_partials/conditioning/auraflow.yaml CHANGED
@@ -1,48 +1,56 @@
1
- nodes:
2
- ckpt_loader:
3
- class_type: CheckpointLoaderSimple
4
- title: "Load Checkpoint"
5
-
6
- connections:
7
- - from: "ckpt_loader:0"
8
- to: "ksampler:model"
9
- - from: "ckpt_loader:1"
10
- to: "pos_prompt:clip"
11
- - from: "ckpt_loader:1"
12
- to: "neg_prompt:clip"
13
- - from: "pos_prompt:0"
14
- to: "ksampler:positive"
15
- - from: "neg_prompt:0"
16
- to: "ksampler:negative"
17
- - from: "ckpt_loader:2"
18
- to: "vae_decode:vae"
19
- - from: "ckpt_loader:2"
20
- to: "vae_encode:vae"
21
-
22
- dynamic_vae_chains:
23
- vae_chain:
24
- targets:
25
- - "vae_decode:vae"
26
- - "vae_encode:vae"
27
-
28
- dynamic_lora_chains:
29
- lora_chain:
30
- template: "LoraLoader"
31
- start: "ckpt_loader"
32
- output_map:
33
- "0": "model"
34
- "1": "clip"
35
- input_map:
36
- "model": "model"
37
- "clip": "clip"
38
- end_input_map:
39
- "model": ["ksampler:model"]
40
- "clip": ["pos_prompt:clip", "neg_prompt:clip"]
41
-
42
- dynamic_conditioning_chains:
43
- conditioning_chain:
44
- ksampler_node: "ksampler"
45
- clip_source: "ckpt_loader:1"
46
-
47
- ui_map:
48
- model_name: "ckpt_loader:ckpt_name"
 
 
 
 
 
 
 
 
 
1
+ nodes:
2
+ pos_prompt:
3
+ class_type: CLIPTextEncode
4
+ title: "CLIP Text Encode (Positive)"
5
+ neg_prompt:
6
+ class_type: CLIPTextEncode
7
+ title: "CLIP Text Encode (Negative)"
8
+ ckpt_loader:
9
+ class_type: CheckpointLoaderSimple
10
+ title: "Load Checkpoint"
11
+
12
+ connections:
13
+ - from: "ckpt_loader:0"
14
+ to: "ksampler:model"
15
+ - from: "ckpt_loader:1"
16
+ to: "pos_prompt:clip"
17
+ - from: "ckpt_loader:1"
18
+ to: "neg_prompt:clip"
19
+ - from: "pos_prompt:0"
20
+ to: "ksampler:positive"
21
+ - from: "neg_prompt:0"
22
+ to: "ksampler:negative"
23
+ - from: "ckpt_loader:2"
24
+ to: "vae_decode:vae"
25
+ - from: "ckpt_loader:2"
26
+ to: "vae_encode:vae"
27
+
28
+ dynamic_vae_chains:
29
+ vae_chain:
30
+ targets:
31
+ - "vae_decode:vae"
32
+ - "vae_encode:vae"
33
+
34
+ dynamic_lora_chains:
35
+ lora_chain:
36
+ template: "LoraLoader"
37
+ start: "ckpt_loader"
38
+ output_map:
39
+ "0": "model"
40
+ "1": "clip"
41
+ input_map:
42
+ "model": "model"
43
+ "clip": "clip"
44
+ end_input_map:
45
+ "model": ["ksampler:model"]
46
+ "clip": ["pos_prompt:clip", "neg_prompt:clip"]
47
+
48
+ dynamic_conditioning_chains:
49
+ conditioning_chain:
50
+ ksampler_node: "ksampler"
51
+ clip_source: "ckpt_loader:1"
52
+
53
+ ui_map:
54
+ positive_prompt: "pos_prompt:text"
55
+ negative_prompt: "neg_prompt:text"
56
+ model_name: "ckpt_loader:ckpt_name"
core/pipelines/workflow_recipes/_partials/conditioning/boogu-image.yaml CHANGED
@@ -1,58 +1,66 @@
1
- nodes:
2
- unet_loader:
3
- class_type: UNETLoader
4
- title: "Load Diffusion Model"
5
- params:
6
- weight_dtype: "default"
7
- clip_loader:
8
- class_type: CLIPLoader
9
- title: "Load CLIP"
10
- params:
11
- type: "boogu"
12
- device: "default"
13
- vae_loader:
14
- class_type: VAELoader
15
- title: "Load VAE"
16
-
17
- connections:
18
- - from: "unet_loader:0"
19
- to: "ksampler:model"
20
- - from: "clip_loader:0"
21
- to: "pos_prompt:clip"
22
- - from: "clip_loader:0"
23
- to: "neg_prompt:clip"
24
- - from: "pos_prompt:0"
25
- to: "ksampler:positive"
26
- - from: "neg_prompt:0"
27
- to: "ksampler:negative"
28
- - from: "vae_loader:0"
29
- to: "vae_decode:vae"
30
- - from: "vae_loader:0"
31
- to: "vae_encode:vae"
32
-
33
- dynamic_lora_chains:
34
- lora_chain:
35
- template: "LoraLoader"
36
- output_map:
37
- "unet_loader:0": "model"
38
- "clip_loader:0": "clip"
39
- input_map:
40
- "model": "model"
41
- "clip": "clip"
42
- end_input_map:
43
- "model": ["ksampler:model"]
44
- "clip": ["pos_prompt:clip", "neg_prompt:clip"]
45
-
46
- dynamic_conditioning_chains:
47
- conditioning_chain:
48
- ksampler_node: "ksampler"
49
- clip_source: "clip_loader:0"
50
-
51
- dynamic_pid_chains:
52
- pid_chain:
53
- ksampler_node: "ksampler"
54
-
55
- ui_map:
56
- unet_name: "unet_loader:unet_name"
57
- clip_name: "clip_loader:clip_name"
58
- vae_name: "vae_loader:vae_name"
 
 
 
 
 
 
 
 
 
1
+ nodes:
2
+ pos_prompt:
3
+ class_type: CLIPTextEncode
4
+ title: "CLIP Text Encode (Positive)"
5
+ neg_prompt:
6
+ class_type: CLIPTextEncode
7
+ title: "CLIP Text Encode (Negative)"
8
+ unet_loader:
9
+ class_type: UNETLoader
10
+ title: "Load Diffusion Model"
11
+ params:
12
+ weight_dtype: "default"
13
+ clip_loader:
14
+ class_type: CLIPLoader
15
+ title: "Load CLIP"
16
+ params:
17
+ type: "boogu"
18
+ device: "default"
19
+ vae_loader:
20
+ class_type: VAELoader
21
+ title: "Load VAE"
22
+
23
+ connections:
24
+ - from: "unet_loader:0"
25
+ to: "ksampler:model"
26
+ - from: "clip_loader:0"
27
+ to: "pos_prompt:clip"
28
+ - from: "clip_loader:0"
29
+ to: "neg_prompt:clip"
30
+ - from: "pos_prompt:0"
31
+ to: "ksampler:positive"
32
+ - from: "neg_prompt:0"
33
+ to: "ksampler:negative"
34
+ - from: "vae_loader:0"
35
+ to: "vae_decode:vae"
36
+ - from: "vae_loader:0"
37
+ to: "vae_encode:vae"
38
+
39
+ dynamic_lora_chains:
40
+ lora_chain:
41
+ template: "LoraLoader"
42
+ output_map:
43
+ "unet_loader:0": "model"
44
+ "clip_loader:0": "clip"
45
+ input_map:
46
+ "model": "model"
47
+ "clip": "clip"
48
+ end_input_map:
49
+ "model": ["ksampler:model"]
50
+ "clip": ["pos_prompt:clip", "neg_prompt:clip"]
51
+
52
+ dynamic_conditioning_chains:
53
+ conditioning_chain:
54
+ ksampler_node: "ksampler"
55
+ clip_source: "clip_loader:0"
56
+
57
+ dynamic_pid_chains:
58
+ pid_chain:
59
+ ksampler_node: "ksampler"
60
+
61
+ ui_map:
62
+ positive_prompt: "pos_prompt:text"
63
+ negative_prompt: "neg_prompt:text"
64
+ unet_name: "unet_loader:unet_name"
65
+ clip_name: "clip_loader:clip_name"
66
+ vae_name: "vae_loader:vae_name"
core/pipelines/workflow_recipes/_partials/conditioning/chroma1-radiance.yaml CHANGED
@@ -1,4 +1,10 @@
1
  nodes:
 
 
 
 
 
 
2
  unet_loader:
3
  class_type: UNETLoader
4
  title: "Load Diffusion Model"
@@ -55,5 +61,7 @@ dynamic_conditioning_chains:
55
  clip_source: "t5_tokenizer:0"
56
 
57
  ui_map:
 
 
58
  unet_name: "unet_loader:unet_name"
59
  clip_name: "clip_loader:clip_name"
 
1
  nodes:
2
+ pos_prompt:
3
+ class_type: CLIPTextEncode
4
+ title: "CLIP Text Encode (Positive)"
5
+ neg_prompt:
6
+ class_type: CLIPTextEncode
7
+ title: "CLIP Text Encode (Negative)"
8
  unet_loader:
9
  class_type: UNETLoader
10
  title: "Load Diffusion Model"
 
61
  clip_source: "t5_tokenizer:0"
62
 
63
  ui_map:
64
+ positive_prompt: "pos_prompt:text"
65
+ negative_prompt: "neg_prompt:text"
66
  unet_name: "unet_loader:unet_name"
67
  clip_name: "clip_loader:clip_name"
core/pipelines/workflow_recipes/_partials/conditioning/chroma1.yaml CHANGED
@@ -1,4 +1,10 @@
1
  nodes:
 
 
 
 
 
 
2
  unet_loader:
3
  class_type: UNETLoader
4
  title: "Load Diffusion Model"
@@ -60,6 +66,8 @@ dynamic_pid_chains:
60
  ksampler_node: "ksampler"
61
 
62
  ui_map:
 
 
63
  unet_name: "unet_loader:unet_name"
64
  vae_name: "vae_loader:vae_name"
65
  clip_name: "clip_loader:clip_name"
 
1
  nodes:
2
+ pos_prompt:
3
+ class_type: CLIPTextEncode
4
+ title: "CLIP Text Encode (Positive)"
5
+ neg_prompt:
6
+ class_type: CLIPTextEncode
7
+ title: "CLIP Text Encode (Negative)"
8
  unet_loader:
9
  class_type: UNETLoader
10
  title: "Load Diffusion Model"
 
66
  ksampler_node: "ksampler"
67
 
68
  ui_map:
69
+ positive_prompt: "pos_prompt:text"
70
+ negative_prompt: "neg_prompt:text"
71
  unet_name: "unet_loader:unet_name"
72
  vae_name: "vae_loader:vae_name"
73
  clip_name: "clip_loader:clip_name"
core/pipelines/workflow_recipes/_partials/conditioning/cosmos-predict2.yaml CHANGED
@@ -1,47 +1,55 @@
1
- nodes:
2
- unet_loader:
3
- class_type: UNETLoader
4
- title: "Load Diffusion Model"
5
- params:
6
- weight_dtype: "default"
7
- vae_loader:
8
- class_type: VAELoader
9
- title: "Load VAE"
10
- clip_loader:
11
- class_type: CLIPLoader
12
- title: "Load CLIP"
13
- params:
14
- type: "cosmos"
15
- device: "default"
16
-
17
- connections:
18
- - from: "unet_loader:0"
19
- to: "ksampler:model"
20
- - from: "clip_loader:0"
21
- to: "pos_prompt:clip"
22
- - from: "clip_loader:0"
23
- to: "neg_prompt:clip"
24
- - from: "pos_prompt:0"
25
- to: "ksampler:positive"
26
- - from: "neg_prompt:0"
27
- to: "ksampler:negative"
28
- - from: "vae_loader:0"
29
- to: "vae_decode:vae"
30
- - from: "vae_loader:0"
31
- to: "vae_encode:vae"
32
-
33
- dynamic_vae_chains:
34
- vae_chain:
35
- targets:
36
- - "vae_decode:vae"
37
- - "vae_encode:vae"
38
-
39
- dynamic_conditioning_chains:
40
- conditioning_chain:
41
- ksampler_node: "ksampler"
42
- clip_source: "clip_loader:0"
43
-
44
- ui_map:
45
- unet_name: "unet_loader:unet_name"
46
- vae_name: "vae_loader:vae_name"
47
- clip_name: "clip_loader:clip_name"
 
 
 
 
 
 
 
 
 
1
+ nodes:
2
+ pos_prompt:
3
+ class_type: CLIPTextEncode
4
+ title: "CLIP Text Encode (Positive)"
5
+ neg_prompt:
6
+ class_type: CLIPTextEncode
7
+ title: "CLIP Text Encode (Negative)"
8
+ unet_loader:
9
+ class_type: UNETLoader
10
+ title: "Load Diffusion Model"
11
+ params:
12
+ weight_dtype: "default"
13
+ vae_loader:
14
+ class_type: VAELoader
15
+ title: "Load VAE"
16
+ clip_loader:
17
+ class_type: CLIPLoader
18
+ title: "Load CLIP"
19
+ params:
20
+ type: "cosmos"
21
+ device: "default"
22
+
23
+ connections:
24
+ - from: "unet_loader:0"
25
+ to: "ksampler:model"
26
+ - from: "clip_loader:0"
27
+ to: "pos_prompt:clip"
28
+ - from: "clip_loader:0"
29
+ to: "neg_prompt:clip"
30
+ - from: "pos_prompt:0"
31
+ to: "ksampler:positive"
32
+ - from: "neg_prompt:0"
33
+ to: "ksampler:negative"
34
+ - from: "vae_loader:0"
35
+ to: "vae_decode:vae"
36
+ - from: "vae_loader:0"
37
+ to: "vae_encode:vae"
38
+
39
+ dynamic_vae_chains:
40
+ vae_chain:
41
+ targets:
42
+ - "vae_decode:vae"
43
+ - "vae_encode:vae"
44
+
45
+ dynamic_conditioning_chains:
46
+ conditioning_chain:
47
+ ksampler_node: "ksampler"
48
+ clip_source: "clip_loader:0"
49
+
50
+ ui_map:
51
+ positive_prompt: "pos_prompt:text"
52
+ negative_prompt: "neg_prompt:text"
53
+ unet_name: "unet_loader:unet_name"
54
+ vae_name: "vae_loader:vae_name"
55
+ clip_name: "clip_loader:clip_name"
core/pipelines/workflow_recipes/_partials/conditioning/ernie-image.yaml CHANGED
@@ -1,4 +1,10 @@
1
  nodes:
 
 
 
 
 
 
2
  unet_loader:
3
  class_type: UNETLoader
4
  title: "Load Diffusion Model"
@@ -53,6 +59,8 @@ dynamic_pid_chains:
53
  ksampler_node: "ksampler"
54
 
55
  ui_map:
 
 
56
  unet_name: "unet_loader:unet_name"
57
  clip_name: "clip_loader:clip_name"
58
  vae_name: "vae_loader:vae_name"
 
1
  nodes:
2
+ pos_prompt:
3
+ class_type: CLIPTextEncode
4
+ title: "CLIP Text Encode (Positive)"
5
+ neg_prompt:
6
+ class_type: CLIPTextEncode
7
+ title: "CLIP Text Encode (Negative)"
8
  unet_loader:
9
  class_type: UNETLoader
10
  title: "Load Diffusion Model"
 
59
  ksampler_node: "ksampler"
60
 
61
  ui_map:
62
+ positive_prompt: "pos_prompt:text"
63
+ negative_prompt: "neg_prompt:text"
64
  unet_name: "unet_loader:unet_name"
65
  clip_name: "clip_loader:clip_name"
66
  vae_name: "vae_loader:vae_name"
core/pipelines/workflow_recipes/_partials/conditioning/flux1.yaml CHANGED
@@ -1,4 +1,10 @@
1
  nodes:
 
 
 
 
 
 
2
  unet_loader:
3
  class_type: UNETLoader
4
  title: "Load FLUX UNET"
@@ -61,6 +67,8 @@ dynamic_pid_chains:
61
  ksampler_node: "ksampler"
62
 
63
  ui_map:
 
 
64
  unet_name: "unet_loader:unet_name"
65
  vae_name: "vae_loader:vae_name"
66
  clip1_name: "clip_loader:clip_name1"
 
1
  nodes:
2
+ pos_prompt:
3
+ class_type: CLIPTextEncode
4
+ title: "CLIP Text Encode (Positive)"
5
+ neg_prompt:
6
+ class_type: CLIPTextEncode
7
+ title: "CLIP Text Encode (Negative)"
8
  unet_loader:
9
  class_type: UNETLoader
10
  title: "Load FLUX UNET"
 
67
  ksampler_node: "ksampler"
68
 
69
  ui_map:
70
+ positive_prompt: "pos_prompt:text"
71
+ negative_prompt: "neg_prompt:text"
72
  unet_name: "unet_loader:unet_name"
73
  vae_name: "vae_loader:vae_name"
74
  clip1_name: "clip_loader:clip_name1"
core/pipelines/workflow_recipes/_partials/conditioning/hidream-i1.yaml CHANGED
@@ -1,4 +1,10 @@
1
  nodes:
 
 
 
 
 
 
2
  unet_loader:
3
  class_type: UNETLoader
4
  title: "Load HiDream-I1 UNET"
@@ -49,6 +55,8 @@ dynamic_pid_chains:
49
  ksampler_node: "ksampler"
50
 
51
  ui_map:
 
 
52
  unet_name: "unet_loader:unet_name"
53
  vae_name: "vae_loader:vae_name"
54
  clip1_name: "clip_loader:clip_name1"
 
1
  nodes:
2
+ pos_prompt:
3
+ class_type: CLIPTextEncode
4
+ title: "CLIP Text Encode (Positive)"
5
+ neg_prompt:
6
+ class_type: CLIPTextEncode
7
+ title: "CLIP Text Encode (Negative)"
8
  unet_loader:
9
  class_type: UNETLoader
10
  title: "Load HiDream-I1 UNET"
 
55
  ksampler_node: "ksampler"
56
 
57
  ui_map:
58
+ positive_prompt: "pos_prompt:text"
59
+ negative_prompt: "neg_prompt:text"
60
  unet_name: "unet_loader:unet_name"
61
  vae_name: "vae_loader:vae_name"
62
  clip1_name: "clip_loader:clip_name1"
core/pipelines/workflow_recipes/_partials/conditioning/hidream-o1.yaml CHANGED
@@ -1,68 +1,76 @@
1
- nodes:
2
- ckpt_loader:
3
- class_type: CheckpointLoaderSimple
4
- title: "Load Checkpoint"
5
-
6
- model_noise_scale:
7
- class_type: ModelNoiseScale
8
- title: "ModelNoiseScale"
9
- params:
10
- noise_scale: 8
11
-
12
- connections:
13
- - from: "ckpt_loader:0"
14
- to: "model_noise_scale:model"
15
-
16
- - from: "model_noise_scale:0"
17
- to: "ksampler:model"
18
-
19
- - from: "ckpt_loader:1"
20
- to: "pos_prompt:clip"
21
- - from: "ckpt_loader:1"
22
- to: "neg_prompt:clip"
23
-
24
- - from: "pos_prompt:0"
25
- to: "ksampler:positive"
26
- - from: "neg_prompt:0"
27
- to: "ksampler:negative"
28
-
29
- - from: "ckpt_loader:2"
30
- to: "vae_decode:vae"
31
- - from: "ckpt_loader:2"
32
- to: "vae_encode:vae"
33
-
34
- dynamic_vae_chains:
35
- vae_chain:
36
- targets:
37
- - "vae_decode:vae"
38
- - "vae_encode:vae"
39
-
40
- dynamic_lora_chains:
41
- lora_chain:
42
- template: "LoraLoader"
43
- start: "ckpt_loader"
44
- output_map:
45
- "0": "model"
46
- "1": "clip"
47
- input_map:
48
- "model": "model"
49
- "clip": "clip"
50
- end_input_map:
51
- "model": ["model_noise_scale:model"]
52
- "clip": ["pos_prompt:clip", "neg_prompt:clip"]
53
-
54
- dynamic_hidream_o1_smoothing_chains:
55
- hidream_o1_smoothing_chain:
56
- target_node: "ksampler"
57
-
58
- dynamic_conditioning_chains:
59
- conditioning_chain:
60
- ksampler_node: "ksampler"
61
- clip_source: "ckpt_loader:1"
62
-
63
- dynamic_hidream_o1_reference_chains:
64
- hidream_o1_reference_chain:
65
- ksampler_node: "ksampler"
66
-
67
- ui_map:
 
 
 
 
 
 
 
 
68
  model_name: "ckpt_loader:ckpt_name"
 
1
+ nodes:
2
+ pos_prompt:
3
+ class_type: CLIPTextEncode
4
+ title: "CLIP Text Encode (Positive)"
5
+ neg_prompt:
6
+ class_type: CLIPTextEncode
7
+ title: "CLIP Text Encode (Negative)"
8
+ ckpt_loader:
9
+ class_type: CheckpointLoaderSimple
10
+ title: "Load Checkpoint"
11
+
12
+ model_noise_scale:
13
+ class_type: ModelNoiseScale
14
+ title: "ModelNoiseScale"
15
+ params:
16
+ noise_scale: 8
17
+
18
+ connections:
19
+ - from: "ckpt_loader:0"
20
+ to: "model_noise_scale:model"
21
+
22
+ - from: "model_noise_scale:0"
23
+ to: "ksampler:model"
24
+
25
+ - from: "ckpt_loader:1"
26
+ to: "pos_prompt:clip"
27
+ - from: "ckpt_loader:1"
28
+ to: "neg_prompt:clip"
29
+
30
+ - from: "pos_prompt:0"
31
+ to: "ksampler:positive"
32
+ - from: "neg_prompt:0"
33
+ to: "ksampler:negative"
34
+
35
+ - from: "ckpt_loader:2"
36
+ to: "vae_decode:vae"
37
+ - from: "ckpt_loader:2"
38
+ to: "vae_encode:vae"
39
+
40
+ dynamic_vae_chains:
41
+ vae_chain:
42
+ targets:
43
+ - "vae_decode:vae"
44
+ - "vae_encode:vae"
45
+
46
+ dynamic_lora_chains:
47
+ lora_chain:
48
+ template: "LoraLoader"
49
+ start: "ckpt_loader"
50
+ output_map:
51
+ "0": "model"
52
+ "1": "clip"
53
+ input_map:
54
+ "model": "model"
55
+ "clip": "clip"
56
+ end_input_map:
57
+ "model": ["model_noise_scale:model"]
58
+ "clip": ["pos_prompt:clip", "neg_prompt:clip"]
59
+
60
+ dynamic_hidream_o1_smoothing_chains:
61
+ hidream_o1_smoothing_chain:
62
+ target_node: "ksampler"
63
+
64
+ dynamic_conditioning_chains:
65
+ conditioning_chain:
66
+ ksampler_node: "ksampler"
67
+ clip_source: "ckpt_loader:1"
68
+
69
+ dynamic_hidream_o1_reference_chains:
70
+ hidream_o1_reference_chain:
71
+ ksampler_node: "ksampler"
72
+
73
+ ui_map:
74
+ positive_prompt: "pos_prompt:text"
75
+ negative_prompt: "neg_prompt:text"
76
  model_name: "ckpt_loader:ckpt_name"
core/pipelines/workflow_recipes/_partials/conditioning/hunyuanimage.yaml CHANGED
@@ -1,4 +1,10 @@
1
  nodes:
 
 
 
 
 
 
2
  unet_loader:
3
  class_type: UNETLoader
4
  title: "Load Hunyuan UNET"
@@ -36,6 +42,8 @@ dynamic_conditioning_chains:
36
  clip_source: "clip_loader:0"
37
 
38
  ui_map:
 
 
39
  unet_name: "unet_loader:unet_name"
40
  vae_name: "vae_loader:vae_name"
41
  clip1_name: "clip_loader:clip_name1"
 
1
  nodes:
2
+ pos_prompt:
3
+ class_type: CLIPTextEncode
4
+ title: "CLIP Text Encode (Positive)"
5
+ neg_prompt:
6
+ class_type: CLIPTextEncode
7
+ title: "CLIP Text Encode (Negative)"
8
  unet_loader:
9
  class_type: UNETLoader
10
  title: "Load Hunyuan UNET"
 
42
  clip_source: "clip_loader:0"
43
 
44
  ui_map:
45
+ positive_prompt: "pos_prompt:text"
46
+ negative_prompt: "neg_prompt:text"
47
  unet_name: "unet_loader:unet_name"
48
  vae_name: "vae_loader:vae_name"
49
  clip1_name: "clip_loader:clip_name1"
core/pipelines/workflow_recipes/_partials/conditioning/ideogram-4.yaml CHANGED
@@ -1,4 +1,10 @@
1
  nodes:
 
 
 
 
 
 
2
  unet_loader:
3
  class_type: UNETLoader
4
  title: "Load Diffusion Model"
@@ -95,6 +101,8 @@ dynamic_pid_chains:
95
  ksampler_node: "ksampler"
96
 
97
  ui_map:
 
 
98
  unet_name: "unet_loader:unet_name"
99
  unet_uncond_name: "unet_uncond_loader:unet_name"
100
  clip_name: "clip_loader:clip_name"
 
1
  nodes:
2
+ pos_prompt:
3
+ class_type: CLIPTextEncode
4
+ title: "CLIP Text Encode (Positive)"
5
+ neg_prompt:
6
+ class_type: CLIPTextEncode
7
+ title: "CLIP Text Encode (Negative)"
8
  unet_loader:
9
  class_type: UNETLoader
10
  title: "Load Diffusion Model"
 
101
  ksampler_node: "ksampler"
102
 
103
  ui_map:
104
+ positive_prompt: "pos_prompt:text"
105
+ negative_prompt: "neg_prompt:text"
106
  unet_name: "unet_loader:unet_name"
107
  unet_uncond_name: "unet_uncond_loader:unet_name"
108
  clip_name: "clip_loader:clip_name"
core/pipelines/workflow_recipes/_partials/conditioning/joyai-image.yaml CHANGED
@@ -1,86 +1,86 @@
1
- nodes:
2
- unet_loader:
3
- class_type: UNETLoader
4
- title: "Load Diffusion Model"
5
- params:
6
- weight_dtype: "default"
7
- vae_loader:
8
- class_type: VAELoader
9
- title: "Load VAE"
10
- clip_loader:
11
- class_type: CLIPLoader
12
- title: "Load CLIP"
13
- params:
14
- type: "joyimage"
15
- device: "default"
16
-
17
- pos_prompt:
18
- class_type: TextEncodeJoyImageEdit
19
- title: "TextEncodeJoyImageEdit (Positive)"
20
- neg_prompt:
21
- class_type: TextEncodeJoyImageEdit
22
- title: "TextEncodeJoyImageEdit (Negative)"
23
-
24
- cfg_norm:
25
- class_type: CFGNorm
26
- title: "CFGNorm"
27
- params:
28
- strength: 1.0
29
- pre_cfg: true
30
-
31
- connections:
32
- - from: "unet_loader:0"
33
- to: "cfg_norm:model"
34
- - from: "cfg_norm:0"
35
- to: "ksampler:model"
36
-
37
- - from: "clip_loader:0"
38
- to: "pos_prompt:clip"
39
- - from: "clip_loader:0"
40
- to: "neg_prompt:clip"
41
-
42
- - from: "pos_prompt:0"
43
- to: "ksampler:positive"
44
- - from: "neg_prompt:0"
45
- to: "ksampler:negative"
46
-
47
- - from: "vae_loader:0"
48
- to: "vae_decode:vae"
49
- - from: "vae_loader:0"
50
- to: "vae_encode:vae"
51
-
52
- dynamic_lora_chains:
53
- lora_chain:
54
- template: "LoraLoader"
55
- output_map:
56
- "unet_loader:0": "model"
57
- "clip_loader:0": "clip"
58
- input_map:
59
- "model": "model"
60
- "clip": "clip"
61
- end_input_map:
62
- "model": ["cfg_norm:model"]
63
- "clip": ["pos_prompt:clip", "neg_prompt:clip"]
64
-
65
- dynamic_conditioning_chains:
66
- conditioning_chain:
67
- ksampler_node: "ksampler"
68
- clip_source: "clip_loader:0"
69
-
70
- dynamic_pid_chains:
71
- pid_chain:
72
- ksampler_node: "ksampler"
73
-
74
- dynamic_joyai_reference_chains:
75
- joyai_reference_chain:
76
- pos_prompt_node: "pos_prompt"
77
- neg_prompt_node: "neg_prompt"
78
- vae_node: "vae_loader"
79
-
80
- ui_map:
81
- unet_name: "unet_loader:unet_name"
82
- vae_name: "vae_loader:vae_name"
83
- clip_name: "clip_loader:clip_name"
84
- positive_prompt: "pos_prompt:prompt"
85
- negative_prompt: "neg_prompt:prompt"
86
-
 
1
+ nodes:
2
+ unet_loader:
3
+ class_type: UNETLoader
4
+ title: "Load Diffusion Model"
5
+ params:
6
+ weight_dtype: "default"
7
+ vae_loader:
8
+ class_type: VAELoader
9
+ title: "Load VAE"
10
+ clip_loader:
11
+ class_type: CLIPLoader
12
+ title: "Load CLIP"
13
+ params:
14
+ type: "joyimage"
15
+ device: "default"
16
+
17
+ pos_prompt:
18
+ class_type: TextEncodeJoyImageEdit
19
+ title: "TextEncodeJoyImageEdit (Positive)"
20
+ neg_prompt:
21
+ class_type: TextEncodeJoyImageEdit
22
+ title: "TextEncodeJoyImageEdit (Negative)"
23
+
24
+ cfg_norm:
25
+ class_type: CFGNorm
26
+ title: "CFGNorm"
27
+ params:
28
+ strength: 1.0
29
+ pre_cfg: true
30
+
31
+ connections:
32
+ - from: "unet_loader:0"
33
+ to: "cfg_norm:model"
34
+ - from: "cfg_norm:0"
35
+ to: "ksampler:model"
36
+
37
+ - from: "clip_loader:0"
38
+ to: "pos_prompt:clip"
39
+ - from: "clip_loader:0"
40
+ to: "neg_prompt:clip"
41
+
42
+ - from: "pos_prompt:0"
43
+ to: "ksampler:positive"
44
+ - from: "neg_prompt:0"
45
+ to: "ksampler:negative"
46
+
47
+ - from: "vae_loader:0"
48
+ to: "vae_decode:vae"
49
+ - from: "vae_loader:0"
50
+ to: "vae_encode:vae"
51
+
52
+ dynamic_lora_chains:
53
+ lora_chain:
54
+ template: "LoraLoader"
55
+ output_map:
56
+ "unet_loader:0": "model"
57
+ "clip_loader:0": "clip"
58
+ input_map:
59
+ "model": "model"
60
+ "clip": "clip"
61
+ end_input_map:
62
+ "model": ["cfg_norm:model"]
63
+ "clip": ["pos_prompt:clip", "neg_prompt:clip"]
64
+
65
+ dynamic_conditioning_chains:
66
+ conditioning_chain:
67
+ ksampler_node: "ksampler"
68
+ clip_source: "clip_loader:0"
69
+
70
+ dynamic_pid_chains:
71
+ pid_chain:
72
+ ksampler_node: "ksampler"
73
+
74
+ dynamic_joyai_reference_chains:
75
+ joyai_reference_chain:
76
+ pos_prompt_node: "pos_prompt"
77
+ neg_prompt_node: "neg_prompt"
78
+ vae_node: "vae_loader"
79
+
80
+ ui_map:
81
+ unet_name: "unet_loader:unet_name"
82
+ vae_name: "vae_loader:vae_name"
83
+ clip_name: "clip_loader:clip_name"
84
+ positive_prompt: "pos_prompt:prompt"
85
+ negative_prompt: "neg_prompt:prompt"
86
+
core/pipelines/workflow_recipes/_partials/conditioning/kandinsky-5.yaml CHANGED
@@ -1,4 +1,10 @@
1
  nodes:
 
 
 
 
 
 
2
  unet_loader:
3
  class_type: UNETLoader
4
  title: "Load Diffusion Model"
@@ -66,6 +72,8 @@ dynamic_pid_chains:
66
  ksampler_node: "ksampler"
67
 
68
  ui_map:
 
 
69
  unet_name: "unet_loader:unet_name"
70
  vae_name: "vae_loader:vae_name"
71
  clip1_name: "clip_loader:clip_name1"
 
1
  nodes:
2
+ pos_prompt:
3
+ class_type: CLIPTextEncode
4
+ title: "CLIP Text Encode (Positive)"
5
+ neg_prompt:
6
+ class_type: CLIPTextEncode
7
+ title: "CLIP Text Encode (Negative)"
8
  unet_loader:
9
  class_type: UNETLoader
10
  title: "Load Diffusion Model"
 
72
  ksampler_node: "ksampler"
73
 
74
  ui_map:
75
+ positive_prompt: "pos_prompt:text"
76
+ negative_prompt: "neg_prompt:text"
77
  unet_name: "unet_loader:unet_name"
78
  vae_name: "vae_loader:vae_name"
79
  clip1_name: "clip_loader:clip_name1"
core/pipelines/workflow_recipes/_partials/conditioning/krea-2.yaml CHANGED
@@ -1,4 +1,10 @@
1
  nodes:
 
 
 
 
 
 
2
  unet_loader:
3
  class_type: UNETLoader
4
  title: "Load Diffusion Model"
@@ -58,6 +64,8 @@ dynamic_pid_chains:
58
  ksampler_node: "ksampler"
59
 
60
  ui_map:
 
 
61
  unet_name: "unet_loader:unet_name"
62
  clip_name: "clip_loader:clip_name"
63
  vae_name: "vae_loader:vae_name"
 
1
  nodes:
2
+ pos_prompt:
3
+ class_type: CLIPTextEncode
4
+ title: "CLIP Text Encode (Positive)"
5
+ neg_prompt:
6
+ class_type: CLIPTextEncode
7
+ title: "CLIP Text Encode (Negative)"
8
  unet_loader:
9
  class_type: UNETLoader
10
  title: "Load Diffusion Model"
 
64
  ksampler_node: "ksampler"
65
 
66
  ui_map:
67
+ positive_prompt: "pos_prompt:text"
68
+ negative_prompt: "neg_prompt:text"
69
  unet_name: "unet_loader:unet_name"
70
  clip_name: "clip_loader:clip_name"
71
  vae_name: "vae_loader:vae_name"
core/pipelines/workflow_recipes/_partials/conditioning/lens.yaml CHANGED
@@ -1,4 +1,10 @@
1
  nodes:
 
 
 
 
 
 
2
  unet_loader:
3
  class_type: UNETLoader
4
  title: "Load Diffusion Model"
@@ -53,6 +59,8 @@ dynamic_pid_chains:
53
  ksampler_node: "ksampler"
54
 
55
  ui_map:
 
 
56
  unet_name: "unet_loader:unet_name"
57
  clip_name: "clip_loader:clip_name"
58
  vae_name: "vae_loader:vae_name"
 
1
  nodes:
2
+ pos_prompt:
3
+ class_type: CLIPTextEncode
4
+ title: "CLIP Text Encode (Positive)"
5
+ neg_prompt:
6
+ class_type: CLIPTextEncode
7
+ title: "CLIP Text Encode (Negative)"
8
  unet_loader:
9
  class_type: UNETLoader
10
  title: "Load Diffusion Model"
 
59
  ksampler_node: "ksampler"
60
 
61
  ui_map:
62
+ positive_prompt: "pos_prompt:text"
63
+ negative_prompt: "neg_prompt:text"
64
  unet_name: "unet_loader:unet_name"
65
  clip_name: "clip_loader:clip_name"
66
  vae_name: "vae_loader:vae_name"
core/pipelines/workflow_recipes/_partials/conditioning/longcat-image.yaml CHANGED
@@ -1,4 +1,10 @@
1
  nodes:
 
 
 
 
 
 
2
  unet_loader:
3
  class_type: UNETLoader
4
  title: "Load Diffusion Model"
@@ -82,6 +88,8 @@ dynamic_pid_chains:
82
  ksampler_node: "ksampler"
83
 
84
  ui_map:
 
 
85
  unet_name: "unet_loader:unet_name"
86
  vae_name: "vae_loader:vae_name"
87
  clip_name: "clip_loader:clip_name"
 
1
  nodes:
2
+ pos_prompt:
3
+ class_type: CLIPTextEncode
4
+ title: "CLIP Text Encode (Positive)"
5
+ neg_prompt:
6
+ class_type: CLIPTextEncode
7
+ title: "CLIP Text Encode (Negative)"
8
  unet_loader:
9
  class_type: UNETLoader
10
  title: "Load Diffusion Model"
 
88
  ksampler_node: "ksampler"
89
 
90
  ui_map:
91
+ positive_prompt: "pos_prompt:text"
92
+ negative_prompt: "neg_prompt:text"
93
  unet_name: "unet_loader:unet_name"
94
  vae_name: "vae_loader:vae_name"
95
  clip_name: "clip_loader:clip_name"
core/pipelines/workflow_recipes/_partials/conditioning/lumina.yaml CHANGED
@@ -1,4 +1,10 @@
1
  nodes:
 
 
 
 
 
 
2
  ckpt_loader:
3
  class_type: CheckpointLoaderSimple
4
  title: "Load Checkpoint"
@@ -58,4 +64,6 @@ dynamic_pid_chains:
58
  ksampler_node: "ksampler"
59
 
60
  ui_map:
 
 
61
  model_name: "ckpt_loader:ckpt_name"
 
1
  nodes:
2
+ pos_prompt:
3
+ class_type: CLIPTextEncode
4
+ title: "CLIP Text Encode (Positive)"
5
+ neg_prompt:
6
+ class_type: CLIPTextEncode
7
+ title: "CLIP Text Encode (Negative)"
8
  ckpt_loader:
9
  class_type: CheckpointLoaderSimple
10
  title: "Load Checkpoint"
 
64
  ksampler_node: "ksampler"
65
 
66
  ui_map:
67
+ positive_prompt: "pos_prompt:text"
68
+ negative_prompt: "neg_prompt:text"
69
  model_name: "ckpt_loader:ckpt_name"
core/pipelines/workflow_recipes/_partials/conditioning/mage-flow.yaml ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ nodes:
2
+ unet_loader:
3
+ class_type: UNETLoader
4
+ title: "Load Diffusion Model"
5
+ params:
6
+ weight_dtype: "default"
7
+ vae_loader:
8
+ class_type: VAELoader
9
+ title: "Load VAE"
10
+ clip_loader:
11
+ class_type: CLIPLoader
12
+ title: "Load CLIP"
13
+ params:
14
+ type: "mage"
15
+ device: "default"
16
+ text_encode_latent:
17
+ class_type: TextEncodeMageFlowEdit
18
+ title: "TextEncodeMageFlowEdit"
19
+
20
+ connections:
21
+ - from: "unet_loader:0"
22
+ to: "ksampler:model"
23
+ - from: "clip_loader:0"
24
+ to: "text_encode_latent:clip"
25
+ - from: "vae_loader:0"
26
+ to: "vae_decode:vae"
27
+ - from: "vae_loader:0"
28
+ to: "vae_encode:vae"
29
+ - from: "text_encode_latent:0"
30
+ to: "ksampler:positive"
31
+ - from: "text_encode_latent:1"
32
+ to: "ksampler:negative"
33
+ - from: "text_encode_latent:2"
34
+ to: "ksampler:latent_image"
35
+
36
+ dynamic_lora_chains:
37
+ lora_chain:
38
+ template: "LoraLoader"
39
+ output_map:
40
+ "unet_loader:0": "model"
41
+ "clip_loader:0": "clip"
42
+ input_map:
43
+ "model": "model"
44
+ "clip": "clip"
45
+ end_input_map:
46
+ "model": ["ksampler:model"]
47
+ "clip": ["text_encode_latent:clip"]
48
+
49
+ dynamic_controlnet_chains:
50
+ controlnet_chain:
51
+ template: "ControlNetApplyAdvanced"
52
+ ksampler_node: "ksampler"
53
+ vae_source: "vae_loader:0"
54
+
55
+ dynamic_conditioning_chains:
56
+ conditioning_chain:
57
+ ksampler_node: "ksampler"
58
+ clip_source: "clip_loader:0"
59
+
60
+ dynamic_pid_chains:
61
+ pid_chain:
62
+ ksampler_node: "ksampler"
63
+
64
+ dynamic_reference_image_chains:
65
+ reference_image_chain:
66
+ text_encode_node: "text_encode_latent"
67
+ vae_node: "vae_loader"
68
+
69
+ ui_map:
70
+ unet_name: "unet_loader:unet_name"
71
+ vae_name: "vae_loader:vae_name"
72
+ clip_name: "clip_loader:clip_name"
73
+ positive_prompt: "text_encode_latent:prompt"
74
+ negative_prompt: "text_encode_latent:negative_prompt"
75
+ width: "text_encode_latent:width"
76
+ height: "text_encode_latent:height"
77
+ batch_size: "text_encode_latent:batch_size"
core/pipelines/workflow_recipes/_partials/conditioning/newbie-image.yaml CHANGED
@@ -1,4 +1,10 @@
1
  nodes:
 
 
 
 
 
 
2
  unet_loader:
3
  class_type: UNETLoader
4
  title: "Load Diffusion Model"
@@ -63,6 +69,8 @@ dynamic_pid_chains:
63
  ksampler_node: "ksampler"
64
 
65
  ui_map:
 
 
66
  unet_name: "unet_loader:unet_name"
67
  vae_name: "vae_loader:vae_name"
68
  clip1_name: "clip_loader:clip_name1"
 
1
  nodes:
2
+ pos_prompt:
3
+ class_type: CLIPTextEncode
4
+ title: "CLIP Text Encode (Positive)"
5
+ neg_prompt:
6
+ class_type: CLIPTextEncode
7
+ title: "CLIP Text Encode (Negative)"
8
  unet_loader:
9
  class_type: UNETLoader
10
  title: "Load Diffusion Model"
 
69
  ksampler_node: "ksampler"
70
 
71
  ui_map:
72
+ positive_prompt: "pos_prompt:text"
73
+ negative_prompt: "neg_prompt:text"
74
  unet_name: "unet_loader:unet_name"
75
  vae_name: "vae_loader:vae_name"
76
  clip1_name: "clip_loader:clip_name1"
core/pipelines/workflow_recipes/_partials/conditioning/omnigen2.yaml CHANGED
@@ -1,4 +1,10 @@
1
  nodes:
 
 
 
 
 
 
2
  unet_loader:
3
  class_type: UNETLoader
4
  title: "Load Diffusion Model"
@@ -58,6 +64,8 @@ dynamic_pid_chains:
58
  ksampler_node: "ksampler"
59
 
60
  ui_map:
 
 
61
  unet_name: "unet_loader:unet_name"
62
  vae_name: "vae_loader:vae_name"
63
  clip_name: "clip_loader:clip_name"
 
1
  nodes:
2
+ pos_prompt:
3
+ class_type: CLIPTextEncode
4
+ title: "CLIP Text Encode (Positive)"
5
+ neg_prompt:
6
+ class_type: CLIPTextEncode
7
+ title: "CLIP Text Encode (Negative)"
8
  unet_loader:
9
  class_type: UNETLoader
10
  title: "Load Diffusion Model"
 
64
  ksampler_node: "ksampler"
65
 
66
  ui_map:
67
+ positive_prompt: "pos_prompt:text"
68
+ negative_prompt: "neg_prompt:text"
69
  unet_name: "unet_loader:unet_name"
70
  vae_name: "vae_loader:vae_name"
71
  clip_name: "clip_loader:clip_name"
core/pipelines/workflow_recipes/_partials/conditioning/ovis-image.yaml CHANGED
@@ -1,4 +1,10 @@
1
  nodes:
 
 
 
 
 
 
2
  unet_loader:
3
  class_type: UNETLoader
4
  title: "Load Diffusion Model"
@@ -49,6 +55,8 @@ dynamic_pid_chains:
49
  ksampler_node: "ksampler"
50
 
51
  ui_map:
 
 
52
  unet_name: "unet_loader:unet_name"
53
  vae_name: "vae_loader:vae_name"
54
  clip_name: "clip_loader:clip_name"
 
1
  nodes:
2
+ pos_prompt:
3
+ class_type: CLIPTextEncode
4
+ title: "CLIP Text Encode (Positive)"
5
+ neg_prompt:
6
+ class_type: CLIPTextEncode
7
+ title: "CLIP Text Encode (Negative)"
8
  unet_loader:
9
  class_type: UNETLoader
10
  title: "Load Diffusion Model"
 
55
  ksampler_node: "ksampler"
56
 
57
  ui_map:
58
+ positive_prompt: "pos_prompt:text"
59
+ negative_prompt: "neg_prompt:text"
60
  unet_name: "unet_loader:unet_name"
61
  vae_name: "vae_loader:vae_name"
62
  clip_name: "clip_loader:clip_name"
core/pipelines/workflow_recipes/_partials/conditioning/pixeldit.yaml CHANGED
@@ -1,4 +1,10 @@
1
  nodes:
 
 
 
 
 
 
2
  unet_loader:
3
  class_type: UNETLoader
4
  title: "Load Diffusion Model"
@@ -38,6 +44,8 @@ dynamic_conditioning_chains:
38
  clip_source: "clip_loader:0"
39
 
40
  ui_map:
 
 
41
  unet_name: "unet_loader:unet_name"
42
  vae_name: "vae_loader:vae_name"
43
  clip_name: "clip_loader:clip_name"
 
1
  nodes:
2
+ pos_prompt:
3
+ class_type: CLIPTextEncode
4
+ title: "CLIP Text Encode (Positive)"
5
+ neg_prompt:
6
+ class_type: CLIPTextEncode
7
+ title: "CLIP Text Encode (Negative)"
8
  unet_loader:
9
  class_type: UNETLoader
10
  title: "Load Diffusion Model"
 
44
  clip_source: "clip_loader:0"
45
 
46
  ui_map:
47
+ positive_prompt: "pos_prompt:text"
48
+ negative_prompt: "neg_prompt:text"
49
  unet_name: "unet_loader:unet_name"
50
  vae_name: "vae_loader:vae_name"
51
  clip_name: "clip_loader:clip_name"
core/pipelines/workflow_recipes/_partials/conditioning/qwen-image.yaml CHANGED
@@ -1,4 +1,10 @@
1
  nodes:
 
 
 
 
 
 
2
  unet_loader:
3
  class_type: UNETLoader
4
  title: "Load Qwen UNET"
@@ -70,6 +76,8 @@ dynamic_pid_chains:
70
  ksampler_node: "ksampler"
71
 
72
  ui_map:
 
 
73
  unet_name: "unet_loader:unet_name"
74
  vae_name: "vae_loader:vae_name"
75
  clip_name: "clip_loader:clip_name"
 
1
  nodes:
2
+ pos_prompt:
3
+ class_type: CLIPTextEncode
4
+ title: "CLIP Text Encode (Positive)"
5
+ neg_prompt:
6
+ class_type: CLIPTextEncode
7
+ title: "CLIP Text Encode (Negative)"
8
  unet_loader:
9
  class_type: UNETLoader
10
  title: "Load Qwen UNET"
 
76
  ksampler_node: "ksampler"
77
 
78
  ui_map:
79
+ positive_prompt: "pos_prompt:text"
80
+ negative_prompt: "neg_prompt:text"
81
  unet_name: "unet_loader:unet_name"
82
  vae_name: "vae_loader:vae_name"
83
  clip_name: "clip_loader:clip_name"
core/pipelines/workflow_recipes/_partials/conditioning/sd15.yaml CHANGED
@@ -1,4 +1,10 @@
1
  nodes:
 
 
 
 
 
 
2
  ckpt_loader:
3
  class_type: CheckpointLoaderSimple
4
  title: "Load Checkpoint"
@@ -65,5 +71,7 @@ dynamic_conditioning_chains:
65
  clip_source: "clip_set_last_layer:0"
66
 
67
  ui_map:
 
 
68
  model_name: "ckpt_loader:ckpt_name"
69
  clip_skip: "clip_set_last_layer:stop_at_clip_layer"
 
1
  nodes:
2
+ pos_prompt:
3
+ class_type: CLIPTextEncode
4
+ title: "CLIP Text Encode (Positive)"
5
+ neg_prompt:
6
+ class_type: CLIPTextEncode
7
+ title: "CLIP Text Encode (Negative)"
8
  ckpt_loader:
9
  class_type: CheckpointLoaderSimple
10
  title: "Load Checkpoint"
 
71
  clip_source: "clip_set_last_layer:0"
72
 
73
  ui_map:
74
+ positive_prompt: "pos_prompt:text"
75
+ negative_prompt: "neg_prompt:text"
76
  model_name: "ckpt_loader:ckpt_name"
77
  clip_skip: "clip_set_last_layer:stop_at_clip_layer"
core/pipelines/workflow_recipes/_partials/conditioning/sd35.yaml CHANGED
@@ -1,4 +1,10 @@
1
  nodes:
 
 
 
 
 
 
2
  ckpt_loader:
3
  class_type: CheckpointLoaderSimple
4
  title: "Load Checkpoint"
@@ -59,4 +65,6 @@ dynamic_pid_chains:
59
  ksampler_node: "ksampler"
60
 
61
  ui_map:
 
 
62
  model_name: "ckpt_loader:ckpt_name"
 
1
  nodes:
2
+ pos_prompt:
3
+ class_type: CLIPTextEncode
4
+ title: "CLIP Text Encode (Positive)"
5
+ neg_prompt:
6
+ class_type: CLIPTextEncode
7
+ title: "CLIP Text Encode (Negative)"
8
  ckpt_loader:
9
  class_type: CheckpointLoaderSimple
10
  title: "Load Checkpoint"
 
65
  ksampler_node: "ksampler"
66
 
67
  ui_map:
68
+ positive_prompt: "pos_prompt:text"
69
+ negative_prompt: "neg_prompt:text"
70
  model_name: "ckpt_loader:ckpt_name"
core/pipelines/workflow_recipes/_partials/conditioning/sdxl.yaml CHANGED
@@ -1,4 +1,10 @@
1
  nodes:
 
 
 
 
 
 
2
  ckpt_loader:
3
  class_type: CheckpointLoaderSimple
4
  title: "Load Checkpoint"
@@ -64,4 +70,6 @@ dynamic_pid_chains:
64
  ksampler_node: "ksampler"
65
 
66
  ui_map:
 
 
67
  model_name: "ckpt_loader:ckpt_name"
 
1
  nodes:
2
+ pos_prompt:
3
+ class_type: CLIPTextEncode
4
+ title: "CLIP Text Encode (Positive)"
5
+ neg_prompt:
6
+ class_type: CLIPTextEncode
7
+ title: "CLIP Text Encode (Negative)"
8
  ckpt_loader:
9
  class_type: CheckpointLoaderSimple
10
  title: "Load Checkpoint"
 
70
  ksampler_node: "ksampler"
71
 
72
  ui_map:
73
+ positive_prompt: "pos_prompt:text"
74
+ negative_prompt: "neg_prompt:text"
75
  model_name: "ckpt_loader:ckpt_name"
core/pipelines/workflow_recipes/_partials/conditioning/z-image.yaml CHANGED
@@ -1,4 +1,10 @@
1
  nodes:
 
 
 
 
 
 
2
  unet_loader:
3
  class_type: UNETLoader
4
  title: "Load Diffusion Model"
@@ -64,6 +70,8 @@ dynamic_pid_chains:
64
  ksampler_node: "ksampler"
65
 
66
  ui_map:
 
 
67
  unet_name: "unet_loader:unet_name"
68
  vae_name: "vae_loader:vae_name"
69
  clip_name: "clip_loader:clip_name"
 
1
  nodes:
2
+ pos_prompt:
3
+ class_type: CLIPTextEncode
4
+ title: "CLIP Text Encode (Positive)"
5
+ neg_prompt:
6
+ class_type: CLIPTextEncode
7
+ title: "CLIP Text Encode (Negative)"
8
  unet_loader:
9
  class_type: UNETLoader
10
  title: "Load Diffusion Model"
 
70
  ksampler_node: "ksampler"
71
 
72
  ui_map:
73
+ positive_prompt: "pos_prompt:text"
74
+ negative_prompt: "neg_prompt:text"
75
  unet_name: "unet_loader:unet_name"
76
  vae_name: "vae_loader:vae_name"
77
  clip_name: "clip_loader:clip_name"
core/pipelines/workflow_recipes/_partials/input/txt2img_hidream_o1_latent.yaml CHANGED
@@ -1,11 +1,11 @@
1
- nodes:
2
- latent_source:
3
- class_type: "EmptyHiDreamO1LatentImage"
4
- title: "Empty HiDream-O1 Latent Image"
5
-
6
- connections: []
7
-
8
- ui_map:
9
- width: "latent_source:width"
10
- height: "latent_source:height"
11
- batch_size: "latent_source:batch_size"
 
1
+ nodes:
2
+ latent_source:
3
+ class_type: "EmptyHiDreamO1LatentImage"
4
+ title: "Empty HiDream-O1 Latent Image"
5
+
6
+ connections: []
7
+
8
+ ui_map:
9
+ width: "latent_source:width"
10
+ height: "latent_source:height"
11
+ batch_size: "latent_source:batch_size"
core/pipelines/workflow_recipes/_partials/input/txt2img_none.yaml ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ nodes: {}
2
+
3
+ connections: []
4
+
5
+ ui_map: {}
ui/events/chain_handlers.py CHANGED
@@ -748,6 +748,39 @@ def create_joyai_reference_event_handlers(prefix, ui_components):
748
  del_button.click(fn=del_ref_row, inputs=[count_state], outputs=del_outputs, show_progress=False)
749
 
750
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
751
  def create_embedding_event_handlers(prefix, ui_components):
752
  rows = ui_components.get(f'embedding_rows_{prefix}')
753
  if not rows: return
 
748
  del_button.click(fn=del_ref_row, inputs=[count_state], outputs=del_outputs, show_progress=False)
749
 
750
 
751
+ def create_reference_image_event_handlers(prefix, ui_components):
752
+ ref_rows = ui_components.get(f'reference_image_rows_{prefix}')
753
+ if not ref_rows: return
754
+ count_state = ui_components[f'reference_image_count_state_{prefix}']
755
+ add_button = ui_components[f'add_reference_image_button_{prefix}']
756
+ del_button = ui_components[f'delete_reference_image_button_{prefix}']
757
+ images = ui_components[f'reference_image_images_{prefix}']
758
+
759
+ def add_ref_row(c):
760
+ c += 1
761
+ return {
762
+ count_state: c,
763
+ ref_rows[c - 1]: gr.update(visible=True),
764
+ add_button: gr.update(visible=c < 10),
765
+ del_button: gr.update(visible=True),
766
+ }
767
+
768
+ def del_ref_row(c):
769
+ c -= 1
770
+ return {
771
+ count_state: c,
772
+ ref_rows[c]: gr.update(visible=False),
773
+ images[c]: None,
774
+ add_button: gr.update(visible=True),
775
+ del_button: gr.update(visible=c > 0),
776
+ }
777
+
778
+ add_outputs = [count_state, add_button, del_button] + ref_rows
779
+ del_outputs = [count_state, add_button, del_button] + ref_rows + images
780
+ add_button.click(fn=add_ref_row, inputs=[count_state], outputs=add_outputs, show_progress=False)
781
+ del_button.click(fn=del_ref_row, inputs=[count_state], outputs=del_outputs, show_progress=False)
782
+
783
+
784
  def create_embedding_event_handlers(prefix, ui_components):
785
  rows = ui_components.get(f'embedding_rows_{prefix}')
786
  if not rows: return
ui/events/change_handlers.py CHANGED
@@ -17,7 +17,7 @@ from .config_loaders import (
17
  load_ipadapter_config
18
  )
19
 
20
- def make_update_fn(m_comp, cat_comp, cs_comp, ar_comp, width_comp, height_comp, cn_types, cn_series, cn_filepaths, anima_cn_types, anima_cn_series, anima_cn_filepaths, diffsynth_cn_types, diffsynth_cn_series, diffsynth_cn_filepaths, krea2_cn_types, krea2_cn_series, krea2_cn_filepaths, ipa_preset, lora_acc, cn_acc, anima_cn_acc, diffsynth_cn_acc, krea2_cn_acc, ipa_acc, sd3_ipa_acc, flux1_ipa_acc, style_acc, embed_acc, cond_acc, ref_latent_acc, hidream_o1_ref_acc, guidance_comp, prompt_comp, neg_prompt_comp, steps_comp, cfg_comp, sampler_comp, scheduler_comp, pid_acc=None, vae_acc=None, joyai_ref_acc=None):
21
  def update_fn(*args):
22
  arch = args[0]
23
  category = args[1]
@@ -69,6 +69,7 @@ def make_update_fn(m_comp, cat_comp, cs_comp, ar_comp, width_comp, height_comp,
69
  if ref_latent_acc: updates[ref_latent_acc] = gr.update(visible=('reference_latent' in enabled_chains))
70
  if hidream_o1_ref_acc: updates[hidream_o1_ref_acc] = gr.update(visible=('hidream_o1_reference' in enabled_chains))
71
  if joyai_ref_acc: updates[joyai_ref_acc] = gr.update(visible=('joyai_reference' in enabled_chains))
 
72
  if pid_acc: updates[pid_acc] = gr.update(visible=('pid' in enabled_chains))
73
  if vae_acc: updates[vae_acc] = gr.update(visible=('vae' in enabled_chains))
74
 
@@ -143,7 +144,7 @@ def make_update_fn(m_comp, cat_comp, cs_comp, ar_comp, width_comp, height_comp,
143
  return update_fn
144
 
145
 
146
- def make_model_change_fn(cat_comp_ref, cs_comp, ar_comp, width_comp, height_comp, cn_types, cn_series, cn_filepaths, anima_cn_types, anima_cn_series, anima_cn_filepaths, diffsynth_cn_types, diffsynth_cn_series, diffsynth_cn_filepaths, krea2_cn_types, krea2_cn_series, krea2_cn_filepaths, arch_comp_ref, ipa_preset, lora_acc, cn_acc, anima_cn_acc, diffsynth_cn_acc, krea2_cn_acc, ipa_acc, sd3_ipa_acc, flux1_ipa_acc, style_acc, embed_acc, cond_acc, ref_latent_acc, hidream_o1_ref_acc, guidance_comp, prompt_comp, neg_prompt_comp, steps_comp, cfg_comp, sampler_comp, scheduler_comp, pid_acc=None, vae_acc=None, joyai_ref_acc=None):
147
  def change_fn(*args):
148
  model_name = args[0]
149
  idx = 1
@@ -200,9 +201,9 @@ def make_model_change_fn(cat_comp_ref, cs_comp, ar_comp, width_comp, height_comp
200
  if ref_latent_acc: updates[ref_latent_acc] = gr.update(visible=('reference_latent' in enabled_chains))
201
  if hidream_o1_ref_acc: updates[hidream_o1_ref_acc] = gr.update(visible=('hidream_o1_reference' in enabled_chains))
202
  if joyai_ref_acc: updates[joyai_ref_acc] = gr.update(visible=('joyai_reference' in enabled_chains))
 
203
  if pid_acc: updates[pid_acc] = gr.update(visible=('pid' in enabled_chains))
204
  if vae_acc: updates[vae_acc] = gr.update(visible=('vae' in enabled_chains))
205
- if vae_acc: updates[vae_acc] = gr.update(visible=('vae' in enabled_chains))
206
 
207
  if cs_comp:
208
  updates[cs_comp] = gr.update(visible=(arch_model_type == "sd15"))
 
17
  load_ipadapter_config
18
  )
19
 
20
+ def make_update_fn(m_comp, cat_comp, cs_comp, ar_comp, width_comp, height_comp, cn_types, cn_series, cn_filepaths, anima_cn_types, anima_cn_series, anima_cn_filepaths, diffsynth_cn_types, diffsynth_cn_series, diffsynth_cn_filepaths, krea2_cn_types, krea2_cn_series, krea2_cn_filepaths, ipa_preset, lora_acc, cn_acc, anima_cn_acc, diffsynth_cn_acc, krea2_cn_acc, ipa_acc, sd3_ipa_acc, flux1_ipa_acc, style_acc, embed_acc, cond_acc, ref_latent_acc, hidream_o1_ref_acc, guidance_comp, prompt_comp, neg_prompt_comp, steps_comp, cfg_comp, sampler_comp, scheduler_comp, pid_acc=None, vae_acc=None, joyai_ref_acc=None, ref_img_acc=None):
21
  def update_fn(*args):
22
  arch = args[0]
23
  category = args[1]
 
69
  if ref_latent_acc: updates[ref_latent_acc] = gr.update(visible=('reference_latent' in enabled_chains))
70
  if hidream_o1_ref_acc: updates[hidream_o1_ref_acc] = gr.update(visible=('hidream_o1_reference' in enabled_chains))
71
  if joyai_ref_acc: updates[joyai_ref_acc] = gr.update(visible=('joyai_reference' in enabled_chains))
72
+ if ref_img_acc: updates[ref_img_acc] = gr.update(visible=('reference_image' in enabled_chains))
73
  if pid_acc: updates[pid_acc] = gr.update(visible=('pid' in enabled_chains))
74
  if vae_acc: updates[vae_acc] = gr.update(visible=('vae' in enabled_chains))
75
 
 
144
  return update_fn
145
 
146
 
147
+ def make_model_change_fn(cat_comp_ref, cs_comp, ar_comp, width_comp, height_comp, cn_types, cn_series, cn_filepaths, anima_cn_types, anima_cn_series, anima_cn_filepaths, diffsynth_cn_types, diffsynth_cn_series, diffsynth_cn_filepaths, krea2_cn_types, krea2_cn_series, krea2_cn_filepaths, arch_comp_ref, ipa_preset, lora_acc, cn_acc, anima_cn_acc, diffsynth_cn_acc, krea2_cn_acc, ipa_acc, sd3_ipa_acc, flux1_ipa_acc, style_acc, embed_acc, cond_acc, ref_latent_acc, hidream_o1_ref_acc, guidance_comp, prompt_comp, neg_prompt_comp, steps_comp, cfg_comp, sampler_comp, scheduler_comp, pid_acc=None, vae_acc=None, joyai_ref_acc=None, ref_img_acc=None):
148
  def change_fn(*args):
149
  model_name = args[0]
150
  idx = 1
 
201
  if ref_latent_acc: updates[ref_latent_acc] = gr.update(visible=('reference_latent' in enabled_chains))
202
  if hidream_o1_ref_acc: updates[hidream_o1_ref_acc] = gr.update(visible=('hidream_o1_reference' in enabled_chains))
203
  if joyai_ref_acc: updates[joyai_ref_acc] = gr.update(visible=('joyai_reference' in enabled_chains))
204
+ if ref_img_acc: updates[ref_img_acc] = gr.update(visible=('reference_image' in enabled_chains))
205
  if pid_acc: updates[pid_acc] = gr.update(visible=('pid' in enabled_chains))
206
  if vae_acc: updates[vae_acc] = gr.update(visible=('vae' in enabled_chains))
 
207
 
208
  if cs_comp:
209
  updates[cs_comp] = gr.update(visible=(arch_model_type == "sd15"))
ui/events/main.py CHANGED
@@ -13,7 +13,8 @@ from .chain_handlers import (
13
  create_style_event_handlers,
14
  create_reference_latent_event_handlers,
15
  create_hidream_o1_reference_event_handlers,
16
- create_joyai_reference_event_handlers
 
17
  )
18
  from .change_handlers import (
19
  make_update_fn,
@@ -68,6 +69,7 @@ def attach_event_handlers(ui_components, demo):
68
  ref_latent_accordion = ui_components.get(f'reference_latent_accordion_{prefix}')
69
  hidream_o1_ref_accordion = ui_components.get(f'hidream_o1_reference_accordion_{prefix}')
70
  joyai_ref_accordion = ui_components.get(f'joyai_reference_accordion_{prefix}')
 
71
  pid_accordion = ui_components.get(f'pid_accordion_{prefix}')
72
  vae_accordion = ui_components.get(f'vae_accordion_{prefix}')
73
 
@@ -106,6 +108,7 @@ def attach_event_handlers(ui_components, demo):
106
  if ref_latent_accordion: outputs.append(ref_latent_accordion)
107
  if hidream_o1_ref_accordion: outputs.append(hidream_o1_ref_accordion)
108
  if joyai_ref_accordion: outputs.append(joyai_ref_accordion)
 
109
  if pid_accordion: outputs.append(pid_accordion)
110
  if vae_accordion: outputs.append(vae_accordion)
111
  if ipa_preset_list: outputs.append(ipa_preset_list)
@@ -120,7 +123,7 @@ def attach_event_handlers(ui_components, demo):
120
  krea2_cn_types_list, krea2_cn_series_list, krea2_cn_filepaths_list,
121
  ipa_preset_list, lora_accordion, cn_accordion, anima_cn_accordion, diffsynth_cn_accordion, krea2_cn_accordion, ipa_accordion, sd3_ipa_accordion, flux1_ipa_accordion, style_accordion, embedding_accordion, conditioning_accordion,
122
  ref_latent_accordion, hidream_o1_ref_accordion, guidance_comp, prompt_comp, neg_prompt_comp, steps_comp, cfg_comp, sampler_comp, scheduler_comp,
123
- pid_acc=pid_accordion, vae_acc=vae_accordion, joyai_ref_acc=joyai_ref_accordion
124
  )
125
  inputs = [arch_comp, cat_comp]
126
  if aspect_ratio_comp:
@@ -153,6 +156,7 @@ def attach_event_handlers(ui_components, demo):
153
  if ref_latent_accordion: outputs2.append(ref_latent_accordion)
154
  if hidream_o1_ref_accordion: outputs2.append(hidream_o1_ref_accordion)
155
  if joyai_ref_accordion: outputs2.append(joyai_ref_accordion)
 
156
  if pid_accordion: outputs2.append(pid_accordion)
157
  if vae_accordion: outputs2.append(vae_accordion)
158
  if ipa_preset_list: outputs2.append(ipa_preset_list)
@@ -172,7 +176,7 @@ def attach_event_handlers(ui_components, demo):
172
  krea2_cn_types_list, krea2_cn_series_list, krea2_cn_filepaths_list,
173
  arch_comp, ipa_preset_list, lora_accordion, cn_accordion, anima_cn_accordion, diffsynth_cn_accordion, krea2_cn_accordion, ipa_accordion, sd3_ipa_accordion, flux1_ipa_accordion, style_accordion, embedding_accordion, conditioning_accordion,
174
  ref_latent_accordion, hidream_o1_ref_accordion, guidance_comp, prompt_comp, neg_prompt_comp, steps_comp, cfg_comp, sampler_comp, scheduler_comp,
175
- pid_acc=pid_accordion, vae_acc=vae_accordion, joyai_ref_acc=joyai_ref_accordion
176
  )
177
  model_comp.change(fn=change_fn, inputs=inputs2, outputs=outputs2)
178
 
@@ -190,6 +194,7 @@ def attach_event_handlers(ui_components, demo):
190
  create_reference_latent_event_handlers(prefix, ui_components)
191
  create_hidream_o1_reference_event_handlers(prefix, ui_components)
192
  create_joyai_reference_event_handlers(prefix, ui_components)
 
193
  create_run_event(prefix, task_type, ui_components)
194
 
195
  if 'view_mode_inpaint' in ui_components:
 
13
  create_style_event_handlers,
14
  create_reference_latent_event_handlers,
15
  create_hidream_o1_reference_event_handlers,
16
+ create_joyai_reference_event_handlers,
17
+ create_reference_image_event_handlers
18
  )
19
  from .change_handlers import (
20
  make_update_fn,
 
69
  ref_latent_accordion = ui_components.get(f'reference_latent_accordion_{prefix}')
70
  hidream_o1_ref_accordion = ui_components.get(f'hidream_o1_reference_accordion_{prefix}')
71
  joyai_ref_accordion = ui_components.get(f'joyai_reference_accordion_{prefix}')
72
+ ref_img_accordion = ui_components.get(f'reference_image_accordion_{prefix}')
73
  pid_accordion = ui_components.get(f'pid_accordion_{prefix}')
74
  vae_accordion = ui_components.get(f'vae_accordion_{prefix}')
75
 
 
108
  if ref_latent_accordion: outputs.append(ref_latent_accordion)
109
  if hidream_o1_ref_accordion: outputs.append(hidream_o1_ref_accordion)
110
  if joyai_ref_accordion: outputs.append(joyai_ref_accordion)
111
+ if ref_img_accordion: outputs.append(ref_img_accordion)
112
  if pid_accordion: outputs.append(pid_accordion)
113
  if vae_accordion: outputs.append(vae_accordion)
114
  if ipa_preset_list: outputs.append(ipa_preset_list)
 
123
  krea2_cn_types_list, krea2_cn_series_list, krea2_cn_filepaths_list,
124
  ipa_preset_list, lora_accordion, cn_accordion, anima_cn_accordion, diffsynth_cn_accordion, krea2_cn_accordion, ipa_accordion, sd3_ipa_accordion, flux1_ipa_accordion, style_accordion, embedding_accordion, conditioning_accordion,
125
  ref_latent_accordion, hidream_o1_ref_accordion, guidance_comp, prompt_comp, neg_prompt_comp, steps_comp, cfg_comp, sampler_comp, scheduler_comp,
126
+ pid_acc=pid_accordion, vae_acc=vae_accordion, joyai_ref_acc=joyai_ref_accordion, ref_img_acc=ref_img_accordion
127
  )
128
  inputs = [arch_comp, cat_comp]
129
  if aspect_ratio_comp:
 
156
  if ref_latent_accordion: outputs2.append(ref_latent_accordion)
157
  if hidream_o1_ref_accordion: outputs2.append(hidream_o1_ref_accordion)
158
  if joyai_ref_accordion: outputs2.append(joyai_ref_accordion)
159
+ if ref_img_accordion: outputs2.append(ref_img_accordion)
160
  if pid_accordion: outputs2.append(pid_accordion)
161
  if vae_accordion: outputs2.append(vae_accordion)
162
  if ipa_preset_list: outputs2.append(ipa_preset_list)
 
176
  krea2_cn_types_list, krea2_cn_series_list, krea2_cn_filepaths_list,
177
  arch_comp, ipa_preset_list, lora_accordion, cn_accordion, anima_cn_accordion, diffsynth_cn_accordion, krea2_cn_accordion, ipa_accordion, sd3_ipa_accordion, flux1_ipa_accordion, style_accordion, embedding_accordion, conditioning_accordion,
178
  ref_latent_accordion, hidream_o1_ref_accordion, guidance_comp, prompt_comp, neg_prompt_comp, steps_comp, cfg_comp, sampler_comp, scheduler_comp,
179
+ pid_acc=pid_accordion, vae_acc=vae_accordion, joyai_ref_acc=joyai_ref_accordion, ref_img_acc=ref_img_accordion
180
  )
181
  model_comp.change(fn=change_fn, inputs=inputs2, outputs=outputs2)
182
 
 
194
  create_reference_latent_event_handlers(prefix, ui_components)
195
  create_hidream_o1_reference_event_handlers(prefix, ui_components)
196
  create_joyai_reference_event_handlers(prefix, ui_components)
197
+ create_reference_image_event_handlers(prefix, ui_components)
198
  create_run_event(prefix, task_type, ui_components)
199
 
200
  if 'view_mode_inpaint' in ui_components:
ui/events/run_handlers.py CHANGED
@@ -53,6 +53,7 @@ def create_run_event(prefix: str, task_type: str, ui_components: dict):
53
  reference_latent_data_components = ui_components.get(f'all_reference_latent_components_flat_{prefix}', [])
54
  hidream_o1_reference_data_components = ui_components.get(f'all_hidream_o1_reference_components_flat_{prefix}', [])
55
  joyai_reference_data_components = ui_components.get(f'all_joyai_reference_components_flat_{prefix}', [])
 
56
 
57
  run_inputs_map['vae_source'] = ui_components.get(f'vae_source_{prefix}')
58
  run_inputs_map['vae_id'] = ui_components.get(f'vae_id_{prefix}')
@@ -63,7 +64,7 @@ def create_run_event(prefix: str, task_type: str, ui_components: dict):
63
  all_chains = [
64
  lora_data_components, controlnet_data_components, anima_controlnet_lllite_data_components, diffsynth_controlnet_data_components, krea2_controlnet_data_components, ipadapter_data_components,
65
  sd3_ipadapter_data_components, flux1_ipadapter_data_components, style_data_components,
66
- embedding_data_components, conditioning_data_components, reference_latent_data_components, hidream_o1_reference_data_components, joyai_reference_data_components
67
  ]
68
  for chain in all_chains:
69
  if chain:
@@ -94,6 +95,7 @@ def create_run_event(prefix: str, task_type: str, ui_components: dict):
94
  assign_chain_data('reference_latent_data', reference_latent_data_components)
95
  assign_chain_data('hidream_o1_reference_data', hidream_o1_reference_data_components)
96
  assign_chain_data('joyai_reference_data', joyai_reference_data_components)
 
97
 
98
  return ui_dict
99
 
 
53
  reference_latent_data_components = ui_components.get(f'all_reference_latent_components_flat_{prefix}', [])
54
  hidream_o1_reference_data_components = ui_components.get(f'all_hidream_o1_reference_components_flat_{prefix}', [])
55
  joyai_reference_data_components = ui_components.get(f'all_joyai_reference_components_flat_{prefix}', [])
56
+ reference_image_data_components = ui_components.get(f'all_reference_image_components_flat_{prefix}', [])
57
 
58
  run_inputs_map['vae_source'] = ui_components.get(f'vae_source_{prefix}')
59
  run_inputs_map['vae_id'] = ui_components.get(f'vae_id_{prefix}')
 
64
  all_chains = [
65
  lora_data_components, controlnet_data_components, anima_controlnet_lllite_data_components, diffsynth_controlnet_data_components, krea2_controlnet_data_components, ipadapter_data_components,
66
  sd3_ipadapter_data_components, flux1_ipadapter_data_components, style_data_components,
67
+ embedding_data_components, conditioning_data_components, reference_latent_data_components, hidream_o1_reference_data_components, joyai_reference_data_components, reference_image_data_components
68
  ]
69
  for chain in all_chains:
70
  if chain:
 
95
  assign_chain_data('reference_latent_data', reference_latent_data_components)
96
  assign_chain_data('hidream_o1_reference_data', hidream_o1_reference_data_components)
97
  assign_chain_data('joyai_reference_data', joyai_reference_data_components)
98
+ assign_chain_data('reference_image_data', reference_image_data_components)
99
 
100
  return ui_dict
101
 
ui/shared/hires_fix_ui.py CHANGED
@@ -7,7 +7,7 @@ from .ui_components import (
7
  create_conditioning_ui, create_vae_override_ui,
8
  create_model_architecture_filter_ui, create_category_filter_ui,
9
  create_sd3_ipadapter_ui, create_flux1_ipadapter_ui, create_style_ui,
10
- create_reference_latent_ui, create_hidream_o1_reference_ui, create_joyai_reference_ui
11
  )
12
 
13
  default_vals = MODEL_DEFAULTS_CONFIG.get('Default', {})
@@ -102,6 +102,7 @@ def create_ui():
102
  components.update(create_reference_latent_ui(prefix))
103
  components.update(create_hidream_o1_reference_ui(prefix))
104
  components.update(create_joyai_reference_ui(prefix))
 
105
  components.update(create_vae_override_ui(prefix))
106
 
107
  return components
 
7
  create_conditioning_ui, create_vae_override_ui,
8
  create_model_architecture_filter_ui, create_category_filter_ui,
9
  create_sd3_ipadapter_ui, create_flux1_ipadapter_ui, create_style_ui,
10
+ create_reference_latent_ui, create_hidream_o1_reference_ui, create_joyai_reference_ui, create_reference_image_ui
11
  )
12
 
13
  default_vals = MODEL_DEFAULTS_CONFIG.get('Default', {})
 
102
  components.update(create_reference_latent_ui(prefix))
103
  components.update(create_hidream_o1_reference_ui(prefix))
104
  components.update(create_joyai_reference_ui(prefix))
105
+ components.update(create_reference_image_ui(prefix))
106
  components.update(create_vae_override_ui(prefix))
107
 
108
  return components
ui/shared/img2img_ui.py CHANGED
@@ -7,7 +7,7 @@ from .ui_components import (
7
  create_conditioning_ui, create_vae_override_ui,
8
  create_model_architecture_filter_ui, create_category_filter_ui,
9
  create_sd3_ipadapter_ui, create_flux1_ipadapter_ui, create_style_ui,
10
- create_reference_latent_ui, create_hidream_o1_reference_ui, create_joyai_reference_ui
11
  )
12
 
13
  default_vals = MODEL_DEFAULTS_CONFIG.get('Default', {})
@@ -83,6 +83,7 @@ def create_ui():
83
  components.update(create_reference_latent_ui(prefix))
84
  components.update(create_hidream_o1_reference_ui(prefix))
85
  components.update(create_joyai_reference_ui(prefix))
 
86
  components.update(create_vae_override_ui(prefix))
87
 
88
  return components
 
7
  create_conditioning_ui, create_vae_override_ui,
8
  create_model_architecture_filter_ui, create_category_filter_ui,
9
  create_sd3_ipadapter_ui, create_flux1_ipadapter_ui, create_style_ui,
10
+ create_reference_latent_ui, create_hidream_o1_reference_ui, create_joyai_reference_ui, create_reference_image_ui
11
  )
12
 
13
  default_vals = MODEL_DEFAULTS_CONFIG.get('Default', {})
 
83
  components.update(create_reference_latent_ui(prefix))
84
  components.update(create_hidream_o1_reference_ui(prefix))
85
  components.update(create_joyai_reference_ui(prefix))
86
+ components.update(create_reference_image_ui(prefix))
87
  components.update(create_vae_override_ui(prefix))
88
 
89
  return components
ui/shared/inpaint_ui.py CHANGED
@@ -6,7 +6,7 @@ from .ui_components import (
6
  create_conditioning_ui, create_vae_override_ui,
7
  create_model_architecture_filter_ui, create_category_filter_ui,
8
  create_sd3_ipadapter_ui, create_flux1_ipadapter_ui, create_style_ui,
9
- create_reference_latent_ui, create_hidream_o1_reference_ui, create_joyai_reference_ui
10
  )
11
 
12
  default_vals = MODEL_DEFAULTS_CONFIG.get('Default', {})
@@ -115,6 +115,7 @@ def create_ui():
115
  components.update(create_reference_latent_ui(prefix))
116
  components.update(create_hidream_o1_reference_ui(prefix))
117
  components.update(create_joyai_reference_ui(prefix))
 
118
  components.update(create_vae_override_ui(prefix))
119
  components[f'accordion_wrapper_{prefix}'] = accordion_wrapper
120
 
 
6
  create_conditioning_ui, create_vae_override_ui,
7
  create_model_architecture_filter_ui, create_category_filter_ui,
8
  create_sd3_ipadapter_ui, create_flux1_ipadapter_ui, create_style_ui,
9
+ create_reference_latent_ui, create_hidream_o1_reference_ui, create_joyai_reference_ui, create_reference_image_ui
10
  )
11
 
12
  default_vals = MODEL_DEFAULTS_CONFIG.get('Default', {})
 
115
  components.update(create_reference_latent_ui(prefix))
116
  components.update(create_hidream_o1_reference_ui(prefix))
117
  components.update(create_joyai_reference_ui(prefix))
118
+ components.update(create_reference_image_ui(prefix))
119
  components.update(create_vae_override_ui(prefix))
120
  components[f'accordion_wrapper_{prefix}'] = accordion_wrapper
121
 
ui/shared/outpaint_ui.py CHANGED
@@ -7,7 +7,7 @@ from .ui_components import (
7
  create_conditioning_ui, create_vae_override_ui,
8
  create_model_architecture_filter_ui, create_category_filter_ui,
9
  create_sd3_ipadapter_ui, create_flux1_ipadapter_ui, create_style_ui,
10
- create_reference_latent_ui, create_hidream_o1_reference_ui, create_joyai_reference_ui
11
  )
12
 
13
  default_vals = MODEL_DEFAULTS_CONFIG.get('Default', {})
@@ -98,6 +98,7 @@ def create_ui():
98
  components.update(create_reference_latent_ui(prefix))
99
  components.update(create_hidream_o1_reference_ui(prefix))
100
  components.update(create_joyai_reference_ui(prefix))
 
101
  components.update(create_vae_override_ui(prefix))
102
 
103
  return components
 
7
  create_conditioning_ui, create_vae_override_ui,
8
  create_model_architecture_filter_ui, create_category_filter_ui,
9
  create_sd3_ipadapter_ui, create_flux1_ipadapter_ui, create_style_ui,
10
+ create_reference_latent_ui, create_hidream_o1_reference_ui, create_joyai_reference_ui, create_reference_image_ui
11
  )
12
 
13
  default_vals = MODEL_DEFAULTS_CONFIG.get('Default', {})
 
98
  components.update(create_reference_latent_ui(prefix))
99
  components.update(create_hidream_o1_reference_ui(prefix))
100
  components.update(create_joyai_reference_ui(prefix))
101
+ components.update(create_reference_image_ui(prefix))
102
  components.update(create_vae_override_ui(prefix))
103
 
104
  return components
ui/shared/txt2img_ui.py CHANGED
@@ -6,7 +6,7 @@ from .ui_components import (
6
  create_conditioning_ui, create_vae_override_ui,
7
  create_model_architecture_filter_ui, create_category_filter_ui,
8
  create_sd3_ipadapter_ui, create_flux1_ipadapter_ui, create_style_ui,
9
- create_reference_latent_ui, create_hidream_o1_reference_ui, create_joyai_reference_ui,
10
  create_pid_ui
11
  )
12
 
@@ -55,6 +55,7 @@ def create_ui():
55
  components.update(create_reference_latent_ui(prefix))
56
  components.update(create_hidream_o1_reference_ui(prefix))
57
  components.update(create_joyai_reference_ui(prefix))
 
58
  components.update(create_vae_override_ui(prefix))
59
  components.update(create_pid_ui(prefix))
60
 
 
6
  create_conditioning_ui, create_vae_override_ui,
7
  create_model_architecture_filter_ui, create_category_filter_ui,
8
  create_sd3_ipadapter_ui, create_flux1_ipadapter_ui, create_style_ui,
9
+ create_reference_latent_ui, create_hidream_o1_reference_ui, create_joyai_reference_ui, create_reference_image_ui,
10
  create_pid_ui
11
  )
12
 
 
55
  components.update(create_reference_latent_ui(prefix))
56
  components.update(create_hidream_o1_reference_ui(prefix))
57
  components.update(create_joyai_reference_ui(prefix))
58
+ components.update(create_reference_image_ui(prefix))
59
  components.update(create_vae_override_ui(prefix))
60
  components.update(create_pid_ui(prefix))
61
 
ui/shared/ui_components.py CHANGED
@@ -725,6 +725,35 @@ def create_joyai_reference_ui(prefix: str, max_units=2):
725
 
726
  return components
727
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
728
  def create_pid_ui(prefix: str):
729
  components = {}
730
  key = lambda name: f"{name}_{prefix}"
 
725
 
726
  return components
727
 
728
+ def create_reference_image_ui(prefix: str, max_units=10):
729
+ components = {}
730
+ key = lambda name: f"{name}_{prefix}"
731
+
732
+ with gr.Accordion("Mage-Flow Reference Edit Settings", open=False, visible=('reference_image' in default_enabled_chains)) as ref_accordion:
733
+ components[key('reference_image_accordion')] = ref_accordion
734
+ gr.Markdown("💡 **Tip:** (Mage-Flow-Edit-Turbo/Mage-Flow-Edit recommended) For multimodal models, this feature enables powerful editing and combining capabilities. In txt2img mode, adding a single reference image performs an **Image Edit**, while adding multiple images performs an **Image Combine**.")
735
+
736
+ ref_image_groups = []
737
+ ref_image_inputs = []
738
+ with gr.Row():
739
+ for i in range(max_units):
740
+ with gr.Column(visible=(i < 1), min_width=160) as img_col:
741
+ img_comp = gr.Image(type="pil", label=f"Ref. {i+1}", sources=["upload"], height=150)
742
+ ref_image_groups.append(img_col)
743
+ ref_image_inputs.append(img_comp)
744
+
745
+ components[key('reference_image_rows')] = ref_image_groups
746
+ components[key('reference_image_images')] = ref_image_inputs
747
+
748
+ with gr.Row():
749
+ components[key('add_reference_image_button')] = gr.Button("✚ Add Reference Image")
750
+ components[key('delete_reference_image_button')] = gr.Button("➖ Delete Reference Image", visible=False)
751
+ components[key('reference_image_count_state')] = gr.State(1)
752
+
753
+ components[key('all_reference_image_components_flat')] = ref_image_inputs
754
+
755
+ return components
756
+
757
  def create_pid_ui(prefix: str):
758
  components = {}
759
  key = lambda name: f"{name}_{prefix}"
yaml/constants.yaml CHANGED
@@ -15,6 +15,14 @@ RESOLUTION_MAP:
15
  "3:4 (Classic Portrait)": [896, 1152]
16
  "3:2 (Photography)": [1216, 832]
17
  "2:3 (Photography Portrait)": [832, 1216]
 
 
 
 
 
 
 
 
18
  joyai-image:
19
  "1:1 (Square)": [1024, 1024]
20
  "16:9 (Landscape)": [1344, 768]
@@ -241,8 +249,9 @@ RESOLUTION_MAP:
241
  "2:3 (Portrait)": [512, 768]
242
 
243
  MULTIPLIERS_MAP:
244
- joyai-image: 1
245
  krea-2: 1
 
 
246
  boogu-image: 1
247
  pixeldit: 1
248
  ideogram-4: 1
 
15
  "3:4 (Classic Portrait)": [896, 1152]
16
  "3:2 (Photography)": [1216, 832]
17
  "2:3 (Photography Portrait)": [832, 1216]
18
+ mage-flow:
19
+ "1:1 (Square)": [1024, 1024]
20
+ "16:9 (Landscape)": [1344, 768]
21
+ "9:16 (Portrait)": [768, 1344]
22
+ "4:3 (Classic)": [1152, 896]
23
+ "3:4 (Classic Portrait)": [896, 1152]
24
+ "3:2 (Photography)": [1216, 832]
25
+ "2:3 (Photography Portrait)": [832, 1216]
26
  joyai-image:
27
  "1:1 (Square)": [1024, 1024]
28
  "16:9 (Landscape)": [1344, 768]
 
249
  "2:3 (Portrait)": [512, 768]
250
 
251
  MULTIPLIERS_MAP:
 
252
  krea-2: 1
253
+ mage-flow: 1
254
+ joyai-image: 1
255
  boogu-image: 1
256
  pixeldit: 1
257
  ideogram-4: 1
yaml/file_list.yaml CHANGED
@@ -405,6 +405,23 @@ file:
405
  source: "hf"
406
  repo_id: "Comfy-Org/Krea-2"
407
  repository_file_path: "diffusion_models/krea2_raw_fp8_scaled.safetensors"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
408
  # JoyAI-Image
409
  - filename: "joyai_image_edit_int8_convrot.safetensors"
410
  source: "hf"
@@ -916,4 +933,8 @@ file:
916
  - filename: "flux2-vae.safetensors"
917
  source: "hf"
918
  repo_id: "Comfy-Org/flux2-dev"
919
- repository_file_path: "split_files/vae/flux2-vae.safetensors"
 
 
 
 
 
405
  source: "hf"
406
  repo_id: "Comfy-Org/Krea-2"
407
  repository_file_path: "diffusion_models/krea2_raw_fp8_scaled.safetensors"
408
+ # Mage-Flow
409
+ - filename: "mage_flow_turbo_int8_convrot.safetensors"
410
+ source: "hf"
411
+ repo_id: "Comfy-Org/Mage-Flow"
412
+ repository_file_path: "diffusion_models/mage_flow_turbo_int8_convrot.safetensors"
413
+ - filename: "mage_flow_int8_convrot.safetensors"
414
+ source: "hf"
415
+ repo_id: "Comfy-Org/Mage-Flow"
416
+ repository_file_path: "diffusion_models/mage_flow_int8_convrot.safetensors"
417
+ - filename: "mage_flow_edit_turbo_int8_convrot.safetensors"
418
+ source: "hf"
419
+ repo_id: "Comfy-Org/Mage-Flow"
420
+ repository_file_path: "diffusion_models/mage_flow_edit_turbo_int8_convrot.safetensors"
421
+ - filename: "mage_flow_edit_int8_convrot.safetensors"
422
+ source: "hf"
423
+ repo_id: "Comfy-Org/Mage-Flow"
424
+ repository_file_path: "diffusion_models/mage_flow_edit_int8_convrot.safetensors"
425
  # JoyAI-Image
426
  - filename: "joyai_image_edit_int8_convrot.safetensors"
427
  source: "hf"
 
933
  - filename: "flux2-vae.safetensors"
934
  source: "hf"
935
  repo_id: "Comfy-Org/flux2-dev"
936
+ repository_file_path: "split_files/vae/flux2-vae.safetensors"
937
+ - filename: "mage_flow_vae_bf16.safetensors"
938
+ source: "hf"
939
+ repo_id: "Comfy-Org/Mage-Flow"
940
+ repository_file_path: "vae/mage_flow_vae_bf16.safetensors"
yaml/image_gen_features.yaml CHANGED
@@ -8,6 +8,10 @@ default:
8
  - conditioning
9
  - vae
10
 
 
 
 
 
11
  joyai-image:
12
  enabled_chains:
13
  - joyai_reference
 
8
  - conditioning
9
  - vae
10
 
11
+ mage-flow:
12
+ enabled_chains:
13
+ - reference_image
14
+
15
  joyai-image:
16
  enabled_chains:
17
  - joyai_reference
yaml/injectors.yaml CHANGED
@@ -31,6 +31,8 @@ injector_definitions:
31
  module: "chain_injectors.hidream_o1_reference_injector"
32
  dynamic_joyai_reference_chains:
33
  module: "chain_injectors.joyai_reference_injector"
 
 
34
  dynamic_pid_chains:
35
  module: "chain_injectors.pid_injector"
36
 
@@ -51,4 +53,5 @@ injector_order:
51
  - dynamic_hidream_o1_smoothing_chains
52
  - dynamic_hidream_o1_reference_chains
53
  - dynamic_joyai_reference_chains
 
54
  - dynamic_pid_chains
 
31
  module: "chain_injectors.hidream_o1_reference_injector"
32
  dynamic_joyai_reference_chains:
33
  module: "chain_injectors.joyai_reference_injector"
34
+ dynamic_reference_image_chains:
35
+ module: "chain_injectors.reference_image_injector"
36
  dynamic_pid_chains:
37
  module: "chain_injectors.pid_injector"
38
 
 
53
  - dynamic_hidream_o1_smoothing_chains
54
  - dynamic_hidream_o1_reference_chains
55
  - dynamic_joyai_reference_chains
56
+ - dynamic_reference_image_chains
57
  - dynamic_pid_chains