π¬ H3 Studio - LD
Tell It What You Want in One Line, Get a Shootable Script Back
- pack_in
- pack
The whole pack exists to get a script out of this panel
If you install PromptMasterLD, this is the node you're here for. H3 Studio (π¬ H3 Studio - LD, under LD / PromptMaster) is a prompt writer with a panel: you type one line of intent - "she walks into the neon diner, sits opposite him, the jukebox dies mid-song" - and it turns that into a finished, shot-by-shot H3 script with the frame count, the beats and the pacing already correct. Out the other side comes a single pack output that carries the script, canvas size, seconds, keyframes and references, ready to hand to H3 Master or unpack across your graph.
This is the local-LLM-prompt-writer lineage, evolved. The same author - Lora-Daddy, WildSpeaker7315 on Reddit - built the LTX-2 "Easy Prompt" node that was the top prompt-writer thread of 2026, running an uncensored local model so there's no API, no key, no subscription. H3 Studio is that idea rebuilt around MiniMax H3, and it's opinionated in the good way: it knows how a shot is physically built and writes the prompt in that order (weight/mass, texture, light, sound, framing) because that's the order failures appear in.
What it actually does
Pick a video_mode and the panel changes shape. ref (the default) is reference-driven; i2v opens on the frame you supply; t2v builds from nothing; mv is music videos with per-shot stills; multishot writes N shots for the chain sampler; ext extends an existing take; music and image are their own lanes. The intent box always outranks every dial - anything you name in the intent wins over whatever a dropdown seeded.
The dials are the long tail: fps, seconds, seed, camera, transition, accent (49 of them, written into the dialogue brackets where they reach the voice), wardrobe, style, worldscape, celebrity. You don't set most of them - a bare shot should read as a clean brief, not a stripped one, so the writer only emits a law for dials you actually touched. The few that matter for a first render: seconds (clip length), fps, out_w/out_h, and intent. For sizes, H3 was trained on a 768 short edge capped around 768Γ1344 - under that is softer but far cheaper, which is a genuinely good trade on a 24GB card.
The "two models" thing everyone stumbles on
H3 Studio doesn't call a hosted API and needs no key. It needs LM Studio running locally with a model loaded, because the script is written by a local LLM. The pack is built and tested against qwen3.8-27b-uncensored-hauhaucs-aggressive-mtp - search for it in LM Studio's model tab and grab the quant that fits your VRAM. Two settings matter, and both are easy to miss:
- Turn "Thinking" off in the model's load settings. A reasoning model burns its whole reply inside a
<think>block before writing anything usable, and the panel can stall waiting for text that never shows up. - Set context length to at least 32768 (32k). LM Studio's default is 4kβ8k and too small - long briefs (multishot, reference-heavy scenes, accent + wardrobe stacked) get cut off mid-sentence instead of failing cleanly.
Then start the local server on port 1234 (the default) and, in the Studio panel's β settings, point server_url at http://127.0.0.1:1234, pick your model, and set the panel's own ctx field to the same 32768. The panel's ctx is a separate estimate of whether a prompt will fit - it doesn't read LM Studio's setting, so the two have to match by hand. Modes that look at pictures (ref, i2v, mv, multishot) also need a vision-capable model set as the vision model.
One more trap: the model_file/mmproj_file dropdowns sit there with "None" defaults but do nothing in the LM Studio world - they're retired leftovers from an old local-GGUF backend. Ignore them. You'll also see only a pack output on the node itself; fan it out with the pack's Unpack node or wire it straight into H3 Master for a one-node render.
How to install
cd ComfyUI/custom_nodes
git clone https://github.com/Lora-Daddy/PromptMasterLD
cd PromptMasterLD
pip install -r requirements.txt
Restart ComfyUI (or ComfyUI Manager β search "PromptMasterLD"). The pack's only hard dependency beyond ComfyUI core is opencv-python; the real prerequisite is LM Studio itself, which is a free separate app. Note the MiniMax H3 Community License geofences the H3 weights out of the US, EU, UK and Korea - check before you build a workflow around local weights in those regions.
Start with the shipped example graph (it's in workflows/ - drop it into ComfyUI/user/default/workflows/), set the backend up as above, and type one intent. The first honest surprise is how fast a single line becomes something you'd actually shoot.
Inputs (77)
| Name | Type | Default | Description |
|---|---|---|---|
| model_file | COMBO | None | 1 options: None |
| mmproj_file | COMBO | None (text-only) | 1 options: None (text-only) |
| video_mode | COMBO | ref | 8 options: i2v, t2v, ref, ext, multishot, music, +2 |
| pov | COMBO | off | 3 options: off, male, female |
| accent | COMBO | off | 50 options: off, korean, japanese, mandarin, thai, vietnamese, +44 |
| dialogue | INT | 200β100 | β |
| wardrobe | COMBO | auto | 4 options: auto, off, her, him |
| undress | BOOLEAN | false | β |
| camera | COMBO | off | 78 options: off, static, handheld_restless, shoulder_follow, float, rack_focus, +72 |
| transition | COMBO | off | 11 options: off, morph, hard_cut, whip_pan, match_cut, push_through, +5 |
| music | COMBO | off | 52 options: auto, off, club_house, hip_hop, trap, techno, +46 |
| music_bg | BOOLEAN | false | β |
| lexicon | STRING | β | |
| fmt | COMBO | bracket | 5 options: bracket, timed, flowing, shotscript, fullref |
| fps | INT | 248β60 | β |
| seconds | FLOAT | 6.01β60 | β |
| seed | INT | 70β2147483647 | β |
| intent | STRING | β | |
| script | STRING | β | |
| negative_extra | STRING | β | |
| image_name | STRING | β | |
| image_b64 | STRING | β | |
| out_w | INT | 134464β8192 | Generation width, used exactly as given. FYI H3 is trained on a 768 short edge capped at 768*1344 (1344x768, 768x1344, 1024x768, 768x1024, 768x768); under that is softer but far cheaper, and is a fine trade on a 24GB card. |
| out_h | INT | 76864β8192 | Generation height, used exactly as given. See out_w. |
| fit | COMBO | crop | 3 options: crop, pad, stretch |
| style | COMBO | off | 570 options: off, harry_potter, lord_of_the_rings, the_matrix, john_wick, star_wars, +564 |
| accent_strength | COMBO | natural | 3 options: natural, strong, thick |
| accent_language | COMBO | english | 2 options: english, own |
| main_speaker | COMBO | auto | 4 options: auto, her, him, viewer |
| accent_partner | COMBO | off | 50 options: off, korean, japanese, mandarin, thai, vietnamese, +44 |
| detail | COMBO | h3 | 4 options: short, medium, long, h3 |
| choreography | STRING | auto | β |
| extra_skin_detail | BOOLEAN | false | β |
| refs_json | STRING | [] | β |
| end_name | STRING | β | |
| end_b64 | STRING | β | |
| ref_image_size | COMBO | match | 2 options: match, max |
| video_frames | INT | 3455β3600 | Max frames per video ref, read at a true 24fps (345 = 14.4s). The shot is generated onward from where the ref ends, so longer clips keep their TAIL. MiniMax also caps refs at the generation length, so this rarely binds Γ’β¬β raise Seconds to use more of a long ref. |
| video_fit | COMBO | match_canvas | match_canvas: MiniMax adapts ref video to gen aspect. native: keep source aspect (still scaled to H3 canvas rules). |
| style_look | COMBO | off | 177 options: off, pixar_3d, anime_cel, ghibli_paint, cartoon_bold, flat_vector, +171 |
| multishot | BOOLEAN | false | β |
| multishot_shots | INT | 32β80 | β |
| multishot_seconds | FLOAT | 10.11β20.1 | β |
| music_ref | STRING | β | |
| time_of_day | COMBO | off | 25 options: off, muted, desaturated, flat_low, cine_neutral, natural_true, +19 |
| weather | COMBO | off | 11 options: off, rain, downpour, drizzle, snow, fog, +5 |
| speed | COMBO | off | 7 options: off, subtle, slow, very_slow, ramp_in, ramp_out, +1 |
| artist | COMBO | off | 172 options: off, pink_floyd, fleetwood_mac, beatles, iron_maiden, wu_tang, +166 |
| ref_recipe | STRING | manual | β |
| ref_recipe_overwrite | BOOLEAN | false | β |
| worldscape | COMBO | off | 57 options: off, times_square_night, shinjuku_golden_gai, chicago_loop_el, hong_kong_chungking, seoul_euljiro, +51 |
| extend_jsonopt | STRING | β | |
| music_captionopt | STRING | β | |
| image_promptopt | STRING | β | |
| music_lyricsopt | STRING | β | |
| music_secondsopt | FLOAT | 0.00β600 | MV song length. Measured from decoded samples, not the MP3 header. 0 = unknown. |
| pack_inopt | LDP_PACK | β | |
| music_mp3opt | STRING | MV tab only. Filename in ComfyUI/input. Each clip hears its window as <Audio 1>; the finished video muxes this file. Appended last β saved widgets stay put. | |
| mv_stills_jsonopt | STRING | [] | MV tab only. JSON list of up to 8 still filenames. Slot 1 is clip 1, slot 2 is clip 2. One still covers the whole song. Appended last β saved widgets stay put. |
| music_startopt | FLOAT | 0.00β600 | MV tab only. Start of the song window in seconds. 0 = from the top. Appended last. |
| music_endopt | FLOAT | 0.00β600 | MV tab only. End of the song window. 0 = the rest of the file. Appended last. |
| mv_cuts_jsonopt | STRING | [] | MV tab only. JSON list of split times (seconds on the file clock) between clips. Empty = even 2s-join grid. Appended last. |
| outfitopt | STRING | β | |
| scenarioopt | STRING | β | |
| celebrityopt | STRING | off | β |
| upscaleopt | BOOLEAN | true | β |
| chat_jsonopt | STRING | [] | β |
| image_widthopt | INT | 81664β8192 | β |
| image_heightopt | INT | 122464β8192 | β |
| focusopt | COMBO | lean | Full ships the whole craft law. Lean keeps the official H3 fields and cut test, and drops the elaboration. Style inside [Shot 1]. overall_soundscape 1-4 sentences. Empty music is N/A. |
| no_wideopt | BOOLEAN | false | H3 folds 32 pixels into one latent token, so a wide frame has no room for a mouth, a hand or a small prop. This holds the widest framing at a MEDIUM shot - not a close-up, which would throw away the action. |
| words_per_secondopt | COMBO | short | How much description the writer spends per second of clip. Short is the tuned default; Medium is 50% more; Long is twice as much. Spoken lines and the cast lines are foundations and never count toward it. |
| lyrics_driveopt | BOOLEAN | false | MV tab only. Whisper transcribes the attached MP3 and hands the writer what the track is ABOUT, so a song about a jungle is shot in a jungle instead of the generic neon alley. The words are subject matter only - never spoken, never quoted, never on screen. Typing into music_lyrics skips the transcription and uses yours. |
| scenesopt | COMBO | auto | How often the setting changes across a chained take. auto leaves it to the intent, which is what it always did; one holds a single place; every changes it each shot; 2/3/4 work in blocks of that many shots. The person carries word for word either way. |
| mv_refs_jsonopt | STRING | [] | Up to three tagged stills for the MV tab. Each carries a TAG; name that tag in the intent and the writer cites it where the song wants it. |
| mv_anchor_tagopt | STRING | A name for the ANCHOR still β the performer bound to every clip. Name it in the intent the same way you name the tagged stills. | |
| emotionopt | COMBO | off | 27 options: off, auto, joy_laughter, shock, terror, rage, +21 |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| pack | LDP_PACK | β |