RioShiina commited on
Commit
8a95959
·
verified ·
1 Parent(s): de5b1cc

Add Boogu Edit Injector.

Browse files
README.md CHANGED
@@ -137,6 +137,8 @@ models:
137
  - black-forest-labs/FLUX.1-schnell
138
  - Boogu/Boogu-Image-0.1-Turbo
139
  - Boogu/Boogu-Image-0.1-Base
 
 
140
  - HiDream-ai/HiDream-I1-Dev
141
  - HiDream-ai/HiDream-I1-Fast
142
  - HiDream-ai/HiDream-I1-Full
 
137
  - black-forest-labs/FLUX.1-schnell
138
  - Boogu/Boogu-Image-0.1-Turbo
139
  - Boogu/Boogu-Image-0.1-Base
140
+ - Boogu/Boogu-Image-0.1-Edit
141
+ - Boogu/Boogu-Image-0.1-Edit-Turbo
142
  - HiDream-ai/HiDream-I1-Dev
143
  - HiDream-ai/HiDream-I1-Fast
144
  - HiDream-ai/HiDream-I1-Full
chain_injectors/boogu_edit_injector.py ADDED
@@ -0,0 +1,128 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+
3
+ def create_node(assembler, class_type, title):
4
+ try:
5
+ node = assembler._get_node_template(class_type)
6
+ except Exception:
7
+ node = {
8
+ "inputs": {},
9
+ "class_type": class_type,
10
+ "_meta": {"title": title}
11
+ }
12
+ node['_meta']['title'] = title
13
+ return node
14
+
15
+ def inject(assembler, chain_definition, chain_items):
16
+ if not chain_items:
17
+ return
18
+
19
+ valid_images = []
20
+ for item in chain_items:
21
+ if not item:
22
+ continue
23
+ img_path = item
24
+ if isinstance(item, dict):
25
+ img_path = item.get('image') or item.get('filename') or item.get('path')
26
+ if img_path:
27
+ valid_images.append(img_path)
28
+
29
+ if not valid_images:
30
+ return
31
+
32
+ valid_images = valid_images[:10]
33
+
34
+ ksampler_name = chain_definition.get('ksampler_node', 'ksampler')
35
+ pos_prompt_name = chain_definition.get('pos_prompt_node', 'pos_prompt')
36
+ neg_prompt_name = chain_definition.get('neg_prompt_node', 'neg_prompt')
37
+ clip_loader_name = chain_definition.get('clip_loader_node', 'clip_loader')
38
+ vae_loader_name = chain_definition.get('vae_loader_node', 'vae_loader')
39
+
40
+ if ksampler_name not in assembler.node_map:
41
+ print(f"Warning: Target node '{ksampler_name}' for Boogu Edit chain not found. Skipping.")
42
+ return
43
+
44
+ ksampler_id = assembler.node_map[ksampler_name]
45
+
46
+ if 'model' not in assembler.workflow[ksampler_id]['inputs']:
47
+ print(f"Warning: KSampler node '{ksampler_name}' is missing 'model' input. Skipping.")
48
+ return
49
+
50
+ vae_connection = None
51
+ if vae_loader_name in assembler.node_map:
52
+ vae_connection = [assembler.node_map[vae_loader_name], 0]
53
+ else:
54
+ for node_id, node in assembler.workflow.items():
55
+ if isinstance(node, dict) and node.get('class_type') == 'VAELoader':
56
+ vae_connection = [node_id, 0]
57
+ break
58
+
59
+ clip_connection = None
60
+ if clip_loader_name in assembler.node_map:
61
+ clip_connection = [assembler.node_map[clip_loader_name], 0]
62
+ elif pos_prompt_name in assembler.node_map:
63
+ pos_id = assembler.node_map[pos_prompt_name]
64
+ clip_connection = assembler.workflow[pos_id]['inputs'].get('clip')
65
+
66
+ pos_prompt_id = assembler.node_map.get(pos_prompt_name)
67
+ neg_prompt_id = assembler.node_map.get(neg_prompt_name)
68
+
69
+ pos_text = ""
70
+ if pos_prompt_id and pos_prompt_id in assembler.workflow:
71
+ pos_text = assembler.workflow[pos_prompt_id]['inputs'].get('text', '')
72
+ elif hasattr(assembler, 'ui_values') and isinstance(assembler.ui_values, dict):
73
+ pos_text = assembler.ui_values.get('positive_prompt') or assembler.ui_values.get('prompt') or ''
74
+
75
+ if not pos_text:
76
+ for node_id, node in assembler.workflow.items():
77
+ if isinstance(node, dict):
78
+ cls = node.get('class_type', '')
79
+ if cls in ['TextEncodeBooguEdit', 'Krea2EditGroundedEncode', 'TextEncodeQwenImageEditPlus', 'CLIPTextEncode']:
80
+ t = node.get('inputs', {}).get('prompt') or node.get('inputs', {}).get('text')
81
+ if t:
82
+ pos_text = t
83
+ break
84
+
85
+ neg_text = ""
86
+ if neg_prompt_id and neg_prompt_id in assembler.workflow:
87
+ neg_text = assembler.workflow[neg_prompt_id]['inputs'].get('text', '')
88
+ elif hasattr(assembler, 'ui_values') and isinstance(assembler.ui_values, dict):
89
+ neg_text = assembler.ui_values.get('negative_prompt') or assembler.ui_values.get('neg_prompt') or ''
90
+
91
+ scaled_image_ids = []
92
+ for i, img_filename in enumerate(valid_images):
93
+ load_id = assembler._get_unique_id()
94
+ load_node = create_node(assembler, "LoadImage", f"Load Reference Image {i+1}")
95
+ load_node['inputs']['image'] = img_filename
96
+ assembler.workflow[load_id] = load_node
97
+
98
+ scale_id = assembler._get_unique_id()
99
+ scale_node = create_node(assembler, "ImageScaleToTotalPixels", f"Scale Reference {i+1}")
100
+ scale_node['inputs']['upscale_method'] = "nearest-exact"
101
+ scale_node['inputs']['megapixels'] = 1
102
+ scale_node['inputs']['resolution_steps'] = 1
103
+ scale_node['inputs']['image'] = [load_id, 0]
104
+ assembler.workflow[scale_id] = scale_node
105
+ scaled_image_ids.append(scale_id)
106
+
107
+ boogu_encode_id = assembler._get_unique_id()
108
+ boogu_encode_node = create_node(assembler, "TextEncodeBooguEdit", "TextEncodeBooguEdit")
109
+ boogu_encode_node['inputs']['prompt'] = pos_text
110
+ boogu_encode_node['inputs']['negative_prompt'] = neg_text
111
+ if clip_connection:
112
+ boogu_encode_node['inputs']['clip'] = clip_connection
113
+ if vae_connection:
114
+ boogu_encode_node['inputs']['vae'] = vae_connection
115
+ for idx, s_id in enumerate(scaled_image_ids):
116
+ boogu_encode_node['inputs'][f"images.image_{idx+1}"] = [s_id, 0]
117
+ assembler.workflow[boogu_encode_id] = boogu_encode_node
118
+
119
+ assembler.workflow[ksampler_id]['inputs']['positive'] = [boogu_encode_id, 0]
120
+ assembler.workflow[ksampler_id]['inputs']['negative'] = [boogu_encode_id, 1]
121
+
122
+ if pos_prompt_id and pos_prompt_id in assembler.workflow:
123
+ del assembler.workflow[pos_prompt_id]
124
+
125
+ if neg_prompt_id and neg_prompt_id in assembler.workflow:
126
+ del assembler.workflow[neg_prompt_id]
127
+
128
+ print(f"Boogu Edit injector applied with {len(valid_images)} reference image(s). Original CLIPTextEncode nodes replaced.")
core/pipelines/pipeline_input_processor.py CHANGED
@@ -390,6 +390,17 @@ def process_pipeline_inputs(ui_inputs: Dict[str, Any], progress: gr.Progress, wo
390
  temp_files_to_clean.append(temp_path)
391
  active_qwen_image_edit.append(os.path.basename(temp_path))
392
 
 
 
 
 
 
 
 
 
 
 
 
393
  reference_image_data = ui_inputs.get('reference_image_data', [])
394
  active_reference_images = []
395
  if reference_image_data:
@@ -446,6 +457,7 @@ def process_pipeline_inputs(ui_inputs: Dict[str, Any], progress: gr.Progress, wo
446
  "active_krea2_identity_edit": active_krea2_identity_edit,
447
  "active_krea2_reference_edit": active_krea2_reference_edit,
448
  "active_qwen_image_edit": active_qwen_image_edit,
 
449
  "active_reference_images": active_reference_images,
450
  "active_conditioning": active_conditioning,
451
  "temp_files_to_clean": temp_files_to_clean
 
390
  temp_files_to_clean.append(temp_path)
391
  active_qwen_image_edit.append(os.path.basename(temp_path))
392
 
393
+ boogu_edit_data = ui_inputs.get('boogu_edit_data', [])
394
+ active_boogu_edit = []
395
+ if boogu_edit_data:
396
+ for img in boogu_edit_data:
397
+ if img:
398
+ if not os.path.exists(INPUT_DIR): os.makedirs(INPUT_DIR)
399
+ temp_path = os.path.join(INPUT_DIR, f"temp_boogu_edit_ref_{random.randint(1000, 9999)}.png")
400
+ img.save(temp_path, "PNG")
401
+ temp_files_to_clean.append(temp_path)
402
+ active_boogu_edit.append(os.path.basename(temp_path))
403
+
404
  reference_image_data = ui_inputs.get('reference_image_data', [])
405
  active_reference_images = []
406
  if reference_image_data:
 
457
  "active_krea2_identity_edit": active_krea2_identity_edit,
458
  "active_krea2_reference_edit": active_krea2_reference_edit,
459
  "active_qwen_image_edit": active_qwen_image_edit,
460
+ "active_boogu_edit": active_boogu_edit,
461
  "active_reference_images": active_reference_images,
462
  "active_conditioning": active_conditioning,
463
  "temp_files_to_clean": temp_files_to_clean
core/pipelines/sd_image_pipeline.py CHANGED
@@ -121,6 +121,7 @@ class SdImagePipeline(BasePipeline):
121
  active_krea2_identity_edit = processed.get("active_krea2_identity_edit", [])
122
  active_krea2_reference_edit = processed.get("active_krea2_reference_edit", [])
123
  active_qwen_image_edit = processed.get("active_qwen_image_edit", [])
 
124
  active_reference_images = processed.get("active_reference_images", [])
125
  active_conditioning = processed["active_conditioning"]
126
 
@@ -183,6 +184,7 @@ class SdImagePipeline(BasePipeline):
183
  "krea2_identity_edit_chain": active_krea2_identity_edit,
184
  "krea2_reference_edit_chain": active_krea2_reference_edit,
185
  "qwen_image_edit_chain": active_qwen_image_edit,
 
186
  "reference_image_chain": active_reference_images,
187
  "vae_chain": [ui_inputs.get('vae_name')] if ui_inputs.get('vae_name') else [],
188
  "hidream_o1_smoothing_chain": hidream_o1_smoothing_data,
 
121
  active_krea2_identity_edit = processed.get("active_krea2_identity_edit", [])
122
  active_krea2_reference_edit = processed.get("active_krea2_reference_edit", [])
123
  active_qwen_image_edit = processed.get("active_qwen_image_edit", [])
124
+ active_boogu_edit = processed.get("active_boogu_edit", [])
125
  active_reference_images = processed.get("active_reference_images", [])
126
  active_conditioning = processed["active_conditioning"]
127
 
 
184
  "krea2_identity_edit_chain": active_krea2_identity_edit,
185
  "krea2_reference_edit_chain": active_krea2_reference_edit,
186
  "qwen_image_edit_chain": active_qwen_image_edit,
187
+ "boogu_edit_chain": active_boogu_edit,
188
  "reference_image_chain": active_reference_images,
189
  "vae_chain": [ui_inputs.get('vae_name')] if ui_inputs.get('vae_name') else [],
190
  "hidream_o1_smoothing_chain": hidream_o1_smoothing_data,
core/pipelines/workflow_recipes/_partials/conditioning/boogu-image.yaml CHANGED
@@ -54,6 +54,14 @@ dynamic_conditioning_chains:
54
  ksampler_node: "ksampler"
55
  clip_source: "clip_loader:0"
56
 
 
 
 
 
 
 
 
 
57
  dynamic_pid_chains:
58
  pid_chain:
59
  ksampler_node: "ksampler"
 
54
  ksampler_node: "ksampler"
55
  clip_source: "clip_loader:0"
56
 
57
+ dynamic_boogu_edit_chains:
58
+ boogu_edit_chain:
59
+ ksampler_node: "ksampler"
60
+ pos_prompt_node: "pos_prompt"
61
+ neg_prompt_node: "neg_prompt"
62
+ clip_loader_node: "clip_loader"
63
+ vae_loader_node: "vae_loader"
64
+
65
  dynamic_pid_chains:
66
  pid_chain:
67
  ksampler_node: "ksampler"
requirements.txt CHANGED
@@ -1,5 +1,5 @@
1
  comfyui-frontend-package==1.47.11
2
- comfyui-workflow-templates==0.11.20
3
  comfyui-embedded-docs==0.5.9
4
  torch
5
  torchsde
@@ -22,7 +22,7 @@ alembic
22
  SQLAlchemy>=2.0.0
23
  filelock
24
  av>=16.0.0
25
- comfy-kitchen==0.2.25
26
  comfy-aimdo==0.4.10
27
  requests
28
  simpleeval>=1.0.0
 
1
  comfyui-frontend-package==1.47.11
2
+ comfyui-workflow-templates==0.11.23
3
  comfyui-embedded-docs==0.5.9
4
  torch
5
  torchsde
 
22
  SQLAlchemy>=2.0.0
23
  filelock
24
  av>=16.0.0
25
+ comfy-kitchen==0.2.26
26
  comfy-aimdo==0.4.10
27
  requests
28
  simpleeval>=1.0.0
ui/events/chain_handlers.py CHANGED
@@ -952,6 +952,39 @@ def create_krea2_reference_edit_event_handlers(prefix, ui_components):
952
  del_button: gr.update(visible=c > 0),
953
  }
954
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
955
  add_outputs = [count_state, add_button, del_button] + ref_rows
956
  del_outputs = [count_state, add_button, del_button] + ref_rows + images
957
  add_button.click(fn=add_ref_row, inputs=[count_state], outputs=add_outputs, show_progress=False)
 
952
  del_button: gr.update(visible=c > 0),
953
  }
