diff --git a/README.md b/README.md index 42b485e..6d27907 100644 --- a/README.md +++ b/README.md @@ -58,10 +58,10 @@ - `Dumas H3 Prompt Curator` - Inputs: `action_prompt`, `anatomy_guard`, `subject_count_guard`, optional `anchor`, optional `soundscape`, optional `bgm`, optional `ref_1` through `ref_9` - - Outputs: `prompt`, `ref_image_1` through `ref_image_9`, `reference_count`, `debug`, `anchor`, `sounds`, `bgm`, `original_ref_1` through `original_ref_9`, `reference_description`, `original_ref_description_1` through `original_ref_description_9`, `compiled_ref_image_1` through `compiled_ref_image_9`, `compiled_ref_description_1` through `compiled_ref_description_9` + - Outputs: `prompt`, `ref_image_1` through `ref_image_9`, `reference_count`, `debug`, `anchor`, `sounds`, `bgm`, `original_ref_1` through `original_ref_9` - Builds one standalone MiniMax H3 prompt from your final action text plus structured character/location references. - The action text can mention references by character/location name, alias, ``, or ``. Only mentioned references are emitted, and the output images are compacted/renumbered so skipped inputs do not leave gaps. - - Extra component outputs expose the cleaned anchor, sounds, BGM, selected structured references in compacted order, the compiled reference-description block used inside the prompt, and plain image/compiled-description socket pairs for each selected reference. + - Extra component outputs expose the cleaned anchor, sounds, BGM, and each selected original reference image in compacted order. - Adds curated reference context, anatomy guard text, optional subject-count guard text, anchor/style text, `overall_soundscape:` text, and `background_music:` text while respecting MiniMax H3's reference-generation shape: one prompt plus up to nine reference images. - `Dumas H3 Shot Length` diff --git a/dumas_image_nodes.py b/dumas_image_nodes.py index 72bf06e..94cc350 100644 --- a/dumas_image_nodes.py +++ b/dumas_image_nodes.py @@ -1253,13 +1253,11 @@ def curate_h3_prompt( soundscape_text = _reference_text(soundscape) bgm_text = _reference_text(bgm) reference_description = "" - individual_reference_descriptions = [] if selected: - individual_reference_descriptions = [ + reference_description = " ".join( _reference_context(ref, picture_number) for picture_number, (_slot, ref) in enumerate(selected, 1) - ] - reference_description = " ".join(individual_reference_descriptions) + ) prompt_parts = [] _append_prompt_section(prompt_parts, "Scene anchor", anchor_text) @@ -1279,11 +1277,6 @@ def curate_h3_prompt( prompt = prompt[: _H3_PROMPT_MAX_CHARS - 3].rstrip() + "..." images = [_reference_image(ref) for _slot, ref in selected] images.extend([None] * (_H3_PROMPT_REF_SLOTS - len(images))) - selected_refs = [ref for _slot, ref in selected] - selected_refs.extend([None] * (_H3_PROMPT_REF_SLOTS - len(selected_refs))) - individual_reference_descriptions.extend( - [""] * (_H3_PROMPT_REF_SLOTS - len(individual_reference_descriptions)) - ) debug = ( f"Selected {len(selected)} reference(s): " + ", ".join( @@ -1301,11 +1294,7 @@ def curate_h3_prompt( anchor_text, soundscape_text, bgm_text, - *selected_refs[:_H3_PROMPT_REF_SLOTS], - reference_description, - *individual_reference_descriptions[:_H3_PROMPT_REF_SLOTS], *images[:_H3_PROMPT_REF_SLOTS], - *individual_reference_descriptions[:_H3_PROMPT_REF_SLOTS], ) @@ -2697,11 +2686,7 @@ class DumasH3PromptCuratorNode: ("STRING",) + ("IMAGE",) * _H3_PROMPT_REF_SLOTS + ("INT", "STRING", "STRING", "STRING", "STRING") - + (_REFERENCE_TYPE,) * _H3_PROMPT_REF_SLOTS - + ("STRING",) - + ("STRING",) * _H3_PROMPT_REF_SLOTS + ("IMAGE",) * _H3_PROMPT_REF_SLOTS - + ("STRING",) * _H3_PROMPT_REF_SLOTS ) RETURN_NAMES = ( "prompt", @@ -2728,34 +2713,6 @@ class DumasH3PromptCuratorNode: "original_ref_7", "original_ref_8", "original_ref_9", - "reference_description", - "original_ref_description_1", - "original_ref_description_2", - "original_ref_description_3", - "original_ref_description_4", - "original_ref_description_5", - "original_ref_description_6", - "original_ref_description_7", - "original_ref_description_8", - "original_ref_description_9", - "compiled_ref_image_1", - "compiled_ref_image_2", - "compiled_ref_image_3", - "compiled_ref_image_4", - "compiled_ref_image_5", - "compiled_ref_image_6", - "compiled_ref_image_7", - "compiled_ref_image_8", - "compiled_ref_image_9", - "compiled_ref_description_1", - "compiled_ref_description_2", - "compiled_ref_description_3", - "compiled_ref_description_4", - "compiled_ref_description_5", - "compiled_ref_description_6", - "compiled_ref_description_7", - "compiled_ref_description_8", - "compiled_ref_description_9", ) FUNCTION = "curate_prompt" CATEGORY = "Dumas/MiniMax" diff --git a/tests/test_dumas_image_nodes.py b/tests/test_dumas_image_nodes.py index 929ee5a..714f3dc 100644 --- a/tests/test_dumas_image_nodes.py +++ b/tests/test_dumas_image_nodes.py @@ -502,27 +502,9 @@ class DumasImageNodeTests(unittest.TestCase): self.assertEqual(result[12], "grounded handheld thriller") self.assertEqual(result[13], "steady rain") self.assertEqual(result[14], "low suspense music") - self.assertEqual(result[15]["name"], "Dave") - self.assertIs(result[15]["image"], dave_image) - self.assertEqual(result[16]["name"], "Coffee Shop") - self.assertIs(result[16]["image"], cafe_image) + self.assertIs(result[15], dave_image) + self.assertIs(result[16], cafe_image) self.assertIsNone(result[17]) - self.assertIn(" Dave", result[24]) - self.assertIn(" Coffee Shop", result[24]) - self.assertIn("Location context for Coffee Shop", result[24]) - self.assertIn(" Dave", result[25]) - self.assertNotIn(" Coffee Shop", result[25]) - self.assertIn(" Coffee Shop", result[26]) - self.assertIn("Location context for Coffee Shop", result[26]) - self.assertEqual(result[27], "") - self.assertIs(result[34], dave_image) - self.assertIs(result[35], cafe_image) - self.assertIsNone(result[36]) - self.assertIn(" Dave", result[43]) - self.assertNotIn(" Coffee Shop", result[43]) - self.assertIn(" Coffee Shop", result[44]) - self.assertIn("Location context for Coffee Shop", result[44]) - self.assertEqual(result[45], "") def test_h3_prompt_curator_renumbers_explicit_reference_tags(self): node = self.image_nodes.DumasH3PromptCuratorNode() @@ -660,20 +642,10 @@ class DumasImageNodeTests(unittest.TestCase): def test_h3_prompt_curator_uses_documented_reference_limits(self): node = self.image_nodes.DumasH3PromptCuratorNode() - self.assertEqual(len(node.RETURN_TYPES), 52) + self.assertEqual(len(node.RETURN_TYPES), 24) self.assertEqual(node.RETURN_NAMES[1:10], tuple(f"ref_image_{i}" for i in range(1, 10))) self.assertEqual(node.RETURN_NAMES[12:15], ("anchor", "sounds", "bgm")) self.assertEqual(node.RETURN_NAMES[15:24], tuple(f"original_ref_{i}" for i in range(1, 10))) - self.assertEqual(node.RETURN_NAMES[24], "reference_description") - self.assertEqual( - node.RETURN_NAMES[25:34], - tuple(f"original_ref_description_{i}" for i in range(1, 10)), - ) - self.assertEqual(node.RETURN_NAMES[34:43], tuple(f"compiled_ref_image_{i}" for i in range(1, 10))) - self.assertEqual( - node.RETURN_NAMES[43:52], - tuple(f"compiled_ref_description_{i}" for i in range(1, 10)), - ) def test_normalize_reference_upgrades_generic_summary_with_socket_picture_id(self): image = FakeTensorBatch()