Add new properties to VisualPrompt for handling positive and negative prompts, including keywords and descriptive formats, and refactor prompt building logic.

This commit is contained in:
vegu-ai-tools
2025-11-22 17:28:42 +02:00
parent 16f135c8f0
commit dc3ba4a18a
2 changed files with 33 additions and 17 deletions

View File

@@ -287,6 +287,10 @@ class UnpackPrompt(Node):
self.add_output("instructions", socket_type="str") self.add_output("instructions", socket_type="str")
self.add_output("positive_prompt", socket_type="str") self.add_output("positive_prompt", socket_type="str")
self.add_output("negative_prompt", socket_type="str") self.add_output("negative_prompt", socket_type="str")
self.add_output("positive_prompt_keywords", socket_type="str")
self.add_output("negative_prompt_keywords", socket_type="str")
self.add_output("positive_prompt_descriptive", socket_type="str")
self.add_output("negative_prompt_descriptive", socket_type="str")
async def run(self, state: GraphState): async def run(self, state: GraphState):
prompt = self.normalized_input_value("prompt") prompt = self.normalized_input_value("prompt")
@@ -299,6 +303,10 @@ class UnpackPrompt(Node):
"parts": parts, "parts": parts,
"positive_prompt": prompt.positive_prompt, "positive_prompt": prompt.positive_prompt,
"negative_prompt": prompt.negative_prompt, "negative_prompt": prompt.negative_prompt,
"positive_prompt_keywords": prompt.positive_prompt_keywords,
"negative_prompt_keywords": prompt.negative_prompt_keywords,
"positive_prompt_descriptive": prompt.positive_prompt_descriptive,
"negative_prompt_descriptive": prompt.negative_prompt_descriptive,
} }
) )

View File

@@ -133,34 +133,42 @@ class VisualPrompt(pydantic.BaseModel):
@pydantic.computed_field @pydantic.computed_field
@property @property
def positive_prompt(self) -> str: def positive_prompt(self) -> str:
prompt: list[str] = [] return self._build_prompt(self.prompt_type, True)
if self.prompt_type == PROMPT_TYPE.KEYWORDS:
for part in self.parts:
prompt.extend(part.positive_keywords)
return ", ".join(dict.fromkeys(prompt))
elif self.prompt_type == PROMPT_TYPE.DESCRIPTIVE:
for part in self.parts:
if part.positive_descriptive:
prompt.append(part.positive_descriptive)
return "\n\n".join(prompt)
return ""
@pydantic.computed_field @pydantic.computed_field
@property @property
def negative_prompt(self) -> str: def negative_prompt(self) -> str:
return self._build_prompt(self.prompt_type, False)
@property
def positive_prompt_keywords(self) -> str:
return self._build_prompt(PROMPT_TYPE.KEYWORDS, True)
@property
def negative_prompt_keywords(self) -> str:
return self._build_prompt(PROMPT_TYPE.KEYWORDS, False)
@property
def positive_prompt_descriptive(self) -> str:
return self._build_prompt(PROMPT_TYPE.DESCRIPTIVE, True)
@property
def negative_prompt_descriptive(self) -> str:
return self._build_prompt(PROMPT_TYPE.DESCRIPTIVE, False)
def _build_prompt(self, prompt_type: PROMPT_TYPE, positive: bool) -> str:
prompt: list[str] = [] prompt: list[str] = []
if self.prompt_type == PROMPT_TYPE.KEYWORDS: if prompt_type == PROMPT_TYPE.KEYWORDS:
for part in self.parts: for part in self.parts:
prompt.extend(part.negative_keywords) prompt.extend(part.positive_keywords if positive else part.negative_keywords)
return ", ".join(dict.fromkeys(prompt)) return ", ".join(dict.fromkeys(prompt))
elif self.prompt_type == PROMPT_TYPE.DESCRIPTIVE: elif prompt_type == PROMPT_TYPE.DESCRIPTIVE:
for part in self.parts: for part in self.parts:
if part.negative_descriptive: if part.positive_descriptive if positive else part.negative_descriptive:
prompt.append(part.negative_descriptive) prompt.append(part.positive_descriptive if positive else part.negative_descriptive)
return "\n\n".join(prompt) return "\n\n".join(prompt)
return "" return ""
class BackendStatus(pydantic.BaseModel): class BackendStatus(pydantic.BaseModel):
type: BackendStatusType type: BackendStatusType
message: str | None = None message: str | None = None