RioShiina commited on
Commit
cb82143
·
verified ·
1 Parent(s): 28e2f95

Add Anima ControlNet-LLLite, HiDream-01 smoothing/reference & PID injectors

Browse files
chain_injectors/ipadapter_injector.py CHANGED
@@ -25,82 +25,127 @@ def inject(assembler, chain_definition, chain_items):
25
  model_type = final_settings.get('model_type', 'sdxl')
26
  megapixels = 1.05 if model_type == 'sdxl' else 0.39
27
 
28
- pos_embed_outputs = []
29
- neg_embed_outputs = []
30
 
31
- for i, item_data in enumerate(chain_items):
32
- loader_type = 'FaceID' if 'FACEID' in item_data.get('preset', '') else 'Unified'
33
-
34
- loader_template_name = "IPAdapterUnifiedLoader"
35
- if loader_type == 'FaceID':
36
- loader_template_name = "IPAdapterUnifiedLoaderFaceID"
37
-
38
- image_loader_id = assembler._get_unique_id()
39
- image_loader_node = assembler._get_node_template("LoadImage")
40
- image_loader_node['inputs']['image'] = item_data['image']
41
- assembler.workflow[image_loader_id] = image_loader_node
42
-
43
- image_scaler_id = assembler._get_unique_id()
44
- image_scaler_node = assembler._get_node_template("ImageScaleToTotalPixels")
45
- image_scaler_node['inputs']['image'] = [image_loader_id, 0]
46
- image_scaler_node['inputs']['megapixels'] = megapixels
47
- image_scaler_node['inputs']['upscale_method'] = "lanczos"
48
- assembler.workflow[image_scaler_id] = image_scaler_node
49
-
50
- ipadapter_loader_id = assembler._get_unique_id()
51
- ipadapter_loader_node = assembler._get_node_template(loader_template_name)
52
- ipadapter_loader_node['inputs']['model'] = current_model_connection
53
- ipadapter_loader_node['inputs']['preset'] = item_data['preset']
54
- if loader_type == 'FaceID':
55
- ipadapter_loader_node['inputs']['lora_strength'] = item_data.get('lora_strength', 0.6)
56
- assembler.workflow[ipadapter_loader_id] = ipadapter_loader_node
57
-
58
- encoder_id = assembler._get_unique_id()
59
- encoder_node = assembler._get_node_template("IPAdapterEncoder")
60
- encoder_node['inputs']['weight'] = item_data['weight']
61
- encoder_node['inputs']['ipadapter'] = [ipadapter_loader_id, 1]
62
- encoder_node['inputs']['image'] = [image_scaler_id, 0]
63
- assembler.workflow[encoder_id] = encoder_node
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64
 
