OpenH3-IR Main
The OpenH3-IR Main node
- setup
- director
- media
- model
- positive
- latent
- vae
- audio_vae
- prompt
- report
The whole pack, in one node. You type one plain sentence into OpenH3-IR Main, hit queue, and out the other side come the model, conditioning, latent and both VAEs for a finished MiniMax H3 job. No prompt copy-pasting from a chat window, no <Picture 1> bookkeeping, no separate service to keep alive. This is the node you'll actually live in.
Here's why it exists. MiniMax H3 - the open 33B omni-modal video model, ~42.5 GB, generates 4–15 second clips with native stereo audio - doesn't take a prompt the way Stable Diffusion does. It consumes a structured Context-IR document: a formalized brief with shots, references, dialogue and sound all spelled out. Writing that document by hand is miserable, and getting an LLM to write it in a chat window means copying text back into ComfyUI and hoping the model names your references right. OpenH3-IR is an open implementation of that Context-IR layer, and Main is its ComfyUI front door.
How it works
Main runs the OpenH3-IR compiler, which asks your language model (configured on OpenH3-IR Setup) to write the brief from your sentence, validates the result, picks the right H3 checkpoint for the job, loads the encoder and both VAEs, and hands everything to the render side. This is the "LLM as prompt builder" pattern, but with teeth: the output has to be a valid Context-IR document, and anything that can't survive validation is refused and rewritten rather than silently accepted.
The prompt syntax is deliberately tiny. Plain prose for what happens, @ to name something in the media tray, and @speaks("exact words") to lock dialogue. That locked span has to come back word for word and mark for mark - a brief that rewords it is thrown out and written again.
The inputs that matter
- intent - the one sentence. Not a tag list and not a shot breakdown; the compiler writes those. Say the action and the beat you care about.
- seconds - the only place length is set, used by both the brief and the latent. H3 renders on a 17k+5 frame grid, so this snaps up: ask for 10 and you get 10.125. 8.0 is the only whole second on the grid. The trained band is 5.167–15.083 s; outside it renders anyway, untested and slower, and the report tells you so.
- creativity - how much the writer may add where your sentence is silent: restrained, balanced, bold, extreme. It controls three things only - music, a spoken line, and text in the frame. It never decides shot count.
- no music - H3 writes sound in the same pass as the picture, so silence is a decision. This turns off music only; ambient and physical sound still get written.
- shots -
autolets the writer cut, or pin 1–10. Every shot needs 1.2 s, so a count that can't fit the duration is refused with the arithmetic rather than silently changed.
The optional inputs are worth a glance once you're past your first render: megapixels (0 = H3's native 768 short edge; more is sharper, slower, and eats VRAM), seed (the brief seed - changes the writing, not the sampler), and sizing (match fits each picture to the render, max keeps the picture's own size for stronger identity and costs more).
The outputs
Main gives you model (already the right checkpoint - feed your LoRAs and sigma shift from here), positive conditioning, latent (empty, already the length the brief was written for), vae and audio_vae (no loader boxes needed), plus two read-outs: prompt, the compiled brief, and report, a plain-words account of the real length, what each @ became, and every file loaded. Wire report into ComfyUI's Preview as Text node; you'll want it when something's off.
Your sampler, LoRAs, steps, decode and save all stay yours. The pack deliberately starts close to ordinary H3 settings, including the beta scheduler - Comfy-Org's reference-to-video guidance says beta or normal beats simple on reference-heavy prompts.
Install
Search OpenH3-IR in ComfyUI Manager and install, or manually:
git clone https://github.com/ruashots/ComfyUI-OpenH3-IR.git ComfyUI/custom_nodes/ComfyUI-OpenH3-IR
/path/to/ComfyUI/python -m pip install -r ComfyUI/custom_nodes/ComfyUI-OpenH3-IR/requirements.txt
The second command installs open-h3-ir into the Python ComfyUI runs, so compilation happens in-process - nothing to launch, no port to pick. You'll also need a Setup node wired in (your LLM endpoint plus the five H3 files) and a Media node if anything in your sentence is a @ reference.
When something goes wrong
Read the report. It's built to tell apart failures that look identical: a missing language-model address, an OpenH3-IR install that won't import, an endpoint serving several models. Two things burn people: the LLM needs vision if your job contains visual references (Setup tests this for you), and a mention of a media slot that doesn't exist turns red and refuses the queue before any model call. When in doubt, the report names the slot and the reason.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| intent | STRING | One plain sentence. Not a tag list and not a shot breakdown, because the compiler writes those. Say the action and the beat you care about. Type @ to name a slot in the media tray, which is how you say where a file belongs in the shot. Type @speaks("the exact words") for a line that has to be said exactly: those come back in the brief word for word and mark for mark, because a brief that rewords one is refused. Words you merely quote in the sentence get no such check. | |
| seconds | FLOAT | 8.01–149 | The only place length is set, used for both the brief and the latent. H3 renders on a 17 frame grid so this snaps up: ask for 10 and you get 10.125. 8.0 is the only whole second on the grid. H3's trained band is 5.167 to 15.083 seconds. Outside it a render still happens, untested and slower, and the report says so. |
| aspect | COMBO | 16:9 | The canvas is sized from this, 768 on the short edge, so there is no resolution box to keep in step with anything. |
| creativity | COMBO | balanced | How much the writer may add where your sentence is silent, which is three things: music, a spoken line, text in the frame. restrained adds none of them. balanced may add music. bold may also put words in a mouth and text on screen. extreme adds nothing beyond bold, it pushes every choice harder. Shot count is never on this dial, and saying no dialogue in your sentence still means no dialogue at every position. |
| silent | BOOLEAN | false | H3 writes sound in the same pass as the picture, so silence is a decision rather than an absence. This turns off the music only. Ambient and physical sound still get written, and speech is governed by your sentence and by invention. |
| shots | COMBO | auto | auto is usually right: the writer decides the edit, and cut times have to land on the frame grid too. A number is kept exactly, up to 10. Every shot needs 1.2 seconds, so a count that cannot fit the video's length is refused with the arithmetic. |
| setup | H3IR_SETUP | Required. The service address and the five H3 files to load, from an OpenH3-IR Setup node. Which files those are is your choice, so there is one node that holds it and the report names every file that was loaded. | |
| megapixelsopt | FLOAT | 0.000–2.5 | How many pixels the frame gets, the same number a resolution picker calls 1.5. Zero means H3's native size, 768 on the short edge, which is what it was trained at. Bigger is sharper, slower, and eats VRAM in proportion; the report shows the exact canvas it bought. |
| spoken_languageopt | COMBO | English | The language every @speaks line in the sentence is spoken in. It becomes the language tag in the brief, which is what H3 reads, so Spanish words tagged English are spoken wrong. It decides nothing while no line is locked. For a language that is not listed, quote the line in the sentence instead and name the language there. |
| directoropt | H3IR_DIRECTOR | Optional. Whose taste fills what your sentence and your references do not say: the camera, the framing, the light and colour, what the frame looks at, how bodies and delivery are written, and what the room and any music is made of. From an OpenH3-IR Director node, where it is written as plain prose. Leave it unconnected and nothing steers the writing, which is how every graph without one behaves. It never decides how many shots there are or where they cut, and anything you state yourself wins over it: say 'a locked-off wide' and you get one whoever is directing. | |
| mediaopt | H3IR_MEDIA | Everything the video looks at or listens to, from an OpenH3-IR Media node: its pictures, clips and sounds, each one saying what it is. The names of its slots are what @ in the sentence above refers to. Leave it empty for a piece with no media at all. | |
| sizingopt | COMBO | max | match fits each picture to the render's pixel area. max keeps the picture's own size for stronger identity and is slower, because reference tokens ride every sampling step. |
| seedopt | INT | 70–72057594037927940 | The compiler is seeded, so the same inputs give the same brief. Change this for a different take on the same sentence. This is not the sampler's seed. |
| effortopt | COMBO | max | max asks the writer for reasoning prose and is slower. |
Outputs (7)
| Name | Type | Description |
|---|---|---|
| model | MODEL | Already the right H3 checkpoint for the job. Feed your LoRAs and sigma shift from here. |
| positive | CONDITIONING | — |
| latent | LATENT | Empty picture and sound latent, already the length the brief was written for. |
| vae | VAE | H3's video VAE for the decode, so the graph needs no loader boxes. |
| audio_vae | VAE | H3's audio VAE. |
| prompt | STRING | The compiled brief, to read or to keep. |
| report | STRING | What happened in plain words: the job, the real length, what each @ became, which slot became which picture, and every file loaded. |