Set Keyframe
The low-level glue behind Schedule Prompt, when you need it
- keyframed_condition
- schedule
- SCHEDULE
If you read the article on Schedule Prompt, you've already used this node - it's the part of that three-in-one that actually sticks a keyframe onto the schedule. Set Keyframe is the same step, exposed as its own node, and you only need it once you want a prompt schedule built from conditionings that didn't come out of a text box.
The workhorse Schedule Prompt combines CLIP Text Encode + Keyframed Condition + Set Keyframe so you never see the pieces. This is the third of those pieces, and it's refreshingly small: it takes a KEYFRAMED_CONDITION and an optional SCHEDULE, and returns the schedule with that keyframe appended. If no schedule is provided, it starts a new one.
When you'd actually reach for it
The common case is already handled for you, so the honest answer is "not often." You reach for Set Keyframe when your conditionings come from somewhere other than raw text - a Keyframed Condition node fed by, say, an IPAdapter or a ControlNet-style conditioning path, or a prompt you built programmatically with other nodes. Keyframed Condition gives you the KEYFRAMED_CONDITION object at a chosen time with a chosen interpolation method; Set Keyframe is what puts it on the timeline.
The inputs
keyframed_condition(required) - the KEYFRAMED_CONDITION you want to place.schedule(optional) - the SCHEDULE to append to. Leave it empty and a new schedule is born from this keyframe.
The output
Exactly one: SCHEDULE. That's the object you chain into the next Set Keyframe (or into a Schedule Prompt to keep mixing text and non-text keyframes on one timeline), and eventually into "Evaluate Schedule At T" or its batch sibling for per-frame conditioning in an AnimateDiff graph.
The one rule that matters
The README is blunt about it: the first keyframe in a schedule should always be at time=0. Curves evaluate relative to the keyframes around them, and a schedule that starts at frame 12 has no answer for frames 0 through 11 - you'll get whatever the previous-interpolation fallback hands you, which is not what you wanted. Put a keyframe at zero, even if it's a prompt you're going to leave immediately.
How to install it
Part of the ComfyUI-Keyframed pack, so it installs with everything else. ComfyUI Manager → search ComfyUI-Keyframed, or:
cd ComfyUI/custom_nodes
git clone https://github.com/dmarx/ComfyUI-Keyframed
then restart ComfyUI. No models to fetch. The pack depends on the keyframed Python library (plus toolz), which its __init__.py auto-installs on import if needed - that's the only moving part.
Troubleshooting
If your schedule renders nothing but a black/empty conditioning, the usual culprit is a missing keyframe at time 0 - add one and re-run. And if a downloaded workflow shows this node and refuses to start, it's the standard missing-pack problem: this is a node class from dmarx/ComfyUI-Keyframed, so if ComfyUI Manager says the pack isn't there, that's the one to install. If the error instead names a model file, that's a different node in the graph; this pack never asks for one.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| keyframed_condition | KEYFRAMED_CONDITION | — | |
| scheduleopt | SCHEDULE | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| SCHEDULE | SCHEDULE | — |