Nodes/was-node-suite-comfyui/KSampler Sequence (v2)
ComfyUI Node Runs on cloud

KSampler Sequence (v2)

Keyframe-driven, with the anti-stall knobs

By WASasquatch·Created 4 years ago·Updated a day ago· 1,864
KSampler Sequence (v2)
  • model
  • positive_seq
  • negative_seq
  • latent_image
  • LATENT
◄seed0►
◄seed_mode_seq▾►
◄alternate_valuestrue►
◄steps20►
◄cfg8.0►
◄sampler_name▾►
◄scheduler▾►
◄frame_count0►
◄cond_keyframes0►
◄use_conditioning_slerpfalse►
◄cond_slerp_strength0.500►
◄use_latent_interpolationfalse►
◄latent_interpolation_mode▾►
◄latent_interp_strength0.500►
◄denoise_start1.00►
◄denoise_seq0.50►
◄unsample_latentsfalse►
◄inject_noisetrue►
◄noise_strength0.100►
◄denoise_sinetrue►
◄denoise_max0.900►
◄seed_keyingtrue►
◄seed_keying_mode▾►
◄seed_divisor4►

This is the second generation of the sequence sampler, and the difference is the schedule. The original counts loops; this one counts frames and changes prompt when the frame number lands on a keyframe - which means it pairs with CLIP Text Encode Sequence (v2), a node that computes the whole keyframe schedule for you from a prompt list and a total frame count.

If you're starting fresh in 2026, start here. The v2 pair is easier to reason about, and this node carries the three features the old one didn't have: noise injection, a denoise that swings over the length of the run, and a seed that follows a repeating pattern instead of just stepping.

Feeding it

model is your diffusion model and positive_seq / negative_seq are the prompts. They accept either the list that the v2 encoder produces - stepped through on the same keyframes as each other - or a single plain conditioning, which is then used for every frame.

frame_count and cond_keyframes are the schedule. Wire them from the encoder's matching outputs and don't type them by hand. The default of 0 for each is a deliberate trap-defuser: at frame_count 0, or with no keyframes connected, the run becomes one frame per prompt instead of a sequence.

latent_image, steps, cfg, sampler_name and scheduler are what you'd expect. steps is per frame and the whole run costs that times the frame count, so a 100-frame run at 20 steps is 2,000 sampler steps - that's the number to sanity-check before you queue. On the sampler choice: euler is the steadiest across a sequence, and the ancestral and SDE variants add both detail and frame-to-frame flicker, which is a real trade and not a moral failing.

The knobs that exist because long runs stall

A sequence sampled this way has a failure mode: each frame starts from the last, so it settles. It stops moving. Three features here push back.

inject_noise with noise_strength stirs fresh noise into each frame before sampling - 0.1 keeps the picture and adds movement, above about 0.3 the composition starts breaking up frame to frame. That's the cheapest anti-stall lever.

denoise_sine with denoise_seq and denoise_max makes the denoise swing between two bounds across the run "on a sine wave", in the node's own words, so the sequence breathes - settling for a stretch, opening up again. denoise_seq is the low end (0.2 barely moves, 0.5 changes noticeably), denoise_max the high end (0.9 lets the picture change a great deal at the top of the wave).

seed_keying with seed_keying_mode and seed_divisor ties the seed to the frame number. sine swings it smoothly around the base seed once every seed_divisor frames; modulo holds it and jumps on every divisor-th frame, skipping the unsample pass on those frames. The point, per the tooltip, is that a repeating pattern brings back seeds the run has already used - so the sequence comes back round to a look instead of drifting away from it for good. 4 gives a fast flutter, 24 a slow swing across a second of video.

unsample_latents is the expensive one and worth knowing about: each frame first runs the sampler backwards over the previous one, pushing it back up the noise schedule before resampling, so the new prompt has something to re-resolve rather than a finished image to leave alone. Roughly double the time per frame.