954
 
955
+ add_outputs = [count_state, add_button, del_button] + ref_rows
956
+ del_outputs = [count_state, add_button, del_button] + ref_rows + images
957
+ add_button.click(fn=add_ref_row, inputs=[count_state], outputs=add_outputs, show_progress=False)
958
+ del_button.click(fn=del_ref_row, inputs=[count_state], outputs=del_outputs, show_progress=False)
959
+
960
+
961
+ def create_boogu_edit_event_handlers(prefix, ui_components, max_units=10):
962
+ ref_rows = ui_components.get(f'boogu_edit_rows_{prefix}')
963
+ if not ref_rows: return
964
+ count_state = ui_components[f'boogu_edit_count_state_{prefix}']
965
+ add_button = ui_components[f'add_boogu_edit_button_{prefix}']
966
+ del_button = ui_components[f'delete_boogu_edit_button_{prefix}']
967
+ images = ui_components[f'boogu_edit_images_{prefix}']
968
+
969
+ def add_ref_row(c):
970
+ c += 1
971
+ return {
972
+ count_state: c,
973
+ ref_rows[c - 1]: gr.update(visible=True),
974
+ add_button: gr.update(visible=c < max_units),
975
+ del_button: gr.update(visible=True),
976
+ }
977
+
978
+ def del_ref_row(c):
979
+ c -= 1
980
+ return {
981
+ count_state: c,
982
+ ref_rows[c]: gr.update(visible=False),
983
+ images[c]: None,
984
+ add_button: gr.update(visible=True),
985
+ del_button: gr.update(visible=c > 1),
986
+ }
987
+
988
  add_outputs = [count_state, add_button, del_button] + ref_rows
