Seedance 2.0 Generate (Volcengine)
Seedance in ComfyUI without the VRAM question — it's an API call
- image
- last_frame_image
- video_path
- video_url
- last_frame_path
- last_frame_url
- task_id
- status
- response_json
The name is a small lie: nothing here runs on your GPU. Seedance 2.0 is ByteDance's flagship text-to-video model, and like everything else in the Seedream/Seedance line it is API-only - the weights were never released, and people who go looking for a 12 GB VRAM recipe get a one-line answer: "It's a closed model, API only." This node is the front door to that API, so you get Seedance 2.0's leaderboard-topping quality while your local machine just babysits the HTTP calls. If you already have a Volcengine Ark key, it's the fastest way to put a commercial-grade video model in an existing ComfyUI workflow without swapping out your whole setup.
How it works
Under the hood it's embarrassingly clean - which is the point. The pack uses only Python's standard library (urllib), so there's no heavy dependency to fight. The node assembles your prompt and any images into a JSON content array, POSTs it to the Ark endpoint (contents/generations/tasks), then, when wait_for_result is on, polls the task every poll_interval seconds until it hits a terminal status. On success it downloads the mp4 to ComfyUI/output/seedance/ and hands you the path.
The model string defaults to doubao-seedance-2-0-260128, and base_url defaults to the Ark v3 endpoint - you normally leave both alone.
Inputs that actually matter
You'll set maybe five of these, and the rest have sane defaults:
api_key- paste your Ark key here, or setARK_API_KEYas an environment variable so it never lands in a shared workflow. The node checks the field first, then the env var.prompt- text-to-video: prompt alone is enough.image+image_role- wire a ComfyUIIMAGEin for first-frame image-to-video (first_frame), or use it as a style reference (reference_image).last_frame_image/last_frame_urlset the end frame for first-and-last-frame generation.resolution,ratio(adaptive,16:9,9:16, …),duration(5s default, up to 15),seed(-1 for random).generate_audio(on by default),watermark(off by default - yes, that's a thing you can control).
There are also reference URL fields (reference_image_urls, reference_video_urls, reference_audio_urls) for public URLs, asset://... IDs, or data URIs - the README's "reference image + reference video" edit example maps straight onto them. extra_json merges arbitrary fields into the request body if Ark adds a parameter the node doesn't expose yet; it overrides auto-built content if you include content. callback_url and safety_identifier are for serious pipeline users; ignore them until you need them.
The three toggles that shape your workflow
wait_for_result (default true) blocks the whole ComfyUI queue until the job finishes, fails, or trips timeout_seconds (default 30 min). That's fine for an interactive run; for batch or queue-heavy use, turn it off, let the node return the task_id, and collect results later with the sibling Seedance Query Task node. download_video (default true) saves the mp4 locally; return_last_frame tells the API to also generate a last frame, which download_last_frame then pulls.
Outputs
Seven strings: video_path and video_url (the local file and the Ark-hosted URL), last_frame_path / last_frame_url when you asked for a last frame, plus task_id, status, and response_json for debugging. video_path is the one that feeds the rest of a workflow (e.g. into a VHS or preview node); task_id is what you hand to the Query node.
Install
Through ComfyUI Manager, search for "Volcengine Seedance", or clone it:
cd ComfyUI/custom_nodes
git clone https://github.com/kuangrenaigc-stack/ComfyUI-Volcengine-Seedance
Restart ComfyUI. There is no requirements.txt worth mentioning - no model downloads, no torch version headaches. The only setup that actually matters is the Ark account and key, which (fair warning) historically wanted a Chinese phone number, though third-party resellers exist.
Where people get burned
- Blocked queue.
wait_for_resultsleeps on the ComfyUI execution thread. For long generations this freezes everything behind it - flip it off and query later. - Role conflicts. The API forbids mixing first/last-frame mode with multimodal reference inputs. The node catches the obvious ones - two first frames, or a last frame without a first - and raises a clear error, but the fix is on you: pick one mode.
- Huge images. Anything wired into
imagegets base64-encoded as PNG into the request. A 4K frame is megabytes of base64; keep inputs reasonable or use URLs. - Task died. If the job ends
failed/cancelled/expired, or the poll times out, the node raises with the raw error inresponse_json- paste that into the Ark docs before assuming the node is broken.
It's a thin, MIT-licensed wrapper around a paid API, and that's the right way to think about it: if you want Seedance 2.0 in your ComfyUI graph, this is the least-friction door to it.
Inputs (29)
| Name | Type | Default | Description |
|---|---|---|---|
| api_key | STRING | — | |
| prompt | STRING | — | |
| model | STRING | doubao-seedance-2-0-260128 | — |
| resolution | COMBO | 720p | 3 options: 720p, 480p, 1080p |
| ratio | COMBO | adaptive | 7 options: adaptive, 16:9, 4:3, 1:1, 3:4, 9:16, +1 |
| duration | INT | 5-1–15 | — |
| seed | INT | -1-1–4294967295 | — |
| generate_audio | BOOLEAN | true | — |
| watermark | BOOLEAN | false | — |
| return_last_frame | BOOLEAN | false | — |
| wait_for_result | BOOLEAN | true | — |
| download_video | BOOLEAN | true | — |
| download_last_frame | BOOLEAN | false | — |
| poll_interval | INT | 305–120 | — |
| timeout_seconds | INT | 180060–7200 | — |
| image_role | COMBO | first_frame | 3 options: first_frame, reference_image, none |
| first_frame_url | STRING | — | |
| last_frame_url | STRING | — | |
| reference_image_urls | STRING | — | |
| reference_video_urls | STRING | — | |
| reference_audio_urls | STRING | — | |
| execution_expires_after | INT | 1728003600–259200 | — |
| priority | INT | 00–9 | — |
| safety_identifier | STRING | — | |
| callback_url | STRING | — | |
| base_url | STRING | https://ark.cn-beijing.volces.com/api/v3 | — |
| extra_json | STRING | {} | — |
| imageopt | IMAGE | — | |
| last_frame_imageopt | IMAGE | — |
Outputs (7)
| Name | Type | Description |
|---|---|---|
| video_path | STRING | — |
| video_url | STRING | — |
| last_frame_path | STRING | — |
| last_frame_url | STRING | — |
| task_id | STRING | — |
| status | STRING | — |
| response_json | STRING | — |