Nodes/PromptMasterLD/🎬 H3 Studio - LD
ComfyUI Node

🎬 H3 Studio - LD

Tell It What You Want in One Line, Get a Shootable Script Back

By Lora-DaddyΒ·Created 6 days agoΒ·Updated 2 days agoΒ· 5
🎬 H3 Studio - LD
  • pack_in
  • pack
β—„model_fileNoneβ–Ί
β—„mmproj_fileNone (text-only)β–Ί
β—„video_moderefβ–Ί
β—„povoffβ–Ί
β—„accentoffβ–Ί
β—„dialogue20β–Ί
β—„wardrobeautoβ–Ί
β—„undressfalseβ–Ί
β—„cameraoffβ–Ί
β—„transitionoffβ–Ί
β—„musicoffβ–Ί
β—„music_bgfalseβ–Ί
β—„lexiconβ–Ί
β—„fmtbracketβ–Ί
β—„fps24β–Ί
β—„seconds6.0β–Ί
β—„seed7β–Ί
β—„intentβ–Ί
β—„scriptβ–Ί
β—„negative_extraβ–Ί
β—„image_nameβ–Ί
β—„image_b64β–Ί
β—„out_w1344β–Ί
β—„out_h768β–Ί
β—„fitcropβ–Ί
β—„styleoffβ–Ί
β—„accent_strengthnaturalβ–Ί
β—„accent_languageenglishβ–Ί
β—„main_speakerautoβ–Ί
β—„accent_partneroffβ–Ί
β—„detailh3β–Ί
β—„choreographyautoβ–Ί
β—„extra_skin_detailfalseβ–Ί
β—„refs_json[]β–Ί
β—„end_nameβ–Ί
β—„end_b64β–Ί
β—„ref_image_sizematchβ–Ί
β—„video_frames345β–Ί
β—„video_fitmatch_canvasβ–Ί
β—„style_lookoffβ–Ί
β—„multishotfalseβ–Ί
β—„multishot_shots3β–Ί
β—„multishot_seconds10.1β–Ί
β—„music_refβ–Ί
β—„time_of_dayoffβ–Ί
β—„weatheroffβ–Ί
β—„speedoffβ–Ί
β—„artistoffβ–Ί
β—„ref_recipemanualβ–Ί
β—„ref_recipe_overwritefalseβ–Ί
β—„worldscapeoffβ–Ί
β—„extend_jsonβ–Ί
β—„music_captionβ–Ί
β—„image_promptβ–Ί
β—„music_lyricsβ–Ί
β—„music_seconds0.0β–Ί
β—„music_mp3β–Ί
β—„mv_stills_json[]β–Ί
β—„music_start0.0β–Ί
β—„music_end0.0β–Ί
β—„mv_cuts_json[]β–Ί
β—„outfitβ–Ί
β—„scenarioβ–Ί
β—„celebrityoffβ–Ί
β—„upscaletrueβ–Ί
β—„chat_json[]β–Ί
β—„image_width816β–Ί
β—„image_height1224β–Ί
β—„focusleanβ–Ί
β—„no_widefalseβ–Ί
β—„words_per_secondshortβ–Ί
β—„lyrics_drivefalseβ–Ί
β—„scenesautoβ–Ί
β—„mv_refs_json[]β–Ί
β—„mv_anchor_tagβ–Ί
β—„emotionoffβ–Ί

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.

CategoryLD/PromptMaster

Inputs (77)

