KIE • Seedance Studio
One Node, Four Video Modes, No Guessing
- first_frame
- last_frame
- reference_image_1
- reference_image_2
- reference_image_3
- reference_video
- reference_audio
- video
- url
- all_urls_json
- task_id
- raw_json
- credits_consumed
- credits_left
Why this is a "Studio" node and not just another model node
Seedance's API has a rule that bites people: the docs treat First Frame / First+Last Frame and Multimodal Reference as mutually exclusive scenarios. If you wire a first frame and a reference image into a raw form and submit, you find out about it from a provider-side rejection after your files have already been uploaded.
Studio nodes in this pack exist for exactly that class of model - capabilities that don't fit a flat widget list. You pick a generation_mode and the node only then looks at the sockets that mode uses, validating locally before anything is sent. The error messages are specific and helpful, e.g. "Multimodal reference mode requires at least one image, video, or audio reference."
The inputs
- model -
bytedance/seedance-2,-2-fast,-2-mini, orbytedance/seedance-2-5. Fast and Mini trade quality for latency and money; 2.5 is the current flagship. - generation_mode -
text,first frame,first + last frame,multimodal reference. - prompt - required in practice; the node raises "Seedance Studio requires a prompt or camera direction."
- resolution (
480p,720p,1080p,4k), aspect_ratio (adaptiveplus 16:9 through 21:9), duration (default 5, range −1 to 30 - the −1 sentinel is the provider's "let the model choose"), generate_audio (on by default). - Mode-dependent sockets: first_frame, last_frame, and for multimodal mode reference_image_1/2/3, reference_video, reference_audio.
- camera_direction - a
STRINGthat gets appended to your prompt with a blank line between them. That's the hook forKIE • Camera Directoror a fullKIE • Shot Sequencedirector prompt. - return_last_frame, web_search, timeout_seconds (1200 default).
Outputs: video, url, all_urls_json, task_id, raw_json, credits_consumed, credits_left. return_last_frame is worth knowing about - it's how you chain clips, taking the final frame of one generation and feeding it as the first frame of the next.
How it works under the hood
Images, video and audio all get uploaded to KIE first, then swapped in as URLs; the node submits a task and polls to completion. Connected images go up as batches for references, and a connected video is transcoded to a temp file before upload, so a 10-bit source is going to cost you a moment before the request even leaves.
ByteDance is the interesting vendor here: every flagship generation product (Seedream, Seedance) stays API-only, while the components underneath ship open. So there is no local Seedance to compare against - this node isn't a wrapper around something you could have run yourself. That's the fair case for an API node.
Install and credentials
cd ComfyUI/custom_nodes
git clone https://github.com/felipederosilva/ComfyUI-KIE-Nodes-Next
pip install -r ComfyUI-KIE-Nodes-Next/requirements.txt
Restart, then one-time key setup at Settings → KIE.ai Nodes Next → Connection (validated before it replaces an existing key; masked afterwards; KIE_API_KEY wins on headless installs).
The money conversation
Video is where API credits get real. The community's reaction to Seedance arriving in ComfyUI as an API node was a lot of people doing the arithmetic and concluding it's expensive - with the counter-argument that this is simply what the renders cost, after a couple of years of subsidised pricing. Practical consequences: keep duration short while you iterate, use Fast or Mini for blocking and framing decisions, and only spend 4K on the take you're keeping. The node prints credits spent and the remaining balance right on itself after every run, which makes this the rare case where you can watch a session's cost in real time instead of discovering it on a statement.
Do your shot planning before you press run. A 5-second 720p clip is cheap; six of them plus a reroll each is not.
Inputs (18)
| Name | Type | Default | Description |
|---|---|---|---|
| model | COMBO | bytedance/seedance-2-5 | 4 options: bytedance/seedance-2, bytedance/seedance-2-fast, bytedance/seedance-2-mini, bytedance/seedance-2-5 |
| generation_mode | COMBO | text | 4 options: text, first frame, first + last frame, multimodal reference |
| prompt | STRING | — | |
| resolution | COMBO | 720p | 4 options: 480p, 720p, 1080p, 4k |
| aspect_ratio | COMBO | adaptive | 7 options: adaptive, 16:9, 9:16, 1:1, 4:3, 3:4, +1 |
| duration | INT | 5-1–30 | — |
| generate_audio | BOOLEAN | true | — |
| camera_directionopt | STRING | — | |
| first_frameopt | IMAGE | — | |
| last_frameopt | IMAGE | — | |
| reference_image_1opt | IMAGE | — | |
| reference_image_2opt | IMAGE | — | |
| reference_image_3opt | IMAGE | — | |
| reference_videoopt | VIDEO | — | |
| reference_audioopt | AUDIO | — | |
| return_last_frameopt | BOOLEAN | false | — |
| web_searchopt | BOOLEAN | false | — |
| timeout_secondsopt | INT | 120030–7200 | — |
Outputs (7)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| url | STRING | — |
| all_urls_json | STRING | — |
| task_id | STRING | — |
| raw_json | STRING | — |
| credits_consumed | FLOAT | — |
| credits_left | FLOAT | — |