From 7371f189f75ec922cd8ac1445e0506e2a1ae4659 Mon Sep 17 00:00:00 2001 From: space-nuko <24979496+space-nuko@users.noreply.github.com> Date: Sat, 13 May 2023 02:17:00 -0500 Subject: [PATCH] First commit --- __init__.py | 3 + nodes.py | 193 +++++++++++++++++++++++++++++++++++++++++++++++ requirements.txt | 1 + 3 files changed, 197 insertions(+) create mode 100644 __init__.py create mode 100644 nodes.py create mode 100644 requirements.txt diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..3d998ea --- /dev/null +++ b/__init__.py @@ -0,0 +1,3 @@ +from .nodes import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS + +__all__ = ['NODE_CLASS_MAPPINGS', 'NODE_DISPLAY_NAME_MAPPINGS'] diff --git a/nodes.py b/nodes.py new file mode 100644 index 0000000..41147f7 --- /dev/null +++ b/nodes.py @@ -0,0 +1,193 @@ +import os.path +import dynamicprompts +from dynamicprompts.generators import ( + RandomPromptGenerator, + FeelingLuckyGenerator +) +from dynamicprompts.parser.parse import ParserConfig +from dynamicprompts.wildcards.wildcard_manager import WildcardManager + + +NODE_FILE = os.path.abspath(__file__) +NUI_SUITE_ROOT = os.path.dirname(NODE_FILE) + + +class OutputString: + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "string": ("STRING", {}), + } + } + + RETURN_TYPES = () + FUNCTION = "output_string" + + OUTPUT_NODE = True + + CATEGORY = "prompts" + + def output_string(self, string): + return { "ui": { "string": string } } + + +class DynamicPromptsTextEncode: + @classmethod + def INPUT_TYPES(s): + return {"required": {"text": ("STRING", {"multiline": True}), + "clip": ("CLIP", ), + "seed": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff}), + }} + RETURN_TYPES = ("CONDITIONING",) + FUNCTION = "encode" + + CATEGORY = "conditioning" + + def __init__(self): + wildcard_dir = os.path.join(NUI_SUITE_ROOT, 'wildcards') + self._wildcard_manager = WildcardManager(wildcard_dir) + self._parser_config = ParserConfig( + variant_start="{", + variant_end="}", + wildcard_wrap="__" + ) + + def encode(self, text, clip, seed): + prompt_generator = RandomPromptGenerator( + self._wildcard_manager, + seed=seed, + parser_config=self._parser_config, + unlink_seed_from_prompt=False, + ignore_whitespace=False + ) + + all_prompts = prompt_generator.generate(text, 1) or [""] + prompt = all_prompts[0] + + return ([[clip.encode(prompt), {}]], ) + + +class DynamicPromptsTextGen: + @classmethod + def INPUT_TYPES(s): + return {"required": {"text": ("STRING", {"multiline": True}), + "seed": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff}), + }} + RETURN_TYPES = ("STRING",) + FUNCTION = "generate" + + CATEGORY = "prompts" + + def __init__(self): + wildcard_dir = os.path.join(NUI_SUITE_ROOT, 'wildcards') + self._wildcard_manager = WildcardManager(wildcard_dir) + self._parser_config = ParserConfig( + variant_start="{", + variant_end="}", + wildcard_wrap="__" + ) + + def generate(self, text, seed): + prompt_generator = RandomPromptGenerator( + self._wildcard_manager, + seed=seed, + parser_config=self._parser_config, + unlink_seed_from_prompt=False, + ignore_whitespace=False + ) + + all_prompts = prompt_generator.generate(text, 1) or [""] + prompt = all_prompts[0] + + return (prompt, ) + + +class FeelingLuckyTextEncode: + @classmethod + def INPUT_TYPES(s): + return {"required": {"text": ("STRING", {"multiline": True}), + "clip": ("CLIP", ), + "seed": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff}), + }} + RETURN_TYPES = ("CONDITIONING",) + FUNCTION = "encode" + + CATEGORY = "conditioning" + + def __init__(self): + wildcard_dir = os.path.join(NUI_SUITE_ROOT, 'wildcards') + self._wildcard_manager = WildcardManager(wildcard_dir) + self._parser_config = ParserConfig( + variant_start="{", + variant_end="}", + wildcard_wrap="__" + ) + + def encode(self, text, clip, seed): + inner_generator = RandomPromptGenerator( + self._wildcard_manager, + seed=seed, + parser_config=self._parser_config, + unlink_seed_from_prompt=False, + ignore_whitespace=False + ) + prompt_generator = FeelingLuckyGenerator(inner_generator) + + all_prompts = prompt_generator.generate(text, 1) or [""] + prompt = all_prompts[0] + + return ([[clip.encode(prompt), {}]], ) + + +class FeelingLuckyTextGen: + @classmethod + def INPUT_TYPES(s): + return {"required": {"text": ("STRING", {"multiline": True}), + "seed": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff}), + }} + RETURN_TYPES = ("STRING",) + FUNCTION = "generate" + + CATEGORY = "prompts" + + def __init__(self): + wildcard_dir = os.path.join(NUI_SUITE_ROOT, 'wildcards') + self._wildcard_manager = WildcardManager(wildcard_dir) + self._parser_config = ParserConfig( + variant_start="{", + variant_end="}", + wildcard_wrap="__" + ) + + def generate(self, text, seed): + inner_generator = RandomPromptGenerator( + self._wildcard_manager, + seed=seed, + parser_config=self._parser_config, + unlink_seed_from_prompt=False, + ignore_whitespace=False + ) + prompt_generator = FeelingLuckyGenerator(inner_generator) + + all_prompts = prompt_generator.generate(text, 1) or [""] + prompt = all_prompts[0] + + return (prompt, ) + + +NODE_CLASS_MAPPINGS = { + "Nui_OutputString": OutputString, + "Nui_DynamicPromptsTextEncode": DynamicPromptsTextEncode, + "Nui_DynamicPromptsTextGen": DynamicPromptsTextGen, + "Nui_FeelingLuckyTextEncode": FeelingLuckyTextEncode, + "Nui_FeelingLuckyTextGen": FeelingLuckyTextGen, +} + +NODE_DISPLAY_NAME_MAPPINGS = { + "Nui_OutputString": "Output String", + "Nui_DynamicPromptsTextEncode": "Dynamic Prompts Text Encode", + "Nui_DynamicPromptsTextGen": "Dynamic Prompts Text Gen", + "Nui_FeelingLuckyTextEncode": "Feeling Lucky Text Encode", + "Nui_FeelingLuckyTextGen": "Feeling Lucky Text Gen", +} diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..a2e11fe --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +dynamicprompts[attentiongrabber,magicprompt]==0.23.0