MiniMax H3 Image to Video + Semantic Bridge
H3 Image-to-Video With the Semantic Nudge Already Wired In
- clip
- vae
- first_frame
- last_frame
- positive
- latent
What this is for
If you already have MiniMax H3 generating video and you want to try this pack's semantic bridge on a fresh clip, this is the node you reach for. It does what two nodes do by hand - the text encode and the native image-to-video conditioning builder - and applies the bridge on the way out. Prompt in, conditioning and latent out, sampler next.
Context, because it explains the defaults: MiniMax H3 is the 33B omni-modal video model from August 2026 - the first open-weights answer to Veo's native-audio trick, 4–15 second clips at up to 2K/24fps with the stereo sound generated in the same pass. The bridge is not MiniMax's. It's an independent experimental adapter by Speach1sdef178, distilled from a cross-architecture semantic mapping, and it merges nothing into the H3 weights. A nudge on the conditioning, not a fine-tune.
How it works
It's a wrapper around ComfyUI's own core H3 plumbing: it calls _empty_av_latent and _resize from comfy_extras.nodes_minimax_h3, tokenizes your prompt with the frames attached (clip.tokenize(prompt, images=images)), and runs any frames you supplied through the VAE, attaching them as minimax_keyframes plus a frame count. The "av" in that latent helper is audio + video - the sound comes out of the same sampler pass, so don't go hunting for a separate audio node.
Then the bridge. The adapter is a small MLP (5120 → 512 → 512 → 5120, SiLU) that predicts an alternative representation for every token in the conditioning, and the node blends it in with a straight interpolation:
hybrid = native + alpha * (projected - native)
That 5120 is not arbitrary - it's the hidden width of H3's text encoder, which the pack's own upstream notes identify as Qwen3-VL-32B. It's also why the bridge only works on H3 conditioning: feed it anything else and it refuses.
The inputs that actually matter
Most of it is one-shot setup, not per-generation tuning. The knobs you'll touch:
alpha- 0.10 is the starting point, 0.15 is what the author used in the published A/B examples. Because the blend is a lerp,alpha = 0is an exact no-op. Same seed, three queue runs at 0 / 0.10 / 0.15, and you know whether the bridge helps your prompt instead of trusting a demo.magnitude_match-per_token(recommended),global, ornone. It controls how the predicted representation's scale is reconciled with the native one before blending. Leave it onper_tokenunless you're deliberately experimenting;nonehands you the MLP's raw output scale, which changes what a given alpha means.distilled_adapter- the dropdown, populated fromComfyUI/models/semantic_bridge. If it only ever showsNO_DISTILLED_ADAPTER_FOUND.safetensors, that's the pack telling you it can't see an adapter file, not a bug.width/height/length- 1344×768 is H3's 768p tier, and 124 frames is roughly five seconds at 24fps. Length moves in steps of 17 up from a minimum of 5; stay on that grid.
The rest - clip, vae, prompt, and the optional first_frame / last_frame - is what you'd wire into any H3 image-to-video graph. first_frame is cropped "disabled" (aspect preserved as far as it goes), last_frame "center", which matters when your stills aren't already 1344×768.
Outputs are positive (CONDITIONING, into your sampler's positive input) and latent (LATENT, into the sampler at denoise 1.0). There's no negative output - if you're sampling at CFG above 1, keep feeding the negative from wherever your workflow already got it, encoded with the same H3 CLIP.
Installing it
ComfyUI Manager: search MiniMax H3 Semantic Bridge and restart. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/Speach1sdef178/MiniMax-H3-Semantic-Bridge
pip install -r MiniMax-H3-Semantic-Bridge/requirements.txt
That requirements file is one line - safetensors - so it almost certainly already resolves for you. The real dependency isn't in it: the pack imports comfy_extras.nodes_minimax_h3, so you need a ComfyUI new enough to ship native H3 support, plus the H3 weights themselves.
The adapter is separate, on Hugging Face: MiniMaxH3_SemanticBridge_v1.safetensors, into ComfyUI/models/semantic_bridge/. Restart or refresh model lists after copying, or the dropdown won't see it.
Where people get burned
- A red import error on startup. The core H3 import is at module level, so if your ComfyUI predates
comfy_extras/nodes_minimax_h3, the whole pack fails to load - no nodes, just an error in the console. Update ComfyUI first. - The same failure, delayed. The node borrows two private, underscore-prefixed core helpers. When ComfyUI refactors those, this breaks with no warning and nothing saying "upstream changed" - the standard fate of packs bent to core internals.
- An empty adapter folder. Solved by putting the file in
models/semantic_bridge/and restarting, not by fiddling with the widget. - "Expected MiniMax H3 conditioning [B,T,5120]" or
ValueError: Prompt is empty.- the bridge got conditioning that isn't H3's (a different encoder, a stale workflow mixing models), or you queued a half-edited template. Unusually clear messages, both of them.
The author is blunt that the bridge can help a prompt, do nothing, or make a clip worse - representation-space similarity is not perceptual quality - and there's no community footprint for it yet, so trust your own A/B over the demo. Licensing travels with it too: the adapter is a model-derived H3 artifact, so the upstream MiniMax H3 Community License applies, which is why the pack declines to relabel it MIT or Apache. Not legal advice.
And the scope note: v1 doesn't cover Ref2VA or reference-conditioned workflows, and the author's tests showed worse vocal articulation when the bridge was applied to reference-audio lip-sync. If that's your use case, skip this one.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| clip | CLIP | — | |
| vae | VAE | — | |
| prompt | STRING | — | |
| distilled_adapter | COMBO | 1 options: NO_DISTILLED_ADAPTER_FOUND.safetensors | |
| alpha | FLOAT | 0.100–1 | — |
| magnitude_match | COMBO | per_token | 3 options: per_token, global, none |
| width | INT | 134432–16384 | — |
| height | INT | 76832–16384 | — |
| length | INT | 1245–3600 | — |
| first_frameopt | IMAGE | — | |
| last_frameopt | IMAGE | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| positive | CONDITIONING | — |
| latent | LATENT | — |