MiniMax H3 FL Constraint
MiniMax H3 FL Constraint — pin the first and/or last frame so the clip lands where you want it
- first_frame
- last_frame
- FL_Constraint
Text-to-video has a hard problem: the start is fine, but the ending is a coin flip, and you never know whether the clip actually ends where the shot needs it to. H3's answer is first/last-frame conditioning - you hand it an opening image, a closing image, or both, and it anchors the video to those endpoints. This node is how those frames get into the graph. It's a tiny data-prep node with an outsized effect on whether a clip feels planned or improvised.
How it works
The node takes up to two images - first_frame and last_frame - and packages them into a MINIMAX_H3_FL_CONSTRAINT object that the Conditioning node consumes. It also carries a hidden payload: there's a front-end panel (the node registers a /minimax-h3/fl_constraint route) where the toggles like offload_dit and audio_loudness_match live, and those travel along inside fl_data. So on the surface it's just "plug in two images," but the panel behind it is where finer control - including keyframed FL constraints for the refiner workflows - actually gets set.
Worth knowing from the start: you can't combine this with the PackageData node in the same Conditioning. The README says so outright. Reference media and first/last frames are two different anchoring strategies, and the pack refuses to let you double up. Pick one per shot.
The inputs and outputs
first_frame- optionalIMAGE. The opening frame the video must start from. Animate a still into motion with this alone (that's the I2VA mode).last_frame- optionalIMAGE. The closing frame the video must land on.- Both together give you FL2VA - a start and an end the model has to reconcile in between, which is how you get controlled transition clips.
One output: FL_Constraint, type MINIMAX_H3_FL_CONSTRAINT, wired into Conditioning's fl_constraint socket. The Conditioning node then negotiates the mode with the prompt payload - if your SimplePrompt says T2VA but an FL constraint is present, the constraint wins and the mode becomes I2VA/L2VA/FL2VA accordingly.
Each frame must be a [B,H,W,C] IMAGE tensor - the node validates and throws a clear error otherwise. Load your images with a standard Load Image node and you're fine.
Installing it
The pack-wide routine - ComfyUI Manager search "MiniMax H3", or:
cd ComfyUI/custom_nodes
git clone https://github.com/xiaolibai-sys/ComfyUI-MiniMaxH3
pip install -r requirements.txt
then restart. No model files needed by this node itself.
Common issues
- Nothing changes when you plug frames in. Check your mode. If the prompt payload forces
T2VAand there's no FL constraint path, re-wire so the constraint is actually connected to Conditioning. And remember the mutual-exclusion rule with PackageData - if apackageis also connected, Conditioning refuses the combination. - Wrong shape error. The node validates
[B,H,W,C]. If you're feeding it a single[H,W,C]tensor from a bespoke loader, that's your error right there. - Expecting the panel settings to persist in shared workflows. The
fl_datapanel payload lives in the node's front-end state; if you load a workflow JSON that didn't save it, you may get default toggles. Not a bug - a feature of how ComfyUI saves widget state.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| first_frameopt | IMAGE | — | |
| last_frameopt | IMAGE | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| FL_Constraint | MINIMAX_H3_FL_CONSTRAINT | — |