Batch Prompt Schedule (Latent Input) π π π
Same prompt scheduling, but let your latent batch set the frame count
- clip
- num_latents
- POS
- NEG
- INPUT_LATENTS
Batch Prompt Schedule (Latent Input) is the same node as its parent Batch Prompt Schedule - same keyframe format, same prompt-morphing between frames, same POS/NEG batch outputs - with one difference that matters more than it sounds: you don't type max_frames anymore. Instead you feed it the latent tensor, and the frame count is derived from the latent batch's size.
That's a quiet quality-of-life win, and it's the version you want when your animation length is owned by something else in the graph - typically an AnimateDiff latent batch. If your empty latent is a batch of 24, this node schedules 24 frames and produces 24 conditionings, always in lockstep. No more wondering whether you typed max_frames to match. The source literally sums the batch size: max_frames = sum(tensor.size(0) for tensor in num_latents.values()).
What's different from the plain version
The required inputs swap max_frames for num_latents (a LATENT). Everything else about the schedule text is identical:
"0" :"a cat in a kitchen",
"30" :"a cat in a spaceship, neon lights",
"60" :"a robot cat, cyberpunk city",
Quotes on the frame numbers, commas between entries, --neg to split positive and negative text, and backtick math with t, max_f, and pw_aβpw_d all work exactly as documented for the flagship node. pre_text and app_text still wrap every prompt; start_frame and end_frame remain print-only.
The outputs are POS and NEG conditionings (one per frame in your latent batch) plus an INPUT_LATENTS passthrough - the latents you fed in come back out unchanged, so you can chain the node into a sampler without a second latent wire.
The one real footgun
Because the node derives its frame count from the latent batch, wiring a latent batch of the wrong size silently changes your animation length - there's no max_frames to catch the mismatch. If your prompt transitions are landing on the wrong frames, check the latent that's feeding this node, not the text. And remember the general FizzNodes rule: POS and NEG are a whole batch of conditionings, meant for a sampler that consumes all frames, not single-value widgets.
Install
cd ComfyUI/custom_nodes && git clone https://github.com/FizzleDorf/ComfyUI_FizzNodes.git
cd ComfyUI_FizzNodes && pip install -r requirements.txt
Or grab "FizzNodes" via ComfyUI Manager and restart. Just numpy, pandas, and numexpr - no models to download. This variant is the one to reach for if you're building AnimateDiff workflows and you're tired of keeping two frame counts in sync by hand.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| text | STRING | "0" :"", "11" :"", "23" :"", "35" :"", "47" :"", "59" :"", "71" :"", "83" :"", "95" :"", "107" :"", "119" :"" | β |
| clip | CLIP | β | |
| num_latents | LATENT | β | |
| print_output | BOOLEAN | false | β |
| pre_textopt | STRING | β | |
| app_textopt | STRING | β | |
| start_frameopt | INT | 00β9999 | β |
| end_frameopt | INT | 00β9999 | β |
| pw_aopt | FLOAT | 0.0-9999β9999 | β |
| pw_bopt | FLOAT | 0.0-9999β9999 | β |
| pw_copt | FLOAT | 0.0-9999β9999 | β |
| pw_dopt | FLOAT | 0.0-9999β9999 | β |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| POS | CONDITIONING | β |
| NEG | CONDITIONING | β |
| INPUT_LATENTS | LATENT | β |