7.5 KiB
7.5 KiB
Documentation
- Class name: pipeEdit
- Category: EasyUse/Pipe
- Output node: False
- Repo Ref: https://github.com/yolain/ComfyUI-Easy-Use.git
pipeEdit节点是一个全面的精炼和调整处理流程中元素的工具。它旨在简化条件的修改、模型的集成以及各种数据类型的处理,确保复杂作的工作流程无缝进行。
Input types
Required
- clip_skip
- 此参数决定流水线中CLIP模型的跳过级别,对控制CLIP对整体处理的影响至关重要。
- Comfy dtype: INT
- Python dtype: int
- conditioning_mode
- 调节模式定义了在流水线中应用和组合各种条件的策略,影响最终输出的连贯性和与预期方向的一致性。
- Comfy dtype: COMBO
- Python dtype: str
Optional
- optional_positive
- 正面调节文本对于引导生成过程朝着期望的结果至关重要。它塑造了模型输出的创作方向。
- Comfy dtype: STRING
- Python dtype: str
- positive_token_normalization
- 此参数集确定了正面调节文本中的标记是如何规范化的,这显著影响生成内容的精确性和相关性。
- Comfy dtype: COMBO
- Python dtype: str
Output types
- pipe
- 更新后的流水线对象封装了pipeEdit节点所做的所有修改和配置,作为后续处理步骤的支柱。
- Comfy dtype: PIPE_LINE
- Python dtype: dict
- model
- 模型参数代表流水线中使用的神经网络模型,更新确保特定任务的最佳性能和定制输出。
- Comfy dtype: MODEL
- Python dtype: torch.nn.Module
Usage tips
- Infra type: GPU
Source code
class pipeEdit:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(s):
return {'required': {'clip_skip': ('INT', {'default': -1, 'min': -24, 'max': 0, 'step': 1}), 'optional_positive': ('STRING', {'default': '', 'multiline': True}), 'positive_token_normalization': (['none', 'mean', 'length', 'length+mean'],), 'positive_weight_interpretation': (['comfy', 'A1111', 'comfy++', 'compel', 'fixed attention'],), 'optional_negative': ('STRING', {'default': '', 'multiline': True}), 'negative_token_normalization': (['none', 'mean', 'length', 'length+mean'],), 'negative_weight_interpretation': (['comfy', 'A1111', 'comfy++', 'compel', 'fixed attention'],), 'a1111_prompt_style': ('BOOLEAN', {'default': False}), 'conditioning_mode': (['replace', 'concat', 'combine', 'average', 'timestep'], {'default': 'replace'}), 'average_strength': ('FLOAT', {'default': 1.0, 'min': 0.0, 'max': 1.0, 'step': 0.01}), 'old_cond_start': ('FLOAT', {'default': 0.0, 'min': 0.0, 'max': 1.0, 'step': 0.001}), 'old_cond_end': ('FLOAT', {'default': 1.0, 'min': 0.0, 'max': 1.0, 'step': 0.001}), 'new_cond_start': ('FLOAT', {'default': 0.0, 'min': 0.0, 'max': 1.0, 'step': 0.001}), 'new_cond_end': ('FLOAT', {'default': 1.0, 'min': 0.0, 'max': 1.0, 'step': 0.001})}, 'optional': {'pipe': ('PIPE_LINE',), 'model': ('MODEL',), 'pos': ('CONDITIONING',), 'neg': ('CONDITIONING',), 'latent': ('LATENT',), 'vae': ('VAE',), 'clip': ('CLIP',), 'image': ('IMAGE',)}, 'hidden': {'my_unique_id': 'UNIQUE_ID', 'prompt': 'PROMPT'}}
RETURN_TYPES = ('PIPE_LINE', 'MODEL', 'CONDITIONING', 'CONDITIONING', 'LATENT', 'VAE', 'CLIP', 'IMAGE')
RETURN_NAMES = ('pipe', 'model', 'pos', 'neg', 'latent', 'vae', 'clip', 'image')
FUNCTION = 'flush'
CATEGORY = 'EasyUse/Pipe'
def flush(self, clip_skip, optional_positive, positive_token_normalization, positive_weight_interpretation, optional_negative, negative_token_normalization, negative_weight_interpretation, a1111_prompt_style, conditioning_mode, average_strength, old_cond_start, old_cond_end, new_cond_start, new_cond_end, pipe=None, model=None, pos=None, neg=None, latent=None, vae=None, clip=None, image=None, my_unique_id=None, prompt=None):
model = model if model is not None else pipe.get('model')
if model is None:
log_node_warn(f'pipeIn[{my_unique_id}]', 'Model missing from pipeLine')
vae = vae if vae is not None else pipe.get('vae')
if vae is None:
log_node_warn(f'pipeIn[{my_unique_id}]', 'VAE missing from pipeLine')
clip = clip if clip is not None else pipe.get('clip')
if clip is None:
log_node_warn(f'pipeIn[{my_unique_id}]', 'Clip missing from pipeLine')
if image is None:
image = pipe.get('images') if pipe is not None else None
samples = latent if latent is not None else pipe.get('samples')
if samples is None:
log_node_warn(f'pipeIn[{my_unique_id}]', 'Latent missing from pipeLine')
else:
batch_size = pipe['loader_settings']['batch_size'] if 'batch_size' in pipe['loader_settings'] else 1
samples = {'samples': vae.encode(image[:, :, :, :3])}
samples = RepeatLatentBatch().repeat(samples, batch_size)[0]
pipe_lora_stack = pipe.get('lora_stack') if pipe is not None and 'lora_stack' in pipe else []
steps = pipe['loader_settings']['steps'] if 'steps' in pipe['loader_settings'] else 1
if pos is None and optional_positive != '':
(pos, positive_wildcard_prompt, model, clip) = prompt_to_cond('positive', model, clip, clip_skip, pipe_lora_stack, optional_positive, positive_token_normalization, positive_weight_interpretation, a1111_prompt_style, my_unique_id, prompt, easyCache, True, steps)
pos = set_cond(pipe['positive'], pos, conditioning_mode, average_strength, old_cond_start, old_cond_end, new_cond_start, new_cond_end)
pipe['loader_settings']['positive'] = positive_wildcard_prompt
pipe['loader_settings']['positive_token_normalization'] = positive_token_normalization
pipe['loader_settings']['positive_weight_interpretation'] = positive_weight_interpretation
if a1111_prompt_style:
pipe['loader_settings']['a1111_prompt_style'] = True
else:
pos = pipe.get('positive')
if pos is None:
log_node_warn(f'pipeIn[{my_unique_id}]', 'Pos Conditioning missing from pipeLine')
if neg is None and optional_negative != '':
(neg, negative_wildcard_prompt, model, clip) = prompt_to_cond('negative', model, clip, clip_skip, pipe_lora_stack, optional_negative, negative_token_normalization, negative_weight_interpretation, a1111_prompt_style, my_unique_id, prompt, easyCache, True, steps)
neg = set_cond(pipe['negative'], neg, conditioning_mode, average_strength, old_cond_start, old_cond_end, new_cond_start, new_cond_end)
pipe['loader_settings']['negative'] = negative_wildcard_prompt
pipe['loader_settings']['negative_token_normalization'] = negative_token_normalization
pipe['loader_settings']['negative_weight_interpretation'] = negative_weight_interpretation
if a1111_prompt_style:
pipe['loader_settings']['a1111_prompt_style'] = True
else:
neg = pipe.get('negative')
if neg is None:
log_node_warn(f'pipeIn[{my_unique_id}]', 'Neg Conditioning missing from pipeLine')
if pipe is None:
pipe = {'loader_settings': {'positive': '', 'negative': '', 'xyplot': None}}
new_pipe = {**pipe, 'model': model, 'positive': pos, 'negative': neg, 'vae': vae, 'clip': clip, 'samples': samples, 'images': image, 'seed': pipe.get('seed') if pipe is not None and 'seed' in pipe else None, 'loader_settings': {**pipe['loader_settings']}}
del pipe
return (new_pipe, model, pos, neg, latent, vae, clip, image)