๐ฑ Seedance 2.0 First/Last Frame-to-Video
Pin the ending and let Seedance fill the middle
- first_frame_image
- last_frame_image
- video_url
- first_frame
- request_id
- batch_json
Here's the pitch in one sentence: give Seedance 2.0 First/Last Frame-to-Video a starting frame and optionally an ending frame, and it renders a video that starts where you say and lands exactly where you say. It's the difference between "Seedance, do something" and "Seedance, go from this to that" - and for shots where the ending genuinely matters, that control is the whole point.
This is one of the more specialized nodes in the pack, and the README is upfront that BytePlus treats first/last-frame generation as a separate mode from normal reference-based generation. That's why it's its own node instead of a checkbox on Image-to-Video. The practical consequence: you cannot mix it with normal reference images, reference videos, reference audio, or draft tasks in the same request. If you need references plus a fixed ending, that's a job for Omni Reference or Image-to-Video instead.
The inputs that matter
first_frame_image- required IMAGE. The video starts here.last_frame_image- optional IMAGE. The video is steered to end here. Leave it empty and you get a first-frame-anchored generation (basically a fancier image-to-video).prompt- describes the motion between the frames.aspect_ratio- defaults tosmarthere, with a tooltip worth reading: "Use smart to let BytePlus choose an appropriate ratio from the input/prompt." When you're giving it actual frames, letting the model match them is usually the right call.resolution(480pโ4k, endpoint-dependent),duration(4โ15s),seed,batch_count(cost + wait scale with it).generate_audio- defaulttrue.
How it works
The node uploads your first frame (and last frame, if given) to BytePlus as content references, tags them as first_frame / last_frame in the request payload, and runs the standard submit-then-poll cycle. When it finishes you get the same four outputs as every generator in this pack: video_url (short-lived, ~24h), first_frame (IMAGE), request_id, and batch_json.
Where this shines is loop-adjacent work: a scene that must begin and end on a specific composition - a character entering and leaving a room, a camera push-in that has to land on a close-up. Pin the endpoints, write a prompt that describes the transition, and iterate on the prompt rather than re-rolling the frames.
Gotchas
The big one is the frame you feed it. A real-person first/last frame is exactly the input that trips BytePlus's privacy filter (InputImageSensitiveContentDetected.PrivacyInformation) - the API is aggressive about identifiable faces in reference material. Synthesized or anonymous content passes cleanly. And as always in this pack: the returned URL expires in about a day, so if the clip is a keeper, send video_url to Seedance 2.0 Save Video before the link dies.
Install: ComfyUI Manager โ Install via Git URL โ https://github.com/nnnnkatsu/seedance2-comfyui-byteplus, restart. No models to download, no GPU required - the rendering happens on BytePlus's servers and you're paying per call.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| first_frame_image | IMAGE | โ | |
| prompt | STRING | Generate a smooth cinematic video starting from the first frame. | โ |
| aspect_ratio | COMBO | smart | Use smart to let BytePlus choose an appropriate ratio from the input/prompt. |
| resolution | COMBO | 480p | BytePlus output resolution. 1080p/4k availability depends on the selected endpoint. |
| duration | INT | 54โ15 | โ |
| seed | INT | -1-1โ4294967295 | โ |
| batch_count | INT | 11โ10 | Create multiple tasks with different seeds. Cost and wait time scale with this count. |
| api_keyopt | STRING | โ | |
| endpointopt | STRING | BytePlus ModelArk endpoint ID, for example ep-... | |
| generate_audioopt | BOOLEAN | true | โ |
| last_frame_imageopt | IMAGE | โ |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| video_url | STRING | โ |
| first_frame | IMAGE | โ |
| request_id | STRING | โ |
| batch_json | STRING | โ |