KSampler Sequence
A sampler that carries each frame into the next
- model
- positive_seq
- negative_seq
- latent_image
- LATENT
The trick this node packages is older than the node's own docs suggest, and it's the reason there's a whole genre of ComfyUI workflows from 2023 that produce wobbling morph videos. Run the sampler. Take the latent it gave you. Feed it back in at a lower denoise with a different prompt. Do that twenty times.
That loop, written out by hand, is a dozen nodes and a headache. KSampler Sequence is the loop: run the sampler once per iteration, stack the results into one latent batch, and let a prompt schedule decide what each iteration is chasing.
What comes out and what you do with it
One output, latent, and it's a batch - one latent per loop, in order. Decode that batch and save it as frames. There's no video node involved, no ffmpeg, no timing: you're making a numbered image sequence that happens to be related to itself.
Which is the honest framing of what this is. Each loop starts from the previous latent at a lower denoise, so the run reads as movement rather than as unrelated images. But nothing in the model knows about time, and no amount of latent interpolation changes that. This is the AnimateDiff-era approach, and AnimateDiff's own rationale - temporal motion modules bolted onto an image model - got replaced by video models that actually generate frames. Keep expectations accordingly: this is for prompt travel, morphs and short loops, and it's great at those.
The inputs that matter
positive_seq and negative_seq are the schedules, and they're a CONDITIONING_SEQ - a list of frame-tagged conditionings, which is exactly what CLIP Text Encode Sequence (Advanced) emits. A loop with no entry of its own keeps the last one it was given, so a prompt stays in force until the next index. And the negative side needs at least one entry at frame 0, because a loop with nothing to fall back on has no negative prompt at all.
sequence_loop_count is how many frames you get. steps times that is what you're actually asking the GPU to do, so 20 loops at 20 steps is 400 steps of work - budget it.
latent_image is the starting point and sets the size of every frame. An empty latent generates from scratch; an encoded image starts the sequence on that picture.
denoise_start is how much of the first loop is redrawn (1.0 ignores latent_image and generates from noise; ~0.5 keeps its composition), and denoise_seq is the per-loop value for everything after. This is the knob that decides whether the run drifts gently or jumps from frame to frame - 0.2 barely moves, 0.5 is a visible change, near 1.0 and each frame is a fresh image.
seed_mode_seq moves the seed per loop: increment/decrement step by one and keep consecutive frames close, random makes every frame its own image, fixed holds one seed so only the prompt and denoise change anything. alternate_values is the fun one - on by default, it runs every other loop on a second seed drifting away from the first, which reads as flicker between two looks and, in a short sequence, as movement.
Then the two "make it less jumpy" switches. use_conditioning_slerp with cond_slerp_strength blends each loop's conditioning toward the previous one, turning a cut between prompts into a glide - 0.0 keeps the previous prompt, 1.0 takes the new one whole. use_latent_interpolation with latent_interp_strength mixes the new latent back toward the last frame; Blend is a straight average while Slerp travels the arc between the two and holds contrast better. unsample_latents goes further and runs the sampler backwards over the previous frame before resampling, giving the new prompt something to re-resolve - at roughly double the time per loop.
Installing it
Part of WAS Node Suite v3 (MIT, WASasquatch), so:
cd ComfyUI/custom_nodes
git clone https://github.com/WASasquatch/was-node-suite-comfyui.git
Or ComfyUI Manager, searching WAS Node Suite v3. ComfyUI 0.14.0+ and Python 3.10+; the pack installs no packages and fetches nothing, so this isn't one of those packs that can half-install. If the sequence samplers are missing from your Add Node menu, look at the extras feature group in <ComfyUI user dir>/was-node-suite/config.yaml - it's on by default, and it also gates the LUT and latent-upscale nodes.
What bites people
Loops that drift bright. Because each frame starts from the last, contrast and detail accumulate over a long run; that's the characteristic look of chained latent resampling and the reason the interpolation and denoise controls exist. If you need forty frames, drop denoise_seq and interpolate rather than pushing through.
Forgetting there are two ways to smooth a sequence. Conditioning slerp smooths what you asked for; latent interpolation smooths what you got. Turning on both and blaming the sampler for a mushy result is a rite of passage.
And the one that gets everyone eventually: fixed seed, low denoise, one prompt, and the run converges on a single image and then holds it. That's the ladder running out of rungs. Turn on alternate_values or raise denoise_seq.
There's also a v2 of this node. If a workflow from 2026 asks for KSampler Sequence (v2), it pairs with CLIP Text Encode Sequence (v2) and drives off keyframes rather than a loop count - they're different nodes, and the sockets don't match.
Inputs (20)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | The diffusion model every loop in the run samples with. | |
| seed | INT | 00–18446744073709550000 | The seed the first loop runs on, and the base every later loop's seed is worked out from. The same seed replays the whole run; change it for a different one. Any whole number; `0` is as good a seed as any. |
| seed_mode_seq | COMBO | How the seed moves from loop to loop. 'increment' and 'decrement' step it by one, which keeps consecutive frames close and the run smooth; 'random' picks a fresh seed each loop, which makes every frame its own image; 'fixed' holds one seed for the whole run, so only the prompt and the denoise change anything. | |
| alternate_values | BOOLEAN | true | Whether every other loop runs on a second seed that drifts away from the first instead of on the stepped one. It gives the run a slight back-and-forth flicker between two looks, which reads as movement in a short sequence. Turn it off for a single steady progression. |
| steps | INT | 201–10000 | Sampling steps per loop. Around 20 suits most models; more takes proportionally longer, and the whole run is this many steps times sequence_loop_count. |
| cfg | FLOAT | 8.00–100 | How closely each loop 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_name | COMBO | The 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 frame to frame. The list is whatever this ComfyUI offers. | |
| scheduler | COMBO | How the noise level is stepped down within each loop. 'normal' and 'karras' are the usual choices, karras spending more steps at low noise where fine detail is decided. The list is whatever this ComfyUI offers. | |
| sequence_loop_count | INT | 201–1024 | How many loops to run, which is how many latents come out. At 20 the output is a 20-image batch; the frame indices in the conditioning schedule are counted against this same number. |
| positive_seq | CONDITIONING_SEQ | The positive prompt schedule from CLIP Text Encode Sequence (Advanced): pairs of frame index and conditioning. A loop with no entry of its own keeps the last one it was given, so a prompt stays in force until the next index in the list. | |
| negative_seq | CONDITIONING_SEQ | The negative prompt schedule, read exactly as positive_seq is. It needs at least one entry at frame 0, since a loop with nothing to fall back on has no negative prompt at all. | |
| use_conditioning_slerp | BOOLEAN | false | Whether the prompt changes gradually instead of switching over on one frame. On, each loop's conditioning is interpolated towards the one before it by cond_slerp_strength, which is what turns a list of prompts into a blend rather than a cut. |
| cond_slerp_strength | FLOAT | 0.5000–1 | How far each loop moves towards the new prompt when use_conditioning_slerp is on. 0.0 keeps the previous prompt, 1.0 takes the new one whole, 0.5 sits halfway between them. Ignored while that switch is off. |
| latent_image | LATENT | The latent the first loop 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_interpolation | BOOLEAN | false | Whether 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_mode | COMBO | How 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' is a blend that eases in and out, so each frame is held a little longer. Ignored while use_latent_interpolation is off. | |
| latent_interp_strength | FLOAT | 0.5000–1 | How 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_start | FLOAT | 1.000–1 | How much of the first loop 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_seq | FLOAT | 0.500–1 | How much every loop after the first redraws. This is what decides whether the run drifts or jumps: 0.5 lets a frame change noticeably, 0.2 barely moves, and near 1.0 each frame is a fresh image holding nothing of the last. |
| unsample_latents | BOOLEAN | false | Whether each loop first runs the sampler backwards over the previous frame, 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 loop. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| LATENT | LATENT | Every loop'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. |