RioShiina commited on
Commit
79e1a03
·
verified ·
1 Parent(s): db60c62

Add SenseNova-U1.5 architecture model.

Browse files
README.md CHANGED
@@ -117,6 +117,7 @@ models:
117
  - stabilityai/stable-diffusion-3.5-controlnets
118
  - stabilityai/stable-diffusion-xl-base-1.0
119
  - stable-diffusion-v1-5/stable-diffusion-v1-5
 
120
  - tori29umai/krea2-controlnet
121
  - tsukiyomi/krea2_raw-nvfp4
122
  - Wenaka/NoobAI_XL_Inpainting_ControlNet_Full
@@ -170,6 +171,8 @@ models:
170
  - Qwen/Qwen-Image-Edit
171
  - Qwen/Qwen-Image-Edit-2509
172
  - Qwen/Qwen-Image-Edit-2511
 
 
173
  - stabilityai/stable-diffusion-3.5-large
174
  - stabilityai/stable-diffusion-3.5-medium
175
  - tencent/HunyuanImage-2.1
 
117
  - stabilityai/stable-diffusion-3.5-controlnets
118
  - stabilityai/stable-diffusion-xl-base-1.0
119
  - stable-diffusion-v1-5/stable-diffusion-v1-5
120
+ - t8star/SenseNova-U1.5-Comfy
121
  - tori29umai/krea2-controlnet
122
  - tsukiyomi/krea2_raw-nvfp4
123
  - Wenaka/NoobAI_XL_Inpainting_ControlNet_Full
 
171
  - Qwen/Qwen-Image-Edit
172
  - Qwen/Qwen-Image-Edit-2509
173
  - Qwen/Qwen-Image-Edit-2511
174
+ - sensenova/SenseNova-U1.5-8B-MoT
175
+ - sensenova/SenseNova-U1.5-8B-MoT-SFT
176
  - stabilityai/stable-diffusion-3.5-large
177
  - stabilityai/stable-diffusion-3.5-medium
178
  - tencent/HunyuanImage-2.1
