ComfyUI Node

Kling 3.0

The node with no inputs at all, and how to drive it anyway

By felipederosilva·Created 2 months ago·Updated 13 days ago· 4
Kling 3.0
  • image_urls
  • video
  • url
  • all_urls_json
  • task_id
  • raw_json
  • credits_consumed
  • credits_left
◄soundtrue►
◄duration5►
◄modepro►
◄multi_shotsfalse►
◄promptIn a bright rehearsal room, sunlight streams through the window@element_dog►
◄aspect_ratio16:9►
◄multi_prompt[ { "prompt": "a happy dog in running@element_cat", "duration": 3 }, { "prompt": "a happy dog play with a cat@element_dog", "duration": 3 } ]►
◄kling_elements[ { "name": "element_dog", "description": "dog", "element_input_urls": [ "https://example.com/your-image.png", "https://example.com/your-image.png" ] } ]►
◄timeout_seconds1200►
◄callback_url►

Yes, really: no widgets

Drop KIE_Next_kling_3_0_video_604efc51 on the canvas and you get three optional fields - timeout_seconds, callback_url, and expert_override_json. There is no prompt box. No image socket. Not a bug, not a broken install, and definitely not a "post your issue" moment.

Here's why. This pack doesn't hand-write a node per model. It reads KIE's API documentation at startup and generates a ComfyUI node for every documented endpoint, converting the documented request fields into widgets. That works great when the docs publish a request schema. Kling 3.0's page publishes example payloads - full, useful JSON - but no schema table, so the factory had nothing to convert. Result: a node that can call kling-3.0/video correctly and gives you nowhere to type.

So this node is a thin shell around the raw endpoint. Which is fine - it's the general Kling 3.0 endpoint, the one that covers image-guided generation, multi-shot mode, elements and sound in a single call. You just have to bring the payload.

Driving it

Fill in expert_override_json with the documented input object. KIE's own example for this model looks like this:

{
  "prompt": "In a bright rehearsal room, sunlight streams through the window @element_dog",
  "image_urls": ["https://your-uploaded-image.png"],
  "sound": true,
  "duration": "5",
  "aspect_ratio": "16:9",
  "mode": "pro",
  "multi_shots": false,
  "kling_elements": [
    {
      "name": "element_dog",
      "description": "dog",
      "element_input_urls": [
        "https://your-uploaded-dog-1.jpeg",
        "https://your-uploaded-dog-2.png"
      ]
    }
  ]
}

Two things worth noticing in that example. The @element_dog token in the prompt is how a named element gets referenced from the text - that's the mechanism behind Kling's elements feature, and it's why the name has to match. And image_urls wants hosted URLs, not local files: since you're bypassing the widgets, the pack's automatic upload doesn't kick in. Wire your image into the KIE • Upload Image utility node (it's in the pack's Utility branch) and paste the url it returns. Same trick for reference footage with KIE • Upload Video.

From there it behaves like every other node in this pack: POST createTask, poll recordInfo until success with a poll interval growing from ~2.5s to a 15s cap, download the MP4 into output/KIE-Results/videos/, return it as a ComfyUI VIDEO. timeout_seconds defaults to 1200 - twenty minutes - and callback_url stays empty unless you run a webhook server.

Outputs

video (wire this into a preview, a save, or a local post-process), url (the hosted result link), all_urls_json (every URL the provider returned), task_id, raw_json (the full provider response - read this first when a job dies), credits_consumed and credits_left. The two credit numbers also print directly on the node after each run, which matters here because payloads you write by hand are the easiest way to accidentally buy a 4K multi-shot render.

A word on cost

