Files
2026-02-02 08:07:58 +09:00

73 lines
3.1 KiB
Python

"""
Knishika Dual Lora Stack - ComfyUI Custom Node
Author: knishika
Description: Load multiple Lora models to two separate model paths with shared CLIP
"""
import folder_paths
class KnishikaDualLoraStack:
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"model_1": ("MODEL",),
"model_2": ("MODEL",),
"clip": ("CLIP",),
"lora_01": (["None"] + folder_paths.get_filename_list("loras"),),
"lora_01_strength": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}),
"lora_02": (["None"] + folder_paths.get_filename_list("loras"),),
"lora_02_strength": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}),
"lora_03": (["None"] + folder_paths.get_filename_list("loras"),),
"lora_03_strength": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}),
"lora_04": (["None"] + folder_paths.get_filename_list("loras"),),
"lora_04_strength": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}),
"lora_05": (["None"] + folder_paths.get_filename_list("loras"),),
"lora_05_strength": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}),
"lora_06": (["None"] + folder_paths.get_filename_list("loras"),),
"lora_06_strength": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}),
}
}
RETURN_TYPES = ("MODEL", "MODEL", "CLIP")
RETURN_NAMES = ("model_1", "model_2", "clip")
FUNCTION = "load_lora"
CATEGORY = "knishika/loaders"
def load_lora(self, model_1, model_2, clip, lora_01, lora_01_strength, lora_02, lora_02_strength, lora_03, lora_03_strength, lora_04, lora_04_strength, lora_05, lora_05_strength, lora_06, lora_06_strength):
from nodes import LoraLoader
lora_loader = LoraLoader()
# Process each lora for both models
loras = [
(lora_01, lora_01_strength),
(lora_02, lora_02_strength),
(lora_03, lora_03_strength),
(lora_04, lora_04_strength),
(lora_05, lora_05_strength),
(lora_06, lora_06_strength)
]
current_model_1 = model_1
current_model_2 = model_2
current_clip = clip
for lora_name, strength in loras:
if lora_name != "None" and strength != 0:
# Apply lora to model_1
current_model_1, current_clip = lora_loader.load_lora(current_model_1, current_clip, lora_name, strength, strength)
# Apply the same lora to model_2 (create fresh clip reference for model_2)
current_model_2, _ = lora_loader.load_lora(current_model_2, current_clip, lora_name, strength, strength)
return (current_model_1, current_model_2, current_clip)
NODE_CLASS_MAPPINGS = {
"KnishikaDualLoraStack": KnishikaDualLoraStack,
}
NODE_DISPLAY_NAME_MAPPINGS = {
"KnishikaDualLoraStack": "Knishika Dual Lora Stack",
}