Protoface Seedance 2.0 · Extend Video
Chaining 15-second segments into a real shot
- video
- files
- run id
What extending really buys you
Every video model in this class generates in short chunks; the difference between a demo and a shot is what happens after the first chunk. Seedance's extend operation takes a clip and writes the continuation, which means you can build a 40-second sequence out of four passes instead of hoping a single prompt holds together for that long.
This is the standard-tier version: 480p through 4K, four to fifteen seconds of new footage per hop, native audio, and optional steering of the frame you want to end on. It's the node I'd use for a real chain rather than a throwaway one, because resolution consistency across segments matters more here than anywhere.
The round trip
Like the rest of the Protoface pack, this is an HTTP client, not a model. The node uploads the clip you're extending, submits a job with your continuation prompt, polls until it's done, downloads the new segment and returns it as a native ComfyUI VIDEO. Per-model fields are generated from the provider's public schema. Nothing runs locally, and each hop is a metered request - billed for output seconds and for the input clip's seconds, with the added input cost capped at 15 seconds.
Inputs worth understanding
video is the clip to continue: a native Video input (a loader, or the output of a previous Protoface job - use the asset-reuse path so it doesn't get re-uploaded).
prompt is the continuation brief, and the tooltip names exactly the four things worth writing: "action, camera movement, lighting, mood." This is a next beat, not a synopsis. "Camera continues the slow push in, rain intensifies, she stops at the window" is the register.
duration is 4–15 seconds of new footage. resolution - 480p, 720p, 1080p or 4K - applies to the segment you're generating, so match it to the clip you're extending unless you enjoy visible resolution steps mid-shot. generate_audio defaults true and produces audio synchronised with the new segment.
last_image is the one optional input, and the one worth the trouble: give the continuation an ending frame and it has somewhere to land. Chained with a last_image per segment, you can plan a whole sequence as a series of poses and beats rather than praying each hop drifts in the right direction.
generation_id is the handle for the paid job. Keep it fixed with identical inputs to resume a recorded run; increment for a new generation. request_scope is auto-assigned; only headless clients supply their own.
Outputs: video (list - and yes, lists here are real, ComfyUI maps downstream nodes over them), files (the originals, useful when a provider's container isn't what your downstream node wanted), run id (for Protoface Resume Run).
Install
ComfyUI 0.41.0+ and Python 3.10+.
cd ComfyUI
git clone --branch v0.1.0 --depth 1 https://github.com/protoface-ai/protoface-comfyui.git custom_nodes/protoface
python -m pip install -r custom_nodes/protoface/requirements.txt
Or Manager: Extensions → Protoface → install protoface-nodes → restart and reload. Run pip with ComfyUI's interpreter (python_embeded/python.exe on Windows portable). Then paste your API key via the Protoface button, or export PROTOFACE_API_KEY. Dependencies: httpx, jsonschema, Pillow, PyAV.
Where it goes wrong
The seam is real and it's yours to fix. You get segments, not a stitched film. Join them locally and expect to trim the last few frames of each - continuation starts from where the model believes your clip ends, which is rarely the exact frame you'd cut on. Audio has to be handled too: each hop's soundtrack is invented independently, so crossfade or replace it.
Chains drift. Every hop only sees the clip you hand it. Faces, wardrobe and lighting wander over several generations, and the fix is fewer, longer hops - at four to fifteen seconds each, you have room.
Iterating on the same hop. Five attempts at one continuation bills five continuations plus five source reads. If a hop isn't working it's usually the prompt's job to fix, not a sixth try.
Assuming a timeout means failure. It doesn't. The pack journals the request identity before it submits, so requeueing unchanged inputs resumes the recorded run. Bumping generation_id after a timeout is how you pay twice for one render.
Feeding it long source. Input billing is capped at 15 seconds on this operation - a decent hint about how much of a long clip it's actually working from. Cut the tail you want continued and pass that instead.
Verdict
The extend operation is the most practical thing in the pack for anyone making anything longer than a single beat. Standard tier is worth the money over Mini if the footage is going out the door - a chain of 4K segments assembled carefully reads as one continuous shot, which is a small magic trick worth learning.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | Describe the cinematic continuation - action, camera movement, lighting, mood. | |
| video | COMBO | A public URL, a data URI, or an asset id. | |
| resolution | COMBO | 720p | Output resolution of the new segment. |
| duration | INT | 54–15 | Length in seconds of the new segment to append (4-15). |
| generate_audio | BOOLEAN | true | Whether to generate native audio synchronized with the output video. Defaults to true. |
| last_image | COMBO | A public URL, a data URI, or an asset id. | |
| generation_id | INT | 00–9007199254740991 | Keep fixed to reuse/resume this paid job. Increment for a fresh paid generation; independent of the model seed. |
| request_scope | STRING | Automatically assigned per node. Headless clients must supply a stable unique workflow/node ID. This is not a secret. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| files | PROTOFACE_FILE | — |
| run id | STRING | — |