97 lines
3.1 KiB
Markdown
97 lines
3.1 KiB
Markdown
|
|
# Documentation
|
|
- Class name: AV_LoraListStacker
|
|
- Category: Art Venture/Loaders
|
|
- Output node: False
|
|
- Repo Ref: https://github.com/comfyanonymous/ComfyUI
|
|
|
|
AV_LoraListStacker节点旨在管理和堆叠Lora模型的配置,促进多个Lora模型动态集成并应用到处理流程中。它抽象了处理Lora模型参数的复杂性,确保模型的应用顺序尊重预期的分层和强度调整。
|
|
|
|
# Input types
|
|
## Required
|
|
- data
|
|
- 'data'输入包含了JSON格式的Lora模型列表及其配置,规定了每个Lora模型应如何应用于基础模型。
|
|
- Comfy dtype: STRING
|
|
- Python dtype: str
|
|
## Optional
|
|
- base_url
|
|
- 'base_url'可选输入提供了一个默认的URL前缀,用于获取本地不可用的Lora模型,便于远程模型检索。
|
|
- Comfy dtype: STRING
|
|
- Python dtype: str
|
|
- lora_stack
|
|
- 'lora_stack'输入允许包含现有的Lora模型堆栈,以进行进一步处理或与新的Lora配置集成。
|
|
- Comfy dtype: LORA_STACK
|
|
- Python dtype: list
|
|
|
|
# Output types
|
|
- lora_stack
|
|
- 返回整合了指定Lora模型调整后的更新后的Lora模型堆栈。
|
|
- Comfy dtype: LORA_STACK
|
|
- Python dtype: list
|
|
|
|
|
|
## Usage tips
|
|
- Infra type: `CPU`
|
|
- Common nodes: unknown
|
|
|
|
|
|
## Source code
|
|
```python
|
|
class AVLoraListStacker:
|
|
@classmethod
|
|
def INPUT_TYPES(s):
|
|
return {
|
|
"required": {
|
|
"data": ("STRING", {"default": "", "multiline": True, "dynamicPrompts": False}),
|
|
},
|
|
"optional": {"base_url": ("STRING", {"default": lora_cloud_front_url}), "lora_stack": ("LORA_STACK",)},
|
|
}
|
|
|
|
RETURN_TYPES = ("LORA_STACK",)
|
|
FUNCTION = "load_list_lora"
|
|
CATEGORY = "Art Venture/Loaders"
|
|
|
|
def parse_lora_list(self, data: str, base_url: str):
|
|
# data is a list of lora model (lora_name, strength_model, strength_clip, url) in json format
|
|
# trim data
|
|
data = data.strip()
|
|
if data == "" or data == "[]" or data is None:
|
|
return []
|
|
|
|
print(f"Loading lora list: {data}")
|
|
|
|
lora_list = json.loads(data)
|
|
if len(lora_list) == 0:
|
|
return []
|
|
|
|
available_loras = folder_paths.get_filename_list("loras")
|
|
model_path = os.path.join(folder_paths.models_dir, "loras")
|
|
|
|
lora_params = []
|
|
for lora in lora_list:
|
|
lora_name = lora["name"]
|
|
strength_model = lora["strength"]
|
|
strength_clip = lora["strength"]
|
|
lora_url = lora.get("url", None)
|
|
|
|
if strength_model == 0 and strength_clip == 0:
|
|
continue
|
|
|
|
if lora_name not in available_loras:
|
|
lora_url = lora_url or f"{base_url}/models/loras/{lora_name}"
|
|
load_file_from_url(lora_url, model_dir=model_path, file_name=lora_name)
|
|
|
|
lora_params.append((lora_name, strength_model, strength_clip))
|
|
|
|
return lora_params
|
|
|
|
def load_list_lora(self, data, base_url=lora_cloud_front_url, lora_stack=None):
|
|
loras = self.parse_lora_list(data, base_url=base_url)
|
|
|
|
if lora_stack is not None:
|
|
loras.extend([l for l in lora_stack if l[0] != "None"])
|
|
|
|
return (loras,)
|
|
|
|
```
|