Nodes/FizzNodes/Batch Prompt Schedule (Latent Input) πŸ“…πŸ…•πŸ…
ComfyUI Node Runs on cloud

Batch Prompt Schedule (Latent Input) πŸ“…πŸ…•πŸ…

Same prompt scheduling, but let your latent batch set the frame count

By FizzleDorfΒ·Created 3 years agoΒ·Updated 2 years agoΒ· 479
Batch Prompt Schedule (Latent Input) πŸ“…πŸ…•πŸ…
  • clip
  • num_latents
  • POS
  • NEG
  • INPUT_LATENTS
β—„text"0" :"", "11" :"", "23" :"", "35" :"", "47" :"", "59" :"", "71" :"", "83" :"", "95" :"", "107" :"", "119" :"" β–Ί
β—„print_outputfalseβ–Ί
β—„pre_textβ€”β–Ί
β—„app_textβ€”β–Ί
β—„start_frame0β–Ί
β—„end_frame0β–Ί
β—„pw_a0.0β–Ί
β—„pw_b0.0β–Ί
β—„pw_c0.0β–Ί
β—„pw_d0.0β–Ί

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.

CategoryFizzNodes πŸ“…πŸ…•πŸ…/BatchScheduleNodes

Inputs (12)

NameTypeDefaultDescription
textSTRING"0" :"", "11" :"", "23" :"", "35" :"", "47" :"", "59" :"", "71" :"", "83" :"", "95" :"", "107" :"", "119" :"" β€”
clipCLIPβ€”
num_latentsLATENTβ€”
print_outputBOOLEANfalseβ€”
pre_textoptSTRINGβ€”
app_textoptSTRINGβ€”
start_frameoptINT00–9999β€”
end_frameoptINT00–9999β€”
pw_aoptFLOAT0.0-9999–9999β€”
pw_boptFLOAT0.0-9999–9999β€”
pw_coptFLOAT0.0-9999–9999β€”
pw_doptFLOAT0.0-9999–9999β€”

Outputs (3)

NameTypeDescription
POSCONDITIONINGβ€”
NEGCONDITIONINGβ€”
INPUT_LATENTSLATENTβ€”