EvoLink Veo 3.1 Image-to-Video (Official)
First Frame In, Sound Included, Up to 4K Out
- first_frame
- last_frame
- video
- task_id
- status_info
- result_urls
- response_json
The image-to-video node is where Veo 3.1 actually shines. Text-to-video is fine, but pointing a real frame at the model and asking it to move is how you keep a composition, a character, a mood you already made elsewhere in the graph. EvoLink Veo 3.1 Image-to-Video does exactly that - and unlike most of the pack, first_frame is a required input, because without a first frame this node has no reason to exist.
How it works
Standard EvoLink plumbing: submit to /videos/generations, poll, download before the 24-hour result links expire, return a native VIDEO output. The first_frame image uploads through EvoLink's own file channel - no third-party host, no pasting URLs - and you can optionally add a last_frame so the clip ends on a specific image rather than wherever the model drifts. First-frame-only is the casual setup; first + last frame is a closed loop and honestly the more impressive demo.
Model choices are veo-3.1-generate-preview and veo-3.1-fast-generate-preview. aspect_ratio defaults to auto, which just inherits your first frame's proportions - leave it alone unless you want to force a crop. Quality goes up to 4k, and like its text-to-video sibling, audio generation defaults to on and costs extra. Turn generate_audio off while iterating.
The inputs that matter
first_frame- required IMAGE input. Load Image → here.last_frame- optional IMAGE input for a fixed ending.prompt- required, ~2000 tokens, Chinese-friendly; describes the motion and scene.model- full vs. fast Veo 3.1.quality- 720p / 1080p / 4k.generate_audio- native audio, extra charge, on by default.seed/negative_prompt- for reproducible takes and steering away from things.
Outputs
video → Save Video. Plus the shared EvoLink quartet: task_id (job-log receipt), status_info (model/time/credits), result_urls (24h raw links), response_json (full payload). Wire result_urls into the Topaz upscale node for a generate-then-sharpen chain.
Install and gotchas
Part of the comfyui-evolink pack. Manager → search EvoLink → Install → fully restart ComfyUI (close the console, not just refresh). Or:
cd ComfyUI/custom_nodes
git clone https://github.com/deeplearning-goethe/comfyui-evolink
Only requests as a dependency; no models, no GPU. Key from evolink.ai/dashboard/keys, fill api_key once, blank afterward so it doesn't leak into shared JSON. EVOLINK_API_KEY env var works.
The one gotcha that's specific to this node: it's the rare EvoLink node where an input is genuinely required, so if you hit "prompt/first_frame can't be empty"-style errors, check you've actually wired a Load Image into first_frame. Everything else follows pack convention - 401 bad key, 402 no credit, 429 rate limit, moderation blocks free, unchanged reruns cached and unbilled. And if you want subject/style consistency across a whole clip rather than a fixed first/last frame, the sibling EvoLink Veo 3.1 Reference node is the one.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | 镜头/画面描述,支持中文,最长约 2000 tokens。 | |
| model | COMBO | veo-3.1-generate-preview | 2 options: veo-3.1-generate-preview, veo-3.1-fast-generate-preview |
| first_frame | IMAGE | 首帧图(必接) | |
| aspect_ratioopt | COMBO | auto | auto:按首帧图比例 |
| durationopt | COMBO | 8 | 视频时长(秒) |
| qualityopt | COMBO | 720p | 分辨率 |
| generate_audioopt | BOOLEAN | true | 生成原生音频(额外收费) |
| negative_promptopt | STRING | 不希望出现的内容 | |
| seedopt | INT | 00–4294967295 | 0=随机 |
| last_frameopt | IMAGE | 尾帧图(可选) | |
| api_keyopt | STRING | EvoLink API Key(sk- 开头)。首次填写后自动保存到本机配置,之后可留空。分享工作流前请清空此框。获取:evolink.ai/dashboard/keys | |
| timeout_secondsopt | INT | 120060–3600 | 最长等待时间;生成失败或审核拦截的任务不扣费 |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | 生成结果(已下载落地,可直连保存节点) |
| task_id | STRING | EvoLink 任务 ID,可到 evolink.ai/zh/dashboard/logs 查询 |
| status_info | STRING | 人读状态摘要(模型/用时/消耗 credits) |
| result_urls | STRING | 结果原始链接,每行一个(24 小时过期) |
| response_json | STRING | 平台 GET /v1/tasks/{id} 的完整 JSON 响应(status/usage/results 等),供下游节点解析 |