BytePlus Create Video Asset
Put a clip in Seedance's reference library
- video
- asset_id
- group_id
- asset_uri
- info
Reference-to-video is where Seedance earns its keep - feed it a clip and it can edit it, extend it, or keep a person's motion consistent across a new shot. The catch is that Seedance 2.0/2.5 want references as links, and a clip sitting in your ComfyUI output folder isn't a link. This node is the bridge: it registers a video as a private BytePlus asset and gives you an ID that works in every later run.
If you're extending a video you just generated, and it's long enough that re-uploading it every single run is annoying, this is the node that stops the churn.
How it works
CreateAsset takes an HTTPS URL only. A connected video is therefore uploaded to Comfy.org storage first - which means a Comfy.org login is required unless you supply video_url yourself. The asset is then created in a group and the node polls until BytePlus flips it to Active (up to ten minutes), because a Processing asset is not usable as a Seedance reference. Re-running with the same media reuses the existing asset rather than piling up duplicates.
Inputs and outputs
video(optional) is the clip to register;video_urlis the public-HTTPS alternative that skips the Comfy.org upload.group_idfor an existing group (a virtual-portraitAIGCgroup, or a verified real person's group), or leave it empty andgroup_namefinds or creates one by exact name. One group per person or per project keeps this manageable.asset_name,project_nameandwait_until_activeare the housekeeping trio. I'd leavewait_until_activeon: it costs you a wait, and it saves you a confusing failure three nodes later.- Outputs:
asset_id,group_id,asset_uriandinfo(the asset as JSON). Feedasset_idto anasset_Nsocket on BytePlus Seedance 2.5 Reference to Video - that's the whole payoff.
The clip has to fit BytePlus's asset rules, which are stricter than "it's an mp4": 2 to 30 seconds, 407,696 to 8,295,044 total pixels (so a vertical short in the right ballpark and nothing tiny), 24–60 fps, and under 200 MB.
Install and keys
cd ComfyUI/custom_nodes
git clone https://github.com/byteplus-sa/ComfyUI-BytePlus-ModelArk
pip install -r ComfyUI-BytePlus-ModelArk/requirements.txt
Restart after that (ComfyUI 0.31.0+), or grab it via Manager by searching BytePlus ModelArk. For this node you need all three credential sets: the ModelArk key, IAM AK/SK with asset-library permission, and Advanced Creation Rights. Set them in Settings → BytePlus or in user/.env as BYTEPLUS_API_KEY, BYTEPLUS_ACCESS_KEY, BYTEPLUS_SECRET_KEY. Only the ModelArk key gets validated at save time; the others fail at run time instead.
Where people get burned
The Comfy.org login trips people up more on this node than anywhere else in the pack, because video is the file you least want to re-upload - and if Comfy.org storage isn't available, nothing goes to CreateAsset. If you're already hosting clips somewhere public (S3, a CDN, your own box), video_url is the smoother road.
Second: don't register a video just to use it once. If the clip lives in the same workflow that consumes it, connecting it directly to Reference to Video's reference_video_N inputs is fine - the node handles the upload for you. This node is worth it when the same reference shows up across many runs and many workflows, because then the asset ID is a stable thing you can paste into anything.
Third, the familiar asset-library trap: these are authorized media. Registering someone else's footage is on you, not on the node.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| group_id | STRING | Reuse an existing asset group ID to add more assets of the same person: a virtual portrait (AIGC) group, or a verified real person's LivenessFace group. Leave empty to find or create the virtual portrait (AIGC) group named group_name. Real-person verification is a QR-code flow in the ModelArk console (BytePlus has no API for it), so unlike ComfyUI core's node this node does not start it: verify the person in the console, then paste the group ID here. | |
| video_url | STRING | Public HTTPS URL of the video (mp4/mov), used instead of the video input: sent straight to CreateAsset without a Comfy.org upload. | |
| group_name | STRING | ComfyUI Virtual Portraits | Used when group_id is empty: the virtual portrait (AIGC) group, matched by exact name and created if missing. Use one group per person. |
| asset_name | STRING | ComfyUI video | Name of the new asset. |
| project_name | STRING | default | ModelArk project that holds the asset library. |
| wait_until_active | BOOLEAN | true | Wait (up to 10 min) until the asset is Active and can be used in Seedance. |
| videoopt | VIDEO | Video to register as a personal asset. Leave unconnected to use video_url instead. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| asset_id | STRING | — |
| group_id | STRING | — |
| asset_uri | STRING | asset://<asset_id>, for inputs that take URIs. |
| info | STRING | The asset as JSON. |