MiniMax H3 Semantic Bridge
The 'Distilled' in MiniMax H3 Semantic Bridge Has Nothing to Do With Steps
- conditioning
- conditioning
First, kill the wrong expectation
"Distilled" in ComfyUI usually means Lightning, Hyper, LCM, CausVid - a student trained to hit the teacher's endpoint in 4 steps instead of 30. This node is not that. It will not make H3 faster, smaller, or cheaper to sample. SenseNovaH3DistilledBridge and "MiniMax H3 Semantic Bridge" are the same node, and the display name is the one you'll find in the node search.
What it actually is: a conditioning-space adapter. You hand it an existing H3 conditioning tensor, it returns a nudged version of that same tensor, and you sample as usual. It never touches H3's weights, doesn't add a LoRA, and costs you a forward pass so small you wouldn't notice it in the queue time.
How the mechanism works
Conditioning on H3 isn't CLIP tags. It's the hidden-state sequence from the model's text encoder - for H3 that's Qwen3-VL-32B, so the conditioning arrives as [B, T, 5120]. Prompt weighting doesn't apply in this world either: the encoder reads your prompt as an instruction, and ((face:1.4))-style syntax is inert at best. So the lever isn't "tell the encoder something different", it's "rescale the representation the encoder already produced".
Per token: RMS-normalise each vector, so the adapter sees unit-scale input whatever the prompt did. Run it through a tiny MLP - 5120 → 512 → 512 → 5120, SiLU between the layers, about 5.5M parameters and ~22MB in fp32. That's the "student", distilled by the author from a cross-architecture semantic mapping developed with SenseNova U1.5 as a research teacher. Then rescale the prediction per magnitude_match, and blend:
hybrid = native + alpha * (projected - native)
That last line is the whole node. alpha is a plain interpolation between what H3's encoder said and what the student predicts: alpha = 0 is a bit-exact no-op, alpha = 1 throws your conditioning away and samples the student alone (don't). The author's numbers - 0.10 as a starting point, 0.15 in the published A/B examples - sit where a nudge stops being a shove.
The node also stamps provenance into the conditioning metadata - alpha, mode, adapter filename, a sensenova_h3_distilled flag - so you can tell a bridged conditioning from a native one downstream.
The four inputs, one output
conditioning- what you're modifying, from an H3 text encode or a core H3 conditioning node.distilled_adapter- the dropdown of files found inComfyUI/models/semantic_bridge/. If it lists onlyNO_DISTILLED_ADAPTER_FOUND.safetensors, the pack can't see your download.alpha- 0 to 1, default 0.10. Your strength dial, and your A/B control.magnitude_match-per_token(default, recommended),global, ornone.per_tokenrescales each predicted vector to match the native one's own energy, so tokens the encoder was confident about stay dominant;globalmatches the whole sequence's RMS at once;noneblends the student's raw output, which makes the same alpha a different effective strength. Fine to try, bad to compare against.
Output is a single conditioning of type CONDITIONING. Wire it into your sampler's positive input, and put it last - after any conditioning merge or keyframe setup, immediately before sampling.
Installing, and the one file that matters
cd ComfyUI/custom_nodes
git clone https://github.com/Speach1sdef178/MiniMax-H3-Semantic-Bridge
pip install -r MiniMax-H3-Semantic-Bridge/requirements.txt
requirements.txt is just safetensors. The load-bearing dependency isn't in it: the pack imports comfy_extras.nodes_minimax_h3 at module level, so an older ComfyUI fails to load the whole pack rather than just this node.
Then grab MiniMaxH3_SemanticBridge_v1.safetensors from speach1sdef178/MiniMax-H3-Semantic-Bridge on Hugging Face and drop it in ComfyUI/models/semantic_bridge/ - the pack creates and registers that folder itself, which is why the dropdown exists. Restart or refresh model lists after copying.
Where people get burned
- The runtime error is the useful one.
Expected MiniMax H3 conditioning [B,T,5120]means you fed it something that isn't H3 conditioning - a Wan or LTX encode, or a workflow mixing two models. - A swapped adapter file doesn't take effect. The adapter is cached by file path, so replacing the
.safetensorswith a same-named file keeps serving the old weights until you restart ComfyUI or run the pack's cache-clear node. Silent, and easy to mistake for "v2 is identical to v1". - It nudges the whole tensor, not just your prompt. If you tokenized with frames attached - the pack's own image-to-video node does - the image tokens get blended too.
- Don't stack it. One pass, last in the chain, after any conditioning merges.
- Cranking alpha is not "more of a good thing". The author's README is unusually honest: the bridge may help some prompts, do little on others, and occasionally make a result worse. There's no independent footprint for it either, so trust your own fixed-seed A/B over the demo.
- v1 is scoped on purpose. No Ref2VA or reference-conditioned workflows, and reference-audio lip-sync came out worse in the author's tests.
One non-technical note: the adapter is a model-derived H3 artifact, so the upstream MiniMax H3 Community License travels with it - including the territory clause that excludes the US, EU, UK and South Korea from local-weights use, outputs included. That's why the pack declines to relabel it MIT or Apache. Not legal advice.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| conditioning | CONDITIONING | — | |
| 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 |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| conditioning | CONDITIONING | — |