989
  del_outputs = [count_state, add_button, del_button] + ref_rows + images
990
  add_button.click(fn=add_ref_row, inputs=[count_state], outputs=add_outputs, show_progress=False)
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, krea2_identity_edit_acc=None, krea2_reference_edit_acc=None, qwen_image_edit_acc=None, ref_img_acc=None):
21
  def update_fn(*args):
22
  arch = args[0]
23
  category = args[1]
@@ -72,6 +72,7 @@ def make_update_fn(m_comp, cat_comp, cs_comp, ar_comp, width_comp, height_comp,
72
  if krea2_identity_edit_acc: updates[krea2_identity_edit_acc] = gr.update(visible=('krea2_identity_edit' in enabled_chains))
73
  if krea2_reference_edit_acc: updates[krea2_reference_edit_acc] = gr.update(visible=('krea2_reference_edit' in enabled_chains))
74
  if qwen_image_edit_acc: updates[qwen_image_edit_acc] = gr.update(visible=('qwen_image_edit' in enabled_chains))
 
75
  if ref_img_acc: updates[ref_img_acc] = gr.update(visible=('reference_image' in enabled_chains))
76
  if pid_acc: updates[pid_acc] = gr.update(visible=('pid' in enabled_chains))
77
  if vae_acc: updates[vae_acc] = gr.update(visible=('vae' in enabled_chains))
@@ -147,7 +148,7 @@ def make_update_fn(m_comp, cat_comp, cs_comp, ar_comp, width_comp, height_comp,
147
  return update_fn
148
 
149
 
150
- 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, krea2_identity_edit_acc=None, krea2_reference_edit_acc=None, qwen_image_edit_acc=None, ref_img_acc=None):
151
  def change_fn(*args):
152
  model_name = args[0]
153
  idx = 1
@@ -207,6 +208,7 @@ def make_model_change_fn(cat_comp_ref, cs_comp, ar_comp, width_comp, height_comp
207
  if krea2_identity_edit_acc: updates[krea2_identity_edit_acc] = gr.update(visible=('krea2_identity_edit' in enabled_chains))
208
  if krea2_reference_edit_acc: updates[krea2_reference_edit_acc] = gr.update(visible=('krea2_reference_edit' in enabled_chains))
209
  if qwen_image_edit_acc: updates[qwen_image_edit_acc] = gr.update(visible=('qwen_image_edit' in enabled_chains))
 
210
  if ref_img_acc: updates[ref_img_acc] = gr.update(visible=('reference_image' in enabled_chains))
211
  if pid_acc: updates[pid_acc] = gr.update(visible=('pid' in enabled_chains))
212
  if vae_acc: updates[vae_acc] = gr.update(visible=('vae' in enabled_chains))
 
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, krea2_identity_edit_acc=None, krea2_reference_edit_acc=None, qwen_image_edit_acc=None, boogu_edit_acc=None, ref_img_acc=None):
21
  def update_fn(*args):
22
  arch = args[0]
23
  category = args[1]
 
72
  if krea2_identity_edit_acc: updates[krea2_identity_edit_acc] = gr.update(visible=('krea2_identity_edit' in enabled_chains))
73
  if krea2_reference_edit_acc: updates[krea2_reference_edit_acc] = gr.update(visible=('krea2_reference_edit' in enabled_chains))
74
  if qwen_image_edit_acc: updates[qwen_image_edit_acc] = gr.update(visible=('qwen_image_edit' in enabled_chains))
75
+ if boogu_edit_acc: updates[boogu_edit_acc] = gr.update(visible=('boogu_edit' in enabled_chains))
76
  if ref_img_acc: updates[ref_img_acc] = gr.update(visible=('reference_image' in enabled_chains))
77
  if pid_acc: updates[pid_acc] = gr.update(visible=('pid' in enabled_chains))
78
  if vae_acc: updates[vae_acc] = gr.update(visible=('vae' in enabled_chains))
 
148
  return update_fn
149
 
150
 
151
+ 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, krea2_identity_edit_acc=None, krea2_reference_edit_acc=None, qwen_image_edit_acc=None, boogu_edit_acc=None, ref_img_acc=None):
152
  def change_fn(*args):
