Nodes/Realtime LoRA Trainer/MiniMax H3 Analyzer + Selective Loader V2
ComfyUI Node

MiniMax H3 Analyzer + Selective Loader V2

Block-by-block control over your MiniMax H3 LoRA — 50 DiT blocks, one node

By shootthesound·Created 10 months ago·Updated 2 months ago· 568
MiniMax H3 Analyzer + Selective Loader V2
  • model
  • positive
  • negative
  • model
  • positive
  • negative
  • analysis
  • analysis_json
  • weights_output
◄lora_name▾►
◄strength1.00►
◄presetDefault►
◄block_0true►
◄block_0_str1.00►
◄block_1true►
◄block_1_str1.00►
◄block_2true►
◄block_2_str1.00►
◄block_3true►
◄block_3_str1.00►
◄block_4true►
◄block_4_str1.00►
◄block_5true►
◄block_5_str1.00►
◄block_6true►
◄block_6_str1.00►
◄block_7true►
◄block_7_str1.00►
◄block_8true►
◄block_8_str1.00►
◄block_9true►
◄block_9_str1.00►
◄block_10true►
◄block_10_str1.00►
◄block_11true►
◄block_11_str1.00►
◄block_12true►
◄block_12_str1.00►
◄block_13true►
◄block_13_str1.00►
◄block_14true►
◄block_14_str1.00►
◄block_15true►
◄block_15_str1.00►
◄block_16true►
◄block_16_str1.00►
◄block_17true►
◄block_17_str1.00►
◄block_18true►
◄block_18_str1.00►
◄block_19true►
◄block_19_str1.00►
◄block_20true►
◄block_20_str1.00►
◄block_21true►
◄block_21_str1.00►
◄block_22true►
◄block_22_str1.00►
◄block_23true►
◄block_23_str1.00►
◄block_24true►
◄block_24_str1.00►
◄block_25true►
◄block_25_str1.00►
◄block_26true►
◄block_26_str1.00►
◄block_27true►
◄block_27_str1.00►
◄block_28true►
◄block_28_str1.00►
◄block_29true►
◄block_29_str1.00►
◄block_30true►
◄block_30_str1.00►
◄block_31true►
◄block_31_str1.00►
◄block_32true►
◄block_32_str1.00►
◄block_33true►
◄block_33_str1.00►
◄block_34true►
◄block_34_str1.00►
◄block_35true►
◄block_35_str1.00►
◄block_36true►
◄block_36_str1.00►
◄block_37true►
◄block_37_str1.00►
◄block_38true►
◄block_38_str1.00►
◄block_39true►
◄block_39_str1.00►
◄block_40true►
◄block_40_str1.00►
◄block_41true►
◄block_41_str1.00►
◄block_42true►
◄block_42_str1.00►
◄block_43true►
◄block_43_str1.00►
◄block_44true►
◄block_44_str1.00►
◄block_45true►
◄block_45_str1.00►
◄block_46true►
◄block_46_str1.00►
◄block_47true►
◄block_47_str1.00►
◄block_48true►
◄block_48_str1.00►
◄block_49true►
◄block_49_str1.00►
◄other_weightstrue►
◄other_weights_str1.00►
◄lora_path_opt—►
◄schedule_presetCustom►
◄strength_schedule►
◄save_refined_lorafalse►
◄save_path►
◄save_filename►
◄block_weights_string►

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) and Mid-Late (25-49) are the useful starting points for dialing down an overbaked subject.
  • block_0 through block_49, each with a _str strength, plus other_weights for the token-refiner and strays.
  • strength_schedule - step:strength pairs like 0:.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_lora bakes 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.

Categoryloaders/lora

Inputs (115)

