Spaces:
Running
on
L40S
Running
on
L40S
from nodes import LoraLoader | |
from .constants import get_category, get_name | |
from .power_prompt_utils import get_lora_by_filename | |
from .utils import FlexibleOptionalInputType, any_type | |
class RgthreePowerLoraLoader: | |
""" The Power Lora Loader is a powerful, flexible node to add multiple loras to a model/clip.""" | |
NAME = get_name('Power Lora Loader') | |
CATEGORY = get_category() | |
def INPUT_TYPES(cls): # pylint: disable = invalid-name, missing-function-docstring | |
return { | |
"required": { | |
"model": ("MODEL",), | |
"clip": ("CLIP",), | |
}, | |
# Since we will pass any number of loras in from the UI, this needs to always allow an | |
"optional": FlexibleOptionalInputType(any_type), | |
"hidden": {}, | |
} | |
RETURN_TYPES = ("MODEL", "CLIP") | |
RETURN_NAMES = ("MODEL", "CLIP") | |
FUNCTION = "load_loras" | |
def load_loras(self, model, clip, **kwargs): | |
"""Loops over the provided loras in kwargs and applies valid ones.""" | |
for key, value in kwargs.items(): | |
key = key.upper() | |
if key.startswith('LORA_') and 'on' in value and 'lora' in value and 'strength' in value: | |
strength_model = value['strength'] | |
# If we just passed one strtength value, then use it for both, if we passed a strengthTwo | |
# as well, then our `strength` will be for the model, and `strengthTwo` for clip. | |
strength_clip = value['strengthTwo'] if 'strengthTwo' in value and value[ | |
'strengthTwo'] is not None else strength_model | |
if value['on'] and (strength_model != 0 or strength_clip != 0): | |
lora = get_lora_by_filename(value['lora'], log_node=self.NAME) | |
if lora is not None: | |
model, clip = LoraLoader().load_lora(model, clip, lora, strength_model, strength_clip) | |
return (model, clip) | |