153
  model_name = args[0]
154
  idx = 1
 
208
  if krea2_identity_edit_acc: updates[krea2_identity_edit_acc] = gr.update(visible=('krea2_identity_edit' in enabled_chains))
209
  if krea2_reference_edit_acc: updates[krea2_reference_edit_acc] = gr.update(visible=('krea2_reference_edit' in enabled_chains))
210
  if qwen_image_edit_acc: updates[qwen_image_edit_acc] = gr.update(visible=('qwen_image_edit' in enabled_chains))
211
+ if boogu_edit_acc: updates[boogu_edit_acc] = gr.update(visible=('boogu_edit' in enabled_chains))
212
  if ref_img_acc: updates[ref_img_acc] = gr.update(visible=('reference_image' in enabled_chains))
213
  if pid_acc: updates[pid_acc] = gr.update(visible=('pid' in enabled_chains))
214
  if vae_acc: updates[vae_acc] = gr.update(visible=('vae' in enabled_chains))
ui/events/main.py CHANGED
@@ -17,6 +17,7 @@ from .chain_handlers import (
17
  create_krea2_identity_edit_event_handlers,
18
  create_krea2_reference_edit_event_handlers,
19
  create_qwen_image_edit_event_handlers,
 
20
  create_reference_image_event_handlers
21
  )
22
  from .change_handlers import (
@@ -75,6 +76,7 @@ def attach_event_handlers(ui_components, demo):
75
  krea2_identity_edit_accordion = ui_components.get(f'krea2_identity_edit_accordion_{prefix}')
76
  krea2_reference_edit_accordion = ui_components.get(f'krea2_reference_edit_accordion_{prefix}')
77
  qwen_image_edit_accordion = ui_components.get(f'qwen_image_edit_accordion_{prefix}')
 
78
  ref_img_accordion = ui_components.get(f'reference_image_accordion_{prefix}')
79
  pid_accordion = ui_components.get(f'pid_accordion_{prefix}')
80
  vae_accordion = ui_components.get(f'vae_accordion_{prefix}')
@@ -117,6 +119,7 @@ def attach_event_handlers(ui_components, demo):
117
  if krea2_identity_edit_accordion: outputs.append(krea2_identity_edit_accordion)
118
  if krea2_reference_edit_accordion: outputs.append(krea2_reference_edit_accordion)
119
  if qwen_image_edit_accordion: outputs.append(qwen_image_edit_accordion)
 
120
  if ref_img_accordion: outputs.append(ref_img_accordion)
121
  if pid_accordion: outputs.append(pid_accordion)
122
  if vae_accordion: outputs.append(vae_accordion)
@@ -132,7 +135,7 @@ def attach_event_handlers(ui_components, demo):
132
  krea2_cn_types_list, krea2_cn_series_list, krea2_cn_filepaths_list,
133
  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,
134
  ref_latent_accordion, hidream_o1_ref_accordion, guidance_comp, prompt_comp, neg_prompt_comp, steps_comp, cfg_comp, sampler_comp, scheduler_comp,
135
- pid_acc=pid_accordion, vae_acc=vae_accordion, joyai_ref_acc=joyai_ref_accordion, krea2_identity_edit_acc=krea2_identity_edit_accordion, krea2_reference_edit_acc=krea2_reference_edit_accordion, qwen_image_edit_acc=qwen_image_edit_accordion, ref_img_acc=ref_img_accordion
136
  )
137
  inputs = [arch_comp, cat_comp]
138
  if aspect_ratio_comp:
