Files
CavinHuang-comfyui-nodes-docs/docs/WildcardAndLoraSyntaxProcessor.md
2024-05-26 20:35:16 +08:00

102 lines
4.9 KiB
Markdown

# Documentation
- Class name: WildcardAndLoraSyntaxProcessor
- Category: Mikey/Lora
- Output node: False
- Repo Ref: https://github.com/bash-j/mikey_nodes
WildcardAndLoraSyntaxProcessor节点旨在处理和加工复杂的文本输入,通过将通配符和Lora语法替换为特定值或文件。它通过使能基于预定义模式和外部文件的动态内容生成,增强了文本处理工作流的灵活性和定制性。
# Input types
## Required
- model
- 模型参数对于节点的操作至关重要,因为它代表了节点将用于处理的核心模型。这是一个必需的输入,直接影响节点正常工作的能力。
- Comfy dtype: MODEL
- Python dtype: torch.nn.Module
- clip
- clip参数是一个必需的输入,它与模型参数协同工作。它通过提供模型可能需要的额外上下文或数据,在节点的执行中发挥重要作用。
- Comfy dtype: CLIP
- Python dtype: CLIP model instance
- text
- 文本参数是节点的关键输入,因为它包含将被处理的原始文本。它可以包含用于通配符和Lora引用的特殊语法,节点将相应地解释并替换它们。
- Comfy dtype: STRING
- Python dtype: str
- seed
- 种子参数对节点的随机化过程很重要。它确保文本中的随机元素以可重现的方式生成,这对于不同运行之间获得一致的结果至关重要。
- Comfy dtype: INT
- Python dtype: int
## Optional
- extra_pnginfo
- extra_pnginfo参数虽然是可选的,但可以提供用于进一步定制节点行为的额外信息。它可以包含元数据或其他相关数据,以增强节点的处理能力。
- Comfy dtype: EXTRA_PNGINFO
- Python dtype: str or dict
- prompt
- 提示参数是一个可选输入,它可以通过提供特定指令或上下文来指导节点的处理。当处理复杂文本输入时,它可以用来影响节点的决策过程。
- Comfy dtype: PROMPT
- Python dtype: str or dict
# Output types
- model
- 节点的模型输出代表了已处理的模型,该模型已根据节点的操作进行了更新或修改。它标志着节点文本处理的完成,并已准备好用于进一步使用或分析。
- Comfy dtype: MODEL
- Python dtype: torch.nn.Module
- clip
- clip输出是输入clip的处理版本,反映了节点执行期间所做的任何更改。这是一个重要的结果,可能会在工作流的后续阶段中使用。
- Comfy dtype: CLIP
- Python dtype: CLIP model instance
- text
- 文本输出是所有通配符和Lora语法被替换后的最终处理文本。它代表了节点的主要输出,是节点核心功能的结果。
- Comfy dtype: STRING
- Python dtype: str
- unprocessed_text
- 未处理的文本输出提供了节点的原始文本输入,未经节点操作的任何修改。它用作比较或进一步分析的参考。
- Comfy dtype: STRING
- Python dtype: str
# Usage tips
- Infra type: CPU
# Source code
```
class WildcardAndLoraSyntaxProcessor:
def __init__(self):
self.loaded_lora = None
@classmethod
def INPUT_TYPES(s):
return {'required': {'model': ('MODEL',), 'clip': ('CLIP',), 'text': ('STRING', {'multiline': True, 'default': '<lora:filename:weight>'}), 'seed': ('INT', {'default': 0, 'min': 0, 'max': 18446744073709551615})}, 'hidden': {'extra_pnginfo': 'EXTRA_PNGINFO', 'prompt': 'PROMPT'}}
RETURN_TYPES = ('MODEL', 'CLIP', 'STRING', 'STRING')
RETURN_NAMES = ('model', 'clip', 'text', 'unprocessed_text')
FUNCTION = 'process'
CATEGORY = 'Mikey/Lora'
def extract_and_load_loras(self, text, model, clip):
lora_re = '<lora:(.*?)(?::(.*?))?>'
lora_prompts = re.findall(lora_re, text)
stripped_text = text
clip_lora = clip
if len(lora_prompts) > 0:
for lora_prompt in lora_prompts:
lora_filename = lora_prompt[0]
if '.safetensors' not in lora_filename:
lora_filename += '.safetensors'
try:
lora_multiplier = float(lora_prompt[1]) if lora_prompt[1] != '' else 1.0
except:
lora_multiplier = 1.0
(model, clip) = load_lora(model, clip, lora_filename, lora_multiplier, lora_multiplier)
stripped_text = re.sub(lora_re, '', stripped_text)
return (model, clip, stripped_text)
def process(self, model, clip, text, seed, extra_pnginfo=None, prompt=None):
text = search_and_replace(text, extra_pnginfo, prompt)
text = process_random_syntax(text, seed)
text_ = find_and_replace_wildcards(text, seed, True)
if len(text_) != len(text):
seed = random.randint(0, 1000000)
else:
seed = 1
(model, clip, stripped_text) = self.extract_and_load_loras(text_, model, clip)
stripped_text = find_and_replace_wildcards(stripped_text, seed, True)
return (model, clip, stripped_text, text_)
```