Nodes/ComfyUI-PainterNodes/Painter MiniMax FL2VA 3
ComfyUI Node

Painter MiniMax FL2VA 3

The same H3 frame anchors, with the canvas on output wires

By princepainter·Created 9 months ago·Updated 11 days ago· 205
Painter MiniMax FL2VA 3
  • clip
  • vae
  • audio_vae
  • first_frame
  • last_frame
  • ref_audios
  • positive
  • LATENT
  • prompt
  • width
  • height
◄prompt—►
◄width1344►
◄height768►
◄length124►

If you're building a MiniMax H3 graph and you've settled on a single pass - no latent upscale, no refine stage - this is the FL2VA node to reach for. Painter MiniMax FL2VA 3 does the same job as the pack's other FL2VA nodes: it takes your first and last frame as hard anchors, takes a reference audio for the voice, and hands you back the conditioning and the audio-video latent for H3 to sample. The only thing that makes it "3" is that it also echoes three of its inputs back out as output ports.

That sounds like nothing. It's the kind of nothing that saves you a node.

The three echo ports, and why you'd care

Alongside positive (CONDITIONING) and the LATENT, this node outputs prompt (STRING), width (INT) and height (INT) - the exact values it actually consumed. In practice you feed width and height from widgets you typed, and then a save node, an overlay, a resize, or a second graph region downstream needs the same numbers. Without the echo you either retype them (and eventually they drift out of sync) or you drop a primitive node to hold them. With it, the canvas has one source of truth and lives on a wire.

Same story for the prompt: if you're rendering a title card, writing a sidecar text file, or feeding the script into a downstream text encode, the prompt that was really used is available as a string instead of copied by hand.

What's inside

The conditioning logic is the v1 logic, unchanged. First and last frames go in as minimax_keyframes - the hard anchor path - with the first frame resized whole and the last frame centre-cropped, both encoded through the video vae. Reference audio goes in as a ref block carrying an audio latent encoded through audio_vae, resampled to that VAE's sample rate. The prompt is tokenised once, and the empty audio-video latent is built at the requested width / height / length with the model's fixed frame-shape rules.

This node also carries the two runtime patches that its siblings need, and they're the reason FL2VA can feel flaky in a bare ComfyUI install. The first fixes a shared conditioning field where an audio-only reference overwrites your first/last frame latents with an empty list - so the anchors silently disappear. The second fixes a time-axis misalignment in H3's packed layout: the anchor segment's position ignored the reference offset, so the anchors landed at RoPE positions that didn't line up with the video segment and attention couldn't hard-anchor them - the author's shorthand for the failure is that anchoring "degrades to identity only," i.e. the frame looks like your image rather than being it. Both patches are idempotent and applied in memory, so running several FL2VA nodes in one install is harmless. If your ComfyUI predates MiniMaxH3 in comfy.model_base, the patch is skipped with a console warning rather than raising.

Inputs you actually touch

clip, vae and audio_vae are the H3 text encoder and the two VAEs. prompt is multiline - put the dialogue here, because the reference audio supplies the timbre and the prompt supplies the words; tag the anchors as you go, since <Picture 1> is the first frame, <Picture 2> the last (it becomes <Picture 1> if you didn't supply a first frame), and <Audio 1> is the reference voice. width and height default to 1344x768 on a 32-pixel grid. length defaults to 124 frames - about five seconds at 24fps - and steps in 17s; type a value that isn't a legal 17k+5 count and the node rounds it up for you.

Optional: first_frame, last_frame, and ref_audios, which expands to up to three audio slots. If you leave the frames disconnected you get an audio-conditioned text-to-video node, which is a legitimate way to use it.

Install

Search PainterNodes in ComfyUI Manager, or:

cd ComfyUI/custom_nodes
git clone https://github.com/princepainter/ComfyUI-PainterNodes
cd ComfyUI-PainterNodes && pip install -r requirements.txt

Restart ComfyUI afterwards. The pack's own dependencies are tiny (soundfile, numpy); the H3 weights and their VAEs are the heavy part and live wherever you keep models.

Picking between the three

FL2VA 1, 2 and 3 are parallel variants, not releases - don't assume the highest number absorbs the others. 3 is the single-pass shape with the canvas echoed out. 2 is the one that also emits upscale_positive, a second conditioning whose anchors are encoded at an upscale canvas, which is what you need for the low-res-then-refine pattern. If you start single-pass here and later add a refine stage, you'll be swapping in FL2VA 2 - the wiring isn't transferable.

Two other things worth knowing before you invest a session in this. The H3 weights are under a licence whose territory excludes the US, EU, UK and South Korea, outputs included, so check that first. And the pack is a fast-moving personal project that renames and deletes nodes between releases; if a workflow matters to you, commit-pin the install rather than letting the manager upgrade it under you.

Categorymodel/conditioning/minimax

Inputs (10)

NameTypeDefaultDescription
clipCLIP—
vaeVAE—
audio_vaeVAE—
promptSTRING—
widthINT134432–16384—
heightINT76832–16384—
lengthINT1245–3600—
first_frameoptIMAGEFirst frame hard anchor (<Picture 1>)
last_frameoptIMAGELast frame hard anchor (<Picture 2>; becomes <Picture 1> when no first frame)
ref_audiosoptCOMFY_AUTOGROW_V3—

Outputs (5)

NameTypeDescription
positiveCONDITIONING—
LATENTLATENT—
promptSTRING—
widthINT—
heightINT—