|
|
import comfy
|
|
|
import folder_paths
|
|
|
|
|
|
class SwarmLoraLoader:
|
|
|
def __init__(self):
|
|
|
self.loaded_lora = None
|
|
|
|
|
|
@classmethod
|
|
|
def INPUT_TYPES(s):
|
|
|
return {
|
|
|
"required": {
|
|
|
"model": ("MODEL", ),
|
|
|
"clip": ("CLIP", ),
|
|
|
"lora_names": ("STRING", {"multiline": True, "tooltip": "Comma separated list of lora names to load."}),
|
|
|
"lora_weights": ("STRING", {"multiline": True, "tooltip": "Comma separated list of lora weights to apply to each lora. Must match the number of loras."}),
|
|
|
}
|
|
|
}
|
|
|
|
|
|
CATEGORY = "SwarmUI/models"
|
|
|
RETURN_TYPES = ("MODEL", "CLIP")
|
|
|
FUNCTION = "load_loras"
|
|
|
DESCRIPTION = "Like a regular LoRA Loader, but designed to take a dynamic list of loras and weights, to allow easier integration with SwarmUI custom workflows."
|
|
|
|
|
|
def load_loras(self, model, clip, lora_names, lora_weights):
|
|
|
if lora_names.strip() == "":
|
|
|
return (model, clip)
|
|
|
|
|
|
lora_names = lora_names.split(",")
|
|
|
lora_weights = lora_weights.split(",")
|
|
|
lora_weights = [float(x.strip()) for x in lora_weights]
|
|
|
|
|
|
for i in range(len(lora_names)):
|
|
|
lora_name = lora_names[i].strip()
|
|
|
weight = lora_weights[i]
|
|
|
if weight == 0:
|
|
|
continue
|
|
|
|
|
|
lora_path = folder_paths.get_full_path("loras", lora_name)
|
|
|
lora = None
|
|
|
if self.loaded_lora is not None:
|
|
|
if self.loaded_lora[0] == lora_path:
|
|
|
lora = self.loaded_lora[1]
|
|
|
else:
|
|
|
temp = self.loaded_lora
|
|
|
self.loaded_lora = None
|
|
|
del temp
|
|
|
if lora is None:
|
|
|
lora = comfy.utils.load_torch_file(lora_path, safe_load=True)
|
|
|
self.loaded_lora = (lora_path, lora)
|
|
|
model, clip = comfy.sd.load_lora_for_models(model, clip, lora, weight, weight)
|
|
|
|
|
|
return (model, clip)
|
|
|
|
|
|
NODE_CLASS_MAPPINGS = {
|
|
|
"SwarmLoraLoader": SwarmLoraLoader,
|
|
|
}
|
|
|
|