Nodes/KIE.ai Nodes Next/Extend Veo3.1 Video
ComfyUI Node

Extend Veo3.1 Video

A second take on a clip that's already too short

By felipederosilva·Created about a month ago·Updated about 22 hours ago· 3
Extend Veo3.1 Video
    • video
    • url
    • all_urls_json
    • task_id
    • raw_json
    • credits_consumed
    • credits_left
    ◄task_idveo_task_abcdef123456►
    ◄promptThe dog continues running through the park, jumping over obstacles and playing with other dogs►
    ◄seeds12345►
    ◄watermarkMyBrand►
    ◄timeout_seconds1200►
    ◄callback_url►

    Veo's native audio is the one video capability with no open-weight answer - the KB's closed-source-models doc calls the gap "genuine," and it's why people put up with paying per second for it. The flip side of a provider-generated clip is that it ends when the provider says so, and eight seconds is often not the shot. Extend is how you get a longer one without regenerating from scratch and losing the performance you already liked.

    How it works

    You hand the node the task ID of a Veo job that already exists on KIE's side, plus a prompt describing what should happen next. The node submits an extension request through KIE's task endpoint, polls until the job lands, then downloads the resulting clip and returns it as a ComfyUI VIDEO object you can wire into Save Video or a combine node.

    The clever bit is what you don't provide: there's no video to upload and no first frame to pin. The provider still has the original, so continuity comes from their side of the fence. That also means this node only works on clips that were generated on that same account - it's a continuation, not a general-purpose video editor.

    Inputs

    task_id is required and is the whole trick. Point it at the original generation. In practice you wire it - the pack's generate nodes publish a task_id string output, so connect that instead of retyping. The field ships with a placeholder string (veo_task_abcdef123456) that will not work.

    prompt describes the extension: actions, scene changes, style. Write it as "the dog keeps running through the park, hurdles a low fence, lands in the grass" - forward motion. A prompt that re-describes the original footage just gives the model two conflicting jobs.

    Optionally:

    • seeds - 10000 to 99999. Same seed, similar content; different seed, different continuation. Useful when you liked everything except one detail in the extend.
    • watermark - a text watermark. The default is a placeholder (MyBrand), so clear it if you don't want a string of somebody's example burned into your output.
    • timeout_seconds - 30 to 7200, default 1200. Video jobs are slow; the default is 20 minutes for good reason.
    • callback_url - leave empty for normal ComfyUI use. The pack polls; this field is for people running their own webhook.

    Outputs

    video is the extended clip - the native Comfy media output, and the one you wire. url is the hosted file, all_urls_json holds every result URL, task_id is this job's ID (feed it back in if you're extending an extension), raw_json is the provider's full response for when something looks wrong, and credits_consumed / credits_left are floats reporting cost and balance. The node also paints both numbers onto itself after a run.

    Install

    cd ComfyUI/custom_nodes
    git clone https://github.com/felipederosilva/ComfyUI-KIE-Nodes-Next
    

    Restart, or install through ComfyUI Manager by searching "KIE.ai Nodes Next". requirements.txt is four small packages - requests, Pillow, numpy, PyYAML - with no model downloads, because every model here lives on KIE's servers. Then paste your API key once in Settings → KIE.ai Nodes Next → Connection; the pack validates it against KIE before saving it over a working key, keeps it out of workflow JSON, and only ever shows the frontend a masked fingerprint. On a headless box, KIE_API_KEY in the environment takes priority over the saved key.

    The one that catches everybody

    1080p clips can't be extended. It's in the field tooltip, and it's the kind of restriction you discover after burning a 1080p generation on the shot you wanted to lengthen. Generate at the lower resolution if you know you'll be extending, and upscale afterwards if it matters.

    Other things worth knowing up front:

    • This costs money twice. The original generation plus the extension. Check credits before chaining three of them.
    • Some packs nodes appear only after a catalog sync. The pack builds its node list from KIE's live API documentation and refreshes it in the background. If this node errors with a message about an endpoint not being resolved, restart ComfyUI or run the catalog refresh node so the deep sync can fill it in.
    • Veo has no local fallback. If you're building a fully offline pipeline, this node is not the one to plan around - it's the capability you rent, not the one you download.
    CategoryKIE Next/Video/Veo3.1

    Inputs (6)

    NameTypeDefaultDescription
    task_idSTRINGveo_task_abcdef123456The task ID of the original video generation. Must be a valid task ID returned by the video generation API. Note: Videos generated in 1080P cannot be extended.
    promptSTRINGThe dog continues running through the park, jumping over obstacles and playing with other dogsA text prompt describing the content of the extended video. It should detail how you want the video to be extended, including actions, scene changes, styles, etc.
    seedsoptINT1234510000–99999A random seed parameter that controls the randomness of the generated content. Range: 10000-99999. The same seed will generate similar video content, while different seeds will generate different video content. If not specified, the system will automatically assign a random seed.
    watermarkoptSTRINGMyBrandWatermark text (optional). If provided, a watermark will be added to the generated video.
    timeout_secondsoptINT120030–7200—
    callback_urloptSTRINGOptional KIE callback URL. Leave empty for normal ComfyUI use.

    Outputs (7)

    NameTypeDescription
    videoVIDEO—
    urlSTRING—
    all_urls_jsonSTRING—
    task_idSTRING—
    raw_jsonSTRING—
    credits_consumedFLOAT—
    credits_leftFLOAT—