The gotchas, in order of how often they bite

use_conditioning_slerp does not work the way it does on the older node. On v2 it rebuilds each frame's conditioning from its embedding and pooled output alone - so anything else the prompt carried, an area, a mask, a control hint, is dropped. Its tooltip says to leave it off unless the prompts are plain text encodes, and that's advice, not a suggestion. And cond_slerp_strength genuinely does nothing here: the two ends of the interpolation are the same prompt. It's the one widget in the node that exists for symmetry.

use_latent_interpolation with latent_interp_strength is the real jumpiness control - 1.0 keeps the new frame whole, 0.5 is an even blend with the one before, and low values nearly freeze the sequence. Slerp holds contrast better than Blend.

And the scale problem: this is the last node in the pack you want to point at 500 frames. Everything multiplies - steps, time, and accumulated drift.

Installing it

It's in WAS Node Suite v3 - MIT, WASasquatch, 468 nodes - so install the pack:

cd ComfyUI/custom_nodes
git clone https://github.com/WASasquatch/was-node-suite-comfyui.git

ComfyUI Manager's WAS Node Suite v3 entry is the recommended route. ComfyUI 0.14.0+, Python 3.10+, no pip packages installed, nothing downloaded. First start after install (or after a pull) is a beat slower while it writes config.yaml under <ComfyUI user dir>/was-node-suite/ and compiles the pack. The sequence samplers sit in the extras feature group, which is enabled out of the box - if they're missing, that switch is the first place to look.

Worth saying plainly: no sequence sampler in this pack generates motion the way a video model does. There's no temporal attention, no time axis, no idea that frame 12 follows frame 11. The samplers chain latent resampling and let the prompt schedule steer, which makes convincing morphs, prompt travel and short loops - and unconvincing everything else. If you want a moving shot, that's a Wan or LTX-shaped problem now.

CategoryWAS Suite/Sampling

Inputs (28)

