Schedule Prompt
Turn a row of prompts into a video that changes its mind
- clip
- schedule
- KEYFRAMED_CONDITION
- CONDITIONING
- SCHEDULE
This is the node you probably came here for. If you've ever wanted an AnimateDiff clip where the prompt changes partway through - a "cinematic" shot that becomes "nighttime city street" at frame 40 instead of asking one prompt to do all of it - Schedule Prompt is how you do it without learning a single line of Deforum or FizzNodes notation. The whole pitch of the ComfyUI-Keyframed pack is that keyframing shouldn't live in a text-string DSL nobody can read; it should live in the node graph, where you can see and edit it. This node is that pitch, wrapped up in the friendliest interface the pack offers.
One Schedule Prompt node = one prompt at one point in time. You lay out a row of them, chain the SCHEDULE output from one into the next's optional schedule input, and by the time you've placed five or six you've written an animation script.
How it works
Under the hood this node is a three-in-one: a CLIP Text Encode, a "Keyframed Condition," and a "Set Keyframe." It tokenizes your text with the clip, encodes it (including the pooled output, which is why prompt-keyframing works at all - both the cross-attention tensor and the pooled vector get their own interpolation curve), stamps it at time, and appends it to the schedule.
The schedule itself is a ParameterGroup carrying two curves: one for the cross-attention conditioning tensor, one for the pooled output. When you query it at a time between two prompts, the interpolation method from the earlier keyframe decides how the tensors blend. That's the mechanism, and it's the same one FizzNodes' PromptSchedule uses - just built from visible, editable pieces.
The inputs that matter
text- the prompt. Multiline, so go ahead and write a paragraph.time- which frame (or second, whatever yourtaxis means) this prompt owns.interpolation_method- the enum that decides how it transitions.linearis the default and matches Deforum/FizzNodes behavior: even lerp from one prompt to the next.previous(ornull) holds the last prompt until the next keyframe,nextjumps at the keyframe, andsin/sin^2ease the transition (slower at the ends). For most peoplelinearis right, andsin^2is the one to try if transitions feel abrupt.schedule(optional) - pass the SCHEDULE output of the previous Schedule Prompt here to keep building the same schedule. If you leave it empty, this node starts a fresh one.
The outputs
Three, but you'll use one: SCHEDULE. Chain it forward and eventually feed it into "Evaluate Schedule At T" (single conditioning) or "Evaluate Schedule At T (Batch)" when you want per-frame conditionings for AnimateDiff. The other two outputs are conveniences - KEYFRAMED_CONDITION if you want to pass this prompt into a Set Keyframe node yourself, and CONDITIONING, which is just the raw encode and is handy for checking a single prompt before you commit to the whole schedule.
Two rules from the README that will save you an hour: the first keyframe in any schedule should live at time=0, and when you're combining weighted conditionings you usually want the weights to sum to 1 (an empty prompt is the standard filler).
How to install it
ComfyUI Manager → search ComfyUI-Keyframed, or clone it by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/dmarx/ComfyUI-Keyframed
then restart ComfyUI. There are no model files - this is pure logic. The only real dependency is the keyframed Python library (plus toolz), which the pack auto-installs on first import if it's missing, and which pulls in matplotlib and a couple of small packages via the library. First load can take a minute while pip does its thing.
Troubleshooting
Two things that actually trip people up. First, if a workflow using these nodes demands model files you don't have, the missing-model error is almost certainly coming from a different node in the graph - AnimateDiff motion modules, VFI interpolators, that sort of thing. This pack downloads nothing and needs nothing. Second, if your transitions look like hard cuts no matter what, check the interpolation method on the earlier prompt's node, not the later one - that's the keyframe that owns the tween. And a gentle reality check: this pack is from the AnimateDiff heyday, and the KB's verdict on AnimateDiff itself is that Wan/LTX have mostly superseded it for new work. The prompt-scheduling skill transfers fine; just know the ecosystem it was built for is quieter now.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| clip | CLIP | — | |
| text | STRING | — | |
| time | FLOAT | 0 | — |
| interpolation_method | COMBO | linear | 6 options: , previous, next, linear, sin, sin^2 |
| scheduleopt | SCHEDULE | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| KEYFRAMED_CONDITION | KEYFRAMED_CONDITION | — |
| CONDITIONING | CONDITIONING | — |
| SCHEDULE | SCHEDULE | — |