H3 Scheduled Sampler
The sampler that spends your steps where the error actually is
- sigmas
- SAMPLER
- SIGMAS
- report
Here's a number that should annoy you: on a 15/8 split schedule, four of twenty-two steps carry 97% of the local error, and the smallest twelve carry 0.07%. Spread your budget evenly and almost all of it lands where it can't matter. H3 Scheduled Sampler is res_multistep with a per-step budget - extra evaluations go to the steps that actually need them, and it can even tell H3 Block Cache where skipping is allowed.
The gotcha first: it's hidden
This node is is_dev_only - it's filtered out of the node library, search and the Add Node menu until you flip Settings → "Enable dev mode options (API save, etc.)" (Comfy.DevMode). It comes back with a Dev Only badge; no restart needed. Workflows that already contain it still load and run with dev mode off. The author hides it on purpose - the arithmetic is tested, but "local truncation error is what limits H3 quality" is still a hypothesis, and the node logs predicted-vs-measured error so it gets checked rather than assumed.
How it works
Feed it a sigmas schedule (H3 Detail Schedule, or any scheduler), set the knobs, and wire both outputs to SamplerCustomAdvanced - SAMPLER and SIGMAS (the schedule, unchanged) - so the plan in the report is the plan that runs. The inputs:
- solver -
res_multistep(default; second-order reuse of the previous step's prediction) oreuler. Reach for euler when Block Cache is running hard: a cached step's approximate denoised becomes the next step's history term and gets carried forward with weight ~0.6–0.97, where Euler keeps that error local. Withextra_evaluations0 and everything off, it's bit-for-bit the core sampler of that name. - extra_evaluations (default 4) - model evaluations on top of one per step. Handed out by marginal error reduction, so the first few land on the handful of steps holding almost all the error. 0 makes it a plain res_multistep.
- bias (default 0) - which end gets the extras: negative favours structure and motion, positive favours refinement. Note it buys accuracy at either end - for more texture rather than polish, use
detail_eta. - cache_floor (default 0.02) - the share of total local error Block Cache may be responsible for. Permission only: the cache's own drift threshold still decides, so this can never make it more aggressive. Supersedes Block Cache's
start_percent/end_percentwhen both are present (those resolve against the unsplit curve and go wrong on split schedules). - max_substeps - ceiling on subdividing one enormous step.
- detail_eta / eta_below_sigma - the only knob that adds detail: ancestral noise applied only below
eta_below_sigma(default 0.5, matching the Detail Schedule split), banded because eta across H3's long structure phase destabilises motion. - cfg_below_sigma - force CFG to 1.0 below a sigma, dropping the unconditional pass and halving those steps. The biggest single saving available, and the most likely to cost prompt adherence. 0 is off.
Install
Pack install: ComfyUI Manager → "Nynxz H3", or:
cd ComfyUI/custom_nodes
git clone https://github.com/Nynxz/ComfyUI-NynxzH3
Restart. Pure Python, no dependencies, ComfyUI 0.30.0+. Remember dev mode to see it.
The one-liner
Turn on dev mode, wire Detail Schedule through it, and start with extra_evaluations 4. Read the report before the run - that's the whole point of the node - and only touch cfg_below_sigma when you've seen what prompt adherence costs.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| sigmas | SIGMAS | The schedule to plan over — H3 Detail Schedule, or any scheduler. Passed through unchanged on the SIGMAS output; wire that one onward so the plan in the report is the plan that runs. | |
| solver | COMBO | res_multistep | The integrator. res_multistep gets second order for one evaluation by reusing the previous step's prediction, and is the better default. Choose euler when Block Cache is running hard: a cached step's approximate denoised becomes the next step's history term and gets carried forward with weight, where Euler keeps that error local. This also re-plans the budget — first-order error is less concentrated, so the extra evaluations spread wider. |
| extra_evaluations | INT | 40–64 | Model evaluations on top of one per step — this is time, in the only currency that is honest about it. They are handed out by marginal error reduction, so the first few land on the handful of steps that hold almost all of the error. 0 makes this a plain res_multistep. |
| bias | FLOAT | 0.00-1–1 | Which end gets the extra evaluations. 0 is untilted and spends purely where the measured error is. Negative favours structure and motion; positive favours refinement. Note this buys ACCURACY at either end — for more texture rather than more polish, use detail_eta. |
| cache_floor | FLOAT | 0.0200–0.5 | The share of total local error H3 Block Cache is allowed to be responsible for. Steps are made eligible smallest-error-first until this is used up. Permission only — the cache's own drift threshold still decides whether it skips, so this can never make it more aggressive than it was. 0 leaves the cache's start_percent/end_percent window alone. |
| max_substeps | INT | 41–16 | Ceiling on how far one step may be subdivided. Stops the whole budget landing on a single enormous step when there is one. |
| detail_eta | FLOAT | 0.000–1 | Ancestral noise, applied ONLY below eta_below_sigma. The one setting here that adds detail rather than resolving it — everything else converges harder onto the same trajectory. Banded because eta across H3's long structure phase destabilises motion. |
| eta_below_sigma | FLOAT | 0.500–1 | Where the eta band starts. 0.5 is H3 Detail Schedule's default split, so out of the box the noise lands exactly on the refinement phase. |
| cfg_below_sigma | FLOAT | 0.000–1 | Force CFG to 1.0 below this sigma, which makes ComfyUI drop the unconditional pass entirely and halve those steps. The biggest single saving available, and the one most likely to cost prompt adherence — 0 is off. |
| verbose | BOOLEAN | false | Log the full per-step table before the run, and predicted-vs-measured local error after it. The summary lines are logged either way. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| SAMPLER | SAMPLER | — |
| SIGMAS | SIGMAS | The schedule, unchanged. Wire this to SamplerCustomAdvanced so the sampler and the report cannot disagree about what is being run. |
| report | STRING | The plan, step by step: step size, the multistep conditioning ratio, the share of total error each step holds, and where the budget went. |