@@ -168,6 +171,7 @@ def attach_event_handlers(ui_components, demo):
168
  if krea2_identity_edit_accordion: outputs2.append(krea2_identity_edit_accordion)
169
  if krea2_reference_edit_accordion: outputs2.append(krea2_reference_edit_accordion)
170
  if qwen_image_edit_accordion: outputs2.append(qwen_image_edit_accordion)
 
171
  if ref_img_accordion: outputs2.append(ref_img_accordion)
172
  if pid_accordion: outputs2.append(pid_accordion)
173
  if vae_accordion: outputs2.append(vae_accordion)
@@ -188,7 +192,7 @@ def attach_event_handlers(ui_components, demo):
188
  krea2_cn_types_list, krea2_cn_series_list, krea2_cn_filepaths_list,
189
  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,
190
  ref_latent_accordion, hidream_o1_ref_accordion, guidance_comp, prompt_comp, neg_prompt_comp, steps_comp, cfg_comp, sampler_comp, scheduler_comp,
191
- pid_acc=pid_accordion, vae_acc=vae_accordion, joyai_ref_acc=joyai_ref_accordion, krea2_identity_edit_acc=krea2_identity_edit_accordion, krea2_reference_edit_acc=krea2_reference_edit_accordion, qwen_image_edit_acc=qwen_image_edit_accordion, ref_img_acc=ref_img_accordion
192
  )
193
  model_comp.change(fn=change_fn, inputs=inputs2, outputs=outputs2)
194
 
@@ -209,6 +213,7 @@ def attach_event_handlers(ui_components, demo):
209
  create_krea2_identity_edit_event_handlers(prefix, ui_components)
210
  create_krea2_reference_edit_event_handlers(prefix, ui_components)
211
  create_qwen_image_edit_event_handlers(prefix, ui_components)
 
212
  create_reference_image_event_handlers(prefix, ui_components)
213
  create_run_event(prefix, task_type, ui_components)
214
 
 
17
  create_krea2_identity_edit_event_handlers,
18
  create_krea2_reference_edit_event_handlers,
19
  create_qwen_image_edit_event_handlers,
20
+ create_boogu_edit_event_handlers,
21
  create_reference_image_event_handlers
22
  )
23
  from .change_handlers import (
 
76
  krea2_identity_edit_accordion = ui_components.get(f'krea2_identity_edit_accordion_{prefix}')
77
  krea2_reference_edit_accordion = ui_components.get(f'krea2_reference_edit_accordion_{prefix}')
78
  qwen_image_edit_accordion = ui_components.get(f'qwen_image_edit_accordion_{prefix}')
79
+ boogu_edit_accordion = ui_components.get(f'boogu_edit_accordion_{prefix}')
80
  ref_img_accordion = ui_components.get(f'reference_image_accordion_{prefix}')
81
  pid_accordion = ui_components.get(f'pid_accordion_{prefix}')
82
  vae_accordion = ui_components.get(f'vae_accordion_{prefix}')
 
119
  if krea2_identity_edit_accordion: outputs.append(krea2_identity_edit_accordion)
120
  if krea2_reference_edit_accordion: outputs.append(krea2_reference_edit_accordion)
121
  if qwen_image_edit_accordion: outputs.append(qwen_image_edit_accordion)
122
+ if boogu_edit_accordion: outputs.append(boogu_edit_accordion)
123
  if ref_img_accordion: outputs.append(ref_img_accordion)
124
  if pid_accordion: outputs.append(pid_accordion)
125
  if vae_accordion: outputs.append(vae_accordion)
 
135
  krea2_cn_types_list, krea2_cn_series_list, krea2_cn_filepaths_list,
136
  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,
137
  ref_latent_accordion, hidream_o1_ref_accordion, guidance_comp, prompt_comp, neg_prompt_comp, steps_comp, cfg_comp, sampler_comp, scheduler_comp,
138
+ pid_acc=pid_accordion, vae_acc=vae_accordion, joyai_ref_acc=joyai_ref_accordion, krea2_identity_edit_acc=krea2_identity_edit_accordion, krea2_reference_edit_acc=krea2_reference_edit_accordion, qwen_image_edit_acc=qwen_image_edit_accordion, boogu_edit_acc=boogu_edit_accordion, ref_img_acc=ref_img_accordion
139
  )
140
  inputs = [arch_comp, cat_comp]
141
  if aspect_ratio_comp:
 
171
  if krea2_identity_edit_accordion: outputs2.append(krea2_identity_edit_accordion)
172
  if krea2_reference_edit_accordion: outputs2.append(krea2_reference_edit_accordion)
173
  if qwen_image_edit_accordion: outputs2.append(qwen_image_edit_accordion)
174
+ if boogu_edit_accordion: outputs2.append(boogu_edit_accordion)
175
  if ref_img_accordion: outputs2.append(ref_img_accordion)
176
  if pid_accordion: outputs2.append(pid_accordion)
177
  if vae_accordion: outputs2.append(vae_accordion)
 
192
  krea2_cn_types_list, krea2_cn_series_list, krea2_cn_filepaths_list,
193
  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,
194
  ref_latent_accordion, hidream_o1_ref_accordion, guidance_comp, prompt_comp, neg_prompt_comp, steps_comp, cfg_comp, sampler_comp, scheduler_comp,
195
+ pid_acc=pid_accordion, vae_acc=vae_accordion, joyai_ref_acc=joyai_ref_accordion, krea2_identity_edit_acc=krea2_identity_edit_accordion, krea2_reference_edit_acc=krea2_reference_edit_accordion, qwen_image_edit_acc=qwen_image_edit_accordion, boogu_edit_acc=boogu_edit_accordion, ref_img_acc=ref_img_accordion
196
  )
197
  model_comp.change(fn=change_fn, inputs=inputs2, outputs=outputs2)
198
 
 
213
  create_krea2_identity_edit_event_handlers(prefix, ui_components)
214
  create_krea2_reference_edit_event_handlers(prefix, ui_components)
215
  create_qwen_image_edit_event_handlers(prefix, ui_components)
216
+ create_boogu_edit_event_handlers(prefix, ui_components)
217
  create_reference_image_event_handlers(prefix, ui_components)
