feat(megaprompt-v4): register IsulionMegaPromptV4 node (single prompt output)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Isulion
2026-10-20 20:38:45 +02:00
co-authored by Claude Opus 5.5
parent 470f55dec4
commit b2791f7af0
5 changed files with 64 additions and 0 deletions
+24
View File
@@ -222,3 +222,27 @@ def roll(state, reels, seed, registry=None):
prompt, segments = assemble_prompt(state)
return _result(state, prompt, segments, rolled + to_roll, seed, registry)
class IsulionMegaPromptV4:
"""Slot-machine prompt generator: every execution re-rolls the unlocked reels."""
TITLE = "🕹️ Mega Prompt V4"
@classmethod
def INPUT_TYPES(cls):
return {"required": {"machine_state": ("STRING", {"default": DEFAULT_STATE})}}
RETURN_TYPES = ("STRING",)
RETURN_NAMES = ("prompt",)
FUNCTION = "generate"
CATEGORY = "Isulion/Core"
OUTPUT_NODE = True
@classmethod
def IS_CHANGED(cls, machine_state):
return float("nan") # the machine spins on every run
def generate(self, machine_state):
result = roll(machine_state, REEL_NAMES, new_seed())
return {"ui": {"draw": [result]}, "result": (result["prompt"],)}
+3
View File
@@ -9,6 +9,7 @@ __description__ = "Advanced prompt generation nodes for ComfyUI with multiple th
# Import all node classes
from .Core_Nodes.mega_prompt_V3 import IsulionMegaPromptV3
from .Core_Nodes.mega_prompt_v4 import IsulionMegaPromptV4
from .Core_Nodes.mega_prompt_all_themes import IsulionMultiplePromptGenerator
from .Core_Nodes.isucollage_node import IsuCollageNode
from .Core_Nodes.load_images_node import IsulionLoadImagesNode
@@ -86,6 +87,7 @@ NODE_CLASS_MAPPINGS = {
"IsulionCivitaiTrending": IsulionCivitaiTrending,
"IsulionCivitaiImageDisplay": IsulionCivitaiImageDisplay,
"IsulionMegaPromptV3": IsulionMegaPromptV3,
"IsulionMegaPromptV4": IsulionMegaPromptV4,
"IsulionMultiplePromptGenerator": IsulionMultiplePromptGenerator,
"IsuCollage_Node": IsuCollageNode,
"IsulionLoadImagesNode": IsulionLoadImagesNode,
@@ -100,6 +102,7 @@ NODE_CLASS_MAPPINGS = {
# Display name mappings
NODE_DISPLAY_NAME_MAPPINGS = {
"IsulionMegaPromptV3": "🚀 Isulion Mega Prompt V3",
"IsulionMegaPromptV4": "🕹️ Isulion Mega Prompt V4",
"IsulionVideoPromptGenerator": "🎥 Isulion Video Prompt Generator",
"IsulionMultiplePromptGenerator": "🔄 Isulion Multiple Prompt Generator",
"IsulionAnimalRandom": "🦁 Isulion Animal Selector",
+1
View File
@@ -21,6 +21,7 @@
"IsulionLoadImagesNode",
"IsulionMagicalEffectGenerator",
"IsulionMegaPromptV3",
"IsulionMegaPromptV4",
"IsulionMultiplePromptGenerator",
"IsulionMythicalLocationGenerator",
"IsulionNegativePromptGenerator",
+10
View File
@@ -3643,5 +3643,15 @@
}
]
}
},
"IsulionMegaPromptV4": {
"required": {
"machine_state": [
"STRING",
{
"default": "{\"version\": 1}"
}
]
}
}
}
+26
View File
@@ -232,3 +232,29 @@ def test_roll_uses_the_shared_generation_lock():
assert RecordingLock.entries == 1
finally:
mp4.GENERATION_LOCK = original
import math
def test_node_contract_and_registration():
pkg = import_package()
cls = pkg.NODE_CLASS_MAPPINGS["IsulionMegaPromptV4"]
assert pkg.NODE_DISPLAY_NAME_MAPPINGS["IsulionMegaPromptV4"] == "🕹️ Isulion Mega Prompt V4"
assert cls.INPUT_TYPES() == {"required": {"machine_state": ("STRING", {"default": '{"version": 1}'})}}
assert (cls.RETURN_TYPES, cls.RETURN_NAMES, cls.CATEGORY, cls.OUTPUT_NODE) == (("STRING",), ("prompt",), "Isulion/Core", True)
assert math.isnan(cls.IS_CHANGED('{"version": 1}'))
def test_node_generate_rolls_everything_and_reports_ui():
mp4 = _mp4()
original, mp4.new_seed = mp4.new_seed, lambda: 5
try:
node = mp4.IsulionMegaPromptV4()
out = node.generate('{"version": 1}')
draw = out["ui"]["draw"]
assert len(draw) == 1 and draw[0]["seed"] == 5 and out["result"] == (draw[0]["prompt"],)
assert draw[0]["prompt"] and draw[0]["state"]["theme"]["name"] in mp4.get_theme_registry().handlers
assert node.generate("garbage")["result"] == out["result"] # same seed, default state => same prompt
finally:
mp4.new_seed = original