H3 Context Request
H3 Context Request is where \"5 seconds\" turns into 124 frames
- hard_constraints
- request
Type 5 into a duration box for H3 and the model doesn't get five seconds. It gets 124 frames - and 124 frames at 24 fps is 5.167 seconds. Nearly every "why is my clip a weird length" question about H3 ends here, and H3 Context Request is the node that does the arithmetic in the open.
It's the entry point of the whole pack. Two required fields, two optional ones, one output. The point is that it's the only place length is authored: the pack's own length module is the single authority that both this node and the Production workspace call, because (their words, in the source) two authorities for one contract is how you get a plan the model can't actually produce.
Five task modes, one intent box
Required task_mode is a combo, t2va by default, and the pack's five options are text-to-video, opening image, first-and-last frame, ending image, and reference set. Required user_intent is the multiline description you'd otherwise type into a text-encode box - except this one is validated. Blank or whitespace-only intent fails with missing_user_intent; control characters are rejected; there's a length ceiling. That's not pedantry, it's the difference between a request that fails at the node and a video that comes back as noise.
hard_constraints is the interesting optional input: a typed H3_HARD_CONSTRAINTS set, which in practice comes from H3 Hard Constraint Producer. Wire it and your dialogue, on-screen text, and required/forbidden elements are carried word for word into the prompt instead of being paraphrased by a stack of downstream prose. If exact wording matters - a line of dialogue, a sign in the shot, a logo you don't want - this is the only honest way to get it in.
The duration lattice, concretely
duration_seconds is a float, 0 to 149.687, and 0 is how "unset" reads. Unset gives you the default 124 frames (the same 5-second-ish default as the sidebar).
Where it goes from there: the value becomes integer milliseconds, converts to frames at 24 fps with round-half-even, then snaps upward to H3's frame lattice - counts of the form 17k+5, the same conversion the official ComfyUI H3 templates do inside a ComfyMathExpression node. Minimum is 5 frames, and the largest producible length is 3592 frames, which is why the slider tops out at 149.687 seconds rather than a rounder 150. The docs are blunt about that gap: frames 3593–3600 sit inside the host's stated range but align above it, so a control bounded at 150 s would offer durations that always fail. Here they're simply not offered.
Two diagnostics are worth recognising when you see them:
duration_snapped- a warning. You asked for 8.0 s, you're getting the nearest producible length up. Harmless, but it's why your clip is a few frames long.untested_duration- a warning. Your frame count lands outside the inspected trained range of 124–362 frames, i.e. roughly 5.2 s to 15.1 s. Shorter or longer may work; the pack won't pretend it's been shown to.duration_out_of_bounds- an error, and the request fails closed. Note there's no clamp-and-continue: you get a diagnostic, not a silently shortened video.
Wiring and outputs
One output: request (H3_CONTEXT_REQUEST). It goes into the required request input of H3 Context Plan, and also into H3 Intent Graph Producer, H3 Feasible AV Timeline, H3 Directive Authority Producer and H3 Local Reconstruction.
Deliberately, it does not take a reference registry. The node validates mode, text, duration and typed controls, then stops - reference binding is a later node, and the docs say why: a request node has to be able to carry an i2va/ref2va mode before any media exists. So "my task mode says I need a first frame" is a downstream complaint, not this node's.
Request -> Reference Registry -> Plan -> Compiler -> Validator -> Preview
Install it
Not yet in the Comfy Registry at the time of writing, so clone it into your custom nodes folder:
cd ComfyUI/custom_nodes
git clone https://github.com/rookiestar28/ComfyUI-MiniMaxH3-Studio.git
Restart ComfyUI, then find it under Add Node → h3_context → contracts. The pack declares no runtime Python dependencies and the installer downloads no models; prompt building works with zero H3 weights installed, which is genuinely useful - you can build and validate the request half of a workflow on a laptop that could never generate the clip. Keep the full repo (__init__.py plus comfyui_h3_context/); a partial copy is the usual cause of missing nodes.
If you're building outside the sidebar, the bundled examples/minimal_core_pipeline.py runs the same Request → Plan → Compiler → Validator chain in pure Python, no ComfyUI needed - handy when you want to check what your duration actually resolves to before committing GPU time.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| task_mode | COMBO | t2va | Explicit H3 task mode. |
| user_intent | STRING | User-declared intent; exact hard text is preserved. | |
| duration_secondsopt | FLOAT | 0–149.687 | Optional expected duration in seconds; the H3 frame count is derived and snapped to the 17k+5 lattice. |
| hard_constraintsopt | H3_HARD_CONSTRAINTS | Optional immutable hard-constraint set from a typed node. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| request | H3_CONTEXT_REQUEST | — |