218
  create_run_event(prefix, task_type, ui_components)
219
 
ui/events/run_handlers.py CHANGED
@@ -56,6 +56,7 @@ def create_run_event(prefix: str, task_type: str, ui_components: dict):
56
  krea2_identity_edit_data_components = ui_components.get(f'all_krea2_identity_edit_components_flat_{prefix}', [])
57
  krea2_reference_edit_data_components = ui_components.get(f'all_krea2_reference_edit_components_flat_{prefix}', [])
58
  qwen_image_edit_data_components = ui_components.get(f'all_qwen_image_edit_components_flat_{prefix}', [])
 
59
  reference_image_data_components = ui_components.get(f'all_reference_image_components_flat_{prefix}', [])
60
 
61
  run_inputs_map['vae_source'] = ui_components.get(f'vae_source_{prefix}')
@@ -67,7 +68,7 @@ def create_run_event(prefix: str, task_type: str, ui_components: dict):
67
  all_chains = [
68
  lora_data_components, controlnet_data_components, anima_controlnet_lllite_data_components, diffsynth_controlnet_data_components, krea2_controlnet_data_components, ipadapter_data_components,
69
  sd3_ipadapter_data_components, flux1_ipadapter_data_components, style_data_components,
70
- embedding_data_components, conditioning_data_components, reference_latent_data_components, hidream_o1_reference_data_components, joyai_reference_data_components, krea2_identity_edit_data_components, krea2_reference_edit_data_components, qwen_image_edit_data_components, reference_image_data_components
71
  ]
72
  for chain in all_chains:
73
  if chain:
@@ -101,6 +102,7 @@ def create_run_event(prefix: str, task_type: str, ui_components: dict):
101
  assign_chain_data('krea2_identity_edit_data', krea2_identity_edit_data_components)
102
  assign_chain_data('krea2_reference_edit_data', krea2_reference_edit_data_components)
103
  assign_chain_data('qwen_image_edit_data', qwen_image_edit_data_components)
 
104
  assign_chain_data('reference_image_data', reference_image_data_components)
105
 
106
  return ui_dict
 
56
  krea2_identity_edit_data_components = ui_components.get(f'all_krea2_identity_edit_components_flat_{prefix}', [])
57
  krea2_reference_edit_data_components = ui_components.get(f'all_krea2_reference_edit_components_flat_{prefix}', [])
58
  qwen_image_edit_data_components = ui_components.get(f'all_qwen_image_edit_components_flat_{prefix}', [])
59
+ boogu_edit_data_components = ui_components.get(f'all_boogu_edit_components_flat_{prefix}', [])
60
  reference_image_data_components = ui_components.get(f'all_reference_image_components_flat_{prefix}', [])
61
 
62
  run_inputs_map['vae_source'] = ui_components.get(f'vae_source_{prefix}')
 
68
  all_chains = [
69
  lora_data_components, controlnet_data_components, anima_controlnet_lllite_data_components, diffsynth_controlnet_data_components, krea2_controlnet_data_components, ipadapter_data_components,
70
  sd3_ipadapter_data_components, flux1_ipadapter_data_components, style_data_components,
71
+ embedding_data_components, conditioning_data_components, reference_latent_data_components, hidream_o1_reference_data_components, joyai_reference_data_components, krea2_identity_edit_data_components, krea2_reference_edit_data_components, qwen_image_edit_data_components, boogu_edit_data_components, reference_image_data_components
72
  ]
73
  for chain in all_chains:
74
  if chain:
 
102
  assign_chain_data('krea2_identity_edit_data', krea2_identity_edit_data_components)
103
  assign_chain_data('krea2_reference_edit_data', krea2_reference_edit_data_components)
104
  assign_chain_data('qwen_image_edit_data', qwen_image_edit_data_components)
105
+ assign_chain_data('boogu_edit_data', boogu_edit_data_components)
106
  assign_chain_data('reference_image_data', reference_image_data_components)
107
 
108
  return ui_dict
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, create_reference_image_ui, create_krea2_identity_edit_ui, create_krea2_reference_edit_ui, create_qwen_image_edit_ui
11
  )
12
 
13
  default_vals = MODEL_DEFAULTS_CONFIG.get('Default', {})
@@ -105,6 +105,7 @@ def create_ui():
105
  components.update(create_krea2_identity_edit_ui(prefix))
106
  components.update(create_krea2_reference_edit_ui(prefix))
107
  components.update(create_qwen_image_edit_ui(prefix))
 
108
  components.update(create_reference_image_ui(prefix))
109
  components.update(create_vae_override_ui(prefix))
110
 
 
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, create_krea2_identity_edit_ui, create_krea2_reference_edit_ui, create_qwen_image_edit_ui, create_boogu_edit_ui
11
  )
12
 
13
  default_vals = MODEL_DEFAULTS_CONFIG.get('Default', {})
 
105
  components.update(create_krea2_identity_edit_ui(prefix))
106
  components.update(create_krea2_reference_edit_ui(prefix))
107
  components.update(create_qwen_image_edit_ui(prefix))
108
+ components.update(create_boogu_edit_ui(prefix))
109
  components.update(create_reference_image_ui(prefix))
110
  components.update(create_vae_override_ui(prefix))
111
 
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, create_reference_image_ui, create_krea2_identity_edit_ui, create_krea2_reference_edit_ui, create_qwen_image_edit_ui
11
  )
12
 
13
  default_vals = MODEL_DEFAULTS_CONFIG.get('Default', {})
@@ -86,6 +86,7 @@ def create_ui():
86
  components.update(create_krea2_identity_edit_ui(prefix))
87
  components.update(create_krea2_reference_edit_ui(prefix))
88
  components.update(create_qwen_image_edit_ui(prefix))
 
89
  components.update(create_reference_image_ui(prefix))
90
  components.update(create_vae_override_ui(prefix))
91
 
 
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, create_krea2_identity_edit_ui, create_krea2_reference_edit_ui, create_qwen_image_edit_ui, create_boogu_edit_ui
11
  )
