MMH3 Sample Params
Pack the Whole Two-Stage Sampler Setup Into One Node
- model_high
- sigma_high
- sampler_high
- model_low
- sigma_low
- sampler_low
- sample_params
Two-stage sampling is one of those things everyone ends up doing on video models and nobody enjoys wiring. The Wan 2.2 crowd landed on the same compromise: run the high-noise stage with your full-quality model, then take a cheaper path on the low-noise stage - speed LoRA, lower steps, different sampler - because the early steps decide composition, lighting and motion, and the tail is mostly cleanup. On H3 you can do the same, and this node is where those settings live.
It is a config node. It samples nothing. It bundles a HIGH stage and an optional LOW stage into one opaque sample_params object for MMH3 Temporal Extend Video.
How the two stages divide the work
Both stages are fed by a split sigma schedule - the high and low halves of a SplitSigmas node. The HIGH stage runs from sigma_max down to the split sigma with noise injection, exactly like the start of a normal generation. The LOW stage then runs from the split sigma to zero with no noise added, continuing from the HIGH stage's final x0 prediction rather than from the noisy trajectory.
That detail matters. At a nonzero sigma the sampler's trajectory still carries that sigma's noise, so it's a poor thing to hand off. The x0 prediction is the model's clean estimate, and in the frozen zones this pack creates via noise masks, x0 holds the pristine carried-over content. So the LOW stage re-noises that clean estimate to the split sigma (with seed + 1) and denoises it the rest of the way - the same idea as two chained SamplerCustom nodes on a split schedule, with the handoff done for you.
The inputs
Four are required and they're all HIGH stage: model_high, sigma_high, sampler_high, cfg_high. Feed the model from your H3 UNET loader (through whatever LoRA loader you use), sigma_high from the high output of SplitSigmas, sampler_high from a KSamplerSelect.
cfg_high applies when negative conditioning is connected. H3 turbo/step-distilled LoRAs are the common case here and they run at CFG 1, which is also the default - so if you never connect a negative prompt, leave it alone.
The optional half is the LOW stage: model_low, sigma_low, sampler_low, cfg_low. This is where you make the cheap-vs-quality decision, and it's a genuinely useful one on H3: high stage on the full model, low stage with a speed LoRA or a different sampler. cfg_low defaults to cfg_high when you leave it unconnected.
Two rules, both enforced:
- All three low inputs together, or none. Connect
model_lowwithoutsigma_lowand you get a validation error telling you exactly that. Leave all three unconnected and the bundle simply carries no LOW stage - a perfectly valid, HIGH-only setup. - The split sigma must be shared.
sigma_low's first sigma has to equalsigma_high's last, which is what you get for free by using both outputs of oneSplitSigmas. Get it wrong and the run stops with a message naming both values and suggesting SplitSigmas.
The single output is sample_params, a custom MMH3_SAMPLE_PARAMS link. It goes into the Extend Video node's sample_params input, or into its optional 2nd_sample_params if you're setting up the refinement pass.
Wiring it in practice
A minimal H3 pattern: UNETLoader → (optional LoraLoaderModelOnly) → BasicScheduler → SplitSigmas, with a KSamplerSelect for the sampler. On H3 you also want the flow-matching sigma shift handled - the pack's example workflow uses ComfyUI's MiniMaxH3SigmaShift and sa_solver. Then feed HIGH the model/sampler/high sigmas, and LOW the other model/sampler plus the low sigmas.
This follows the plumbing convention that runs through most utility packs: bundle the values once and send them down one wire instead of dragging model, sampler, sigmas and cfg across the canvas repeatedly. The cost is opacity - you can't inspect the bundle on the link - so when a run behaves oddly, check that both sigma halves really came from the same SplitSigmas node.
Install
ComfyUI Manager → search Comfyui-MMH3-UltimateExtend → install → restart, or:
cd ComfyUI/custom_nodes
git clone https://github.com/bbaudio-2025/Comfyui-MMH3-UltimateExtend
No pip install step; the pack has no Python dependencies of its own. You need a ComfyUI new enough to include MiniMax H3 support and the comfy_api.latest node schema, and you need H3 weights plus the video/audio VAEs from the usual ComfyUI model folders - the H3 weights themselves are geofenced by MiniMax's community licence (no US, EU, UK or South Korea).
Two errors worth knowing in advance
model_low / sigma_low / sampler_low must be connected together, or all left unconnected to skip the LOW stage. - you connected two of three. Also note you can't "half enable" the LOW stage by connecting only a model: it silently isn't a LOW stage unless all three are there.
sigma_low's first sigma does not match sigma_high's last sigma (0.48 vs 0.52) - use SplitSigmas so both schedules share the split sigma - you built two separate schedulers and they don't agree at the seam.
One expectation to set: the LOW stage is a continuation, not a second opinion. A low stage with a wildly different sampler and CFG will visibly fight the high stage's x0 rather than refining it - the pack treats LOW as a way to change cost, not to change look.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| model_high | MODEL | Diffusion model for the HIGH stage (noise injection, sigma_max -> split sigma). | |
| sigma_high | SIGMAS | Sigma schedule for the HIGH stage - e.g. the 'high' output of SplitSigmas; its LAST sigma is the split sigma. | |
| sampler_high | SAMPLER | Sampler for the HIGH stage. | |
| cfg_high | FLOAT | 1.00–100 | CFG of the HIGH stage (applies when negative conditioning is connected). |
| model_lowopt | MODEL | Diffusion model for the optional LOW stage (no noise added, split sigma -> 0). ALL THREE low inputs must be connected together to enable the LOW stage. | |
| sigma_lowopt | SIGMAS | Sigma schedule for the optional LOW stage - e.g. the 'low' output of SplitSigmas; its FIRST sigma must equal sigma_high's last (split) sigma. | |
| sampler_lowopt | SAMPLER | Sampler for the optional LOW stage. | |
| cfg_lowopt | FLOAT | 1.00–100 | CFG of the LOW stage (applies when negative conditioning is connected). Defaults to cfg_high when unconnected. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| sample_params | MMH3_SAMPLE_PARAMS | Connect to the 'sample_params' input of 'MMH3 Temporal Extend Video'. |