Kling 3.0 Omni Image To Video
A two-widget node, and why that's on KIE, not you
- 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 (4)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | Prompt sent to this KIE model. | |
| timeout_secondsopt | INT | 120030–7200 | — |
| callback_urlopt | STRING | Optional KIE callback URL. Leave empty for normal ComfyUI use. | |
| expert_override_jsonopt | STRING | {} | Expert-only payload overrides for APIs whose documentation has no request schema yet. |
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 | — |