125 lines
4.1 KiB
Markdown
125 lines
4.1 KiB
Markdown
|
|
# Documentation
|
|
- Class name: Inference_Core_PromptExpansion
|
|
- Category: utils
|
|
- Output node: False
|
|
- Repo Ref: https://github.com/comfyanonymous/ComfyUI
|
|
|
|
Inference_Core_PromptExpansion节点旨在使用预训练语言模型来增强和扩展输入提示。它根据给定的种子自动调整输入提示,通过添加额外的上下文或变体来丰富提示内容,并输出扩展后的版本。这个过程的目的是提高提示的质量和相关性,以便用于后续的处理或生成任务。
|
|
|
|
# Input types
|
|
## Required
|
|
- model_name
|
|
- 指定用于提示扩展的模型。它决定了扩展的语言风格和能力。
|
|
- Comfy dtype: COMBO[STRING]
|
|
- Python dtype: str
|
|
- text
|
|
- 需要扩展的初始文本提示。它作为基础内容,将被丰富和扩展以生成更详细或多样化的输出。
|
|
- Comfy dtype: STRING
|
|
- Python dtype: str
|
|
- seed
|
|
- 一个整数种子,用于影响扩展提示的变化。它确保了扩展过程的可重复性,允许在不同运行中获得一致的结果。
|
|
- Comfy dtype: INT
|
|
- Python dtype: int
|
|
- log_prompt
|
|
- 一个布尔标志,用于控制是否记录原始和扩展后的提示,以便进行调试或分析。
|
|
- Comfy dtype: BOOLEAN
|
|
- Python dtype: bool
|
|
|
|
# Output types
|
|
- expanded_prompt
|
|
- 原始提示的丰富和扩展版本,通过基于种子整合额外的上下文或变体而产生。
|
|
- Comfy dtype: STRING
|
|
- Python dtype: str
|
|
- seed
|
|
- 用于扩展过程的种子值,返回以供参考或进一步使用。
|
|
- Comfy dtype: INT
|
|
- Python dtype: int
|
|
|
|
|
|
## Usage tips
|
|
- Infra type: `GPU`
|
|
- Common nodes: unknown
|
|
|
|
|
|
## Source code
|
|
```python
|
|
class PromptExpansion:
|
|
# noinspection PyPep8Naming,PyMethodParameters
|
|
@classmethod
|
|
def INPUT_TYPES(s):
|
|
return {
|
|
"required": {
|
|
"model_name": (folder_paths.get_filename_list("prompt_expansion"),),
|
|
"text": ("STRING", {"multiline": True}),
|
|
"seed": ("INT", {"default": 0, "min": 0, "max": 0xFFFFFFFF}),
|
|
"log_prompt": ("BOOLEAN", {"default": False})
|
|
},
|
|
}
|
|
|
|
RETURN_TYPES = (
|
|
"STRING",
|
|
"INT",
|
|
)
|
|
RETURN_NAMES = (
|
|
"expanded_prompt",
|
|
"seed",
|
|
)
|
|
FUNCTION = "expand_prompt" # Function name
|
|
|
|
CATEGORY = "utils" # Category for organization
|
|
|
|
@staticmethod
|
|
@torch.no_grad()
|
|
def expand_prompt(model_name: str, text: str, seed: int, log_prompt: bool):
|
|
expansion = load_expansion_runner(model_name)
|
|
|
|
prompt = remove_empty_str([safe_str(text)], default="")[0]
|
|
|
|
max_seed = 1024 * 1024 * 1024
|
|
if not isinstance(seed, int):
|
|
seed = random.randint(1, max_seed)
|
|
elif seed < 0:
|
|
seed = abs(seed)
|
|
elif seed > max_seed:
|
|
seed = seed % max_seed
|
|
|
|
prompt_parts = []
|
|
expanded_parts = []
|
|
|
|
# Split prompt if longer than 256
|
|
if len(prompt) > 256:
|
|
prompt_lines = prompt.splitlines()
|
|
# Fill part until 256
|
|
prompt_parts = [""]
|
|
filled_chars = 0
|
|
for line in prompt_lines:
|
|
# When adding the line would exceed 256, start a new part
|
|
if filled_chars + len(line) > 256:
|
|
prompt_parts.append(line)
|
|
filled_chars = len(line)
|
|
else:
|
|
prompt_parts[-1] += line
|
|
filled_chars += len(line)
|
|
else:
|
|
prompt_parts = [prompt]
|
|
|
|
for i, part in enumerate(prompt_parts):
|
|
expansion_part = expansion(part, seed)
|
|
full_part = join_prompts(part, expansion_part)
|
|
expanded_parts.append(full_part)
|
|
|
|
expanded_prompt = "\n".join(expanded_parts)
|
|
|
|
if log_prompt:
|
|
if logger.isEnabledFor(logging.INFO):
|
|
logger.info(f"Prompt: {prompt!r}")
|
|
logger.info(f"Expanded Prompt: {expanded_prompt!r}")
|
|
else:
|
|
print(f"Prompt: {prompt!r}")
|
|
print(f"Expanded Prompt: {expanded_prompt!r}")
|
|
|
|
return expanded_prompt, seed
|
|
|
|
```
|