chain_injectors/sensenova_reference_injector.py ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ def inject(assembler, chain_definition, chain_items):
2
+ if not chain_items:
3
+ return
4
+
5
+ ksampler_name = chain_definition.get('ksampler_node', 'ksampler')
6
+
7
+ if ksampler_name not in assembler.node_map:
8
+ print(f"Warning: KSampler node '{ksampler_name}' not found for SenseNova Reference chain. Skipping.")
9
+ return
10
+
11
+ ksampler_id = assembler.node_map[ksampler_name]
12
+
13
+ if 'positive' not in assembler.workflow[ksampler_id]['inputs'] or 'negative' not in assembler.workflow[ksampler_id]['inputs']:
14
+ print(f"Warning: KSampler node '{ksampler_name}' missing positive/negative inputs. Skipping.")
15
+ return
16
+
17
+ current_pos_conditioning = assembler.workflow[ksampler_id]['inputs']['positive']
18
+ current_neg_conditioning = assembler.workflow[ksampler_id]['inputs']['negative']
19
+
20
+ ref_images_id = assembler._get_unique_id()
21
+ ref_images_node = assembler._get_node_template("HiDreamO1ReferenceImages")
22
+
23
+ if 'images' in ref_images_node['inputs']:
24
+ del ref_images_node['inputs']['images']
25
+
26
+ ref_images_node['inputs']['positive'] = current_pos_conditioning
27
+ ref_images_node['inputs']['negative'] = current_neg_conditioning
28
+
29
+ for i, img_filename in enumerate(chain_items):
30
+ if i >= 10:
31
+ break
32
+
33
+ load_id = assembler._get_unique_id()
34
+ load_node = assembler._get_node_template("LoadImage")
35
+ load_node['inputs']['image'] = img_filename
36
+ load_node['_meta']['title'] = f"Load Reference Image {i+1}"
37
+ assembler.workflow[load_id] = load_node
38
+
39
+ scale_id = assembler._get_unique_id()
40
+ scale_node = assembler._get_node_template("ImageScaleToTotalPixels")
41
+ scale_node['inputs']['megapixels'] = 1.0
42
+ scale_node['inputs']['upscale_method'] = "lanczos"
43
+ scale_node['inputs']['image'] = [load_id, 0]
44
+ scale_node['_meta']['title'] = f"Scale Reference {i+1}"
45
+ assembler.workflow[scale_id] = scale_node
46
+
47
+ ref_images_node['inputs'][f'images.image_{i+1}'] = [scale_id, 0]
48
+
49
+ assembler.workflow[ref_images_id] = ref_images_node
50
+
51
+ assembler.workflow[ksampler_id]['inputs']['positive'] = [ref_images_id, 0]
52
+ assembler.workflow[ksampler_id]['inputs']['negative'] = [ref_images_id, 1]
53
+
54
+ print(f"SenseNova Reference injector applied. Re-routed inputs through {min(len(chain_items), 10)} reference images.")
core/pipelines/pipeline_input_processor.py CHANGED
@@ -356,6 +356,17 @@ def process_pipeline_inputs(ui_inputs: Dict[str, Any], progress: gr.Progress, wo
356
  img.save(temp_path, "PNG")
357
  temp_files_to_clean.append(temp_path)
358
  active_hidream_o1_reference.append(os.path.basename(temp_path))
 
 
 
 
 
 
 
 
 
 
 
359
 
360
  joyai_reference_data = ui_inputs.get('joyai_reference_data', [])
361
  active_joyai_reference = []
@@ -470,6 +481,7 @@ def process_pipeline_inputs(ui_inputs: Dict[str, Any], progress: gr.Progress, wo
470
  "active_styles": active_styles,
471
  "active_reference_latents": active_reference_latents,
472
  "active_hidream_o1_reference": active_hidream_o1_reference,
 
473
  "active_joyai_reference": active_joyai_reference,
474
  "active_krea2_identity_edit": active_krea2_identity_edit,
475
  "active_krea2_reference_edit": active_krea2_reference_edit,
 
356
  img.save(temp_path, "PNG")
357
  temp_files_to_clean.append(temp_path)
358
  active_hidream_o1_reference.append(os.path.basename(temp_path))
359
+
360
+ sensenova_reference_data = ui_inputs.get('sensenova_reference_data', [])
361
+ active_sensenova_reference = []
362
+ if 'sensenova_reference' in enabled_chains and sensenova_reference_data:
363
+ for img in sensenova_reference_data:
364
+ if img:
365
+ if not os.path.exists(INPUT_DIR): os.makedirs(INPUT_DIR)
366
+ temp_path = os.path.join(INPUT_DIR, f"temp_sn_ref_{random.randint(1000, 9999)}.png")
367
+ img.save(temp_path, "PNG")
368
+ temp_files_to_clean.append(temp_path)
369
+ active_sensenova_reference.append(os.path.basename(temp_path))
370
 
371
  joyai_reference_data = ui_inputs.get('joyai_reference_data', [])
372
  active_joyai_reference = []
 
481
  "active_styles": active_styles,
482
  "active_reference_latents": active_reference_latents,
483
  "active_hidream_o1_reference": active_hidream_o1_reference,
484
+ "active_sensenova_reference": active_sensenova_reference,
485
  "active_joyai_reference": active_joyai_reference,
486
  "active_krea2_identity_edit": active_krea2_identity_edit,
487
  "active_krea2_reference_edit": active_krea2_reference_edit,
core/pipelines/sd_image_pipeline.py CHANGED
@@ -115,6 +115,7 @@ class SdImagePipeline(BasePipeline):
115
  active_styles = processed["active_styles"]
116
  active_reference_latents = processed["active_reference_latents"]
117
  active_hidream_o1_reference = processed["active_hidream_o1_reference"]
 
118
  active_joyai_reference = processed.get("active_joyai_reference", [])
119
  active_krea2_identity_edit = processed.get("active_krea2_identity_edit", [])
120
  active_krea2_reference_edit = processed.get("active_krea2_reference_edit", [])
@@ -176,6 +177,7 @@ class SdImagePipeline(BasePipeline):
176
  "conditioning_chain": active_conditioning,
177
  "reference_latent_chain": active_reference_latents,
178
  "hidream_o1_reference_chain": active_hidream_o1_reference,
 
179
  "joyai_image_chain": active_joyai_reference,
180
  "krea2_identity_edit_chain": active_krea2_identity_edit,
181
  "krea2_style_reference_chain": active_krea2_reference_edit,
 
115
  active_styles = processed["active_styles"]
116
  active_reference_latents = processed["active_reference_latents"]
117
  active_hidream_o1_reference = processed["active_hidream_o1_reference"]
118
+ active_sensenova_reference = processed.get("active_sensenova_reference", [])
119
  active_joyai_reference = processed.get("active_joyai_reference", [])
120
  active_krea2_identity_edit = processed.get("active_krea2_identity_edit", [])
121
  active_krea2_reference_edit = processed.get("active_krea2_reference_edit", [])
 
177
  "conditioning_chain": active_conditioning,
178
  "reference_latent_chain": active_reference_latents,
179
  "hidream_o1_reference_chain": active_hidream_o1_reference,
180
+ "sensenova_reference_chain": active_sensenova_reference,
181
  "joyai_image_chain": active_joyai_reference,
182
  "krea2_identity_edit_chain": active_krea2_identity_edit,
183
  "krea2_style_reference_chain": active_krea2_reference_edit,
core/pipelines/workflow_recipes/_partials/conditioning/sensenova-u1.5.yaml ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ sensenova_sampling:
12
+ class_type: SenseNovaSamplingOptions
13
+ title: "SenseNovaSamplingOptions"
14
+ params:
15
+ shift: 3
16
+
17
+ connections:
18
+ - from: "ckpt_loader:0"
19
+ to: "sensenova_sampling:model"
20
+ - from: "sensenova_sampling:0"
21
+ to: "ksampler:model"
22
+
23
+ - from: "ckpt_loader:1"
24
+ to: "pos_prompt:clip"
25
+ - from: "ckpt_loader:1"
26
+ to: "neg_prompt:clip"
27
+ - from: "pos_prompt:0"
28
+ to: "ksampler:positive"
29
+ - from: "neg_prompt:0"
30
+ to: "ksampler:negative"
31
+
32
+ - from: "ckpt_loader:2"
33
+ to: "vae_decode:vae"
34
+ - from: "ckpt_loader:2"
35
+ to: "vae_encode:vae"
36
+
37
+ dynamic_vae_chains:
38
+ vae_chain:
39
+ targets:
40
+ - "vae_decode:vae"
41
+ - "vae_encode:vae"
42
+
43
+ dynamic_lora_chains:
44
+ lora_chain:
45
+ template: "LoraLoader"
46
+ start: "ckpt_loader"
47
+ output_map:
48
+ "0": "model"
49
+ "1": "clip"
50
+ input_map:
51
+ "model": "model"
52
+ "clip": "clip"
53
+ end_input_map:
54
+ "model": ["sensenova_sampling:model"]
55
+ "clip": ["pos_prompt:clip", "neg_prompt:clip"]
56
+
57
+ dynamic_conditioning_chains:
58
+ conditioning_chain:
59
+ ksampler_node: "ksampler"
60
+ clip_source: "ckpt_loader:1"
61
+
62
+ dynamic_sensenova_reference_chains:
63
+ sensenova_reference_chain:
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"
mcp_tools/common.py CHANGED
@@ -450,6 +450,7 @@ def _execute_imagegen_pipeline(task_id: str, params: dict):
450
  boogu_edit_data = []
451
  qwen_image_edit_data = []
452
  hidream_o1_reference_data = []
 
453
  cond_prompts = []
454
  cond_widths = []
455
  cond_heights = []
@@ -702,6 +703,10 @@ def _execute_imagegen_pipeline(task_id: str, params: dict):
702
  img = _parse_image_param(item.get("image"))
703
  if img:
704
  hidream_o1_reference_data.append(img)
 
 
 
 
705
  elif itype == "vae":
706
  v_source = item.get("source", item.get("vae_source", "Civitai"))
707
  v_val = item.get("vae_value", item.get("value", item.get("vae_id", item.get("vae_name", ""))))
@@ -755,6 +760,7 @@ def _execute_imagegen_pipeline(task_id: str, params: dict):
755
  if boogu_edit_data: ui_inputs["boogu_edit_data"] = boogu_edit_data
756
  if qwen_image_edit_data: ui_inputs["qwen_image_edit_data"] = qwen_image_edit_data
757
  if hidream_o1_reference_data: ui_inputs["hidream_o1_reference_data"] = hidream_o1_reference_data
 
758
  if cond_prompts:
759
  ui_inputs["conditioning_data"] = (
760
  cond_prompts + cond_widths + cond_heights + cond_xs + cond_ys + cond_strengths
 
450
  boogu_edit_data = []
451
  qwen_image_edit_data = []
452
  hidream_o1_reference_data = []
453
+ sensenova_reference_data = []
454
  cond_prompts = []
455
  cond_widths = []
456
  cond_heights = []
 
703
  img = _parse_image_param(item.get("image"))
704
  if img:
705
  hidream_o1_reference_data.append(img)
706
+ elif itype == "sensenova_reference":
707
+ img = _parse_image_param(item.get("image"))
708
+ if img:
709
+ sensenova_reference_data.append(img)
710
  elif itype == "vae":
711
  v_source = item.get("source", item.get("vae_source", "Civitai"))
712
  v_val = item.get("vae_value", item.get("value", item.get("vae_id", item.get("vae_name", ""))))
 
760
  if boogu_edit_data: ui_inputs["boogu_edit_data"] = boogu_edit_data
761
  if qwen_image_edit_data: ui_inputs["qwen_image_edit_data"] = qwen_image_edit_data
762
  if hidream_o1_reference_data: ui_inputs["hidream_o1_reference_data"] = hidream_o1_reference_data
763
+ if sensenova_reference_data: ui_inputs["sensenova_reference_data"] = sensenova_reference_data
764
  if cond_prompts:
765
  ui_inputs["conditioning_data"] = (
766
  cond_prompts + cond_widths + cond_heights + cond_xs + cond_ys + cond_strengths
requirements.txt CHANGED
@@ -1,5 +1,5 @@
1
- comfyui-frontend-package==1.49.6
2
- comfyui-workflow-templates==0.11.44
3
  comfyui-embedded-docs==0.5.10
4
  torch
5
  torchsde
@@ -21,9 +21,9 @@ psutil
21
  alembic
22
  SQLAlchemy>=2.0.0
23
  filelock
24
- av>=16.0.0
25
  comfy-kitchen==0.2.31
26
- comfy-aimdo==0.4.13
27
  requests
28
  simpleeval>=1.0.0
29
  blake3
 
1
+ comfyui-frontend-package==1.51.9
2
+ comfyui-workflow-templates==0.11.50
3
  comfyui-embedded-docs==0.5.10
4
  torch
5
  torchsde
 
21
  alembic
22
  SQLAlchemy>=2.0.0
23
  filelock
24
+ av>=17.0.0
25
  comfy-kitchen==0.2.31
26
+ comfy-aimdo==0.4.15
27
  requests
28
  simpleeval>=1.0.0
29
  blake3
ui/events/chain_handlers.py CHANGED
@@ -715,6 +715,39 @@ def create_hidream_o1_reference_event_handlers(prefix, ui_components):
715
  del_button.click(fn=del_ref_row, inputs=[count_state], outputs=del_outputs, show_progress=False)
716
 
717
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
718
  def create_joyai_reference_event_handlers(prefix, ui_components):
719
  ref_rows = ui_components.get(f'joyai_reference_rows_{prefix}')
720
  if not ref_rows: return
 
715
  del_button.click(fn=del_ref_row, inputs=[count_state], outputs=del_outputs, show_progress=False)
716
 
717
 
718
+ def create_sensenova_reference_event_handlers(prefix, ui_components):
719
+ ref_rows = ui_components.get(f'sensenova_reference_rows_{prefix}')
720
+ if not ref_rows: return
721
+ count_state = ui_components[f'sensenova_reference_count_state_{prefix}']
722
+ add_button = ui_components[f'add_sensenova_reference_button_{prefix}']
723
+ del_button = ui_components[f'delete_sensenova_reference_button_{prefix}']
724
+ images = ui_components[f'sensenova_reference_images_{prefix}']
725
+
726
+ def add_ref_row(c):
727
+ c += 1
728
+ return {
729
+ count_state: c,
730
+ ref_rows[c - 1]: gr.update(visible=True),
731
+ add_button: gr.update(visible=c < 10),
732
+ del_button: gr.update(visible=True),
733
+ }
734
+
735
+ def del_ref_row(c):
736
+ c -= 1
737
+ return {
738
+ count_state: c,
739
+ ref_rows[c]: gr.update(visible=False),
740
+ images[c]: None,
741
+ add_button: gr.update(visible=True),
742
+ del_button: gr.update(visible=c > 0),
743
+ }
744
+
745
+ add_outputs = [count_state, add_button, del_button] + ref_rows
746
+ del_outputs = [count_state, add_button, del_button] + ref_rows + images
747
+ add_button.click(fn=add_ref_row, inputs=[count_state], outputs=add_outputs, show_progress=False)
748
+ del_button.click(fn=del_ref_row, inputs=[count_state], outputs=del_outputs, show_progress=False)
749
+
750
+
751
  def create_joyai_reference_event_handlers(prefix, ui_components):
752
  ref_rows = ui_components.get(f'joyai_reference_rows_{prefix}')
753
  if not ref_rows: return
ui/events/change_handlers.py CHANGED
@@ -18,7 +18,7 @@ from .config_loaders import (
18
  load_ipadapter_config
19
  )
20
 
21
- def make_update_fn(m_comp, cat_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, 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, task_type=None, type_comp=None):
22
  def update_fn(*args):
23
  arch = args[0]
24
  category = args[1]
@@ -82,6 +82,7 @@ def make_update_fn(m_comp, cat_comp, ar_comp, width_comp, height_comp, cn_types,
82
  if cond_acc: updates[cond_acc] = gr.update(visible=('conditioning' in enabled_chains))
83
  if ref_latent_acc: updates[ref_latent_acc] = gr.update(visible=('reference_latent' in enabled_chains))
84
  if hidream_o1_ref_acc: updates[hidream_o1_ref_acc] = gr.update(visible=('hidream_o1_reference' in enabled_chains))
 
85
  if joyai_ref_acc: updates[joyai_ref_acc] = gr.update(visible=('joyai_image' in enabled_chains))
86
  if krea2_identity_edit_acc: updates[krea2_identity_edit_acc] = gr.update(visible=('krea2_identity_edit' in enabled_chains))
87
  if krea2_reference_edit_acc: updates[krea2_reference_edit_acc] = gr.update(visible=('krea2_style_reference' in enabled_chains))
@@ -157,7 +158,7 @@ def make_update_fn(m_comp, cat_comp, ar_comp, width_comp, height_comp, cn_types,
157
  return update_fn
158
 
159
 
160
- def make_model_change_fn(cat_comp_ref, 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, 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, task_type=None, type_comp=None):
161
  def change_fn(*args):
162
  model_name = args[0]
163
  idx = 1
@@ -229,6 +230,7 @@ def make_model_change_fn(cat_comp_ref, ar_comp, width_comp, height_comp, cn_type
229
  if cond_acc: updates[cond_acc] = gr.update(visible=('conditioning' in enabled_chains))
230
  if ref_latent_acc: updates[ref_latent_acc] = gr.update(visible=('reference_latent' in enabled_chains))
231
  if hidream_o1_ref_acc: updates[hidream_o1_ref_acc] = gr.update(visible=('hidream_o1_reference' in enabled_chains))
 
232
  if joyai_ref_acc: updates[joyai_ref_acc] = gr.update(visible=('joyai_image' in enabled_chains))
233
  if krea2_identity_edit_acc: updates[krea2_identity_edit_acc] = gr.update(visible=('krea2_identity_edit' in enabled_chains))
234
  if krea2_reference_edit_acc: updates[krea2_reference_edit_acc] = gr.update(visible=('krea2_style_reference' in enabled_chains))
 
18
  load_ipadapter_config
19
  )
20
 
21
+ def make_update_fn(m_comp, cat_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, 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, sensenova_ref_acc=None, task_type=None, type_comp=None):
22
  def update_fn(*args):
23
  arch = args[0]
24
  category = args[1]
 
82
  if cond_acc: updates[cond_acc] = gr.update(visible=('conditioning' in enabled_chains))
83
  if ref_latent_acc: updates[ref_latent_acc] = gr.update(visible=('reference_latent' in enabled_chains))
84
  if hidream_o1_ref_acc: updates[hidream_o1_ref_acc] = gr.update(visible=('hidream_o1_reference' in enabled_chains))
85
+ if sensenova_ref_acc: updates[sensenova_ref_acc] = gr.update(visible=('sensenova_reference' in enabled_chains))
86
  if joyai_ref_acc: updates[joyai_ref_acc] = gr.update(visible=('joyai_image' in enabled_chains))
87
  if krea2_identity_edit_acc: updates[krea2_identity_edit_acc] = gr.update(visible=('krea2_identity_edit' in enabled_chains))
88
  if krea2_reference_edit_acc: updates[krea2_reference_edit_acc] = gr.update(visible=('krea2_style_reference' in enabled_chains))
 
158
  return update_fn
159
 
160
 
161
+ def make_model_change_fn(cat_comp_ref, 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, 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, sensenova_ref_acc=None, task_type=None, type_comp=None):
162
  def change_fn(*args):
163
  model_name = args[0]
164
  idx = 1
 
230
  if cond_acc: updates[cond_acc] = gr.update(visible=('conditioning' in enabled_chains))
231
  if ref_latent_acc: updates[ref_latent_acc] = gr.update(visible=('reference_latent' in enabled_chains))
232
  if hidream_o1_ref_acc: updates[hidream_o1_ref_acc] = gr.update(visible=('hidream_o1_reference' in enabled_chains))
233
+ if sensenova_ref_acc: updates[sensenova_ref_acc] = gr.update(visible=('sensenova_reference' in enabled_chains))
234
  if joyai_ref_acc: updates[joyai_ref_acc] = gr.update(visible=('joyai_image' in enabled_chains))
235
  if krea2_identity_edit_acc: updates[krea2_identity_edit_acc] = gr.update(visible=('krea2_identity_edit' in enabled_chains))
236
  if krea2_reference_edit_acc: updates[krea2_reference_edit_acc] = gr.update(visible=('krea2_style_reference' in enabled_chains))
ui/events/main.py CHANGED
@@ -13,6 +13,7 @@ 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
  create_krea2_identity_edit_event_handlers,
18
  create_krea2_reference_edit_event_handlers,
@@ -72,6 +73,7 @@ def attach_event_handlers(ui_components, demo):
72
  conditioning_accordion = ui_components.get(f'conditioning_accordion_{prefix}')
73
  ref_latent_accordion = ui_components.get(f'reference_latent_accordion_{prefix}')
74
  hidream_o1_ref_accordion = ui_components.get(f'hidream_o1_reference_accordion_{prefix}')
 
75
  joyai_ref_accordion = ui_components.get(f'joyai_reference_accordion_{prefix}')
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}')
@@ -113,6 +115,7 @@ def attach_event_handlers(ui_components, demo):
113
  if conditioning_accordion: outputs.append(conditioning_accordion)
114
  if ref_latent_accordion: outputs.append(ref_latent_accordion)
115
  if hidream_o1_ref_accordion: outputs.append(hidream_o1_ref_accordion)
 
116
  if joyai_ref_accordion: outputs.append(joyai_ref_accordion)
117
  if krea2_identity_edit_accordion: outputs.append(krea2_identity_edit_accordion)
118
  if krea2_reference_edit_accordion: outputs.append(krea2_reference_edit_accordion)
@@ -133,7 +136,7 @@ def attach_event_handlers(ui_components, demo):
133
  krea2_cn_types_list, krea2_cn_series_list, krea2_cn_filepaths_list,
134
  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,
135
  ref_latent_accordion, hidream_o1_ref_accordion, prompt_comp, neg_prompt_comp, steps_comp, cfg_comp, sampler_comp, scheduler_comp,
136
- 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,
137
  task_type=task_type, type_comp=type_comp
138
  )
139
  inputs = [arch_comp, cat_comp]
@@ -166,6 +169,7 @@ def attach_event_handlers(ui_components, demo):
166
  if conditioning_accordion: outputs2.append(conditioning_accordion)
167
  if ref_latent_accordion: outputs2.append(ref_latent_accordion)
168
  if hidream_o1_ref_accordion: outputs2.append(hidream_o1_ref_accordion)
 
169
  if joyai_ref_accordion: outputs2.append(joyai_ref_accordion)
170
  if krea2_identity_edit_accordion: outputs2.append(krea2_identity_edit_accordion)
171
  if krea2_reference_edit_accordion: outputs2.append(krea2_reference_edit_accordion)
@@ -191,7 +195,7 @@ def attach_event_handlers(ui_components, demo):
191
  krea2_cn_types_list, krea2_cn_series_list, krea2_cn_filepaths_list,
192
  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,
193
  ref_latent_accordion, hidream_o1_ref_accordion, prompt_comp, neg_prompt_comp, steps_comp, cfg_comp, sampler_comp, scheduler_comp,
194
- 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,
195
  task_type=task_type, type_comp=type_comp
196
  )
197
  if type_comp:
@@ -211,6 +215,7 @@ def attach_event_handlers(ui_components, demo):
211
  create_style_event_handlers(prefix, ui_components)
212
  create_reference_latent_event_handlers(prefix, ui_components)
213
  create_hidream_o1_reference_event_handlers(prefix, ui_components)
 
214
  create_joyai_reference_event_handlers(prefix, ui_components)
215
  create_krea2_identity_edit_event_handlers(prefix, ui_components)
216
  create_krea2_reference_edit_event_handlers(prefix, ui_components)
@@ -280,6 +285,7 @@ def attach_event_handlers(ui_components, demo):
280
  f'conditioning_accordion_{prefix}': 'conditioning',
281
  f'reference_latent_accordion_{prefix}': 'reference_latent',
282
  f'hidream_o1_reference_accordion_{prefix}': 'hidream_o1_reference',
 
283
  f'joyai_reference_accordion_{prefix}': 'joyai_image',
284
  f'krea2_identity_edit_accordion_{prefix}': 'krea2_identity_edit',
285
  f'krea2_reference_edit_accordion_{prefix}': 'krea2_style_reference',
@@ -320,7 +326,7 @@ def attach_event_handlers(ui_components, demo):
320
  'sd3_ipadapter_accordion_imagegen', 'flux1_ipadapter_accordion_imagegen',
321
  'style_accordion_imagegen', 'embedding_accordion_imagegen',
322
  'conditioning_accordion_imagegen', 'reference_latent_accordion_imagegen',
323
- 'hidream_o1_reference_accordion_imagegen', 'joyai_reference_accordion_imagegen',
324
  'krea2_identity_edit_accordion_imagegen', 'krea2_reference_edit_accordion_imagegen',
325
  'qwen_image_edit_accordion_imagegen', 'boogu_edit_accordion_imagegen',
326
  'reference_image_accordion_imagegen', 'pid_accordion_imagegen', 'vae_accordion_imagegen',
 
13
  create_style_event_handlers,
14
  create_reference_latent_event_handlers,
15
  create_hidream_o1_reference_event_handlers,
16
+ create_sensenova_reference_event_handlers,
17
  create_joyai_reference_event_handlers,
18
  create_krea2_identity_edit_event_handlers,
19
  create_krea2_reference_edit_event_handlers,
 
73
  conditioning_accordion = ui_components.get(f'conditioning_accordion_{prefix}')
74
  ref_latent_accordion = ui_components.get(f'reference_latent_accordion_{prefix}')
75
  hidream_o1_ref_accordion = ui_components.get(f'hidream_o1_reference_accordion_{prefix}')
76
+ sensenova_ref_accordion = ui_components.get(f'sensenova_reference_accordion_{prefix}')
77
  joyai_ref_accordion = ui_components.get(f'joyai_reference_accordion_{prefix}')
78
  krea2_identity_edit_accordion = ui_components.get(f'krea2_identity_edit_accordion_{prefix}')
79
  krea2_reference_edit_accordion = ui_components.get(f'krea2_reference_edit_accordion_{prefix}')
 
115
  if conditioning_accordion: outputs.append(conditioning_accordion)
116
  if ref_latent_accordion: outputs.append(ref_latent_accordion)
117
  if hidream_o1_ref_accordion: outputs.append(hidream_o1_ref_accordion)
118
+ if sensenova_ref_accordion: outputs.append(sensenova_ref_accordion)
119
  if joyai_ref_accordion: outputs.append(joyai_ref_accordion)
120
  if krea2_identity_edit_accordion: outputs.append(krea2_identity_edit_accordion)
121
  if krea2_reference_edit_accordion: outputs.append(krea2_reference_edit_accordion)
 
136
  krea2_cn_types_list, krea2_cn_series_list, krea2_cn_filepaths_list,
137
  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,
138
  ref_latent_accordion, hidream_o1_ref_accordion, prompt_comp, neg_prompt_comp, steps_comp, cfg_comp, sampler_comp, scheduler_comp,
139
+ 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, sensenova_ref_acc=sensenova_ref_accordion,
140
  task_type=task_type, type_comp=type_comp
141
  )
142
  inputs = [arch_comp, cat_comp]
 
169
  if conditioning_accordion: outputs2.append(conditioning_accordion)
170
  if ref_latent_accordion: outputs2.append(ref_latent_accordion)
171
  if hidream_o1_ref_accordion: outputs2.append(hidream_o1_ref_accordion)
172
+ if sensenova_ref_accordion: outputs2.append(sensenova_ref_accordion)
173
  if joyai_ref_accordion: outputs2.append(joyai_ref_accordion)
174
  if krea2_identity_edit_accordion: outputs2.append(krea2_identity_edit_accordion)
175
  if krea2_reference_edit_accordion: outputs2.append(krea2_reference_edit_accordion)
 
195
  krea2_cn_types_list, krea2_cn_series_list, krea2_cn_filepaths_list,
196
  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,
197
  ref_latent_accordion, hidream_o1_ref_accordion, prompt_comp, neg_prompt_comp, steps_comp, cfg_comp, sampler_comp, scheduler_comp,
198
+ 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, sensenova_ref_acc=sensenova_ref_accordion,
199
  task_type=task_type, type_comp=type_comp
200
  )
201
  if type_comp:
 
215
  create_style_event_handlers(prefix, ui_components)
216
  create_reference_latent_event_handlers(prefix, ui_components)
217
  create_hidream_o1_reference_event_handlers(prefix, ui_components)
218
+ create_sensenova_reference_event_handlers(prefix, ui_components)
219
  create_joyai_reference_event_handlers(prefix, ui_components)
220
  create_krea2_identity_edit_event_handlers(prefix, ui_components)
221
  create_krea2_reference_edit_event_handlers(prefix, ui_components)
 
285
  f'conditioning_accordion_{prefix}': 'conditioning',
286
  f'reference_latent_accordion_{prefix}': 'reference_latent',
287
  f'hidream_o1_reference_accordion_{prefix}': 'hidream_o1_reference',
288
+ f'sensenova_reference_accordion_{prefix}': 'sensenova_reference',
289
  f'joyai_reference_accordion_{prefix}': 'joyai_image',
290
  f'krea2_identity_edit_accordion_{prefix}': 'krea2_identity_edit',
291
  f'krea2_reference_edit_accordion_{prefix}': 'krea2_style_reference',
 
326
  'sd3_ipadapter_accordion_imagegen', 'flux1_ipadapter_accordion_imagegen',
327
  'style_accordion_imagegen', 'embedding_accordion_imagegen',
328
  'conditioning_accordion_imagegen', 'reference_latent_accordion_imagegen',
329
+ 'hidream_o1_reference_accordion_imagegen', 'sensenova_reference_accordion_imagegen', 'joyai_reference_accordion_imagegen',
330
  'krea2_identity_edit_accordion_imagegen', 'krea2_reference_edit_accordion_imagegen',
331
  'qwen_image_edit_accordion_imagegen', 'boogu_edit_accordion_imagegen',
332
  'reference_image_accordion_imagegen', 'pid_accordion_imagegen', 'vae_accordion_imagegen',
ui/events/run_handlers.py CHANGED
@@ -82,6 +82,7 @@ def create_run_event(prefix: str, task_type: str = None, ui_components: dict = N
82
  conditioning_data_components = ui_components.get(f'all_conditioning_components_flat_{prefix}', [])
83
  reference_latent_data_components = ui_components.get(f'all_reference_latent_components_flat_{prefix}', [])
84
  hidream_o1_reference_data_components = ui_components.get(f'all_hidream_o1_reference_components_flat_{prefix}', [])
 
85
  joyai_reference_data_components = ui_components.get(f'all_joyai_reference_components_flat_{prefix}', [])
86
  krea2_identity_edit_data_components = ui_components.get(f'all_krea2_identity_edit_components_flat_{prefix}', [])
87
  krea2_reference_edit_data_components = ui_components.get(f'all_krea2_reference_edit_components_flat_{prefix}', [])
@@ -98,7 +99,7 @@ def create_run_event(prefix: str, task_type: str = None, ui_components: dict = N
98
  all_chains = [
99
  lora_data_components, controlnet_data_components, anima_controlnet_lllite_data_components, diffsynth_controlnet_data_components, krea2_controlnet_data_components, ipadapter_data_components,
100
  sd3_ipadapter_data_components, flux1_ipadapter_data_components, style_data_components,
101
- 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
102
  ]
103
  for chain in all_chains:
104
  if chain:
@@ -128,6 +129,7 @@ def create_run_event(prefix: str, task_type: str = None, ui_components: dict = N
128
  assign_chain_data('conditioning_data', conditioning_data_components)
129
  assign_chain_data('reference_latent_data', reference_latent_data_components)
130
  assign_chain_data('hidream_o1_reference_data', hidream_o1_reference_data_components)
 
131
  assign_chain_data('joyai_reference_data', joyai_reference_data_components)
132
  assign_chain_data('krea2_identity_edit_data', krea2_identity_edit_data_components)
133
  assign_chain_data('krea2_reference_edit_data', krea2_reference_edit_data_components)
 
82
  conditioning_data_components = ui_components.get(f'all_conditioning_components_flat_{prefix}', [])
83
  reference_latent_data_components = ui_components.get(f'all_reference_latent_components_flat_{prefix}', [])
84
  hidream_o1_reference_data_components = ui_components.get(f'all_hidream_o1_reference_components_flat_{prefix}', [])
85
+ sensenova_reference_data_components = ui_components.get(f'all_sensenova_reference_components_flat_{prefix}', [])
86
  joyai_reference_data_components = ui_components.get(f'all_joyai_reference_components_flat_{prefix}', [])
87
  krea2_identity_edit_data_components = ui_components.get(f'all_krea2_identity_edit_components_flat_{prefix}', [])
88
  krea2_reference_edit_data_components = ui_components.get(f'all_krea2_reference_edit_components_flat_{prefix}', [])
 
99
  all_chains = [
100
  lora_data_components, controlnet_data_components, anima_controlnet_lllite_data_components, diffsynth_controlnet_data_components, krea2_controlnet_data_components, ipadapter_data_components,
101
  sd3_ipadapter_data_components, flux1_ipadapter_data_components, style_data_components,
102
+ embedding_data_components, conditioning_data_components, reference_latent_data_components, hidream_o1_reference_data_components, sensenova_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
103
  ]
104
  for chain in all_chains:
105
  if chain:
 
129
  assign_chain_data('conditioning_data', conditioning_data_components)
130
  assign_chain_data('reference_latent_data', reference_latent_data_components)
131
  assign_chain_data('hidream_o1_reference_data', hidream_o1_reference_data_components)
132
+ assign_chain_data('sensenova_reference_data', sensenova_reference_data_components)
133
  assign_chain_data('joyai_reference_data', joyai_reference_data_components)
134
  assign_chain_data('krea2_identity_edit_data', krea2_identity_edit_data_components)
135
  assign_chain_data('krea2_reference_edit_data', krea2_reference_edit_data_components)
ui/imagegen_ui.py CHANGED
@@ -8,7 +8,7 @@ from .shared.ui_components import (
8
  create_conditioning_ui, create_vae_override_ui,
9
  create_model_architecture_filter_ui, create_category_filter_ui,
10
  create_sd3_ipadapter_ui, create_flux1_ipadapter_ui, create_style_ui,
11
- 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,
12
  create_pid_ui
13
  )
14
 
@@ -184,6 +184,7 @@ def create_ui():
184
  components.update(create_conditioning_ui(prefix))
185
  components.update(create_reference_latent_ui(prefix))
186
  components.update(create_hidream_o1_reference_ui(prefix))
 
187
  components.update(create_joyai_reference_ui(prefix))
188
  components.update(create_krea2_identity_edit_ui(prefix))
189
  components.update(create_krea2_reference_edit_ui(prefix))
 
8
  create_conditioning_ui, create_vae_override_ui,
9
  create_model_architecture_filter_ui, create_category_filter_ui,
10
  create_sd3_ipadapter_ui, create_flux1_ipadapter_ui, create_style_ui,
11
+ create_reference_latent_ui, create_hidream_o1_reference_ui, create_sensenova_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,
12
  create_pid_ui
13
  )
14
 
 
184
  components.update(create_conditioning_ui(prefix))
185
  components.update(create_reference_latent_ui(prefix))
186
  components.update(create_hidream_o1_reference_ui(prefix))
187
+ components.update(create_sensenova_reference_ui(prefix))
188
  components.update(create_joyai_reference_ui(prefix))
189
  components.update(create_krea2_identity_edit_ui(prefix))
190
  components.update(create_krea2_reference_edit_ui(prefix))
ui/shared/ui_components.py CHANGED
@@ -693,6 +693,35 @@ def create_hidream_o1_reference_ui(prefix: str, max_units=10):
693
 
694
  return components
695
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
696
  def create_joyai_reference_ui(prefix: str, max_units=2):
697
  components = {}
698
  key = lambda name: f"{name}_{prefix}"
 
693
 
694
  return components
695
 
696
+ def create_sensenova_reference_ui(prefix: str, max_units=10):
697
+ components = {}
698
+ key = lambda name: f"{name}_{prefix}"
699
+
700
+ with gr.Accordion("SenseNova Reference Edit Settings", open=False, visible=('sensenova_reference' in default_enabled_chains)) as ref_accordion:
701
+ components[key('sensenova_reference_accordion')] = ref_accordion
702
+ gr.Markdown("💡 **Tip:** For SenseNova models, this feature enables reference image editing and combining capabilities. In txt2img mode, adding a single reference image performs an **Image Edit**, while adding multiple images performs an **Image Combine**.")
703
+
704
+ ref_image_groups = []
705
+ ref_image_inputs = []
706
+ with gr.Row():
707
+ for i in range(max_units):
708
+ with gr.Column(visible=(i < 1), min_width=160) as img_col:
709
+ img_comp = gr.Image(type="pil", label=f"Ref. {i+1}", sources=["upload"], height=150)
710
+ ref_image_groups.append(img_col)
711
+ ref_image_inputs.append(img_comp)
712
+
713
+ components[key('sensenova_reference_rows')] = ref_image_groups
714
+ components[key('sensenova_reference_images')] = ref_image_inputs
715
+
716
+ with gr.Row():
717
+ components[key('add_sensenova_reference_button')] = gr.Button("✚ Add Reference Image")
718
+ components[key('delete_sensenova_reference_button')] = gr.Button("➖ Delete Reference Image", visible=False)
719
+ components[key('sensenova_reference_count_state')] = gr.State(1)
720
+
721
+ components[key('all_sensenova_reference_components_flat')] = ref_image_inputs
722
+
723
+ return components
724
+
725
  def create_joyai_reference_ui(prefix: str, max_units=2):
726
  components = {}
727
  key = lambda name: f"{name}_{prefix}"
yaml/chain_features.yaml CHANGED
@@ -431,6 +431,21 @@ hidream_o1_reference:
431
  required:
432
  - image
433
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
434
  flux1_ipadapter:
435
  chains: flux1_ipadapter
436
  display_name: "Flux1 IP-Adapter"
 
431
  required:
432
  - image
433
 
434
+ sensenova_reference:
435
+ chains: sensenova_reference
436
+ display_name: "SenseNova Reference Edit"
437
+ description: "For SenseNova models, this feature enables reference image editing and combining capabilities. In txt2img mode, adding a single reference image performs an Image Edit, while adding multiple images performs an Image Combine."
438
+ max_count: 10
439
+ usage_guideline: "Supply reference image(s) (up to 10) encoded as Base64 Data URI or HTTP/HTTPS URL. Passing a single reference image performs an Image Edit, while passing multiple images performs an Image Combine."
440
+ parameters_schema:
441
+ type: object
442
+ properties:
443
+ image:
444
+ type: string
445
+ description: "Reference image encoded as Base64 Data URI or HTTP/HTTPS URL."
446
+ required:
447
+ - image
448
+
449
  flux1_ipadapter:
450
  chains: flux1_ipadapter
451
  display_name: "Flux1 IP-Adapter"
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
  mage-flow:
19
  "1:1 (Square)": [1024, 1024]
20
  "16:9 (Landscape)": [1344, 768]
@@ -258,6 +266,7 @@ RESOLUTION_MAP:
258
 
259
  MULTIPLIERS_MAP:
260
  krea-2: 1
 
261
  mage-flow: 1
262
  joyai-image: 1
263
  boogu-image: 1
 
15
  "3:4 (Classic Portrait)": [896, 1152]
16
  "3:2 (Photography)": [1216, 832]
17
  "2:3 (Photography Portrait)": [832, 1216]
18
+ sensenova-u1.5:
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
  mage-flow:
27
  "1:1 (Square)": [1024, 1024]
28
  "16:9 (Landscape)": [1344, 768]
 
266
 
267
  MULTIPLIERS_MAP:
268
  krea-2: 1
269
+ sensenova-u1.5: 1
270
  mage-flow: 1
271
  joyai-image: 1
272
  boogu-image: 1
yaml/file_list.yaml CHANGED
@@ -1,5 +1,14 @@
1
  file:
2
  checkpoints:
 
 
 
 
 
 
 
 
 
3
  # HiDream-O1
4
  - filename: "hidream_o1_image_dev_fp8_scaled.safetensors"
5
  source: "hf"
@@ -514,6 +523,11 @@ file:
514
  source: "hf"
515
  repo_id: "lylogummy/Anima-3.8B"
516
  repository_file_path: "difussion_models/Anima-3.8B.safetensors"
 
 
 
 
 
517
  # Anima
518
  - filename: "anima-turbo-v1.0.safetensors"
519
  source: "hf"
@@ -531,10 +545,6 @@ file:
531
  source: "hf"
532
  repo_id: "diffusionmodels1254ani/waiANIMA"
533
  repository_file_path: "waiANIMA_v10Base10.safetensors"
534
- - filename: "Anima-2.9B-preview-v1.safetensors"
535
- source: "hf"
536
- repo_id: "Gazingstars123/Anima-2.9B"
537
- repository_file_path: "Anima-2.9B-preview-v1.safetensors"
538
  - filename: "AnimaYume_v10_final_base.safetensors"
539
  source: "hf"
540
  repo_id: "duongve/AnimaYume"
 
1
  file:
2
  checkpoints:
3
+ # SenseNova-U1.5
4
+ - filename: "SenseNova-U1.5-8B-MoT-BF16-T8.safetensors"
5
+ source: "hf"
6
+ repo_id: "t8star/SenseNova-U1.5-Comfy"
7
+ repository_file_path: "SenseNova-U1.5-8B-MoT-BF16-T8.safetensors"
8
+ - filename: "SenseNova-U1.5-8B-MoT-SFT-T8.safetensors"
9
+ source: "hf"
10
+ repo_id: "t8star/SenseNova-U1.5-Comfy"
11
+ repository_file_path: "SenseNova-U1.5-8B-MoT-SFT-T8.safetensors"
12
  # HiDream-O1
13
  - filename: "hidream_o1_image_dev_fp8_scaled.safetensors"
14
  source: "hf"
 
523
  source: "hf"
524
  repo_id: "lylogummy/Anima-3.8B"
525
  repository_file_path: "difussion_models/Anima-3.8B.safetensors"
526
+ # Anima-2.9B
527
+ - filename: "Anima-2.9B-preview-v1.safetensors"
528
+ source: "hf"
529
+ repo_id: "Gazingstars123/Anima-2.9B"
530
+ repository_file_path: "Anima-2.9B-preview-v1.safetensors"
531
  # Anima
532
  - filename: "anima-turbo-v1.0.safetensors"
533
  source: "hf"
 
545
  source: "hf"
546
  repo_id: "diffusionmodels1254ani/waiANIMA"
547
  repository_file_path: "waiANIMA_v10Base10.safetensors"
 
 
 
 
548
  - filename: "AnimaYume_v10_final_base.safetensors"
549
  source: "hf"
550
  repo_id: "duongve/AnimaYume"
yaml/model_architecture_features.yaml CHANGED
@@ -7,6 +7,12 @@ krea-2:
7
  - krea2_style_reference
8
  - pid
9
 
 
 
 
 
 
 
10
  mage-flow:
11
  enabled_chains:
12
  - reference_image
 
7
  - krea2_style_reference
8
  - pid
9
 
10
+ sensenova-u1.5:
11
+ enabled_chains:
12
+ - lora
13
+ - sensenova_reference
14
+ - vae
15
+
16
  mage-flow:
17
  enabled_chains:
18
  - reference_image
yaml/model_architectures.yaml CHANGED
@@ -1,5 +1,6 @@
1
  architecture_order:
2
  - "Krea-2"
 
3
  - "Mage-Flow"
4
  - "JoyAI-Image"
5
  - "Boogu-Image"
@@ -34,6 +35,8 @@ architecture_order:
34
  architectures:
35
  Krea-2:
36
  model_type: "krea-2"
 
 
37
  "Mage-Flow":
38
  model_type: "mage-flow"
39
  "JoyAI-Image":
 
1
  architecture_order:
2
  - "Krea-2"
3
+ - "SenseNova-U1.5"
4
  - "Mage-Flow"
5
  - "JoyAI-Image"
6
  - "Boogu-Image"
 
35
  architectures:
36
  Krea-2:
37
  model_type: "krea-2"
38
+ "SenseNova-U1.5":
39
+ model_type: "sensenova-u1.5"
40
  "Mage-Flow":
41
  model_type: "mage-flow"
42
  "JoyAI-Image":
yaml/model_defaults.yaml CHANGED
@@ -18,6 +18,13 @@ Krea-2:
18
  sampler_name: "euler"
19
  scheduler: "simple"
20
 
 
 
 
 
 
 
 
21
  Mage-Flow:
22
  _defaults:
23
  steps: 30
 
18
  sampler_name: "euler"
19
  scheduler: "simple"
20
 
21
+ SenseNova-U1.5:
22
+ _defaults:
23
+ steps: 50
24
+ cfg: 4.0
25
+ sampler_name: "euler"
26
+ scheduler: "normal"
27
+
28
  Mage-Flow:
29
  _defaults:
30
  steps: 30
yaml/model_list.yaml CHANGED
@@ -12,6 +12,13 @@ Checkpoint:
12
  unet: "krea2_raw-nvfp4.safetensors"
13
  clip: "qwen3vl_4b_fp8_scaled.safetensors"
14
  vae: "qwen_image_vae.safetensors"
 
 
 
 
 
 
 
15
  Mage-Flow:
16
  latent_type: none
17
  models:
 
12
  unet: "krea2_raw-nvfp4.safetensors"
13
  clip: "qwen3vl_4b_fp8_scaled.safetensors"
14
  vae: "qwen_image_vae.safetensors"
15
+ SenseNova-U1.5:
16
+ latent_type: hidream_o1_latent
17
+ models:
18
+ - display_name: "SenseNova-U1.5-8B-MoT"
19
+ path: "SenseNova-U1.5-8B-MoT-BF16-T8.safetensors"
20
+ - display_name: "SenseNova-U1.5-8B-MoT-SFT"
21
+ path: "SenseNova-U1.5-8B-MoT-SFT-T8.safetensors"
22
  Mage-Flow:
23
  latent_type: none
24
  models:
yaml/task_features.yaml CHANGED
@@ -19,6 +19,7 @@ txt2img:
19
  - reference_latent
20
  - hidream_o1_reference
21
  - hidream_o1_smoothing
 
22
  - joyai_image
23
  - krea2_identity_edit
24
  - krea2_style_reference
@@ -44,6 +45,7 @@ img2img:
44
  - reference_latent
45
  - hidream_o1_reference
46
  - hidream_o1_smoothing
 
47
  - joyai_image
48
  - krea2_identity_edit
49
  - krea2_style_reference
@@ -68,6 +70,7 @@ inpaint:
68
  - reference_latent
69
  - hidream_o1_reference
70
  - hidream_o1_smoothing
 
71
  - joyai_image
72
  - krea2_identity_edit
73
  - krea2_style_reference
@@ -92,6 +95,7 @@ outpaint:
92
  - reference_latent
93
  - hidream_o1_reference
94
  - hidream_o1_smoothing
 
95
  - joyai_image
96
  - krea2_identity_edit
97
  - krea2_style_reference
@@ -116,6 +120,7 @@ hires_fix:
116
  - reference_latent
117
  - hidream_o1_reference
118
  - hidream_o1_smoothing
 
119
  - joyai_image
120
  - krea2_identity_edit
121
  - krea2_style_reference
 
19
  - reference_latent
20
  - hidream_o1_reference
21
  - hidream_o1_smoothing
22
+ - sensenova_reference
23
  - joyai_image
24
  - krea2_identity_edit
25
  - krea2_style_reference
 
45
  - reference_latent
46
  - hidream_o1_reference
47
  - hidream_o1_smoothing
48
+ - sensenova_reference
49
  - joyai_image
50
  - krea2_identity_edit
51
  - krea2_style_reference
 
70
  - reference_latent
71
  - hidream_o1_reference
72
  - hidream_o1_smoothing
73
+ - sensenova_reference
74
  - joyai_image
75
  - krea2_identity_edit
76
  - krea2_style_reference
 
95
  - reference_latent
96
  - hidream_o1_reference
97
  - hidream_o1_smoothing
98
+ - sensenova_reference
99
  - joyai_image
100
  - krea2_identity_edit
101
  - krea2_style_reference
 
120
  - reference_latent
121
  - hidream_o1_reference
122
  - hidream_o1_smoothing
123
+ - sensenova_reference
124
  - joyai_image
125
  - krea2_identity_edit
126
  - krea2_style_reference