NameTypeDefaultDescription
model_fileCOMBONone1 options: None
mmproj_fileCOMBONone (text-only)1 options: None (text-only)
video_modeCOMBOref8 options: i2v, t2v, ref, ext, multishot, music, +2
povCOMBOoff3 options: off, male, female
accentCOMBOoff50 options: off, korean, japanese, mandarin, thai, vietnamese, +44
dialogueINT200–100β€”
wardrobeCOMBOauto4 options: auto, off, her, him
undressBOOLEANfalseβ€”
cameraCOMBOoff78 options: off, static, handheld_restless, shoulder_follow, float, rack_focus, +72
transitionCOMBOoff11 options: off, morph, hard_cut, whip_pan, match_cut, push_through, +5
musicCOMBOoff52 options: auto, off, club_house, hip_hop, trap, techno, +46
music_bgBOOLEANfalseβ€”
lexiconSTRINGβ€”
fmtCOMBObracket5 options: bracket, timed, flowing, shotscript, fullref
fpsINT248–60β€”
secondsFLOAT6.01–60β€”
seedINT70–2147483647β€”
intentSTRINGβ€”
scriptSTRINGβ€”
negative_extraSTRINGβ€”
image_nameSTRINGβ€”
image_b64STRINGβ€”
out_wINT134464–8192Generation 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_hINT76864–8192Generation height, used exactly as given. See out_w.
fitCOMBOcrop3 options: crop, pad, stretch
styleCOMBOoff570 options: off, harry_potter, lord_of_the_rings, the_matrix, john_wick, star_wars, +564
accent_strengthCOMBOnatural3 options: natural, strong, thick
accent_languageCOMBOenglish2 options: english, own
main_speakerCOMBOauto4 options: auto, her, him, viewer
accent_partnerCOMBOoff50 options: off, korean, japanese, mandarin, thai, vietnamese, +44
detailCOMBOh34 options: short, medium, long, h3
choreographySTRINGautoβ€”
extra_skin_detailBOOLEANfalseβ€”
refs_jsonSTRING[]β€”
end_nameSTRINGβ€”
end_b64STRINGβ€”
ref_image_sizeCOMBOmatch2 options: match, max
video_framesINT3455–3600Max 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_fitCOMBOmatch_canvasmatch_canvas: MiniMax adapts ref video to gen aspect. native: keep source aspect (still scaled to H3 canvas rules).
style_lookCOMBOoff177 options: off, pixar_3d, anime_cel, ghibli_paint, cartoon_bold, flat_vector, +171
multishotBOOLEANfalseβ€”
multishot_shotsINT32–80β€”
multishot_secondsFLOAT10.11–20.1β€”
music_refSTRINGβ€”
time_of_dayCOMBOoff25 options: off, muted, desaturated, flat_low, cine_neutral, natural_true, +19
weatherCOMBOoff11 options: off, rain, downpour, drizzle, snow, fog, +5
speedCOMBOoff7 options: off, subtle, slow, very_slow, ramp_in, ramp_out, +1
artistCOMBOoff172 options: off, pink_floyd, fleetwood_mac, beatles, iron_maiden, wu_tang, +166
ref_recipeSTRINGmanualβ€”
ref_recipe_overwriteBOOLEANfalseβ€”
worldscapeCOMBOoff57 options: off, times_square_night, shinjuku_golden_gai, chicago_loop_el, hong_kong_chungking, seoul_euljiro, +51
extend_jsonoptSTRINGβ€”
music_captionoptSTRINGβ€”
image_promptoptSTRINGβ€”
music_lyricsoptSTRINGβ€”
music_secondsoptFLOAT0.00–600MV song length. Measured from decoded samples, not the MP3 header. 0 = unknown.
pack_inoptLDP_PACKβ€”
music_mp3optSTRINGMV 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_jsonoptSTRING[]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_startoptFLOAT0.00–600MV tab only. Start of the song window in seconds. 0 = from the top. Appended last.
music_endoptFLOAT0.00–600MV tab only. End of the song window. 0 = the rest of the file. Appended last.
mv_cuts_jsonoptSTRING[]MV tab only. JSON list of split times (seconds on the file clock) between clips. Empty = even 2s-join grid. Appended last.
outfitoptSTRINGβ€”
scenariooptSTRINGβ€”
celebrityoptSTRINGoffβ€”
upscaleoptBOOLEANtrueβ€”
chat_jsonoptSTRING[]β€”
image_widthoptINT81664–8192β€”
image_heightoptINT122464–8192β€”
focusoptCOMBOleanFull 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_wideoptBOOLEANfalseH3 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_secondoptCOMBOshortHow 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_driveoptBOOLEANfalseMV 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.
scenesoptCOMBOautoHow 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_jsonoptSTRING[]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_tagoptSTRINGA name for the ANCHOR still β€” the performer bound to every clip. Name it in the intent the same way you name the tagged stills.
emotionoptCOMBOoff27 options: off, auto, joy_laughter, shock, terror, rage, +21

Outputs (1)

NameTypeDescription
packLDP_PACKβ€”