Evaluate Schedule At T
The sampler's door into your prompt schedule
- schedule
- CONDITIONING
You've built a prompt schedule - several prompts pinned to times, easing between each other. Now the animation has to actually read that schedule. KfGetScheduleConditionAtTime is the read head: give it a schedule and a time, and it returns the conditioning that should be active at that exact moment - the interpolated blend of your prompts, ready to hand to a KSampler exactly like the output of a CLIP Text Encode. Drive the time input from your frame counter and every frame of the animation gets the right prompt state.
This is the non-batch flavor: one time in, one conditioning out, the same shape of conditioning you'd get from any standard text encode. Its sibling KfGetScheduleConditionSlice does the batch version (one conditioning per frame, for AnimateDiff-style sampling). If you're rendering frame-by-frame or frame-sequentially, this is the node you're wiring.
Why you'd reach for it
Any animation where the prompt evolves. In the README's "Prompt Scheduling" workflow, this node sits between the schedule and the KSampler, pulling the interpolated conditioning for each frame. Because the schedule's keyframes are real interpolations between encoded prompts - not a hard list of prompts - you get smooth morphing: frame 12 might be 50% "a cat" and 50% "a cat in a spacesuit", which is a materially different result from switching prompts at frame 12.
The inputs that matter
schedule- theSCHEDULEto query, usually the output ofSet KeyframeorSchedule Prompt.time- aFLOAT, no default; you must provide it. Frame index or fractional time, whatever your animation loop produces.
Output is a single CONDITIONING, the interpolated result at time. Wire it into the KSampler's positive (or negative - you can absolutely schedule the negative prompt this way too) just like any conditioning.
How it works
Under the hood the schedule is a parameter group carrying two curves - one for the cross-attention conditioning tensor, one for the pooled output - plus a dict of the non-interpolated conditioning metadata. Evaluating at a time queries both curves, interpolating between keyframes per the method stored on the previous keyframe, then reassembles the pooled output into the conditioning dict and returns [(tensor, dict)] - the exact structure ComfyUI expects. The result is a genuine tensor blend, not a selection.
Installing it
Part of ComfyUI-Keyframed. ComfyUI Manager: search "Keyframed". Or:
cd ComfyUI/custom_nodes
git clone https://github.com/dmarx/ComfyUI-Keyframed
Restart ComfyUI. The pack auto-installs keyframed and toolz on first load; no model downloads.
Troubleshooting
The big one: querying before the first keyframe. The README insists the first keyframe lives at time=0, and if it doesn't, an early time query can produce something undefined. Second: if your transitions look like hard cuts no matter what, check the interpolation method on each keyframe - a previous/null method means hold-then-jump by design; you want linear or sin for morphs. And remember this returns one conditioning for one time. If you try to feed a whole batch of frames through this node, that's the wrong tool - the batch version is KfGetScheduleConditionSlice.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| schedule | SCHEDULE | — | |
| time | FLOAT | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| CONDITIONING | CONDITIONING | — |