Nodes/ComfyUI-FrameFX/Live Prompt Interpolation
ComfyUI Node

Live Prompt Interpolation

Type a new prompt mid-run and watch the animation steer toward it live

By mgfxer·Created 2 years ago·Updated 2 years ago· 25
Live Prompt Interpolation
    • text
    • current_strength
    • previous_strength
    • toggle_state
    new_promptEnter your prompt here...
    seed311
    total_frames100
    update_cycle10
    min_char_count30
    char_stability_frames5

    Live Prompt Interpolation is the node that makes the Dream Zoom workflow feel like a DJ set instead of a render farm. You're auto-queueing animation frames, the prompt box is sitting there, and you type something new. This node notices - after the right delay - and steers the animation from the previous prompt to the new one over a set number of frames, live, without you touching the queue.

    The trick is that "after the right delay." Nobody wants the animation to lurch sideways on every keystroke, so this node is built around trigger thresholds. It only registers a new prompt when three things line up: the new text is different from the current one, it's long enough to be a real change (≥ min_char_count, default 30), and the character count has been stable for char_stability_frames (default 5) frames. Typing "a" then "ab" then "abc" never fires. A solid, finished prompt does.

    How it works

    The node is stateful - it remembers your previous prompt, current prompt, and where it is in the interpolation across queued runs. When it commits a new prompt, it resets the frame counter, flips toggle_state between 0 and 1, and starts blending. The blend itself is classic weighted interpolation: the previous prompt gets weight (1-t) and the current gets (t), where t is current_frame / total_frames. You get the old prompt fading out inside the new one fading in, in the A1111-style (prompt:weight) syntax your sampler already understands.

    One implementation detail worth knowing: the interpolation actually runs in a spawned python subprocess - the "Python Code Box" pattern this node inherits from atom.p's nodes, which the author credits. It works, but it means the python executable has to be findable from ComfyUI's environment.

    The inputs

    • new_prompt - the text box you edit live. This is the only input you'll touch day to day.
    • total_frames (default 100) - length of the blend once a new prompt is committed.
    • update_cycle, min_char_count, char_stability_frames - the trigger tuning. Raise min_char_count if short prompt swaps feel twitchy; lower it if long-ish changes never seem to register.
    • seed - drives frame counting inside the interpolation.

    The outputs

    • text - the interpolated prompt string for the current frame. Feed this into your CLIP encoder.
    • current_strength and previous_strength - the blend weights for each prompt, if your workflow wants the numbers separately.
    • toggle_state - 0 or 1, flips on every committed change. Handy if you're toggling something else in the workflow in step with prompt changes.

    Installing it

    Standard FrameFX install - ComfyUI Manager, search ComfyUI-FrameFX, install, restart. Or clone:

    cd ComfyUI/custom_nodes
    git clone https://github.com/mgfxer/ComfyUI-FrameFX
    

    No dependencies beyond stock ComfyUI, no models to fetch.

    Where people get burned

    If text comes back empty, the subprocess couldn't find python on PATH - a known wrinkle on some portable/Windows setups; point ComfyUI's environment at your Python. If prompts feel like they never take, your min_char_count is set above your typical prompt length. And remember it's stateful: the node holds your previous prompt between runs, which is the point - it's also why this node doesn't make sense outside an auto-queue animation setup. On a one-shot static render it's just a slower way to type.

    CategoryScripting

    Inputs (6)

    NameTypeDefaultDescription
    new_promptSTRINGEnter your prompt here...
    seedINT311
    total_framesINT100
    update_cycleINT10
    min_char_countINT30
    char_stability_framesINT5

    Outputs (4)

    NameTypeDescription
    textSTRING
    current_strengthFLOAT
    previous_strengthFLOAT
    toggle_stateINT