65
- pos_embed_outputs.append([encoder_id, 0])
66
- neg_embed_outputs.append([encoder_id, 1])
67
-
68
- pos_combiner_id = assembler._get_unique_id()
69
- pos_combiner_node = assembler._get_node_template("IPAdapterCombineEmbeds")
70
- pos_combiner_node['inputs']['method'] = final_settings.get('final_combine_method', 'concat')
71
- for i, conn in enumerate(pos_embed_outputs):
72
- pos_combiner_node['inputs'][f'embed{i+1}'] = conn
73
- assembler.workflow[pos_combiner_id] = pos_combiner_node
74
-
75
- neg_combiner_id = assembler._get_unique_id()
76
- neg_combiner_node = assembler._get_node_template("IPAdapterCombineEmbeds")
77
- neg_combiner_node['inputs']['method'] = final_settings.get('final_combine_method', 'concat')
78
- for i, conn in enumerate(neg_embed_outputs):
79
- neg_combiner_node['inputs'][f'embed{i+1}'] = conn
80
- assembler.workflow[neg_combiner_id] = neg_combiner_node
81
-
82
- final_loader_type = 'FaceID' if 'FACEID' in final_settings.get('final_preset', '') else 'Unified'
83
- final_loader_template_name = "IPAdapterUnifiedLoader"
84
- if final_loader_type == 'FaceID':
85
- final_loader_template_name = "IPAdapterUnifiedLoaderFaceID"
86
-
87
- final_loader_id = assembler._get_unique_id()
88
- final_loader_node = assembler._get_node_template(final_loader_template_name)
89
- final_loader_node['inputs']['model'] = current_model_connection
90
- final_loader_node['inputs']['preset'] = final_settings.get('final_preset', 'STANDARD (medium strength)')
91
- if final_loader_type == 'FaceID':
92
- final_loader_node['inputs']['lora_strength'] = final_settings.get('final_lora_strength', 0.6)
93
- assembler.workflow[final_loader_id] = final_loader_node
94
-
95
- apply_embeds_id = assembler._get_unique_id()
96
- apply_embeds_node = assembler._get_node_template("IPAdapterEmbeds")
97
- apply_embeds_node['inputs']['weight'] = final_settings.get('final_weight', 1.0)
98
- apply_embeds_node['inputs']['embeds_scaling'] = final_settings.get('final_embeds_scaling', 'V only')
99
- apply_embeds_node['inputs']['model'] = [final_loader_id, 0]
100
- apply_embeds_node['inputs']['ipadapter'] = [final_loader_id, 1]
101
- apply_embeds_node['inputs']['pos_embed'] = [pos_combiner_id, 0]
102
- apply_embeds_node['inputs']['neg_embed'] = [neg_combiner_id, 0]
103
- assembler.workflow[apply_embeds_id] = apply_embeds_node
104
-
105
- assembler.workflow[end_node_id]['inputs']['model'] = [apply_embeds_id, 0]
106
- print(f"IPAdapter injector applied. Redirected '{end_node_name}' model input through {len(chain_items)} reference images.")
 
25
  model_type = final_settings.get('model_type', 'sdxl')
26
  megapixels = 1.05 if model_type == 'sdxl' else 0.39
27
 
28
+ first_preset = chain_items[0].get('preset', '')
29
+ is_faceid_chain = 'FACEID' in first_preset.upper()
30
 
