Kling 3.0 Image-to-Video
Animate a still into a scene
- image
- end_image
- client
- video_url
Kling 3.0 Image-to-Video is the node that takes a still image and turns it into a moving scene using Kling 3.0, served through the WaveSpeed API. You've probably seen the meme thread about how the gap between "open a browser, get a Kling video" and "build it locally in ComfyUI" is the single biggest access barrier in this hobby - this node is that first experience, but inside your node graph, with the image arriving straight from your existing workflow instead of a website's upload button.
It's the full Kling 3.0 surface, too: standard, Pro, and 4K variants; start-image and optional end-frame guidance; duration from 3 to 15 seconds; cfg scale, optional synchronized audio, shot composition mode, scene-segmented multi-prompts, and element lists for visual consistency. Pro is the quality tier, 4K the resolution king (it derives aspect ratio from the input image). Both cost more.
How it works
The node accepts your starting image either as a real ComfyUI IMAGE tensor (sent to the API as a base64 data URI) or as an image_url string - and when both are present, the IMAGE tensor wins. That's a nice touch, because it means you can generate a frame locally, feed the tensor straight in, and never touch a URL. It submits the job, polls until the clip renders, and returns a video_url STRING - pipe that into Preview Anything (same pack) to watch it.
The inputs that matter
- image (or image_url) - the starting frame. The IMAGE tensor is preferred;
image_urlis the fallback (WaveSpeed's upload node can produce one). - end_image (or end_image_url) - optional end-frame guidance: the video works toward this final frame.
- prompt - the motion/scene description.
- model - Kling 3.0, Kling 3.0 Pro, or Kling 3.0 4K.
- duration - 3 to 15 seconds.
- cfg_scale - prompt adherence, 0–1, default 0.5.
- sound - synchronized audio, off by default; on, it applies a 1.5x cost multiplier.
The advanced fields (multi_prompt for scene-segmented JSON prompts, element_list for consistency IDs, shot_type customize/intelligent) are there if you outgrow the basics. The seed widget is cache control only, not an API seed.
Installing it
Part of the ERPK Collection (eRepublik-Labs/comfyui-nodes-erpk). ComfyUI Manager: search erpk → ERPK Custom Nodes → restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/eRepublik-Labs/comfyui-nodes-erpk.git erpk
cd erpk
pip install -r requirements.txt
WaveSpeed API key required (Settings → ERPK → API Keys). No model downloads - the pack's WaveSpeed dependency is pydantic/requests/Pillow.
Common issues
- Video never appears - generation takes minutes and polls on ~10s intervals. Don't cancel early; a cancelled poll is a wasted billed job.
- Sound doubles the bill - the 1.5x multiplier is real. Turn
soundoff while iterating, on for the keeper. - 4K needs a good source - the 4K variant derives aspect ratio from the input image, so a low-res or oddly-cropped start gives you a low-res or odd result.
- Only a URL comes out - that's by design. Preview Anything is your viewer; download from there.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| model | COMBO | Kling 3.0 | Model variant: Kling 3.0 (standard), Kling 3.0 Pro (higher quality), or Kling 3.0 4K (highest resolution; derives aspect ratio from the input image) |
| prompt | STRING | Text description of the desired motion/scene | |
| image_url | STRING | Starting image URL (use WaveSpeed Upload Image to produce one). Fallback when the IMAGE input is not connected. | |
| imageopt | IMAGE | Starting image as a ComfyUI IMAGE tensor. Preferred — takes precedence over `image_url` when connected. | |
| end_imageopt | IMAGE | Optional end-frame guidance image as a ComfyUI IMAGE tensor. Preferred — takes precedence over `end_image_url` when connected. | |
| clientopt | WAVESPEED_AI_API_CLIENT | WaveSpeed API client (optional if API key is configured in Settings) | |
| durationopt | INT | 53–15 | Video duration in seconds (3 to 15) |
| seedopt | INT | -1-1–2147483647 | Random seed for reproducibility (-1 for random) |
| negative_promptopt | STRING | Elements to exclude from the generation | |
| end_image_urlopt | STRING | End-frame guidance image URL. Fallback when the end_image IMAGE input is not connected. | |
| cfg_scaleopt | FLOAT | 0.500–1 | Prompt adherence strength, 0-1 |
| soundopt | BOOLEAN | false | Enable synchronized audio generation (applies a 1.5x cost multiplier) |
| shot_typeopt | COMBO | customize | Shot composition mode: 'customize' or 'intelligent' |
| multi_promptopt | STRING | JSON array of scene-segmented prompts (mutually exclusive with prompt on 4K) | |
| element_listopt | STRING | JSON array of pre-generated element IDs for visual consistency |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| video_url | STRING | — |