12
 
13
  default_vals = MODEL_DEFAULTS_CONFIG.get('Default', {})
 
86
  components.update(create_krea2_identity_edit_ui(prefix))
87
  components.update(create_krea2_reference_edit_ui(prefix))
88
  components.update(create_qwen_image_edit_ui(prefix))
89
+ components.update(create_boogu_edit_ui(prefix))
90
  components.update(create_reference_image_ui(prefix))
91
  components.update(create_vae_override_ui(prefix))
92
 
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, create_reference_image_ui, create_krea2_identity_edit_ui, create_krea2_reference_edit_ui, create_qwen_image_edit_ui
10
  )
11
 
12
  default_vals = MODEL_DEFAULTS_CONFIG.get('Default', {})
@@ -118,6 +118,7 @@ def create_ui():
118
  components.update(create_krea2_identity_edit_ui(prefix))
119
  components.update(create_krea2_reference_edit_ui(prefix))
120
  components.update(create_qwen_image_edit_ui(prefix))
 
121
  components.update(create_reference_image_ui(prefix))
122
  components.update(create_vae_override_ui(prefix))
123
  components[f'accordion_wrapper_{prefix}'] = accordion_wrapper
 
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, create_krea2_identity_edit_ui, create_krea2_reference_edit_ui, create_qwen_image_edit_ui, create_boogu_edit_ui
10
  )
11
 
12
  default_vals = MODEL_DEFAULTS_CONFIG.get('Default', {})
 
118
  components.update(create_krea2_identity_edit_ui(prefix))
119
  components.update(create_krea2_reference_edit_ui(prefix))
120
  components.update(create_qwen_image_edit_ui(prefix))
121
+ components.update(create_boogu_edit_ui(prefix))
122
  components.update(create_reference_image_ui(prefix))
123
  components.update(create_vae_override_ui(prefix))
124
  components[f'accordion_wrapper_{prefix}'] = accordion_wrapper
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, create_reference_image_ui, create_krea2_identity_edit_ui, create_krea2_reference_edit_ui, create_qwen_image_edit_ui
11
  )
12
 
13
  default_vals = MODEL_DEFAULTS_CONFIG.get('Default', {})
@@ -101,6 +101,7 @@ def create_ui():
101
  components.update(create_krea2_identity_edit_ui(prefix))
102
  components.update(create_krea2_reference_edit_ui(prefix))
103
  components.update(create_qwen_image_edit_ui(prefix))
 
104
  components.update(create_reference_image_ui(prefix))
105
  components.update(create_vae_override_ui(prefix))
106
 
 
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, create_krea2_identity_edit_ui, create_krea2_reference_edit_ui, create_qwen_image_edit_ui, create_boogu_edit_ui
11
  )
12
 
13
  default_vals = MODEL_DEFAULTS_CONFIG.get('Default', {})
 
101
  components.update(create_krea2_identity_edit_ui(prefix))
102
  components.update(create_krea2_reference_edit_ui(prefix))
103
  components.update(create_qwen_image_edit_ui(prefix))
104
+ components.update(create_boogu_edit_ui(prefix))
105
  components.update(create_reference_image_ui(prefix))
106
  components.update(create_vae_override_ui(prefix))
107
 
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, create_reference_image_ui, create_krea2_identity_edit_ui, create_krea2_reference_edit_ui, create_qwen_image_edit_ui,
10
  create_pid_ui
11
  )
12
 
@@ -58,6 +58,7 @@ def create_ui():
58
  components.update(create_krea2_identity_edit_ui(prefix))
59
  components.update(create_krea2_reference_edit_ui(prefix))
60
  components.update(create_qwen_image_edit_ui(prefix))
 
61
  components.update(create_reference_image_ui(prefix))
62
  components.update(create_vae_override_ui(prefix))
63
  components.update(create_pid_ui(prefix))
 
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, create_krea2_identity_edit_ui, create_krea2_reference_edit_ui, create_qwen_image_edit_ui, create_boogu_edit_ui,
10
  create_pid_ui
11
  )
12
 
 
58
  components.update(create_krea2_identity_edit_ui(prefix))
59
  components.update(create_krea2_reference_edit_ui(prefix))
60
  components.update(create_qwen_image_edit_ui(prefix))
61
+ components.update(create_boogu_edit_ui(prefix))
62
  components.update(create_reference_image_ui(prefix))
63
  components.update(create_vae_override_ui(prefix))
64
  components.update(create_pid_ui(prefix))
ui/shared/ui_components.py CHANGED
@@ -856,4 +856,33 @@ def create_krea2_reference_edit_ui(prefix: str, max_units=3):
856
 
857
  components[key('all_krea2_reference_edit_components_flat')] = ref_image_inputs
858
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
859
  return components
 
856
 
857
  components[key('all_krea2_reference_edit_components_flat')] = ref_image_inputs
858
 
859
+ return components
860
+
861
+ def create_boogu_edit_ui(prefix: str, max_units=10):
862
+ components = {}
863
+ key = lambda name: f"{name}_{prefix}"
864
+
865
+ with gr.Accordion("Boogu-Image Edit Settings", open=False, visible=('boogu_edit' in default_enabled_chains)) as ref_accordion:
866
+ components[key('boogu_edit_accordion')] = ref_accordion
867
+ gr.Markdown("💡 **Tip:** (Boogu-Image-Edit-Turbo/Boogu-Image-Edit recommended, Boogu-Image-Edit need set ZeroGPU Duration (s) to 120 ) In txt2img mode, adding a single reference image performs an **Image Edit**, while adding multiple images performs an **Image Combine**.")
868
+
869
+ ref_image_groups = []
870
+ ref_image_inputs = []
871
+ with gr.Row():
872
+ for i in range(max_units):
873
+ with gr.Column(visible=(i < 1), min_width=160) as img_col:
874
+ img_comp = gr.Image(type="pil", label=f"Ref. {i+1}", sources=["upload"], height=150)
875
+ ref_image_groups.append(img_col)
876
+ ref_image_inputs.append(img_comp)
877
+
878
+ components[key('boogu_edit_rows')] = ref_image_groups
879
+ components[key('boogu_edit_images')] = ref_image_inputs
880
+
881
+ with gr.Row():
882
+ components[key('add_boogu_edit_button')] = gr.Button("✚ Add Reference Image")
883
+ components[key('delete_boogu_edit_button')] = gr.Button("➖ Delete Reference Image", visible=False)
884
+ components[key('boogu_edit_count_state')] = gr.State(1)
885
+
886
+ components[key('all_boogu_edit_components_flat')] = ref_image_inputs
887
+
888
  return components
