Nodes/Seedance 2.0 BytePlus/๐ŸŒฑ Seedance 2.0 Extend
ComfyUI Node

๐ŸŒฑ Seedance 2.0 Extend

Chain clips into videos longer than the 15-second limit

By nnnnkatsuยทCreated 3 months agoยทUpdated about a month agoยท 1
๐ŸŒฑ Seedance 2.0 Extend
    • video_url
    • first_frame
    • new_request_id
    • batch_json
    โ—„request_idโ–บ
    โ—„resolution480pโ–บ
    โ—„duration5โ–บ
    โ—„seed-1โ–บ
    โ—„batch_count1โ–บ
    โ—„api_keyโ–บ
    โ—„endpointโ–บ
    โ—„generate_audiotrueโ–บ
    โ—„promptโ–บ

    Seedance 2.0 clips top out at 15 seconds per generation. Seedance 2.0 Extend is the workaround: it takes a finished clip, extracts its last frame, and uses that frame as the first frame of a new generation - so the story keeps going. Chain this node enough times and 15 seconds becomes a minute, then ten. This is the same trick behind the "infinite length Seedance 2.0" workflows floating around r/comfyui, and this node packages it into something you can actually wire up.

    The input is refreshingly simple: request_id from a completed Seedance 2.0 generation - the cgt-... ID every generator node in this pack returns. Or, if you have a downloadable public video URL or a BytePlus asset:// link instead of a task ID, paste that directly; the node detects the URL form and skips the task retrieval. Everything else is the standard control set: resolution, duration (4โ€“15s per extension), seed, batch_count, plus optional prompt - an "optional continuation prompt" to steer what happens next. Leave it blank and it defaults to "Continue naturally from this frame," which is often exactly right.

    How it works

    This is the most mechanically interesting node in the pack. Given a request_id, it first retrieves the task from BytePlus to get the source video URL. Then it downloads the video, extracts the actual last frame, uploads that frame as the new first frame, and submits a fresh first-frame generation. So the handoff is pixel-accurate by construction - the new clip literally starts on the previous clip's final image. You get the standard outputs (video_url, first_frame, batch_json) plus new_request_id, which is the thing to feed into the next Extend in your chain.

    To chain: Text-to-Video โ†’ Extend (its new_request_id) โ†’ Extend again (the next node's new_request_id), and so on. It's sequential by design - each link depends on the previous render finishing, so an N-link chain costs you N paid renders and N queue waits, back to back.

    Where it breaks

    • Expired sources fail. Extend needs to download the source video's last frame. If the task's output URL has aged past BytePlus's ~24-hour retention, extraction fails and you get an error telling you to use a valid, non-expired URL or a recent request ID. Extend a task the same session, not the same week.
    • Drift accumulates. Each hop re-generates with the last frame as anchor, and small inconsistencies compound across a long chain. For casual continuity it's great; for seamless long-form cuts, expect the seams to show eventually.
    • Cost is per link. An "infinite" video is a finite number of paid renders. The bill and the wait scale linearly with how long you chain.

    Install: ComfyUI Manager โ†’ Install via Git URL โ†’ https://github.com/nnnnkatsu/seedance2-comfyui-byteplus, restart. No model downloads, no GPU required.

    Category๐ŸŒฑ Seedance 2.0

    Inputs (9)

    NameTypeDefaultDescription
    request_idSTRINGrequest_id from a completed Seedance 2.0 generation
    resolutionCOMBO480pBytePlus output resolution. 1080p/4k availability depends on the selected endpoint.
    durationINT54โ€“15โ€”
    seedINT-1-1โ€“4294967295โ€”
    batch_countINT11โ€“10Create multiple extension tasks with different seeds. Cost and wait time scale with this count.
    api_keyoptSTRINGโ€”
    endpointoptSTRINGBytePlus ModelArk endpoint ID, for example ep-...
    generate_audiooptBOOLEANtrueโ€”
    promptoptSTRINGOptional continuation prompt

    Outputs (4)

    NameTypeDescription
    video_urlSTRINGโ€”
    first_frameIMAGEโ€”
    new_request_idSTRINGโ€”
    batch_jsonSTRINGโ€”