31
+ if is_faceid_chain:
32
+ for i, item_data in enumerate(chain_items):
33
+ image_loader_id = assembler._get_unique_id()
34
+ image_loader_node = assembler._get_node_template("LoadImage")
35
+ image_loader_node['inputs']['image'] = item_data['image']
36
+ assembler.workflow[image_loader_id] = image_loader_node
37
+
38
+ image_scaler_id = assembler._get_unique_id()
39
+ image_scaler_node = assembler._get_node_template("ImageScaleToTotalPixels")
40
+ image_scaler_node['inputs']['image'] = [image_loader_id, 0]
41
+ image_scaler_node['inputs']['megapixels'] = megapixels
42
+ image_scaler_node['inputs']['upscale_method'] = "lanczos"
43
+ assembler.workflow[image_scaler_id] = image_scaler_node
44
+
45
+ ipadapter_loader_id = assembler._get_unique_id()
46
+ ipadapter_loader_node = assembler._get_node_template("IPAdapterUnifiedLoaderFaceID")
47
+ ipadapter_loader_node['inputs']['model'] = current_model_connection
48
+ ipadapter_loader_node['inputs']['preset'] = item_data['preset']
49
+ ipadapter_loader_node['inputs']['lora_strength'] = item_data.get('lora_strength', 0.6)
50
+ ipadapter_loader_node['inputs']['provider'] = "CUDA"
51
+ assembler.workflow[ipadapter_loader_id] = ipadapter_loader_node
52
+
53
+ apply_id = assembler._get_unique_id()
54
+ apply_node = assembler._get_node_template("IPAdapterFaceID")
55
+ apply_node['inputs']['model'] = [ipadapter_loader_id, 0]
56
+ apply_node['inputs']['ipadapter'] = [ipadapter_loader_id, 1]
57
+ apply_node['inputs']['image'] = [image_scaler_id, 0]
58
+ apply_node['inputs']['weight'] = item_data['weight']
59
+ apply_node['inputs']['weight_faceidv2'] = final_settings.get('final_lora_strength', 0.6)
60
+ apply_node['inputs']['weight_type'] = "linear"
61
+ apply_node['inputs']['combine_embeds'] = final_settings.get('final_combine_method', 'concat')
62
+ apply_node['inputs']['start_at'] = item_data.get('start_percent', 0.0)
63
+ apply_node['inputs']['end_at'] = item_data.get('end_percent', 1.0)
64
+ apply_node['inputs']['embeds_scaling'] = final_settings.get('final_embeds_scaling', 'V only')
65
+
66
+ assembler.workflow[apply_id] = apply_node
67
+ current_model_connection = [apply_id, 0]
68
+
69
+ assembler.workflow[end_node_id]['inputs']['model'] = current_model_connection
70
+ print(f"IPAdapter FaceID injector applied (Direct Apply). Redirected '{end_node_name}' model input through {len(chain_items)} FaceID node(s).")
71
+ return
72
+
73
+ else:
74
+ pos_embed_outputs = []
75
+ neg_embed_outputs = []
76
+
77
+ for i, item_data in enumerate(chain_items):
78
+ loader_type = 'FaceID' if 'FACEID' in item_data.get('preset', '') else 'Unified'
79
+ loader_template_name = "IPAdapterUnifiedLoader"
80
+ if loader_type == 'FaceID':
81
+ loader_template_name = "IPAdapterUnifiedLoaderFaceID"
82
+
83
+ image_loader_id = assembler._get_unique_id()
84
+ image_loader_node = assembler._get_node_template("LoadImage")
85
+ image_loader_node['inputs']['image'] = item_data['image']
86
+ assembler.workflow[image_loader_id] = image_loader_node
87
+
88
+ image_scaler_id = assembler._get_unique_id()
89
+ image_scaler_node = assembler._get_node_template("ImageScaleToTotalPixels")
90
+ image_scaler_node['inputs']['image'] = [image_loader_id, 0]
91
+ image_scaler_node['inputs']['megapixels'] = megapixels
92
+ image_scaler_node['inputs']['upscale_method'] = "lanczos"
93
+ assembler.workflow[image_scaler_id] = image_scaler_node
94
+
95
+ ipadapter_loader_id = assembler._get_unique_id()
96
+ ipadapter_loader_node = assembler._get_node_template(loader_template_name)
97
+ ipadapter_loader_node['inputs']['model'] = current_model_connection
98
+ ipadapter_loader_node['inputs']['preset'] = item_data['preset']
99
+ if loader_type == 'FaceID':
100
+ ipadapter_loader_node['inputs']['lora_strength'] = item_data.get('lora_strength', 0.6)
101
+ assembler.workflow[ipadapter_loader_id] = ipadapter_loader_node
102
+
103
+ encoder_id = assembler._get_unique_id()
104
+ encoder_node = assembler._get_node_template("IPAdapterEncoder")
105
+ encoder_node['inputs']['weight'] = item_data['weight']
106
+ encoder_node['inputs']['ipadapter'] = [ipadapter_loader_id, 1]
107
+ encoder_node['inputs']['image'] = [image_scaler_id, 0]
108
+ assembler.workflow[encoder_id] = encoder_node
109
+
110
+ pos_embed_outputs.append([encoder_id, 0])
111
+ neg_embed_outputs.append([encoder_id, 1])
112
+
113
+ pos_combiner_id = assembler._get_unique_id()
114
+ pos_combiner_node = assembler._get_node_template("IPAdapterCombineEmbeds")
115
+ pos_combiner_node['inputs']['method'] = final_settings.get('final_combine_method', 'concat')
116
+ for i, conn in enumerate(pos_embed_outputs):
117
+ pos_combiner_node['inputs'][f'embed{i+1}'] = conn
118
+ assembler.workflow[pos_combiner_id] = pos_combiner_node
119
+
120
+ neg_combiner_id = assembler._get_unique_id()
121
+ neg_combiner_node = assembler._get_node_template("IPAdapterCombineEmbeds")
122
+ neg_combiner_node['inputs']['method'] = final_settings.get('final_combine_method', 'concat')
123
+ for i, conn in enumerate(neg_embed_outputs):
124
+ neg_combiner_node['inputs'][f'embed{i+1}'] = conn
125
+ assembler.workflow[neg_combiner_id] = neg_combiner_node
126
 
