Element Strength Schedule
How hard your reference holds on, step by step
- model
- MODEL
Here's the thing nobody tells you about reference-latent edit models: the reference is not equally useful at every step. Early steps decide layout and identity - that's when you want the original image pinned to your forehead. Late steps are painting texture, and holding that tightly at step 7 is what gives you glassy, over-faithful results with no new detail. So the sensible curve is high-to-low.
Element Strength Schedule is a tiny MODEL-to-MODEL patch that lets you write that curve as a comma-separated list. It exists because Element Tile Split deliberately doesn't output a MODEL - it outputs latents and conditionings - so if you're driving them through a stock KSampler, there's no widget left on the sampler for reference strength. This node is the wire between your model loader and the KSampler's model input.
How it works
The patch wraps the diffusion model's forward pass and reads the reference latent that's attached to your conditioning on every call. Then it decides, per step, how much of that reference to honour:
- A value of 1.0 means "do exactly what you'd do normally" - the patch short-circuits and the pass runs untouched.
- A value of 0.0 means the reference is stripped for that step entirely.
- Anything in between runs the forward twice - once with the reference, once without - and blends the two predictions by the strength. That's the honest way to get a fractional effect, and it costs you roughly cfg=2 throughput for those steps.
Step counting watches the timestep: down means next step; a jump back up means a new sampling run (the next tile) and the counter resets. Which is why one patched model covers a whole tile batch.
A nice consequence: an all-whole-number list - 1,1,1,0, or all 1.0 - runs in binary mode, stripping the reference on zeroed steps for free. Fractions cost a second forward, and mostly you don't need them.
What you set
Two things, and one of them is a socket.
model - your checkpoint or UNet loader output. Put LoRAs and other model patches upstream; this node clones the model and adds a wrapper, so order rarely matters, but upstream is the less surprising arrangement.
reference_strength - the list. Default is 1.0,1.0,1.0,0.8,0.5, and that's a reasonable starting shape. The author's own guidance is simpler: first few steps at 1.0, then relax. On a turbo model with 4 steps, 1.0,1.0,0.9,0.8 is what the README suggests. Never go below 0.7 across the board or you'll get drift, because the model is remaking the image rather than refining it - and if you do see drift, flatten the whole thing to all 1.0 and start again.
Formatting is forgiving: English commas, Chinese commas, 、 and colons all work as separators. A single value applies everywhere; fewer values than steps repeats the last one; extra ones get truncated. Decimals need a period - 0,8 is a parse error, not 0.8.
One subtlety worth internalising, from the tooltip: the list maps to steps, not sigmas. So sliding denoise around doesn't rescale your curve - the seventh value is the seventh step whether you're at denoise 0.6 or 1.0.
Wiring it
Loader → Element Strength Schedule → KSampler model. Branch around it and you get default reference behaviour, no schedule, no warning. Pair it with Element Tile Split for latents and Element Tile Merge for assembly.
Using Element Tiled Upscale instead? You don't need this. That node has the same scheduling built in via its own reference_strength field, and ignores anything patched upstream.
Install
Manager → ComfyUI-Element_TileEdit, or:
cd ComfyUI/custom_nodes
git clone https://github.com/supElement/ComfyUI-Element_TileUpscale
Restart. No dependencies, no model files.
Where it bites
The big one: on models without reference-latent support - SDXL, Qwen-Image-2512, plain Flux t2i - the schedule has nothing to modulate. It'll load, run, and change nothing. If you're wondering why the list has no visible effect, check your model before you check the list.
Second, the fractional path is genuinely expensive on a tiled workflow. Every tile is already a full sampling run; double-forwarding half your steps means you've roughly doubled the tile cost. If you're trying to be clever with a fine-grained curve, spend it on steps where it matters rather than smoothing the whole ramp.
Third, this node identifies models by inspecting their internals, and it needs to find the reference latent in the right forward argument to do anything. That's reverse-engineered against current ComfyUI and current model implementations, not a stable contract. An upstream rename or a changed forward signature is exactly the kind of thing that makes it stop working silently - the author is upfront about this in the README. Keep that in mind when a workflow that used to hold identity suddenly stops.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| reference_strength | STRING | 1.0,1.0,1.0,0.8,0.5 | The list of reference strengths per step corresponds solely to the 'steps' parameter; 'denoise' or 'sigma' values have no effect.Supports delimiters including commas (Chinese/English), enumeration commas (、), and colons. A single value applies to every step.If fewer values are provided than the number of steps, the final value is repeated; if more are provided,the list is truncated. A value of 1.0 represents the original behavior. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| MODEL | MODEL | — |