Comfyui-Kling-Wrapper Advanced Element Create
Train a reusable character on Kling without training anything
- image
- image_list
- element
- element_id
- element_json
Kling's advanced elements are the closest thing the API has to a LoRA you don't train. Feed it a few photos of a subject, and it registers that subject as a reusable "element" you can then bind into video generation via an element list. If you've spent time on local identity work - IP-Adapter, FaceID, all that - this is the API-native shortcut: no fine-tuning, no weights, just reference images and a name.
The catch is that it's exacting about its inputs. This node is where Kling's subject-consistency actually happens, and Kling enforces a real constraint: one frontal subject image plus 1–3 additional reference images of the same subject. Background or scene images do not count. Get the references right and this node feels like magic; get them wrong and Kling will politely tell you off.
The three element types
element_type has three options:
image_subject- a single image of a subject (plus references). The classic character-lock.multi_image_subject- same idea with multiple images as the primary reference, for subjects that need more angles to pin down.video_character- a character defined by a video instead of stills. This one requiresvideo_url(a public http(s) URL) instead of images.
For image_subject and multi_image_subject, you connect the frontal shot to image and the 1–3 supporting shots to image_list. The node enforces the total between 2 and 4 images, so you can't sneak a single-photo registration past it.
The fields that will bite you
element_name- max 20 characters. It's an identifier, not a prompt.element_description- max 100 characters. This describes the reusable subject itself. The README is explicit that it's unrelated to Image2Video's voice mode, so don't reuse a voice description here.element_voice_id- optional, only relevant if you're pairing the element with a cloned voice on the models that support it.
There's also extra_payload_json if you need to pass fields the widgets don't cover, but you'll rarely touch it.
Outputs and wiring
The node returns three things:
element- the typed element object that feeds directly into Element List Builderelement_id- the string ID, for when you want to wire it manually or query it laterelement_json- the raw JSON, mostly for debugging orextra_payload_jsonuse
The standard flow: create the element here, drop it into Element List Builder to assemble an element_list, then bind that list into Image2Video or Motion Control. It also works with kling-v3-omni, which can combine elements with voice lists.
Install and gotchas
Pack install as always: ComfyUI Manager (search "Comfyui-Kling-Wrapper") or clone into custom_nodes, pip install -r requirements.txt, restart, Kling API key in config.local.json. API node - no models, just credits.
Where people get burned: feeding scene photos as "references" and getting a rejection, because backgrounds don't count; and exceeding the character limits, which are hard errors, not warnings. Also note that if you want a bound subject and voiced output, the README's reliable path is to generate the element-bound video first, then add speech with Lip Sync or a TTS/audio node - the current endpoint doesn't love doing both at once. Get the reference photos right and this node does the identity work that used to take a training run.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| element_type | COMBO | 3 options: image_subject, multi_image_subject, video_character | |
| element_name | STRING | — | |
| element_description | STRING | — | |
| imageopt | IMAGE | — | |
| image_listopt | IMAGE | — | |
| video_urlopt | STRING | — | |
| element_voice_idopt | STRING | — | |
| extra_payload_jsonopt | STRING | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| element | COMFYUI_KLING_WRAPPER_ELEMENT | — |
| element_id | STRING | — |
| element_json | STRING | — |