Nodes/ComfyUI-plugin/VividAI 文生视频
ComfyUI Node

VividAI 文生视频

Fifteen Minutes of Waiting, and No Cancel Button

By Neko1t·Created 2 days ago·Updated 2 days ago· 0
VividAI 文生视频
  • config
  • prompt
  • VIDEO
◄model►
◄quality720p►
◄ratio16:9►
◄duration0►
◄history_capacity3►
◄node_key►
◄generation_token►
◄model_rules{}►

VividAITextToVideo (显示 "VividAI 文生视频") sends a prompt to VividAI and returns a native VIDEO. Same skeleton as the text-to-image node - same credentials, same cache rules, same model list - with the two things that make video on someone else's hardware different: it takes minutes, and you can't take it back.

That second part isn't a knock on this pack. The service exposes no cancel endpoint, so the node can't offer one, and the README says so plainly. It's the single most important operational fact about using this node, so start there.

What it is

Cloud text-to-video, the reason-1 kind: a model with no downloadable weights that you cannot run locally at any VRAM. Local video is genuinely good now - Wan and friends - but the hosted side still has a quality and convenience edge. You pay per call and your prompt leaves the machine. Those are the terms.

The output is a real ComfyUI VIDEO, not a path and not a list of frames, so it wires straight into core SaveVideo or any downstream node that takes a native video. The plugin hands the file over with a lease so its own cache cleanup won't yank it out from under a downstream node mid-run.

The inputs

Required, all of them: config (the VIVIDAI_CONFIG socket from VividAI 配置), model, prompt, quality (default 720p), ratio (default 16:9), duration (default 0), plus history_capacity (1–100, default 3) and the three hidden fields node_key, generation_token, model_rules that the UI buttons maintain. There are no optional inputs at all on this node - no seed, no negative prompt, no reference image. Text in, video out.

Three of those deserve a paragraph:

ratio only accepts 16:9 or 9:16. The service pins video aspect ratios; if you set 1:1 the node raises before it sends anything. Portrait or landscape, that's the menu.

duration has a specific meaning: 0 means "don't send a duration". The tooltip is explicit about that ("0 表示不提交时长;模型要求时需填写" - 0 means no duration is submitted; fill it in when the model requires one). Some models pick a length themselves and some must be told. Whether duration is required, its min and max (defaults 1–30), and an optional list of allowed exact values all live in the per-model rule JSON behind 当前模型能力配置. Set a duration outside that range and you get a validation error instead of a rejected job.

prompt is a plain 1–5000 character string, though the socket also accepts an OpenAI messages/input content object and flattens its text parts. Anything with an image or file part is refused with "use the reference node" - and it's right, that's what VividAI 参考素材生视频 is for.

The mechanism, and why it's built this way

The node posts the job, then waits on a streaming NDJSON response. The moment it gets a jobId it writes that ID to its local database - before anything else happens. That single line of persistence is the whole recovery story:

  • If the wait times out (the cap is 15 minutes per run), the task stays resumable. Run the same node again and it reconnects to the existing job rather than submitting a new one. That's not politeness, it's money.
  • The resume path replays the task's original parameter snapshot. Parameters you edited in the meantime are not applied - you get what you paid for.
  • If the connection died before a jobId came back, the task is marked "状态不明确" (state unclear) and the node refuses to resubmit automatically. You check the VividAI dashboard yourself, then explicitly mark a new generation. This is the pack deliberately choosing an annoyance over a possible double charge.
  • Hitting ComfyUI's interrupt or closing the window stops the wait, not the remote job. The service has no cancel route; it finishes and bills whether you're watching or not.

Results come back as a file, get validated by decoding the first video frame with PyAV, and only then land in the node's history. A file that won't decode is retried by re-downloading the same job on the next run rather than reported as a content problem.

Same cache rule as the rest of the pack: by default the node outputs the material you already have selected. Editing the prompt costs nothing and generates nothing until you press 下次运行重新生成 and run the workflow. With history_capacity at 3 you keep the last three clips and flip between them with 启用此素材. For video that matters - you'll iterate on a prompt six times and want two of the outputs.

Install

Manager → search ComfyUI VividAI (display name; the repo is ComfyUI-plugin). Manual:

cd ComfyUI/custom_nodes
git clone https://github.com/Neko1t/ComfyUI-plugin
cd ComfyUI-plugin
uv pip install --python /path/to/ComfyUI/python -r requirements.txt

Requirements are httpx, Pillow, numpy and av - PyAV is genuinely required here, both to validate downloads and to encode video you feed the reference node. Install into ComfyUI's own interpreter, restart, save a profile in a VividAI 配置, wire it in, click 刷新模型, and run the VIDEO output into SaveVideo.

Troubleshooting

Long jobs "fail" at 15 minutes. They don't fail; the wait gives up. The state stays resumable, so run the node again and it reconnects. Don't delete and re-add the node - a new node gets a new identity and the old job is orphaned.

"提交状态不明确" (submission state unclear). The submit died without a job ID. The node keeps refusing until you verify what happened on the VividAI side, then press 下次运行重新生成 to declare a new intent. Resubmitting blindly is how people pay twice for one clip.

Nothing happens when you change the prompt. Working as designed. Press 下次运行重新生成. A node whose output isn't wired to anything downstream won't execute on its own either.

CategoryVividAI

Inputs (10)

NameTypeDefaultDescription
configVIVIDAI_CONFIG—
modelSTRING—
promptSTRING,OPENAI_CONTENT支持普通文本,也支持 OpenAI messages/input 内容对象
qualitySTRING720p—
ratioSTRING16:9—
durationINT00–36000 表示不提交时长;模型要求时需填写
history_capacityINT31–100—
node_keySTRING—
generation_tokenSTRING—
model_rulesSTRING{}—

Outputs (1)

NameTypeDescription
VIDEOVIDEO—