NameTypeDefaultDescription
modelMODELThe diffusion model every frame in the run samples with.
seedINT00–18446744073709550000The seed the first frame runs on, and the base every later frame's seed is worked out from. The same seed replays the whole run. Any whole number; `0` is as good a seed as any.
seed_mode_seqCOMBOHow the seed moves from frame to frame, applied after any keying. 'increment' and 'decrement' step it by one, which keeps consecutive frames close; 'random' picks a fresh seed each frame, which makes every frame its own image; 'fixed' leaves the keyed seed alone.
alternate_valuesBOOLEANtrueWhether every other loop runs on a second seed that drifts away from the first instead of on the scheduled one. It gives the run a slight back-and-forth flicker between two looks, which reads as movement in a short sequence. Off, seed_keying and seed_mode decide every frame's seed.
stepsINT201–10000Sampling steps per frame. Around 20 suits most models, and the whole run costs this many steps times the number of frames.
cfgFLOAT8.00–100How closely each frame is held to its prompt. Around 7-8 suits most models; lower is looser and softer, much higher burns contrast and makes a sequence flicker.
sampler_nameCOMBOThe sampling algorithm. 'euler' is the plain, predictable choice and the steadiest across a sequence; the 'ancestral' and 'sde' variants add fresh noise as they go, which adds detail and also adds flicker. The list is whatever this ComfyUI offers.
schedulerCOMBOHow the noise level is stepped down within each frame. 'normal' and 'karras' are the usual choices. The list is whatever this ComfyUI offers.
frame_countINT00–1024How many frames to render. Wire it from CLIP Text Encode Sequence (v2)'s frame_count output. At 0, or with no keyframes connected, the run is one frame per prompt instead.
cond_keyframesINT00–1024The frame numbers at which the run steps to the next prompt. Wire it from CLIP Text Encode Sequence (v2)'s cond_keyframes output, which builds the whole schedule; a single number here means one changeover at that frame.
positive_seqCONDITIONINGThe list of positive prompts to work through, from CLIP Text Encode Sequence (v2). One plain conditioning also works and is then used for every frame.
negative_seqCONDITIONINGThe list of negative prompts, stepped through on the same keyframes as the positive ones. One plain conditioning is used for every frame.
use_conditioning_slerpBOOLEANfalseWhether each frame's conditioning is rebuilt from its embedding and pooled output alone. Anything else the prompt carried, an area, a mask, a control hint, is dropped when this is on, so leave it off unless the prompts are plain text encodes.
cond_slerp_strengthFLOAT0.5000–1Interpolation factor for the rebuild above. The two ends of the interpolation are the same prompt here, so the value makes no difference to the result. Ignored while use_conditioning_slerp is off.
latent_imageLATENTThe latent the first frame starts from, which also sets the size of every frame. An empty latent generates from scratch; an encoded image starts the sequence on that picture.
use_latent_interpolationBOOLEANfalseWhether each new latent is mixed back towards the previous frame before it is kept. It damps down how much can change between two frames, which is the main handle on how jumpy the finished sequence looks.
latent_interpolation_modeCOMBOHow the previous frame is mixed in. 'Blend' is a straight average; 'Slerp' travels along the arc between the two latents and holds contrast better; 'Cosine Interp' eases in and out. Ignored while use_latent_interpolation is off.
latent_interp_strengthFLOAT0.5000–1How much of the newly sampled frame survives the mix. 1.0 keeps it whole and changes nothing, 0.5 is an even blend with the frame before, and low values nearly freeze the sequence. Ignored while use_latent_interpolation is off.
denoise_startFLOAT1.000–1How much of the first frame is redrawn. 1.0 ignores latent_image's content and generates the opening frame from noise; around 0.5 keeps its composition and changes the detail.
denoise_seqFLOAT0.500–1How much every frame after the first redraws, and the low end of the swing when denoise_sine is on. 0.5 lets a frame change noticeably, 0.2 barely moves, and near 1.0 each frame is a fresh image.
unsample_latentsBOOLEANfalseWhether each frame first runs the sampler backwards over the previous one, pushing it back up the noise schedule before resampling. It gives the new prompt something to re-resolve rather than a finished image to leave alone, at roughly double the time per frame.
inject_noiseBOOLEANtrueWhether fresh noise is stirred into each frame before it is sampled. It is what stops a long run settling on one image and holding it; turn it off for the steadiest possible sequence.
noise_strengthFLOAT0.1000.001–1How much noise is stirred in. 0.1 keeps the picture and adds movement; above about 0.3 the composition starts breaking up frame to frame. Ignored while inject_noise is off.
denoise_sineBOOLEANtrueWhether the denoise swings between denoise_seq and denoise_max over the length of the run rather than staying put. The run then breathes , settling for a stretch, opening up again, which suits a long sequence better than one fixed value.
denoise_maxFLOAT0.9000–1The far end of the denoise swing. 0.9 lets the picture change a great deal at the top of the wave; bring it closer to denoise_seq for a flatter run. Ignored while denoise_sine is off.
seed_keyingBOOLEANtrueWhether the seed follows a pattern tied to the frame number instead of only stepping. A pattern that repeats brings back seeds the run has already used, which is how a sequence comes back round to a look rather than drifting away from it for good.
seed_keying_modeCOMBOWhich pattern the seed follows. `sine` swings it smoothly around the base seed once every seed_divisor frames; `modulo` leaves it alone and jumps it on every seed_divisor-th frame, which also skips the unsample pass on those frames. Ignored while seed_keying is off.
seed_divisorINT42–1024How many frames one cycle of the seed pattern takes. 4 gives a fast flutter, 24 a slow swing across a second of video. Ignored while seed_keying is off.

Outputs (1)

NameTypeDescription
LATENTLATENTEvery frame's latent, stacked into one batch in order. Decode it with a VAE Decode to get the frames, then save them as an image sequence or a video.