127
+ final_loader_type = 'FaceID' if 'FACEID' in final_settings.get('final_preset', '') else 'Unified'
128
+ final_loader_template_name = "IPAdapterUnifiedLoader"
129
+ if final_loader_type == 'FaceID':
130
+ final_loader_template_name = "IPAdapterUnifiedLoaderFaceID"
131
+
132
+ final_loader_id = assembler._get_unique_id()
133
+ final_loader_node = assembler._get_node_template(final_loader_template_name)
134
+ final_loader_node['inputs']['model'] = current_model_connection
135
+ final_loader_node['inputs']['preset'] = final_settings.get('final_preset', 'STANDARD (medium strength)')
136
+ if final_loader_type == 'FaceID':
137
+ final_loader_node['inputs']['lora_strength'] = final_settings.get('final_lora_strength', 0.6)
138
+ assembler.workflow[final_loader_id] = final_loader_node
139
+
140
+ apply_embeds_id = assembler._get_unique_id()
141
+ apply_embeds_node = assembler._get_node_template("IPAdapterEmbeds")
142
+ apply_embeds_node['inputs']['weight'] = final_settings.get('final_weight', 1.0)
143
+ apply_embeds_node['inputs']['embeds_scaling'] = final_settings.get('final_embeds_scaling', 'V only')
144
+ apply_embeds_node['inputs']['model'] = [final_loader_id, 0]
145
+ apply_embeds_node['inputs']['ipadapter'] = [final_loader_id, 1]
146
+ apply_embeds_node['inputs']['pos_embed'] = [pos_combiner_id, 0]
147
+ apply_embeds_node['inputs']['neg_embed'] = [neg_combiner_id, 0]
148
+ assembler.workflow[apply_embeds_id] = apply_embeds_node
149
+
150
+ assembler.workflow[end_node_id]['inputs']['model'] = [apply_embeds_id, 0]
151
+ print(f"IPAdapter Unified injector applied. Redirected '{end_node_name}' model input through {len(chain_items)} reference image(s).")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
chain_injectors/pid_injector.py CHANGED
@@ -270,8 +270,22 @@ def inject(assembler, chain_definition, chain_items):
270
  if input_val[0] == original_vae_decode_id:
271
  node_data['inputs'][input_name] = [pid_vae_decode_id, 0]
272
 
273
- if original_vae_loader_id in assembler.workflow:
 
 
 
 
 
 
 
 
 
 
 
 
 
274
  del assembler.workflow[original_vae_loader_id]
 
275
  if original_vae_decode_id in assembler.workflow:
276
  del assembler.workflow[original_vae_decode_id]
277
 
 
270
  if input_val[0] == original_vae_decode_id:
271
  node_data['inputs'][input_name] = [pid_vae_decode_id, 0]
272
 
273
+ is_vae_loader_referenced = False
274
+ if original_vae_loader_id:
275
+ for node_id, node_data in assembler.workflow.items():
276
+ if node_id == original_vae_loader_id:
277
+ continue
278
+ for input_val in node_data.get('inputs', {}).values():
279
+ if isinstance(input_val, list) and len(input_val) == 2:
280
+ if input_val[0] == original_vae_loader_id:
281
+ is_vae_loader_referenced = True
282
+ break
283
+ if is_vae_loader_referenced:
284
+ break
285
+
286
+ if original_vae_loader_id in assembler.workflow and not is_vae_loader_referenced:
287
  del assembler.workflow[original_vae_loader_id]
288
+
289
  if original_vae_decode_id in assembler.workflow:
290
  del assembler.workflow[original_vae_decode_id]
291
 
