Nodes/H3 Relay/H3 Relay · H3 Hybrid Model Loader
ComfyUI Node

H3 Relay · H3 Hybrid Model Loader

Merge MiniMax H3's two checkpoints instead of picking one

By akatz-ai·Created 28 days ago·Updated 8 days ago· 15
H3 Relay · H3 Hybrid Model Loader
    • h3_model
    base_modelminimax_h3_fl2va_int8_convrot.safetensors
    overlay_modelminimax_h3_ref2va_int8_convrot.safetensors
    overlay_presetblock_range_adaln
    manual_cache_revisionv1
    block_range_start25
    block_range_end49
    final_adaln_from_overlayfalse
    custom_overlays
    custom_base
    weight_dtypedefault

    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 stock UNETLoader.
    • ref2va_adaln_over_fl2va (the default) - take per-block adaln_proj from 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 pulls final_layer.adaln_proj from 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 - take adaln_proj only 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. Set block_range_end < block_range_start to take no blocks at all.
    • custom - use custom_overlays only.

    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.

    CategoryH3 Relay/loaders

    Inputs (10)

    NameTypeDefaultDescription
    base_modelCOMBOminimax_h3_fl2va_int8_convrot.safetensorsPrimary checkpoint -- every tensor starts here.
    overlay_modelCOMBOminimax_h3_ref2va_int8_convrot.safetensorsSecondary checkpoint -- tensors matched by overlay_preset come from here. May equal base_model (effectively loads base only).
    overlay_presetCOMBOblock_range_adalnWhich 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_revisionSTRINGv1Manual 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_startoptINT250–49Only 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_endoptINT490–49Only 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_overlayoptBOOLEANfalseToggle 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_overlaysoptSTRINGComma-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_baseoptSTRINGComma-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_dtypeoptCOMBOdefaultSame meaning as the stock 'Load Diffusion Model' node. Leave 'default' unless you know what you are doing.

    Outputs (1)

    NameTypeDescription
    h3_modelH3_RELAY_MODEL