Kling 3.0 sits at the top of the family, and the community price commentary on it is not kind: "Kling V3 Omni is not as censored, but is ludicrously expensive ($1.50 for a 5s clip at 1080p)" is a fair summary of the mood on r/StableDiffusion. KIE resells access, which is usually cheaper than going direct and much simpler to bill, but you're still paying per second of video at the top tier. Draft with the cheap nodes (V3 Turbo, V2.5 Turbo), finish here.

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 overwrites anything and stays out of your workflow files; you get a masked fingerprint and a ✅ CONNECTED status. Headless setups can set KIE_API_KEY instead - it takes priority over the saved key. Dependencies are requests, Pillow, numpy, PyYAML, nothing else. ComfyUI Manager search works when the pack is listed in the registry, and the repo also ships a ZIP plus a one-click Windows installer in dist/.

Gotchas

  • Malformed JSON fails the node locally, before any credits are spent - "must contain valid JSON" with the parser's complaint. It's a feature; just fix your commas.
  • Missing widgets can come back. These nodes regenerate from KIE's docs, and the catalog re-syncs at most once a day. If KIE publishes a schema for this page, the node will grow real inputs. Keep the override JSON when you upgrade; it isn't lost, it just stops being the only way in.
  • Wrong model name is impossible, wrong field names are not. The node pins the envelope model (kling-3.0/video) for you; everything above it is your responsibility.
  • Update ComfyUI if video output errors out with a message about comfy_api.latest and a video-from-file helper. Very old builds can't wrap the downloaded clip.
  • No node in the menu yet? The catalog sync hasn't finished. Restart and give it a minute; the bootstrap set only covers a handful of models on first launch.
CategoryKIE Next/Video/Kling

Inputs (11)

NameTypeDefaultDescription
soundBOOLEANtrueRequired. Whether to generate audio (speech, sound effects, ambience) with the video. Affects price.
durationCOMBO5Required. Video duration in seconds, 3–15 (string, e.g. "5"). In multi-shot mode, output length and billing follow the sum of multi_prompt[].duration (3–15 s); set duration to the same total.
modeCOMBOproRequired. Generation mode. std has standard resolution, pro has higher resolution, 4K has 4K resolution. Resolution mapping: - **std mode**: 16:9 (1280×720), 9:16 (720×1280), 1:1 (720×720) - **pro mode**: 16:9 (1920×1080), 9:16 (1080×1920), 1:1 (1080×1080) - **4K mode**: 16:9 (3840×2160), 9:16 (2160×3840), 1:1 (2160×2160)
multi_shotsBOOLEANfalseRequired. Whether to use multi-shot mode. true enables multi-shot mode, false enables single-shot mode.
promptoptSTRINGIn a bright rehearsal room, sunlight streams through the window@element_dogRequired when multi_shots is false. Up to 2,500 characters.
image_urlsoptIMAGEFirst and last frame image URLs. Optional; not required when using kling_elements. When multi_shots is false: if length is 2, index 0 is the first frame and index 1 is the last frame; if length is 1, the array item serves as the first frame. When multi_shots is true: only the first frame is supported.
aspect_ratiooptCOMBO16:9Optional when image_urls is provided (the output follows the first frame's aspect ratio). For text-to-video, set it explicitly: 16:9, 9:16 or 1:1.
multi_promptoptSTRING[ { "prompt": "a happy dog in running@element_cat", "duration": 3 }, { "prompt": "a happy dog play with a cat@element_dog", "duration": 3 } ]Shot prompts. Takes effect when multi_shots is true. Used to describe the text and duration of each shot. Supports up to 5 shots. Each shot duration is 1-12 seconds. If you need to use elements, add them after the prompt.
kling_elementsoptSTRING[ { "name": "element_dog", "description": "dog", "element_input_urls": [ "https://example.com/your-image.png", "https://example.com/your-image.png" ] } ]Referenced elements. Detailed information about elements referenced in the prompt. A single task can reference a maximum of three elements.
timeout_secondsoptINT120030–7200—
callback_urloptSTRINGOptional KIE callback URL. Leave empty for normal ComfyUI use.

Outputs (7)

NameTypeDescription
videoVIDEO—
urlSTRING—
all_urls_jsonSTRING—
task_idSTRING—
raw_jsonSTRING—
credits_consumedFLOAT—
credits_leftFLOAT—