Keyframe Interpolation Part
One node for the 'real footage slowly becomes AI' effect
- image
- part
- part
This is the node people actually search for when they find this pack. It's the "gradual AI takeover" effect in a single box: your video starts as real footage, and frame by frame the AI redraws more and more of it, until the end is fully generated. Before this pack, doing that meant running your whole batch through several KSamplers at different denoise strengths - multiple passes, all of it slow. Keyframe Interpolation Part replaces that with one node and one sampling pass.
How it works
Give it one image and a range of batch indices, and it emits a keyframe for every index in that range, with the denoise value interpolated from denoise_from to denoise_to. The interpolation math is straightforward easing on top of a linear ramp:
- linear - the denoise climbs evenly across the range.
- ease-in - slow start, accelerates toward the end.
- ease-out - fast start, settles down.
- ease-in-out - gentle at both ends, the S-curve.
Note the end index is exclusive: a range from 0 to 4 covers batch indices 0, 1, 2, and 3. And it raises a ValueError if batch_index_from is greater than or equal to batch_index_to, so mind that before you wire it.
The inputs that matter
image(IMAGE) - the anchor frame. One thing to know: this single image is reused for every keyframe in the ramp. If you want different images per index, you need multiple Keyframe Part nodes instead.batch_index_from/batch_index_to(INT) - where the ramp starts and stops.denoise_from/denoise_to(FLOAT) - the redraw strength at each end, 0.001 to 1.interpolation- the easing curve above.part(LATENT_KEYFRAME_PART, optional) - chain in an existing group to merge.
The classic recipe: denoise_from 0.1 (keep your footage almost intact) up to denoise_to 1.0 (full redraw). Early frames stay glued to the source, the middle drifts, and the tail is pure AI. If you want the source to survive longer before the morph takes over, ease-in-out is usually nicer than linear - the first frames stay near-faithful, then the transformation accelerates in the middle.
Merging with an existing part
If you feed an existing part into the optional input, the ramp merges rather than replaces. One subtlety worth knowing: the merge direction is the opposite of Keyframe Part. Where chaining Keyframe Part nodes lets the newer node win collisions at the same index, this node re-adds your existing keyframes after the ramp - so an existing keyframe at the same batch index overrides the ramp's entry. If you're relying on overlap, test it rather than assuming.
Where it goes next
The part output feeds straight into Keyframe Apply along with your model, latent, and VAE. And the same gotcha applies as everywhere in this pack: set your KSampler to one of the injected samplers - k_euler, k_euler_a, or k_lcm - or the ramp is silently ignored.
Installing it
ComfyUI Manager (search "ComfyUI-Keyframe", listed as SComfyUI-Keyframe), or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/Scholar01/ComfyUI-Keyframe
Restart, and you're done - no requirements.txt, no models to download. It's a tiny pack from the AnimateDiff era by Scholar01 (the sd-webui-mov2mov author), so on a modern ComfyUI there's a chance its import-time patching has rotted; that's the price of a two-line README.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| batch_index_from | INT | 00–9999 | — |
| batch_index_to | INT | 41–9999 | — |
| denoise_from | FLOAT | 0.100.001–1 | — |
| denoise_to | FLOAT | 1.000.001–1 | — |
| interpolation | COMBO | 4 options: linear, ease-in, ease-out, ease-in-out | |
| partopt | LATENT_KEYFRAME_PART | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| part | LATENT_KEYFRAME_PART | — |