BytePlus Asset Library
Find the asset:// URI you forgot to write down
- asset_uris
- assets_json
Seedance 2.0 and 2.5 will happily generate video from a reference you never upload: a face you've already registered with BytePlus as a private asset. That's the whole point of the asset library - you register authorized media once (your own virtual portrait, or a real person who passed BytePlus's verification) and then call it by ID forever after. Which is great until you can't remember the ID. This node is the lookup.
It's the least glamorous node in the pack and the one that saves the most time. Think of it as ls for your private asset library: point it at a group, filter by name, get back asset:// URIs you can wire straight into Seedance's reference sockets.
How it works
Under the hood the pack signs a ListAssets request with your IAM access key and secret (the asset library is the one corner of this pack that isn't covered by the plain ModelArk API key), sending a Filter built from the fields you set, plus a MaxResults page size. You get the matching assets back two ways: asset_uris, one asset://<ID> per line, and assets_json, the same thing as structured JSON with names and types.
The node is declared as an output node, so it actually runs when you press Run even if nothing downstream is connected to it. That's handy - you can use it as a "what have I got?" panel and read the result in the UI, no other nodes required.
The inputs that matter
Most of the time you'll touch two.
nameplusmax_results= 1 is the filter-to-one-asset trick. Setnameto something you know is unique in the group, dropmax_resultsto 1, andasset_urisbecomes a single URI you can connect to anasset_Ninput on BytePlus Seedance 2.5 Reference to Video (or copy the ID intofirst_frame_asset_id/last_frame_asset_idon the first-last-frame node).group_typepicks the table you're looking in:AIGCfor virtual portraits you created yourself,LivenessFacefor verified real people.group_idnarrows to one group, and it's the one you want if a person has several assets and names are ambiguous. Use one group per person; that's how the create nodes are designed too.statusdefaults toActive, which is the right default - aProcessingasset isn't usable in Seedance yet.allis there when you're hunting for something that failed and want to see the wreckage.max_results(1–100) andproject_nameare the boring ones. Leaveproject_namealone unless your ModelArk project isn'tdefault.
Installing it
Standard for the pack - ComfyUI Manager, search BytePlus ModelArk, or by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/byteplus-sa/ComfyUI-BytePlus-ModelArk
pip install -r ComfyUI-BytePlus-ModelArk/requirements.txt
Use the Python that runs ComfyUI, then restart. The dependency is the BytePlus Ark SDK (byteplus-python-sdk-v2[ark]); if it's missing or too old the pack loads nothing and prints the install command in the console rather than pip-installing itself.
Then set up credentials in Settings → BytePlus: the ModelArk API key, its region (ap-southeast-1 or eu-west-1), and - for this node specifically - the asset library IAM AK/SK row. Those live in user/.env if you prefer hand-editing:
BYTEPLUS_API_KEY=your-modelark-key
BYTEPLUS_REGION=ap-southeast-1
BYTEPLUS_ACCESS_KEY=your-iam-ak
BYTEPLUS_SECRET_KEY=your-iam-sk
You also need Dreamina Seedance Advanced Creation Rights on the account, otherwise there's no library to list.
Where people get burned
The IAM key is the sharp edge. Use a sub-user whose policy allows only the asset library - the pack's error handling distinguishes InvalidAccessKey from AccessDenied from throttling (FlowLimitExceeded), so the message usually tells you which of the three you hit. If you see an auth error and you're sure the key is right, check the region and the policy, not the ModelArk key.
Second: real people. BytePlus verifies them through a QR-code flow in the ModelArk console and has no API for it, so this node will never show a LivenessFace asset that you haven't already verified by hand. Do that in the console first, then paste the group ID here.
Third, and it catches everyone once: the URI only means anything to nodes that take asset references. asset://… pasted into a plain image input does nothing useful.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| group_type | COMBO | AIGC | 2 options: AIGC, LivenessFace |
| group_id | STRING | Only assets in this group (optional). | |
| status | COMBO | Active | 4 options: all, Active, Processing, Failed |
| name | STRING | Filter by asset name (optional). | |
| max_results | INT | 201–100 | — |
| project_name | STRING | default | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| asset_uris | STRING | — |
| assets_json | STRING | — |