CYAI Seedance 视频生成 (cyai.club)
What this relay node actually does with your key
- first_frame
- last_frame
- reference_images
- video
ByteDance's Seedance line has no weights and isn't getting any - the entire Seedream/Seedance family is an API product while ByteDance keeps handing out the components underneath it for free. So if you want Seedance in a Comfy graph, someone has to make an HTTP call on your behalf. That someone is this node. It doesn't run a model; it submits a job to a Volcengine Ark endpoint (through the cyai.club relay by default), polls it, downloads the mp4, and hands you a ComfyUI VIDEO object like a local sampler had made it.
Be clear-eyed: closed model, reseller, per call, your frames leaving the machine. In exchange you get shot quality the open video models still haven't matched - which is the whole reason the API-node category exists.
How it works
The node builds one content array - a text item for the prompt, then an image_url item per frame or reference, each tagged with a role of first_frame, last_frame or reference_image - and POSTs it to /api/v3/contents/generations/tasks. Back comes a task id. It then GETs /api/v3/contents/generations/tasks/{task_id} on a loop until the status lands in succeeded, completed, success, done (or trips failed, error, cancelled, canceled), pulls the video URL out of content.video_url, downloads the bytes, and wraps them with comfy_api's VideoFromFile. The progress bar counts polling rounds, and the sleep between polls is chopped into two-second slices so pressing cancel actually stops the node instead of leaving it hanging.
That download-immediately part matters more than it looks: the video URL is a signed TOS link that expires in 24 hours, and the node fetches it the moment the task reports done, so in practice you never see the expiry. The task list itself is only queryable for 7 days.
The inputs you actually touch
Four fields get you running: api_key (your sk-... from the relay), prompt, and model - a plain text box, not a dropdown, so doubao-seedance-2-0-260128, 2-0-fast-260128, 2-5-260628 and whatever the relay adds next all work without a pack update.
Then pick your mode. Leave first_frame, last_frame and reference_images empty for text-to-video. Wire first_frame (plus optionally last_frame) for image-to-video. Or wire reference_images with up to four images to blend characters or styles. Only one mode at a time - the node raises a ValueError if you mix frames with references, because the API refuses it anyway.
Two defaults worth knowing: generate_audio is on, which surprises people who expected a silent clip, and duration takes 4–30 seconds even though the 2.0 models cap out at 10 and only 2.5 goes to 30. max_wait defaults to 900 seconds; bump it if your relay queues hard at peak.
The output is a single video port. Wire it to ComfyUI's preview node to watch it on canvas, or into Video Helper Suite's save/transcode nodes to get an actual file. If you're doing AI comic work with real faces, also flip upload_images on - more on that below.
Installing it
ComfyUI Manager is the easy path: Custom Nodes Manager, search CYAI Seedance, install, restart. Manual works too:
cd ComfyUI/custom_nodes
git clone https://github.com/Gin3601/comfyui_transit_node.git
and restart ComfyUI.
The genuinely nice part: there is nothing to install. No requirements.txt, dependencies = [] in pyproject.toml, and the shipped code only imports torch, PIL, numpy, comfy_api and stdlib urllib. No pip install, no torch version roulette. You do need a funded key on the relay: the pack ships a usage-query node, except the author commented it out of __init__.py because the balance can't be read through the API at all - check credit in the relay's dashboard.
Where people get burned
ratio must be adaptive in first/last-frame mode. Not a suggestion - the node checks it before submitting and refuses with "首帧/尾帧模式要求 ratio 必须设为 adaptive". If you're doing image-to-video and nothing happens, this is usually why.
Real faces get blocked, and it's not the node's fault. Ark rejects anything it thinks contains a real person: InputImageSensitiveContentDetected.PrivacyInformation. Both base64 and public URLs get scanned, so re-encoding won't help - only an asset:// reference passes. The upload_images toggle automates that whole detour: turn it on, fill the key, keep your images on reference_images or first_frame, and the node uploads them as assets and rewrites the request itself. You don't wire asset_ids when it's on. It does cost you an extra asset upload per image, and it needs at least one image connected or it errors out.
A failed run costs you twice. There's no task-id resume here. If generation succeeds and the download then dies - flaky network, killed ComfyUI - you can't point the node back at that task. You paid, you try again.
Widget positions shift between versions. The author appends new inputs at the end of INPUT_TYPES deliberately: ComfyUI assigns widget values by position, not name, so inserting a field mid-list would slide every value in your old workflow over one slot. Glance at the node after you update.
Inputs (33)
| Name | Type | Default | Description |
|---|---|---|---|
| api_key | STRING | 中转站 API Key(sk-xxx) | |
| base_url | STRING | https://www.cyai.club | 中转站地址 |
| submit_url | STRING | /api/v3/contents/generations/tasks | 提交任务的 POST 地址(相对 base_url 的路径或完整 URL) |
| poll_url_template | STRING | /api/v3/contents/generations/tasks/{task_id} | 查询任务的 GET 地址模板,{task_id} 会被替换 |
| model | STRING | doubao-seedance-2-0-260128 | 视频生成模型名(可自由输入任意模型;常见:doubao-seedance-2-0-260128 / 2-0-fast-260128 / 2-0-mini-260615 / 2-5-260628) |
| prompt | STRING | 视频描述提示词 | |
| duration | INT | 54–30 | 视频时长(秒)。2.0 系列最大 10s,2.5 最大 30s |
| resolution | COMBO | 720p | 分辨率(fast 系列不支持 1080p) |
| ratio | COMBO | 16:9 | 画幅比例。首帧/尾帧模式必须选 adaptive |
| generate_audio | BOOLEAN | true | 是否生成声音 |
| watermark | BOOLEAN | false | 是否添加 AI 水印 |
| seed | INT | -1-1–2147483647 | 随机种子(-1 表示随机) |
| return_last_frame | BOOLEAN | false | 是否返回最后一帧图像 |
| first_frameopt | IMAGE | 可选:首帧图(图生视频,取 batch 第一张) | |
| last_frameopt | IMAGE | 可选:尾帧图(首尾帧模式) | |
| reference_imagesopt | IMAGE | 可选:多张参考图(role=reference_image,建议 1-4 张),与首尾帧互斥 | |
| poll_intervalopt | INT | 101–60 | 轮询间隔(秒) |
| max_waitopt | INT | 90030–3600 | 最长等待时间(秒) |
| image_max_sideopt | INT | 1024256–4096 | 上传图像的最长边(像素),越大越清晰但请求体越大。默认 1024 |
| image_qualityopt | INT | 8030–100 | 上传图像的 JPEG 质量(30-100),越低文件越小。默认 80 |
| task_id_fieldopt | STRING | id|data.id|data.task_id|task_id | 提交响应里任务 ID 的字段路径,多个用 | 分隔依次尝试(支持 data.id 点路径) |
| status_fieldopt | STRING | status|data.status | 查询响应里状态的字段路径,多个用 | 分隔依次尝试 |
| video_url_fieldopt | STRING | content.video_url|video_url|data.output|data.video_url | 查询响应里视频地址的字段路径,多个用 | 分隔依次尝试(支持 videos.0.url 数组索引) |
| done_statusesopt | STRING | succeeded,completed,success,done | 逗号分隔的成功状态词(不区分大小写) |
| fail_statusesopt | STRING | failed,error,cancelled,canceled | 逗号分隔的失败状态词(不区分大小写) |
| asset_idsopt | STRING | 可选:素材 ID(逗号分隔),按 asset://<id> 引用。一般是接「图像合并」的 asset_ids 输出;若开了 upload_images 则由节点自己生成 | |
| upload_imagesopt | BOOLEAN | false | 一键模式:自动把接进来的图上传成素材并引用,绕开真人检测(会额外消耗一次素材上传) |
| image_hostopt | COMBO | uguu | upload_images 开启时用的免费图床 |
| asset_group_idopt | STRING | upload_images 开启时:素材组 ID,留空自动建 AIGC 组 | |
| asset_nameopt | STRING | upload_images 开启时:素材名称,留空自动取名 | |
| upload_max_sideopt | INT | 2048300–6000 | upload_images 开启时:上传图最长边 |
| upload_qualityopt | INT | 9030–100 | upload_images 开启时:上传图 JPEG 质量 |
| recipeopt | STRING | 协议配方:内置名 ark_seedance(火山方舟 doubao-seedance),或贴 recipe JSON / 填文件路径接入其它视频 API。留空 = 用上方显式的提交/轮询/字段路径参数(旧行为) |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | 生成视频(ComfyUI VIDEO 对象,可接预览/保存节点) |