Nodes/H3 LBH X2 Stream/H3 LBH F12 Model Loader
ComfyUI Node

H3 LBH F12 Model Loader

Don't load MiniMax H3 with the stock UNET loader

By sepiablue-ai·Created 22 days ago·Updated 16 days ago· 4
H3 LBH F12 Model Loader
    • MODEL
    ◄unet_name▾►
    ◄cache_directoryh3_lbh_x2/f12►
    ◄prepare_if_missingtrue►

    The pack's loader looks like a UNETLoader clone with extra widgets. It isn't. If you drop a normal Load Diffusion Model into this workflow instead, the graph will run - just slower, because the whole point of this node is the twelve weights it swaps in before ComfyUI ever sees the model.

    What it actually does

    H3 here runs as an INT8 ConvRot weight file. This loader reads that file into a state dict, then loads twelve locally prepared shards and splices them over the top, one per block, replacing the fc1 projection with native ConvRot W4A4 weights. The blocks are a fixed, unusual list: 19, 22 through 29, and 47 through 49. Everything else stays INT8 - FC2, QKV and OutProj are asserted to still be TensorWiseINT8Layout on the way out.

    Then it validates hard before handing you the model: exactly 50 blocks, the right layout class on each patched weight, the FC2/QKV/OutProj layers untouched, and the F12 blocks carrying convrot_groupsize 256, quant_group_size 64, linear_dtype int4. If any of that is off you get a runtime error with a specific message, not a silently degraded model. That's the good kind of opinionated.

    The shards aren't downloaded - they're derived. On first use with prepare_if_missing on, it unloads all models, empties the cache, and writes twelve shards plus a manifest into models/h3_lbh_x2/f12 (about 0.93 GB). It also stores the merge recipe on the model as cached_patcher_init, so when ComfyUI unloads H3 to free VRAM and reloads it later, the F12 weights get merged back in instead of quietly dropping to plain INT8. That detail is why you don't just patch once and forget.

    Inputs and outputs

    unet_name is the combo from your diffusion_models folder - pick the MATLOW fused INT8 ConvRot H3 checkpoint. cache_directory defaults to the relative path h3_lbh_x2/f12, resolved against your models dir; leave it unless you're deliberately sharing an existing cache. prepare_if_missing defaults to true, and you want it true the first time. One output: MODEL, which goes straight into the patch chain.

    Install

    Manager: search H3 LBH X2 Stream, install, restart. Or:

    cd ComfyUI/custom_nodes
    git clone https://github.com/sepiablue-ai/ComfyUI-H3-LBH-X2-Stream
    

    and restart. The author also ships a Windows setup.bat for people who'd rather not; note the warning in his README - if X2 Stream came from Manager it landed in custom_nodes/h3-x2-stream, and setup.bat --install-dependencies would then clone a second copy into custom_nodes/ComfyUI-H3-X2-Stream and register the same nodes twice. One install method, not both.

    Models are manual here, and the loader is picky about which file you give it. You need the fused INT8 ConvRot H3 model, the Qwen3-VL NVFP4 text encoder, the INT8 video VAE, the FP32 audio VAE, the original X2 Detail v1 VAE, and the LBH 3D FP16 upscaler in models/latent_upscale_models. Also worth knowing before you download 30-odd GB of weights: H3's community licence excludes the US, EU, UK and South Korea from its applicable territory, so the local-weights side of this pack is a conditional grant rather than a free one.

    Common issues

    "New F12 caches must be inside this ComfyUI's models/h3_lbh_x2". You pointed cache_directory at a fresh path somewhere else while prepare_if_missing was on. New caches are only allowed under the pack's own folder; pointing at a pre-existing cache elsewhere is fine.

    "Source model does not match the F12 cache". The manifest pins the base checkpoint by size plus a hash of its safetensors header. Swapped the model? Use a separate cache directory per base model rather than fighting it - and no, an incomplete or incompatible cache is never overwritten, so deleting the folder is on you.

    Environment errors before the load even starts. The node checks for native ConvRot W4A4 serialization, the dynamic-VRAM loader API, the native INT4 backend, CUDA, a GPU that selects native INT4 MMA, and compiled Sol-Attn. Each failure has its own message ("This GPU/backend would select the INT8 fallback", "Compiled Sol-Attn is unavailable on this GPU"). Read them literally: a stale ComfyUI or a card without native INT4 is the answer, and there's no fallback mode to talk it out of.

    First generation feels stuck. That's the ~0.93 GB shard preparation with a progress bar; it happens once, and it stops if ComfyUI is already busy. Stop the server and re-run, or pre-empt it with setup.bat --prepare-f12.

    CategoryH3 LBH X2 Stream

    Inputs (3)

    NameTypeDefaultDescription
    unet_nameCOMBO0 options:
    cache_directorySTRINGh3_lbh_x2/f12—
    prepare_if_missingBOOLEANtrue—

    Outputs (1)

    NameTypeDescription
    MODELMODEL—