修改优化,新增提示词保存,自定义提示词处理

This commit is contained in:
DreamFly
2025-04-08 21:08:26 +08:00
parent 5710152e89
commit 3708b001e5
5 changed files with 259 additions and 1 deletions
+11
View File
@@ -9,6 +9,9 @@ from .nodes.prompt_portrait import PortraitSkinPrompt
from .nodes.prompt_portrait import PortraitFashionPrompt
from .nodes.prompt_portrait import PortraitPosePrompt
from .nodes.prompt_portrait import PortraitCosmeticPrompt
from .nodes.prompt_combine import CombinePrompt, MultiCombinePrompt
from .nodes.prompt_custom import CustomPrompt
from .nodes.prompt_save import SavePrompt
@@ -24,6 +27,10 @@ NODE_CLASS_MAPPINGS = {
"PortraitFashionPrompt": PortraitFashionPrompt,
"PortraitPosePrompt": PortraitPosePrompt,
"PortraitCosmeticPrompt": PortraitCosmeticPrompt,
"CombinePrompt": CombinePrompt,
"MultiCombinePrompt": MultiCombinePrompt,
"CustomPrompt": CustomPrompt,
"SavePrompt": SavePrompt,
}
NODE_DISPLAY_NAME_MAPPINGS = {
@@ -38,6 +45,10 @@ NODE_DISPLAY_NAME_MAPPINGS = {
"PortraitFashionPrompt": "Portrait Fashion Prompt",
"PortraitPosePrompt": "Portrait Pose Prompt",
"PortraitCosmeticPrompt": "Portrait Cosmetic Prompt",
"CombinePrompt": "Combine Prompt",
"MultiCombinePrompt": "Multi Combine Prompt",
"CustomPrompt": "Custom Prompt",
"SavePrompt": "Save Prompt",
}
__all__ = ['NODE_CLASS_MAPPINGS', 'NODE_DISPLAY_NAME_MAPPINGS']
+101
View File
@@ -0,0 +1,101 @@
import os
# Combine Prompt
class CombinePrompt:
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"text_A": ("STRING", {
"default": "",
"multiline": True
}),
"text_B": ("STRING", {
"default": "",
"multiline": True
}),
"text_C": ("STRING", {
"default": "",
"multiline": True
}),
}
}
RETURN_TYPES = ("STRING",)
RETURN_NAMES = ("text",)
FUNCTION = "combine"
CATEGORY = "PromptWrapper"
def combine(self, text_A="", text_B="", text_C=""):
texts = [text_A, text_B, text_C]
prompts = []
for text in texts:
if text != "" and text != "\n" and text != "\r\n":
prompts.append(text)
output_prompt = ""
if len(prompts) > 0:
output_prompt = ",".join(prompts)
return (output_prompt, )
# Multi Combine Prompt
class MultiCombinePrompt:
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"text_A": ("STRING", {
"default": "",
"multiline": True
}),
"text_B": ("STRING", {
"default": "",
"multiline": True
}),
"text_C": ("STRING", {
"default": "",
"multiline": True
}),
"text_D": ("STRING", {
"default": "",
"multiline": True
}),
"text_E": ("STRING", {
"default": "",
"multiline": True
}),
"text_F": ("STRING", {
"default": "",
"multiline": True
}),
}
}
RETURN_TYPES = ("STRING",)
RETURN_NAMES = ("text",)
FUNCTION = "combine"
CATEGORY = "PromptWrapper"
def combine(self, text_A="", text_B="", text_C="", text_D="", text_E="", text_F=""):
texts = [text_A, text_B, text_C, text_D, text_E, text_F]
prompts = []
for text in texts:
if text != "" and text != "\n" and text != "\r\n":
prompts.append(text)
output_prompt = ""
if len(prompts) > 0:
output_prompt = ",".join(prompts)
return (output_prompt, )
+94
View File
@@ -0,0 +1,94 @@
import os
from ..modules.build_prompt import BuildPrompt
from ..modules.build_prompt import buildOptionList, buildClassifyDatas
from ..modules.build_prompt import EMPTY_OPTION, RANDOM_OPTION, DEFAULT_OPTION
from ..modules.config import config
def _ReadClassifyList():
# 获取Script的目录路径
script_dir = os.path.dirname(os.path.abspath(__file__)) # Script directory
custom_dir = os.path.join(script_dir, "..", "user")
filenames = os.listdir(custom_dir)
classify_list = []
for filename in filenames:
if filename.endswith("_datas.jsonl") and os.path.isfile(os.path.join(custom_dir, filename)):
data_name = filename.replace("_datas.jsonl", "")
data_name = data_name.replace("_", "")
classify_list.append(data_name)
return classify_list
# Custom Prompt
class CustomPrompt:
@classmethod
def INPUT_TYPES(s):
classify_list = _ReadClassifyList()
classify_list = buildOptionList(classify_list, True, False)
custom_data_list = buildOptionList([], True, True)
return {
"required": {
"classify": (classify_list, {
"default": DEFAULT_OPTION
}),
"prompt": (custom_data_list, {
"default": DEFAULT_OPTION
}),
"seed": ("INT", {"default": 0, "min": 0, "max": 0xFFFFFFFFFFFFFFFF}),
"preset_prompt": ("STRING", {
"default": "",
"multiline": True
}),
},
"optional": {
"input_prompt": ("STRING", {"forceInput": True}),
}
}
RETURN_TYPES = ("STRING",)
RETURN_NAMES = ("text",)
FUNCTION = "prompt_generate"
CATEGORY = "PromptWrapper"
def prompt_generate(self, classify, prompt="", seed=0, preset_prompt="", input_prompt=""):
prompt_words = []
if input_prompt != "":
prompt_words.append(input_prompt)
if preset_prompt != "":
prompt_words.append(preset_prompt)
if classify != EMPTY_OPTION:
if prompt == RANDOM_OPTION:
# 获取Script的目录路径
script_dir = os.path.dirname(os.path.abspath(__file__)) # Script directory
classify_datas = buildClassifyDatas(classify)
custom_filename = f"{classify_datas}.jsonl"
custom_data_filename = os.path.join(script_dir, "..", "user", custom_filename)
build = BuildPrompt(custom_data_filename)
prompt = build.generate_prompt(seed)
if prompt != "":
prompt_words.append(prompt)
elif prompt != EMPTY_OPTION:
prompt_words.append(prompt)
output_prompt = ""
if len(prompt_words) > 0:
output_prompt = ", ".join(prompt_words)
return (output_prompt, )
+1 -1
View File
@@ -1047,7 +1047,7 @@ class PortraitPosePrompt:
}),
# 胸部动作权重
"chest_action_weight": ("FLOAT", {
"default": 0,
"default": 1,
"min": 0,
"max": max_float_value,
"round": 0.01,
+52
View File
@@ -0,0 +1,52 @@
import os
import json
# Save Prompt
class SavePrompt:
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"text": ("STRING", {
"forceInput": True
}),
"filename": ("STRING", {
"default": "custom"
})
}
}
RETURN_TYPES = ()
RETURN_NAMES = ()
OUTPUT_NODE = True
FUNCTION = "save"
CATEGORY = "PromptWrapper"
def save(self, text="", filename=""):
text = text.strip()
if text != "" and text != "\n" and text != "\r\n":
# 获取Script的目录路径
script_dir = os.path.dirname(os.path.abspath(__file__))
save_dir = os.path.join(script_dir, "..", "user")
if not os.path.exists(save_dir):
os.makedirs(save_dir)
save_path = os.path.join(save_dir, f"{filename}_datas.jsonl")
with open(save_path, "a+", encoding="utf-8") as fp:
data = { "text": text }
text_data = json.dumps(data, ensure_ascii=False)
size = fp.tell()
if size == 0:
fp.write(text_data)
else:
fp.write(f"\n{text_data}")
return {"ui": {"text": text}}