BytePlus Seedance 2.5 Reference to Video
50 references, three jobs in one node
- VIDEO
- draft_task_id
- last_frame
- response
This is the node the rest of the pack exists to feed. Everything else - the create-asset nodes, the asset library, the LLM that writes your shot prompt - is plumbing for the idea that you can hand Seedance a small mood board and a paragraph, and get a shot back that respects both. Reference-to-video is also where Seedance stops being a generator and becomes an editor: hand it a clip and ask it to change something, or to keep going past the end.
Three jobs, one node, chosen by task_type: reference (make something new from images/videos/audio), edit (change something in a clip you supply), and extend (continue a clip's motion and sound). auto lets the model decide. The two that need a video are edit and extend - the node will refuse either without one, because there's nothing to change or continue.
How it works
Under the model picker you get the text side - prompt, resolution, ratio, duration, generate_audio, output_format, and on 2.5 the task_type - and below that, three autogrow groups: reference_images (image_1…), reference_videos (video_1…) and reference_audios (audio_1…), plus reference_assets (asset_1…). Seedance 2.5 accepts a lot: 30 images, 10 videos and 10 audio clips, 50 references in total. The 2.0 series gives you 9 + 3 + 3, 15 total. Durations are capped in aggregate too, and the node checks before submitting rather than letting the API bounce you.
Positional prompt references are the trick to learn: connected inputs come first, then the asset_N entries, and you refer to them as Image 1, Video 1, Audio 1 in your prompt. The node also accepts asset1, asset2 and rewrites them into the right positions for you, which is much less error-prone when you add a reference at 2 a.m.
Three more inputs live on this node: auto_downscale (on by default, targets the model's per-resolution reference-video pixel limits), auto_upscale (off by default, advanced), and the usual seed, watermark, generation_count, non_blocking.
Outputs
VIDEO as a list - one entry per generation when generation_count is above 1, and the next node runs once per video. last_frame as an image batch in the same order, which is how the pack's own Seedance Video Extension template chains three clips into one 15-second sequence: each node's last frame and audio carry into the next. response for the task JSON and draft_task_id when you're running a Draft model.
Install and the Comfy.org catch
cd ComfyUI/custom_nodes
git clone https://github.com/byteplus-sa/ComfyUI-BytePlus-ModelArk
pip install -r ComfyUI-BytePlus-ModelArk/requirements.txt
Restart (ComfyUI 0.31.0 or newer), or install via Manager by searching BytePlus ModelArk. Save the ModelArk key and region in Settings → BytePlus.
Now the catch, and it's specific to this node: Seedance only accepts reference videos as URLs, so any video you connect has to be uploaded to Comfy.org storage first. That needs a Comfy.org login (or a Comfy.org API key) inside ComfyUI, and it doesn't work with --disable-api-nodes. Uploads get deleted after about 24 hours and the pack reuses one for up to 12 hours, so you're not re-uploading on every run. Connected images and audio are sent inline - nothing uploaded. If you want to skip Comfy.org entirely, pass an https:// link or an asset:// ID in one of the asset_N inputs instead. Note that asset_N looks up what type an asset is, and that lookup needs your IAM AK/SK.
Where people get burned
The reference count is the first wall, and it's counted across connection types: nine local images plus four asset images is thirteen against a limit of nine on 2.0, and the error names the total, the local count and the asset count so you can see which one to trim.
Then the login. "Comfy.org login required" appears in the middle of a video job and reads like a bug the first time. It isn't; it's the only way to get your local clip to a URL Seedance will accept.
And then: cost. Editing a reference video is priced like generating one, so the "just tweak it" loop is real money per iteration. The pack's own Seedance Video Extension template tells you to log in for the same reason.
One more, cheap to get right: don't tell the model what's in a reference and then also describe it in contradictory detail. Positional references (Image 1) plus a clear instruction beats a paragraph of re-description, and it's the difference between an edit and a re-imagining.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| model | COMBO | Seedance 2.5 for the newest model, videos up to 30 seconds and mp4/mov output; Seedance 2.5 Draft for a quick 480p preview whose draft_task_id renders the 1080p final in the BytePlus Seedance 2.5 Draft to Final Video node; Seedance 2.5 Premium for 4k output, and Seedance 2.5 Premium Draft for its 480p preview (rendered in 4k); Seedance 2.0 for maximum quality and 4k; Fast for speed optimization; Mini for the fastest, lowest-cost generation. | |
| seed | INT | 00–2147483647 | Seed controls whether the node should re-run; results are non-deterministic regardless of seed. |
| watermark | BOOLEAN | false | Whether to add a watermark to the video. |
| generation_count | INT | 1 | Number of separate generations to run in parallel. With several, generation N uses seed + N so the results differ. |
| non_blocking | BOOLEAN | false | Submit the task and return at once; run the node again to collect the finished video. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| VIDEO | VIDEO | The generated video, or every video of a generation_count batch (the next node runs once per video). |
| draft_task_id | STRING | Task ID of a Seedance 2.5 Draft or Seedance 2.5 Premium Draft run. Connect it to the BytePlus Seedance 2.5 Draft to Final Video node to render the final (1080p, or 4k for Premium). Several drafts (generation_count above 1) give one ID per line. |
| last_frame | IMAGE | Last frame of each generated video, as one image batch in the same order as the videos. |
| response | STRING | Task responses as JSON. |