H3 Relay · H3 Hybrid Model Loader
Merge MiniMax H3's two checkpoints instead of picking one
- h3_model
MiniMax H3 ships two diffusion checkpoints, and they have genuinely different personalities. fl2va tends to produce the higher output quality; ref2va carries the reference-conditioning pathway that makes image/video-reference steering work well. The Hybrid Loader lets you have both: it loads one checkpoint as the base and merges selected tensor groups from the other onto it. Instead of choosing which compromise to live with, you pick which parts of each model you trust.
The node description says it plainly: it's useful for combining the higher output quality of fl2va with the reference-conditioning pathway of ref2va. And if you set overlay_preset to none, it behaves exactly like the stock Load Diffusion Model node - a pure base load.
The inputs that matter
Required: base_model (defaults to minimax_h3_fl2va_int8_convrot.safetensors), overlay_model (defaults to minimax_h3_ref2va_int8_convrot.safetensors), overlay_preset, and manual_cache_revision.
overlay_preset is the whole node. The options, in order of ambition:
none- pure base load, equivalent to a stockUNETLoader.ref2va_adaln_over_fl2va(the default) - take per-blockadaln_projfrom the overlay only. This is the surgical choice: the adaptive layer-norm projection is where much of the checkpoint's steering character lives, so swapping just that gets you a lot of ref2va behavior on top of fl2va's quality.ref2va_all_adaln_over_fl2va- also pullsfinal_layer.adaln_projfrom the overlay.ref2va_full_over_fl2va/fl2va_full_over_ref2va- take everything from the overlay. These are sanity checks, not production presets.block_range_adaln- takeadaln_projonly for blocks in[block_range_start, block_range_end]. The H3 DiT has 50 blocks indexed 0..49, and the defaults (25..49) overlay the later blocks. Setblock_range_end < block_range_startto take no blocks at all.custom- usecustom_overlaysonly.
If you need finer control, custom_overlays is a comma-separated list of extra keys, prefixes (bare prefixes ending in ., e.g. blocks.49.,final_layer.video_out.), or fnmatch globs (blocks.[0-4].*.attn.qkv_proj.weight) to also pull from the overlay. custom_base is the inverse - keys forced back to the base even if a preset would have taken them from the overlay. final_adaln_from_overlay toggles just the final_layer.adaln_proj on top of whatever the preset does.
Two settings every loader in this pack shares: weight_dtype (leave on default unless you know what you're doing - same meaning as stock) and manual_cache_revision. The tooltip on the latter is important: it's a manual cache reset only. Change it when you replace model files without changing filenames; normal model, LoRA, dtype, strength, and attention changes are tracked automatically by the bundle's fingerprint.
Output is a single h3_model bundle of type H3_RELAY_MODEL - wire it through Attention if you like, then into Generate Shot. No VAE or text encoder comes along here; the H3 text encoder and VAEs are handled elsewhere in the graph.
Why this exists
MiniMax H3's hybrid loading is a known trick in the ComfyUI ecosystem (this class derives from the MiniMax H3 Hybrid Loader, vendored under a namespaced internal id). H3 Relay's version wraps the merge in its cache-aware bundle, so a change to base, overlay, preset, or range invalidates only derived artifacts. If you never touch it, the default ref2va_adaln_over_fl2va is a reasonable place to start - but honestly, for a first project, the plain H3 Model Loader is the simpler on-ramp. Reach for this one when you've looked at enough fl2va output to want ref2va's steering on top of it.
Install: ComfyUI Manager search H3 Relay, or git clone https://github.com/akatz-ai/h3-relay.git into custom_nodes. Needs ComfyUI 0.32.0+, FFmpeg, and both H3 checkpoints from MODELS.md. License gate stands: MiniMax H3's community license excludes US/EU/UK/Korea.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| base_model | COMBO | minimax_h3_fl2va_int8_convrot.safetensors | Primary checkpoint -- every tensor starts here. |
| overlay_model | COMBO | minimax_h3_ref2va_int8_convrot.safetensors | Secondary checkpoint -- tensors matched by overlay_preset come from here. May equal base_model (effectively loads base only). |
| overlay_preset | COMBO | block_range_adaln | Which tensor groups to take from overlay_model. 'none' = pure base loading (equivalent to stock UNETLoader). 'ref2va_adaln_over_fl2va' (default) = take per-block adaln_proj from the overlay only. 'ref2va_all_adaln_over_fl2va' = also take final_layer.adaln_proj. 'ref2va_full_over_fl2va'/'fl2va_full_over_ref2va' = take everything from the overlay (sanity check). 'block_range_adaln' = take adaln_proj only for blocks in [block_range_start, block_range_end] (inclusive). 'custom' = use custom_overlays only. |
| manual_cache_revision | STRING | v1 | Manual cache reset only. Change this when replacing model contents without changing the filename; normal model, LoRA, dtype, strength, and attention changes are tracked automatically. |
| block_range_startopt | INT | 250–49 | Only used when overlay_preset == 'block_range_adaln'. Lower-inclusive bound on the block index whose adaln_proj comes from overlay_model. The minimax h3 DiT has 50 blocks indexed 0..49. |
| block_range_endopt | INT | 490–49 | Only used when overlay_preset == 'block_range_adaln'. Upper-inclusive bound on the block index. Set block_range_end < block_range_start to take NO blocks from the overlay (effectively pure base). |
| final_adaln_from_overlayopt | BOOLEAN | false | Toggle overlay of final_layer.adaln_proj.linear.{weight,bias} from overlay_model. Additive on top of any preset: - False (default): leave final_layer.adaln on the base (unless a preset already covers it, e.g. ref2va_all_adaln_over_fl2va). - True: pull final_layer.adaln from the overlay in addition to whatever the preset does. |
| custom_overlaysopt | STRING | Comma-separated keys/prefixes/globs to *also* take from the overlay on top of the preset. E.g. 'blocks.49.,final_layer.video_out.'. Bare prefixes ending in '.' match by prefix; other strings are matched as fnmatch globs (e.g. 'blocks.[0-4].*.attn.qkv_proj.weight'). | |
| custom_baseopt | STRING | Comma-separated keys/prefixes/globs that should be forced *back* to the base even if the preset or custom_overlays would take them from the overlay. Useful for keeping e.g. final_layer.adaln_proj on the base while everything else adaln comes from the overlay. | |
| weight_dtypeopt | COMBO | default | Same meaning as the stock 'Load Diffusion Model' node. Leave 'default' unless you know what you are doing. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| h3_model | H3_RELAY_MODEL | — |