Nodes/H3 Relay/H3RelayInternalHybridLoader
ComfyUI Node

H3RelayInternalHybridLoader

The Hybrid Loader's raw-model twin — for when you're building your own H3 graph

By akatz-ai·Created 28 days ago·Updated 8 days ago· 15
H3RelayInternalHybridLoader
    • model
    base_model
    overlay_model
    overlay_presetblock_range_adaln
    block_range_start25
    block_range_end49
    final_adaln_from_overlayfalse
    custom_overlays
    custom_base
    weight_dtypedefault

    If you've read the H3 Relay Hybrid Model Loader article, you already know the trick: load a MiniMax H3 checkpoint, merge selected tensor groups from an overlay checkpoint onto it, and end up with a model that has fl2va's quality and ref2va's reference-conditioning pathway. This internal node is the same loader - literally the same class from the vendored MiniMax H3 Hybrid Loader - registered under a namespaced id, with one crucial difference: it returns a plain MODEL, not an H3_RELAY_MODEL bundle.

    That single difference is the entire reason this node exists. The public Hybrid Loader wraps its output in H3 Relay's cache-aware bundle so the pack can fingerprint model changes and invalidate derived artifacts. This one skips the wrapper and hands you a stock MODEL socket, which makes it useful in exactly one scenario: you're building a hand-rolled H3 graph with native ComfyUI nodes - stock samplers, conditioning, the works - and you want the hybrid merge without committing to H3 Relay's bundle-and-cache contract.

    The inputs

    Everything matches the public hybrid loader's schema minus the manual_cache_revision field (there's no cache to bump, since the output is raw):

    • base_model - primary checkpoint; every tensor starts here.
    • overlay_model - secondary checkpoint; tensors matched by overlay_preset come from here. It may equal base_model (effectively a base-only load).
    • overlay_preset - none, ref2va_adaln_over_fl2va (default), ref2va_all_adaln_over_fl2va, the two full-overlay sanity presets, block_range_adaln, or custom. Same semantics as the public node: none is a pure base load equivalent to a stock UNETLoader.
    • block_range_start / block_range_end - used only with block_range_adaln; the H3 DiT has 50 blocks indexed 0..49. block_range_end < block_range_start takes nothing from the overlay.
    • final_adaln_from_overlay - pulls final_layer.adaln_proj from the overlay on top of whatever the preset does.
    • custom_overlays / custom_base - comma-separated keys, prefixes, or fnmatch globs to add or force back.
    • weight_dtype - default or fp8 variants, same meaning as stock Load Diffusion Model.

    Output is a single MODEL socket. Wire it wherever a native ComfyUI model would go.

    When to use it (and when not to)

    Use it if you're building the stock-style MiniMax H3 continuation graph by hand and want the hybrid merge as the model source. Don't use it inside a reference H3 Relay workflow - the staged pipeline and the cache contract both assume the bundle form, and a raw MODEL won't carry the H3_RELAY_MODEL type the relay nodes expect. If you're not hand-building, the public H3 Relay · H3 Hybrid Model Loader is the right node, full stop.

    This is the classic internal-node trap: it looks like a drop-in alternative and is, but only if you know what you're doing with the surrounding graph. If you found it in the expanded graph of a reference workflow, it's because the staged H3 generation path uses it internally to build the H3-only stage - leave it be.

    Install the pack via ComfyUI Manager (search H3 Relay) or git clone https://github.com/akatz-ai/h3-relay.git into custom_nodes. ComfyUI 0.32.0+, FFmpeg, and both H3 checkpoints from MODELS.md are required; the MiniMax H3 community license geofence (US/EU/UK/Korea) applies regardless of which loader you pick.

    Categorymodel/loaders

    Inputs (9)

    NameTypeDefaultDescription
    base_modelCOMBOPrimary checkpoint -- every tensor starts here.
    overlay_modelCOMBOSecondary 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.
    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
    modelMODEL