Nodes/Volcengine Seedance/Seedance 2.0 Generate (Volcengine)
ComfyUI Node

Seedance 2.0 Generate (Volcengine)

Seedance in ComfyUI without the VRAM question — it's an API call

By kuangrenaigc-stack·Created 5 months ago·Updated 5 months ago· 2
Seedance 2.0 Generate (Volcengine)
  • image
  • last_frame_image
  • video_path
  • video_url
  • last_frame_path
  • last_frame_url
  • task_id
  • status
  • response_json
◄api_key►
◄prompt►
◄modeldoubao-seedance-2-0-260128►
◄resolution720p►
◄ratioadaptive►
◄duration5►
◄seed-1►
◄generate_audiotrue►
◄watermarkfalse►
◄return_last_framefalse►
◄wait_for_resulttrue►
◄download_videotrue►
◄download_last_framefalse►
◄poll_interval30►
◄timeout_seconds1800►
◄image_rolefirst_frame►
◄first_frame_url►
◄last_frame_url►
◄reference_image_urls►
◄reference_video_urls►
◄reference_audio_urls►
◄execution_expires_after172800►
◄priority0►
◄safety_identifier►
◄callback_url►
◄base_urlhttps://ark.cn-beijing.volces.com/api/v3►
◄extra_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 set ARK_API_KEY as 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 ComfyUI IMAGE in for first-frame image-to-video (first_frame), or use it as a style reference (reference_image). last_frame_image / last_frame_url set 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_result sleeps 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 image gets 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 in response_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.

CategoryVolcengine/Seedance

Inputs (29)

NameTypeDefaultDescription
api_keySTRING—
promptSTRING—
modelSTRINGdoubao-seedance-2-0-260128—
resolutionCOMBO720p3 options: 720p, 480p, 1080p
ratioCOMBOadaptive7 options: adaptive, 16:9, 4:3, 1:1, 3:4, 9:16, +1
durationINT5-1–15—
seedINT-1-1–4294967295—
generate_audioBOOLEANtrue—
watermarkBOOLEANfalse—
return_last_frameBOOLEANfalse—
wait_for_resultBOOLEANtrue—
download_videoBOOLEANtrue—
download_last_frameBOOLEANfalse—
poll_intervalINT305–120—
timeout_secondsINT180060–7200—
image_roleCOMBOfirst_frame3 options: first_frame, reference_image, none
first_frame_urlSTRING—
last_frame_urlSTRING—
reference_image_urlsSTRING—
reference_video_urlsSTRING—
reference_audio_urlsSTRING—
execution_expires_afterINT1728003600–259200—
priorityINT00–9—
safety_identifierSTRING—
callback_urlSTRING—
base_urlSTRINGhttps://ark.cn-beijing.volces.com/api/v3—
extra_jsonSTRING{}—
imageoptIMAGE—
last_frame_imageoptIMAGE—

Outputs (7)

NameTypeDescription
video_pathSTRING—
video_urlSTRING—
last_frame_pathSTRING—
last_frame_urlSTRING—
task_idSTRING—
statusSTRING—
response_jsonSTRING—