fix: wrong value in clamping. feat: added an optional lora name append if empty result + updated readme

This commit is contained in:
Dijkstra
2023-11-01 18:42:13 +01:00
parent 89ad7f580f
commit e94f4bc2cd
4 changed files with 47 additions and 13 deletions

View File

@@ -3,6 +3,7 @@
This project is a fork of https://github.com/Extraltodeus/LoadLoraWithTags This project is a fork of https://github.com/Extraltodeus/LoadLoraWithTags
The aim of these custom nodes is to get an _easy_ access to the tags used to trigger a lora. The aim of these custom nodes is to get an _easy_ access to the tags used to trigger a lora.
This project is compatible with Stacked Loras from https://github.com/LucianoCirino/efficiency-nodes-comfyui/releases This project is compatible with Stacked Loras from https://github.com/LucianoCirino/efficiency-nodes-comfyui/releases
I talk about **lora**, but works with **lycoris** too.
## Install ## Install
Some of this project nodes depends on https://github.com/pythongosssss/ComfyUI-Custom-Scripts : Some of this project nodes depends on https://github.com/pythongosssss/ComfyUI-Custom-Scripts :
@@ -27,6 +28,10 @@ These loaders have two custom outputs:
This outputs needs to be filtered by two othere nodes: This outputs needs to be filtered by two othere nodes:
- TagsFormater: Helper to show the available tag and their indexes - TagsFormater: Helper to show the available tag and their indexes
- tagsSelector: allow to filter tags and apply a weight to it. - tagsSelector: allow to filter tags and apply a weight to it.
- TagSelector contains four parameters. First the selector (see Filtering next)
- The weight `(tag:weight)`
- The boolean `ensure_comma`. To properly append comma if a prefix or suffix is added.
- The boolean `append_loraname_if_empty` which will add the name of the lora in the list of outputs if they are empty.
#### Filtering #### Filtering
The format is simple. It's the same as python list index, but can select multiple index or ranges of indexes separated by comas. The format is simple. It's the same as python list index, but can select multiple index or ranges of indexes separated by comas.
`Ex: 0, 3, 5:8, -8:` `Ex: 0, 3, 5:8, -8:`

View File

@@ -19,6 +19,7 @@ class LoraLoaderVanilla:
"strength_model": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 2.0, "step": 0.1}), "strength_model": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 2.0, "step": 0.1}),
"strength_clip": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 2.0, "step": 0.1}), "strength_clip": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 2.0, "step": 0.1}),
"force_fetch": ("BOOLEAN", {"default": False}), "force_fetch": ("BOOLEAN", {"default": False}),
"append_loraname_if_empty": ("BOOLEAN", {"default": False}),
} }
} }
@@ -27,9 +28,13 @@ class LoraLoaderVanilla:
FUNCTION = "load_lora" FUNCTION = "load_lora"
CATEGORY = "autotrigger" CATEGORY = "autotrigger"
def load_lora(self, model, clip, lora_name, strength_model, strength_clip, force_fetch): def load_lora(self, model, clip, lora_name, strength_model, strength_clip, force_fetch, append_loraname_if_empty):
meta_tags_list = sort_tags_by_frequency(get_metadata(lora_name, "loras")) meta_tags_list = sort_tags_by_frequency(get_metadata(lora_name, "loras"))
output_tags_list = load_and_save_tags(lora_name, force_fetch) civitai_tags_list = load_and_save_tags(lora_name, force_fetch)
meta_tags_list = append_lora_name_if_empty(meta_tags_list, lora_name, append_loraname_if_empty)
civitai_tags_list = append_lora_name_if_empty(civitai_tags_list, lora_name, append_loraname_if_empty)
lora_path = folder_paths.get_full_path("loras", lora_name) lora_path = folder_paths.get_full_path("loras", lora_name)
lora = None lora = None
if self.loaded_lora is not None: if self.loaded_lora is not None:
@@ -46,7 +51,7 @@ class LoraLoaderVanilla:
model_lora, clip_lora = load_lora_for_models(model, clip, lora, strength_model, strength_clip) model_lora, clip_lora = load_lora_for_models(model, clip, lora, strength_model, strength_clip)
return (model_lora, clip_lora, output_tags_list, meta_tags_list) return (model_lora, clip_lora, civitai_tags_list, meta_tags_list)
class LoraLoaderStackedVanilla: class LoraLoaderStackedVanilla:
@classmethod @classmethod
@@ -57,6 +62,7 @@ class LoraLoaderStackedVanilla:
"lora_name": (LORA_LIST,), "lora_name": (LORA_LIST,),
"lora_weight": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}), "lora_weight": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}),
"force_fetch": ("BOOLEAN", {"default": False}), "force_fetch": ("BOOLEAN", {"default": False}),
"append_loraname_if_empty": ("BOOLEAN", {"default": False}),
}, },
"optional": { "optional": {
"lora_stack": ("LORA_STACK", ), "lora_stack": ("LORA_STACK", ),
@@ -69,12 +75,15 @@ class LoraLoaderStackedVanilla:
#OUTPUT_NODE = False #OUTPUT_NODE = False
CATEGORY = "autotrigger" CATEGORY = "autotrigger"
def set_stack(self, lora_name, lora_weight, force_fetch, lora_stack=None): def set_stack(self, lora_name, lora_weight, force_fetch, append_loraname_if_empty, lora_stack=None):
civitai_tags_list = load_and_save_tags(lora_name, force_fetch) civitai_tags_list = load_and_save_tags(lora_name, force_fetch)
meta_tags = get_metadata(lora_name, "loras") meta_tags = get_metadata(lora_name, "loras")
meta_tags_list = sort_tags_by_frequency(meta_tags) meta_tags_list = sort_tags_by_frequency(meta_tags)
civitai_tags_list = append_lora_name_if_empty(civitai_tags_list, lora_name, append_loraname_if_empty)
meta_tags_list = append_lora_name_if_empty(meta_tags_list, lora_name, append_loraname_if_empty)
if lora_stack is not None: if lora_stack is not None:
lora_stack.append((lora_name,lora_weight,lora_weight,)) lora_stack.append((lora_name,lora_weight,lora_weight,))
else: else:
@@ -99,6 +108,7 @@ class LoraLoaderAdvanced:
"strength_clip": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 2.0, "step": 0.1}), "strength_clip": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 2.0, "step": 0.1}),
"force_fetch": ("BOOLEAN", {"default": False}), "force_fetch": ("BOOLEAN", {"default": False}),
"enable_preview": ("BOOLEAN", {"default": False}), "enable_preview": ("BOOLEAN", {"default": False}),
"append_loraname_if_empty": ("BOOLEAN", {"default": False}),
} }
} }
@@ -107,9 +117,13 @@ class LoraLoaderAdvanced:
FUNCTION = "load_lora" FUNCTION = "load_lora"
CATEGORY = "autotrigger" CATEGORY = "autotrigger"
def load_lora(self, model, clip, lora_name, strength_model, strength_clip, force_fetch, enable_preview): def load_lora(self, model, clip, lora_name, strength_model, strength_clip, force_fetch, enable_preview, append_loraname_if_empty):
meta_tags_list = sort_tags_by_frequency(get_metadata(lora_name["content"], "loras")) meta_tags_list = sort_tags_by_frequency(get_metadata(lora_name["content"], "loras"))
output_tags_list = load_and_save_tags(lora_name["content"], force_fetch) civitai_tags_list = load_and_save_tags(lora_name["content"], force_fetch)
civitai_tags_list = append_lora_name_if_empty(civitai_tags_list, lora_name["content"], append_loraname_if_empty)
meta_tags_list = append_lora_name_if_empty(meta_tags_list, lora_name["content"], append_loraname_if_empty)
lora_path = folder_paths.get_full_path("loras", lora_name["content"]) lora_path = folder_paths.get_full_path("loras", lora_name["content"])
lora = None lora = None
if self.loaded_lora is not None: if self.loaded_lora is not None:
@@ -133,10 +147,10 @@ class LoraLoaderAdvanced:
"subfolder": "lora_preview", "subfolder": "lora_preview",
"type": "temp" "type": "temp"
} }
return {"ui": {"images": [preview_output]}, "result": (model_lora, clip_lora, output_tags_list, meta_tags_list)} return {"ui": {"images": [preview_output]}, "result": (model_lora, clip_lora, civitai_tags_list, meta_tags_list)}
return (model_lora, clip_lora, output_tags_list, meta_tags_list) return (model_lora, clip_lora, civitai_tags_list, meta_tags_list)
class LoraLoaderStackedAdvanced: class LoraLoaderStackedAdvanced:
@classmethod @classmethod
@@ -149,6 +163,7 @@ class LoraLoaderStackedAdvanced:
"lora_weight": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}), "lora_weight": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}),
"force_fetch": ("BOOLEAN", {"default": False}), "force_fetch": ("BOOLEAN", {"default": False}),
"enable_preview": ("BOOLEAN", {"default": False}), "enable_preview": ("BOOLEAN", {"default": False}),
"append_loraname_if_empty": ("BOOLEAN", {"default": False}),
}, },
"optional": { "optional": {
"lora_stack": ("LORA_STACK", ), "lora_stack": ("LORA_STACK", ),
@@ -161,12 +176,15 @@ class LoraLoaderStackedAdvanced:
#OUTPUT_NODE = False #OUTPUT_NODE = False
CATEGORY = "autotrigger" CATEGORY = "autotrigger"
def set_stack(self, lora_name, lora_weight, force_fetch, enable_preview, lora_stack=None): def set_stack(self, lora_name, lora_weight, force_fetch, enable_preview, append_loraname_if_empty, lora_stack=None):
civitai_tags_list = load_and_save_tags(lora_name["content"], force_fetch) civitai_tags_list = load_and_save_tags(lora_name["content"], force_fetch)
meta_tags = get_metadata(lora_name["content"], "loras") meta_tags = get_metadata(lora_name["content"], "loras")
meta_tags_list = sort_tags_by_frequency(meta_tags) meta_tags_list = sort_tags_by_frequency(meta_tags)
civitai_tags_list = append_lora_name_if_empty(civitai_tags_list, lora_name["content"], append_loraname_if_empty)
meta_tags_list = append_lora_name_if_empty(meta_tags_list, lora_name["content"], append_loraname_if_empty)
if lora_stack is not None: if lora_stack is not None:
lora_stack.append((lora_name["content"],lora_weight,lora_weight,)) lora_stack.append((lora_name["content"],lora_weight,lora_weight,))
else: else:

View File

@@ -74,7 +74,7 @@ class TagsSelector:
"tags_list": ("LIST", {"default": []}), "tags_list": ("LIST", {"default": []}),
"selector": ("STRING", {"default": ":"}), "selector": ("STRING", {"default": ":"}),
"weight": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}), "weight": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}),
"ensure_coma": ("BOOLEAN", {"default": True}) "ensure_comma": ("BOOLEAN", {"default": True})
}, },
"optional": { "optional": {
"prefix":("STRING", {"default":"", "forceInput": True}), "prefix":("STRING", {"default":"", "forceInput": True}),
@@ -86,11 +86,11 @@ class TagsSelector:
FUNCTION = "select_tags" FUNCTION = "select_tags"
CATEGORY = "autotrigger" CATEGORY = "autotrigger"
def select_tags(self, tags_list, selector, weight, ensure_coma, prefix="", suffix=""): def select_tags(self, tags_list, selector, weight, ensure_comma, prefix="", suffix=""):
if weight != 1.0: if weight != 1.0:
tags_list = [f"({tag}:{weight})" for tag in tags_list] tags_list = [f"({tag}:{weight})" for tag in tags_list]
output = parse_selector(selector, tags_list) output = parse_selector(selector, tags_list)
if ensure_coma: if ensure_comma:
striped_prefix = prefix.strip() striped_prefix = prefix.strip()
striped_suffix = suffix.strip() striped_suffix = suffix.strip()
if striped_prefix != "" and not striped_prefix.endswith(",") and output != "" and not output.startswith(","): if striped_prefix != "" and not striped_prefix.endswith(",") and output != "" and not output.startswith(","):

View File

@@ -205,9 +205,20 @@ def parse_selector(selector, tags_list):
if end < 0: if end < 0:
end = len(tags_list) + end end = len(tags_list) + end
# clamp start and end values within list boundaries # clamp start and end values within list boundaries
start, end = min(start, len(tags_list)-1), min(end, len(tags_list)-1) start, end = min(start, len(tags_list)), min(end, len(tags_list))
start, end = max(start, 0), max(end, 0) start, end = max(start, 0), max(end, 0)
# merge all # merge all
for i in range(start, end): for i in range(start, end):
output[i] = tags_list[i] output[i] = tags_list[i]
return ", ".join(list(output.values())) return ", ".join(list(output.values()))
def append_lora_name_if_empty(tags_list, lora_path, enabled):
if not enabled or len(tags_list) > 0:
return tags_list
print("AAA : " + lora_path)
filename = os.path.splitext(lora_path)[0]
filename = os.path.basename(filename)
print("BBB : " + filename)
tags_list.append(filename)
return tags_list