Add Anima ControlNet-LLLite, HiDream-01 smoothing/reference & PID injectors
Browse files- chain_injectors/ipadapter_injector.py +122 -77
- chain_injectors/pid_injector.py +15 -1
- yaml/injectors.yaml +3 -0
- yaml/pid.yaml +15 -15
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 |
-
|
| 29 |
-
|
| 30 |
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
|
| 63 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 64 |
|
| 65 |
-
|
| 66 |
-
|
| 67 |
-
|
| 68 |
-
|
| 69 |
-
|
| 70 |
-
|
| 71 |
-
|
| 72 |
-
|
| 73 |
-
|
| 74 |
-
|
| 75 |
-
|
| 76 |
-
|
| 77 |
-
|
| 78 |
-
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
|
| 82 |
-
|
| 83 |
-
|
| 84 |
-
|
| 85 |
-
|
| 86 |
-
|
| 87 |
-
|
| 88 |
-
|
| 89 |
-
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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: "
|
| 3 |
-
latent_format: "flux"
|
| 4 |
-
architectures: ["flux2", "flux2-kv", "lens", "ernie-image"]
|
| 5 |
-
- filepath: "
|
| 6 |
-
latent_format: "qwenimage"
|
| 7 |
-
architectures: ["anima", "qwen-image"]
|
| 8 |
-
- filepath: "
|
| 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"]
|