from .categories import NodeCategories from .shared import hashed_as_strings from .dreamtypes import PartialPrompt class DreamWeightedPromptBuilder: NODE_NAME = "Build Prompt" ICON = "⚖" @classmethod def INPUT_TYPES(cls): return { "optional": { "partial_prompt": (PartialPrompt.ID,) }, "required": { "added_prompt": ("STRING", {"default": "", "multiline": True}), "weight": ("FLOAT", {"default": 1.0}), }, } CATEGORY = NodeCategories.CONDITIONING RETURN_TYPES = (PartialPrompt.ID,) RETURN_NAMES = ("partial_prompt",) FUNCTION = "result" @classmethod def IS_CHANGED(cls, *values): return hashed_as_strings(*values) def result(self, added_prompt, weight, **args): input = args.get("partial_prompt", PartialPrompt()) p = input.add(added_prompt, weight) return (p,) class DreamPromptFinalizer: NODE_NAME = "Finalize Prompt" ICON = "🗫" @classmethod def INPUT_TYPES(cls): return { "required": { "partial_prompt": (PartialPrompt.ID,), "adjustment": (["raw", "by_abs_max", "by_abs_sum"],), "clamp": ("FLOAT", {"default": 2.0, "min": 0.1, "step": 0.1}), "adjustment_reference": ("FLOAT", {"default": 1.0, "min": 0.1}), }, } CATEGORY = NodeCategories.CONDITIONING RETURN_TYPES = ("STRING", "STRING") RETURN_NAMES = ("positive", "negative") FUNCTION = "result" @classmethod def IS_CHANGED(cls, *values): return hashed_as_strings(*values) def result(self, partial_prompt: PartialPrompt, adjustment, adjustment_reference, clamp): if adjustment == "raw" or partial_prompt.is_empty(): return partial_prompt.finalize(clamp) elif adjustment == "by_abs_sum": f = adjustment_reference / partial_prompt.abs_sum() return partial_prompt.scaled_by(f).finalize(clamp) else: f = adjustment_reference / partial_prompt.abs_max() return partial_prompt.scaled_by(f).finalize(clamp)