Kling 3.0 Omni Image To Video
A two-widget node, and why that's on KIE, not you
- image_urls
- video
- url
- all_urls_json
- task_id
- raw_json
- credits_consumed
- credits_left
First, the weird part
Open this node and you'll find… a prompt box. That's it. Plus timeout_seconds, callback_url and a JSON field called expert_override_json. No image socket on an image-to-video node.
That is not a bug in your install, and it's worth understanding because it explains a whole class of nodes in this pack. KIE Next builds its model nodes automatically from KIE's API documentation: it reads the request example for an endpoint, pulls the parameter metadata, and generates widgets. When a documentation page has examples but no request schema, there's nothing to turn into widgets - so the factory emits a prompt plus a raw escape hatch. Kling 3.0 Omni's image-to-video page is one of those pages.
So this is the Kling 3.0 Omni image-to-video endpoint, reachable from ComfyUI, in its least polished form.
Why you'd still want it
Kling 3.0 Omni is the omnimodal tier - the one that handles multi-shot planning, subject elements, audio and 4K in the sibling nodes in this same folder. Image-to-video is the mode you use when you already have the frame you want and just need it to move: a portrait that should turn and smile, a product shot that should get a slow push-in, a character still that needs one beat of motion.
Same deal as every Kling node in this pack: Kuaishou's model has no weights, so there's no local route, and the connection is KIE.ai - a third-party reseller with its own account, credits and key, not ComfyUI's official Partner Nodes. Cost per call, real moderation, your inputs leaving the machine. That's the trade you're making.
How the payload actually gets built
Under the hood the node assembles {"model": "kling-3.0-omni/image-to-video", "input": {...}}, POSTs it to KIE's createTask, then polls recordInfo until the task reports success, downloads the MP4 to output/KIE-Results/videos/, and returns it as a native ComfyUI VIDEO. Whatever you put in expert_override_json is merged straight into that input object, overriding anything the widgets produced - which is the entire point here, since the widgets are effectively empty.
Making it usable in four minutes
Wire your image into a KIE • Upload Image node (it lives under the pack's Utility branch - it pushes a local image to KIE and outputs the hosted url). Then paste that URL into the override field using KIE's documented field name:
{
"image_urls": ["https://your-uploaded-url.png"],
"prompt": "she turns toward the camera and smiles, slow dolly in",
"duration": "5",
"aspect_ratio": "16:9",
"resolution": "1080p"
}
Keep the JSON in expert_override_json small and only include fields you're sure about. The prompt widget above also still works - if the override has no prompt, the value from the widget goes out.
Inputs and outputs
Required: prompt. Optional: timeout_seconds (default 1200 seconds of polling - raise it before you assume a 4K job hung), callback_url (leave empty), expert_override_json. That's the whole surface. There is no seed, no negative prompt, no camera widget on this node.
Outputs: video (the VIDEO object to wire into a save or preview), url, all_urls_json, task_id, raw_json, credits_consumed, credits_left. When a job fails, raw_json is the first place to look - KIE usually tells you which field it hated. credits_left comes back -1 if the balance service is down, which is not an error.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/felipederosilva/ComfyUI-KIE-Nodes-Next
Restart ComfyUI, then Settings → KIE.ai Nodes Next → Connection → Paste / replace KIE.ai API key. The key is validated against KIE before it's stored, kept out of your workflow JSON, and confirmed with a masked fingerprint and ✅ CONNECTED. Server installs can set KIE_API_KEY instead; it takes priority. Dependencies are only requests, Pillow, numpy, PyYAML. Manager install and the ZIP in dist/ both work.
Gotchas
The node class name is stable, the widgets are not. Because these nodes are generated from KIE's docs, the same node may grow real widgets after a catalog refresh - that's the 24-hour background sync doing its job. Don't rebuild your workflow around the override hack; check whether the image socket has appeared, and if it has, use it.
Old workflows move. The pack ships widget-migration JavaScript specifically because generated nodes have changed shape across releases (a boolean audio field that used to be a socket, seeds that shifted position). If a workflow loads with values in the wrong boxes, update the pack and let the migration run.
KIE task ... failed is the provider refusing, not the pack misbehaving. Read the message, check the prompt, check the image. And remember this node is doing real work per call - the credit receipt printed on the node after each run is the cheapest cost audit you'll get.
Inputs (13)
| Name | Type | Default | Description |
|---|---|---|---|
| input_variant | COMBO | Single First Frame | Choose the provider's input mode. Only fields documented for that mode are submitted; its required inputs are checked before upload. |
| prompt | STRING | A happy golden retriever running across a grassy field | Video description. It must not be empty after leading and trailing whitespace is removed. Maximum length: 3,072 characters. |
| image_urls | IMAGE | Array of first-frame image URLs. Exactly 1 image is required. HTTP, HTTPS, and OSS URLs are supported. Images must be in JPG, JPEG, or PNG format; each file must not exceed 50 MB; both width and height must be at least 300 px; and the aspect ratio must be between 0.4 and 2.5. | |
| durationopt | COMBO | 5 | Total video duration in seconds. Optional; the default is 5 seconds. Supports integer values from 3 to 15. |
| resolutionopt | COMBO | 720p | Video resolution. `720p` outputs a 720p video, `1080p` outputs a 1080p video, and `4k` outputs a 4K video. |
| aspect_ratioopt | COMBO | auto | Video aspect ratio. `16:9`, `9:16`, and `1:1` can be selected only when custom multi-shot mode is enabled through `customize_multi_shots`; otherwise, use `auto`. |
| audioopt | BOOLEAN | false | Whether to enable audio. Passing this value explicitly is recommended. `true` enables audio; `false` disables audio. |
| customize_multi_shotsopt | BOOLEAN | false | Optional, default false. Set true for custom multi-shot (multi_prompt required). |
| prefer_multi_shotsopt | BOOLEAN | true | Whether to enable intelligent shot planning. This field is mutually exclusive with `customize_multi_shots`. |
| multi_promptopt | STRING | [ { "duration": 2, "prompt": "A wide shot of the fox entering the snowy forest." }, { "duration": 3, "prompt": "A wide shot of the fox entering the snowy forest." } ] | List of custom shots. When `customize_multi_shots=true`, this field is required and may contain up to 6 shots. When `customize_multi_shots=false`, it must be an empty array or omitted. |
| elementsopt | STRING | [] | List of one-time subject assets. The default is an empty array, with up to 3 subjects. The subject is automatically identified as a multi-image subject or video character subject based on `element_input_urls`. |
| timeout_secondsopt | INT | 120030–7200 | — |
| callback_urlopt | STRING | Optional KIE callback URL. Leave empty for normal ComfyUI use. |
Outputs (7)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| url | STRING | — |
| all_urls_json | STRING | — |
| task_id | STRING | — |
| raw_json | STRING | — |
| credits_consumed | FLOAT | — |
| credits_left | FLOAT | — |