yaml/file_list.yaml CHANGED
@@ -448,6 +448,14 @@ file:
448
  source: "hf"
449
  repo_id: "Comfy-Org/Boogu-Image"
450
  repository_file_path: "diffusion_models/boogu_image_turbo_hotfix_nvfp4.safetensors"
 
 
 
 
 
 
 
 
451
  # Ideogram-4
452
  - filename: "ideogram4_nvfp4_mixed.safetensors"
453
  source: "hf"
 
448
  source: "hf"
449
  repo_id: "Comfy-Org/Boogu-Image"
450
  repository_file_path: "diffusion_models/boogu_image_turbo_hotfix_nvfp4.safetensors"
451
+ - filename: "boogu_image_edit_turbo_hotfix_1k_20260708_int8_convrot.safetensors"
452
+ source: "hf"
453
+ repo_id: "Comfy-Org/Boogu-Image"
454
+ repository_file_path: "diffusion_models/boogu_image_edit_turbo_hotfix_1k_20260708_int8_convrot.safetensors"
455
+ - filename: "boogu_image_edit_nvfp4.safetensors"
456
+ source: "hf"
457
+ repo_id: "Comfy-Org/Boogu-Image"
458
+ repository_file_path: "diffusion_models/boogu_image_edit_nvfp4.safetensors"
459
  # Ideogram-4
460
  - filename: "ideogram4_nvfp4_mixed.safetensors"
461
  source: "hf"
yaml/image_gen_features.yaml CHANGED
@@ -27,7 +27,7 @@ krea-2:
27
  boogu-image:
28
  enabled_chains:
29
  - lora
30
- - conditioning
31
  - pid
32
 
33
  pixeldit:
 
27
  boogu-image:
28
  enabled_chains:
29
  - lora
30
+ - boogu_edit
31
  - pid
32
 
33
  pixeldit:
yaml/injectors.yaml CHANGED
@@ -37,6 +37,8 @@ injector_definitions:
37
  module: "chain_injectors.krea2_reference_edit_injector"
38
  dynamic_qwen_image_edit_chains:
39
  module: "chain_injectors.qwen_image_edit_injector"
 
 
40
  dynamic_reference_image_chains:
41
  module: "chain_injectors.reference_image_injector"
42
  dynamic_pid_chains:
@@ -58,6 +60,7 @@ injector_order:
58
  - dynamic_krea2_identity_edit_chains
59
  - dynamic_krea2_reference_edit_chains
60
  - dynamic_qwen_image_edit_chains
 
61
  - dynamic_anima_controlnet_lllite_chains
62
  - dynamic_hidream_o1_smoothing_chains
63
  - dynamic_hidream_o1_reference_chains
 
37
  module: "chain_injectors.krea2_reference_edit_injector"
38
  dynamic_qwen_image_edit_chains:
39
  module: "chain_injectors.qwen_image_edit_injector"
40
+ dynamic_boogu_edit_chains:
41
+ module: "chain_injectors.boogu_edit_injector"
42
  dynamic_reference_image_chains:
43
  module: "chain_injectors.reference_image_injector"
44
  dynamic_pid_chains:
 
60
  - dynamic_krea2_identity_edit_chains
61
  - dynamic_krea2_reference_edit_chains
62
  - dynamic_qwen_image_edit_chains
63
+ - dynamic_boogu_edit_chains
64
  - dynamic_anima_controlnet_lllite_chains
65
  - dynamic_hidream_o1_smoothing_chains
66
  - dynamic_hidream_o1_reference_chains
yaml/model_defaults.yaml CHANGED
@@ -52,6 +52,11 @@ Boogu-Image:
52
  cfg: 1.0
53
  sampler_name: "lcm"
54
  scheduler: "sgm_uniform"
 
 
 
 
 
55
 
56
  PixelDiT:
57
  _defaults:
 
52
  cfg: 1.0
53
  sampler_name: "lcm"
54
  scheduler: "sgm_uniform"
55
+ "Boogu-Image-Edit-Turbo":
56
+ steps: 4
57
+ cfg: 1.0
58
+ sampler_name: "lcm"
59
+ scheduler: "sgm_uniform"
60
 
61
  PixelDiT:
62
  _defaults:
yaml/model_list.yaml CHANGED
@@ -71,6 +71,16 @@ Checkpoint:
71
  unet: "boogu_image_base_nvfp4.safetensors"
72
  clip: "qwen3vl_8b_nvfp4.safetensors"
73
  vae: "ae.safetensors"
 
 
 
 
 
 
 
 
 
 
74
  PixelDiT:
75
  latent_type: chroma_radiance_latent
76
  models:
 
71
  unet: "boogu_image_base_nvfp4.safetensors"
72
  clip: "qwen3vl_8b_nvfp4.safetensors"
73
  vae: "ae.safetensors"
74
+ - display_name: "Boogu-Image-Edit-Turbo"
75
+ components:
76
+ unet: "boogu_image_edit_turbo_hotfix_1k_20260708_int8_convrot.safetensors"
77
+ clip: "qwen3vl_8b_nvfp4.safetensors"
78
+ vae: "ae.safetensors"
79
+ - display_name: "Boogu-Image-Edit"
80
+ components:
81
+ unet: "boogu_image_edit_nvfp4.safetensors"
82
+ clip: "qwen3vl_8b_nvfp4.safetensors"
83
+ vae: "ae.safetensors"
84
  PixelDiT:
85
  latent_type: chroma_radiance_latent
86
  models: