mirror of
https://github.com/idrirap/ComfyUI-Lora-Auto-Trigger-Words.git
synced 2026-03-21 21:22:12 -03:00
fix: wrong value in clamping. feat: added an optional lora name append if empty result + updated readme
This commit is contained in:
@@ -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:`
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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(","):
|
||||||
|
|||||||
13
utils.py
13
utils.py
@@ -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
|
||||||
Reference in New Issue
Block a user