MiniMax H3 Analyzer + Selective Loader V2
Block-by-block control over your MiniMax H3 LoRA — 50 DiT blocks, one node
- model
- positive
- negative
- model
- positive
- negative
- analysis
- analysis_json
- weights_output
MiniMax H3 is a 33B omni-modal model - text, image, video and audio in one context - which also means its LoRAs are enormous, block-dense, and about as subtle as you'd expect from something that big. When a H3 LoRA is doing 90% of what you want but smearing something on every frame, you don't retrain a 33B model. You reach for this node and tell specific DiT blocks to back off.
It's part of ShootTheSound/comfyUI-Realtime-Lora ("Realtime LoRA Trainer") and it's the V2 combined form: analyze the LoRA's block-level impact and selectively load it, in one node, with strength scheduling on top. The block guide is 50 main packed DiT blocks - 0–12 early, 13–37 middle, 38–49 late - with the token-refiner and other non-block H3 tensors grouped under a single other_weights control.
How it works
Same engine as the other V2 analyzers in the pack, pointed at H3's layout. It loads your LoRA, scores each of the 50 blocks by the magnitude of its weights (the product of the up/down factors, normalized to a 0–100% impact score), then patches only the blocks you leave enabled through ComfyUI's standard LoRA patcher. The score feeds the color-coded checkboxes, so red blocks are the ones doing the heavy lifting - mute those and the subject changes; mute the blue ones and you'll barely notice.
The one H3-specific wrinkle is worth knowing: the node understands both key formats H3 LoRAs actually ship in - native diffusion_model.blocks.* keys and the lora_unet_blocks_* training keys from the Kohya line - so it doesn't care where your LoRA came from. And when you scale a block, it scales only the "up" factor rather than both factors, because ComfyUI multiplies them together at load time; scaling just one keeps the block strength linear and signed, so you can even go negative.
Inputs that matter
- positive / negative - your conditioning from CLIP encode. They feed back out of the node, carrying scheduling hooks when a schedule is active.
- preset - 11 of them.
Late Only (38-49)andMid-Late (25-49)are the useful starting points for dialing down an overbaked subject. - block_0 through block_49, each with a
_strstrength, plus other_weights for the token-refiner and strays. - strength_schedule -
step:strengthpairs like0:.2,.5:.8,1:1.0, or one of the 40+ preset curves if you'd rather not type.
Outputs: model, positive, negative, and the three strings - analysis (readable breakdown), analysis_json (UI coloring / downstream loaders), weights_output (block profile for chaining).
Installing it
cd ComfyUI/custom_nodes
git clone https://github.com/ShootTheSound/comfyUI-Realtime-Lora
Restart ComfyUI - or search "Realtime LoRA Trainer" in ComfyUI Manager. This node is a loader, not a trainer, so it needs no additional install: the sd-scripts/Musubi/AI-Toolkit backends are only for the training nodes, and the requirements file is empty beyond what ComfyUI already ships.
Reality check first
H3's open weights sit under the MiniMax H3 Community License, and its Applicable Territory excludes the US, EU, UK and South Korea. If you're in one of those regions, you're not licensed to run the local weights at all, and no node changes that. The hosted Hailuo API remains the licensed path there. Outside the excluded territories, the usual caveats apply: it's a ~33B model, so plan for serious VRAM, and don't trust the hardware floor rumors that predate the release.
Where people get burned
- Strength scheduling rides on ComfyUI's hook system, and hooks don't work on quantized layers. On fp8/GGUF models the schedule is silently skipped in favor of flat strength - use bf16 if scheduling matters.
- With a schedule active, the strength field is ignored (it's the fallback when you clear the schedule).
- A connected block_weights_string overrides every UI toggle. By design, but it will absolutely confuse you later.
save_refined_lorabakes your filtered LoRA to disk with a timestamp - great once you've found the fix, a waste of disk while you're still guessing.
Fair warning: with 50 blocks plus scheduling, it's easy to fiddle for an hour and end up back at "all blocks at 1.0." Start with one preset, compare two images, and only then go granular.
Inputs (115)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| positive | CONDITIONING | Positive conditioning from CLIP encode | |
| negative | CONDITIONING | Negative conditioning from CLIP encode | |
| lora_name | COMBO | LoRA file to load and analyze | |
| strength | FLOAT | 1.00-10–10 | Overall LoRA strength (ignored when using schedule) |
| preset | COMBO | Default | Quick preset selection. Individual toggles below override when changed. |
| block_0 | BOOLEAN | true | — |
| block_0_str | FLOAT | 1.00-5–5 | — |
| block_1 | BOOLEAN | true | — |
| block_1_str | FLOAT | 1.00-5–5 | — |
| block_2 | BOOLEAN | true | — |
| block_2_str | FLOAT | 1.00-5–5 | — |
| block_3 | BOOLEAN | true | — |
| block_3_str | FLOAT | 1.00-5–5 | — |
| block_4 | BOOLEAN | true | — |
| block_4_str | FLOAT | 1.00-5–5 | — |
| block_5 | BOOLEAN | true | — |
| block_5_str | FLOAT | 1.00-5–5 | — |
| block_6 | BOOLEAN | true | — |
| block_6_str | FLOAT | 1.00-5–5 | — |
| block_7 | BOOLEAN | true | — |
| block_7_str | FLOAT | 1.00-5–5 | — |
| block_8 | BOOLEAN | true | — |
| block_8_str | FLOAT | 1.00-5–5 | — |
| block_9 | BOOLEAN | true | — |
| block_9_str | FLOAT | 1.00-5–5 | — |
| block_10 | BOOLEAN | true | — |
| block_10_str | FLOAT | 1.00-5–5 | — |
| block_11 | BOOLEAN | true | — |
| block_11_str | FLOAT | 1.00-5–5 | — |
| block_12 | BOOLEAN | true | — |
| block_12_str | FLOAT | 1.00-5–5 | — |
| block_13 | BOOLEAN | true | — |
| block_13_str | FLOAT | 1.00-5–5 | — |
| block_14 | BOOLEAN | true | — |
| block_14_str | FLOAT | 1.00-5–5 | — |
| block_15 | BOOLEAN | true | — |
| block_15_str | FLOAT | 1.00-5–5 | — |
| block_16 | BOOLEAN | true | — |
| block_16_str | FLOAT | 1.00-5–5 | — |
| block_17 | BOOLEAN | true | — |
| block_17_str | FLOAT | 1.00-5–5 | — |
| block_18 | BOOLEAN | true | — |
| block_18_str | FLOAT | 1.00-5–5 | — |
| block_19 | BOOLEAN | true | — |
| block_19_str | FLOAT | 1.00-5–5 | — |
| block_20 | BOOLEAN | true | — |
| block_20_str | FLOAT | 1.00-5–5 | — |
| block_21 | BOOLEAN | true | — |
| block_21_str | FLOAT | 1.00-5–5 | — |
| block_22 | BOOLEAN | true | — |
| block_22_str | FLOAT | 1.00-5–5 | — |
| block_23 | BOOLEAN | true | — |
| block_23_str | FLOAT | 1.00-5–5 | — |
| block_24 | BOOLEAN | true | — |
| block_24_str | FLOAT | 1.00-5–5 | — |
| block_25 | BOOLEAN | true | — |
| block_25_str | FLOAT | 1.00-5–5 | — |
| block_26 | BOOLEAN | true | — |
| block_26_str | FLOAT | 1.00-5–5 | — |
| block_27 | BOOLEAN | true | — |
| block_27_str | FLOAT | 1.00-5–5 | — |
| block_28 | BOOLEAN | true | — |
| block_28_str | FLOAT | 1.00-5–5 | — |
| block_29 | BOOLEAN | true | — |
| block_29_str | FLOAT | 1.00-5–5 | — |
| block_30 | BOOLEAN | true | — |
| block_30_str | FLOAT | 1.00-5–5 | — |
| block_31 | BOOLEAN | true | — |
| block_31_str | FLOAT | 1.00-5–5 | — |
| block_32 | BOOLEAN | true | — |
| block_32_str | FLOAT | 1.00-5–5 | — |
| block_33 | BOOLEAN | true | — |
| block_33_str | FLOAT | 1.00-5–5 | — |
| block_34 | BOOLEAN | true | — |
| block_34_str | FLOAT | 1.00-5–5 | — |
| block_35 | BOOLEAN | true | — |
| block_35_str | FLOAT | 1.00-5–5 | — |
| block_36 | BOOLEAN | true | — |
| block_36_str | FLOAT | 1.00-5–5 | — |
| block_37 | BOOLEAN | true | — |
| block_37_str | FLOAT | 1.00-5–5 | — |
| block_38 | BOOLEAN | true | — |
| block_38_str | FLOAT | 1.00-5–5 | — |
| block_39 | BOOLEAN | true | — |
| block_39_str | FLOAT | 1.00-5–5 | — |
| block_40 | BOOLEAN | true | — |
| block_40_str | FLOAT | 1.00-5–5 | — |
| block_41 | BOOLEAN | true | — |
| block_41_str | FLOAT | 1.00-5–5 | — |
| block_42 | BOOLEAN | true | — |
| block_42_str | FLOAT | 1.00-5–5 | — |
| block_43 | BOOLEAN | true | — |
| block_43_str | FLOAT | 1.00-5–5 | — |
| block_44 | BOOLEAN | true | — |
| block_44_str | FLOAT | 1.00-5–5 | — |
| block_45 | BOOLEAN | true | — |
| block_45_str | FLOAT | 1.00-5–5 | — |
| block_46 | BOOLEAN | true | — |
| block_46_str | FLOAT | 1.00-5–5 | — |
| block_47 | BOOLEAN | true | — |
| block_47_str | FLOAT | 1.00-5–5 | — |
| block_48 | BOOLEAN | true | — |
| block_48_str | FLOAT | 1.00-5–5 | — |
| block_49 | BOOLEAN | true | — |
| block_49_str | FLOAT | 1.00-5–5 | — |
| other_weights | BOOLEAN | true | — |
| other_weights_str | FLOAT | 1.00-5–5 | — |
| lora_path_optopt | STRING | Optional: Override LoRA selection with a path | |
| schedule_presetopt | COMBO | Custom | Select a preset schedule (populates the text field below for editing) |
| strength_scheduleopt | STRING | Strength schedule: 0:.2,.5:.8,1:1.0 (step:strength pairs). Edit freely after selecting preset. | |
| save_refined_loraopt | BOOLEAN | false | Enable to save the refined LoRA to disk |
| save_pathopt | STRING | Directory to save refined LoRA | |
| save_filenameopt | STRING | Filename for saved LoRA (timestamp auto-appended). Leave empty for auto-name. | |
| block_weights_stringopt | STRING | Input/Output block profile string. Positional text syncs with the UI. String input overrides UI values. |
Outputs (6)
| Name | Type | Description |
|---|---|---|
| model | MODEL | Model with LoRA applied (filtered by enabled blocks). |
| positive | CONDITIONING | Positive conditioning (with hooks if using schedule). |
| negative | CONDITIONING | Negative conditioning (with hooks if using schedule). |
| analysis | STRING | Per-block analysis showing impact scores. |
| analysis_json | STRING | JSON analysis data for UI coloring. |
| weights_output | STRING | Block profile string output for chaining or reuse. |