NameTypeDefaultDescription
modelMODEL—
positiveCONDITIONINGPositive conditioning from CLIP encode
negativeCONDITIONINGNegative conditioning from CLIP encode
lora_nameCOMBOLoRA file to load and analyze
strengthFLOAT1.00-10–10Overall LoRA strength (ignored when using schedule)
presetCOMBODefaultQuick preset selection. Individual toggles below override when changed.
block_0BOOLEANtrue—
block_0_strFLOAT1.00-5–5—
block_1BOOLEANtrue—
block_1_strFLOAT1.00-5–5—
block_2BOOLEANtrue—
block_2_strFLOAT1.00-5–5—
block_3BOOLEANtrue—
block_3_strFLOAT1.00-5–5—
block_4BOOLEANtrue—
block_4_strFLOAT1.00-5–5—
block_5BOOLEANtrue—
block_5_strFLOAT1.00-5–5—
block_6BOOLEANtrue—
block_6_strFLOAT1.00-5–5—
block_7BOOLEANtrue—
block_7_strFLOAT1.00-5–5—
block_8BOOLEANtrue—
block_8_strFLOAT1.00-5–5—
block_9BOOLEANtrue—
block_9_strFLOAT1.00-5–5—
block_10BOOLEANtrue—
block_10_strFLOAT1.00-5–5—
block_11BOOLEANtrue—
block_11_strFLOAT1.00-5–5—
block_12BOOLEANtrue—
block_12_strFLOAT1.00-5–5—
block_13BOOLEANtrue—
block_13_strFLOAT1.00-5–5—
block_14BOOLEANtrue—
block_14_strFLOAT1.00-5–5—
block_15BOOLEANtrue—
block_15_strFLOAT1.00-5–5—
block_16BOOLEANtrue—
block_16_strFLOAT1.00-5–5—
block_17BOOLEANtrue—
block_17_strFLOAT1.00-5–5—
block_18BOOLEANtrue—
block_18_strFLOAT1.00-5–5—
block_19BOOLEANtrue—
block_19_strFLOAT1.00-5–5—
block_20BOOLEANtrue—
block_20_strFLOAT1.00-5–5—
block_21BOOLEANtrue—
block_21_strFLOAT1.00-5–5—
block_22BOOLEANtrue—
block_22_strFLOAT1.00-5–5—
block_23BOOLEANtrue—
block_23_strFLOAT1.00-5–5—
block_24BOOLEANtrue—
block_24_strFLOAT1.00-5–5—
block_25BOOLEANtrue—
block_25_strFLOAT1.00-5–5—
block_26BOOLEANtrue—
block_26_strFLOAT1.00-5–5—
block_27BOOLEANtrue—
block_27_strFLOAT1.00-5–5—
block_28BOOLEANtrue—
block_28_strFLOAT1.00-5–5—
block_29BOOLEANtrue—
block_29_strFLOAT1.00-5–5—
block_30BOOLEANtrue—
block_30_strFLOAT1.00-5–5—
block_31BOOLEANtrue—
block_31_strFLOAT1.00-5–5—
block_32BOOLEANtrue—
block_32_strFLOAT1.00-5–5—
block_33BOOLEANtrue—
block_33_strFLOAT1.00-5–5—
block_34BOOLEANtrue—
block_34_strFLOAT1.00-5–5—
block_35BOOLEANtrue—
block_35_strFLOAT1.00-5–5—
block_36BOOLEANtrue—
block_36_strFLOAT1.00-5–5—
block_37BOOLEANtrue—
block_37_strFLOAT1.00-5–5—
block_38BOOLEANtrue—
block_38_strFLOAT1.00-5–5—
block_39BOOLEANtrue—
block_39_strFLOAT1.00-5–5—
block_40BOOLEANtrue—
block_40_strFLOAT1.00-5–5—
block_41BOOLEANtrue—
block_41_strFLOAT1.00-5–5—
block_42BOOLEANtrue—
block_42_strFLOAT1.00-5–5—
block_43BOOLEANtrue—
block_43_strFLOAT1.00-5–5—
block_44BOOLEANtrue—
block_44_strFLOAT1.00-5–5—
block_45BOOLEANtrue—
block_45_strFLOAT1.00-5–5—
block_46BOOLEANtrue—
block_46_strFLOAT1.00-5–5—
block_47BOOLEANtrue—
block_47_strFLOAT1.00-5–5—
block_48BOOLEANtrue—
block_48_strFLOAT1.00-5–5—
block_49BOOLEANtrue—
block_49_strFLOAT1.00-5–5—
other_weightsBOOLEANtrue—
other_weights_strFLOAT1.00-5–5—
lora_path_optoptSTRINGOptional: Override LoRA selection with a path
schedule_presetoptCOMBOCustomSelect a preset schedule (populates the text field below for editing)
strength_scheduleoptSTRINGStrength schedule: 0:.2,.5:.8,1:1.0 (step:strength pairs). Edit freely after selecting preset.
save_refined_loraoptBOOLEANfalseEnable to save the refined LoRA to disk
save_pathoptSTRINGDirectory to save refined LoRA
save_filenameoptSTRINGFilename for saved LoRA (timestamp auto-appended). Leave empty for auto-name.
block_weights_stringoptSTRINGInput/Output block profile string. Positional text syncs with the UI. String input overrides UI values.

Outputs (6)

NameTypeDescription
modelMODELModel with LoRA applied (filtered by enabled blocks).
positiveCONDITIONINGPositive conditioning (with hooks if using schedule).
negativeCONDITIONINGNegative conditioning (with hooks if using schedule).
analysisSTRINGPer-block analysis showing impact scores.
analysis_jsonSTRINGJSON analysis data for UI coloring.
weights_outputSTRINGBlock profile string output for chaining or reuse.