yaml/injectors.yaml CHANGED
@@ -7,6 +7,8 @@ injector_definitions:
7
  module: "chain_injectors.newbie_lora_injector"
8
  dynamic_controlnet_chains:
9
  module: "chain_injectors.controlnet_injector"
 
 
10
  dynamic_anima_controlnet_lllite_chains:
11
  module: "chain_injectors.anima_controlnet_lllite_injector"
12
  dynamic_diffsynth_controlnet_chains:
@@ -42,6 +44,7 @@ injector_order:
42
  - dynamic_conditioning_chains
43
  - dynamic_style_chains
44
  - dynamic_controlnet_chains
 
45
  - dynamic_anima_controlnet_lllite_chains
46
  - dynamic_hidream_o1_smoothing_chains
47
  - dynamic_hidream_o1_reference_chains
 
7
  module: "chain_injectors.newbie_lora_injector"
8
  dynamic_controlnet_chains:
9
  module: "chain_injectors.controlnet_injector"
10
+ dynamic_krea2_controlnet_chains:
11
+ module: "chain_injectors.krea2_controlnet_injector"
12
  dynamic_anima_controlnet_lllite_chains:
13
  module: "chain_injectors.anima_controlnet_lllite_injector"
14
  dynamic_diffsynth_controlnet_chains:
 
44
  - dynamic_conditioning_chains
45
  - dynamic_style_chains
46
  - dynamic_controlnet_chains
47
+ - dynamic_krea2_controlnet_chains
48
  - dynamic_anima_controlnet_lllite_chains
49
  - dynamic_hidream_o1_smoothing_chains
50
  - dynamic_hidream_o1_reference_chains
yaml/pid.yaml CHANGED
@@ -1,16 +1,16 @@
1
- PiD:
2
- - filepath: "pid_flux2_1024_to_4096_4step_mxfp8.safetensors"
3
- latent_format: "flux"
4
- architectures: ["flux2", "flux2-kv", "lens", "ernie-image"]
5
- - filepath: "pid_qwenimage_1024_to_4096_4step_bf16.safetensors"
6
- latent_format: "qwenimage"
7
- architectures: ["anima", "qwen-image"]
8
- - filepath: "pid_flux1_1024_to_4096_4step_mxfp8.safetensors"
9
- latent_format: "flux"
10
- architectures: ["longcat-image", "newbie-image", "z-image", "ovis-image", "omnigen2", "chroma1", "hidream-i1", "flux1"]
11
- - filepath: "pid_sd3_1024_to_4096_4step_bf16.safetensors"
12
- latent_format: "sd3"
13
- architectures: ["sd35"]
14
- - filepath: "pid_sdxl_1024_to_4096_4step_bf16.safetensors"
15
- latent_format: "sdxl"
16
  architectures: ["sdxl"]
 
1
+ PiD:
2
+ - filepath: "pid_1.5_flux2_1024_to_4096_4step_int8_convrot.safetensors"
3
+ latent_format: "flux"
4
+ architectures: ["flux2", "flux2-kv", "ideogram-4", "lens", "ernie-image"]
5
+ - filepath: "pid_1.5_qwenimage_1024_to_4096_4step_int8_convrot.safetensors"
6
+ latent_format: "qwenimage"
7
+ architectures: ["anima", "qwen-image", "krea-2"]
8
+ - filepath: "pid_1.5_flux1_1024_to_4096_4step_int8_convrot.safetensors"
9
+ latent_format: "flux"
10
+ architectures: ["longcat-image", "newbie-image", "z-image", "kandinsky-5", "ovis-image", "omnigen2", "chroma1", "hidream-i1", "flux1", "boogu-image"]
11
+ - filepath: "pid_sd3_1024_to_4096_4step_bf16.safetensors"
12
+ latent_format: "sd3"
13
+ architectures: ["sd35"]
14
+ - filepath: "pid_sdxl_1024_to_4096_4step_bf16.safetensors"
15
+ latent_format: "sdxl"
16
  architectures: ["sdxl"]