Gemini Omni 1.1 Flash
Video With Characters, Clips and Audio as Inputs
- image_urls
- first_frame_url
- last_frame_url
- video
- url
- all_urls_json
- task_id
- raw_json
- credits_consumed
- credits_left
What it's for
Most video nodes take a prompt and, optionally, a first frame. This one takes a brief: a prompt, up to seven character references, a source clip with trim points, generated audio, and a first or last frame - and it renders the whole thing at up to 4K.
That's the "omni" idea, and it's the reason this node has more optional sockets than anything else in the pack. You're not describing a shot; you're assembling one from parts you already have. Character IDs for consistent cast, an audio bed for someone to talk over, a clip for the model to extend or restyle, frames to pin the bookends. For anything with a recurring character or a specific soundtrack, this is a much shorter path than generating a clip and hoping it matches.
The catch is the same one that applies to every closed video model: no open weights, so no local version, and there goes your prompt, your references and your audio to a server. Veo's native audio-in-video is the capability with no open equivalent; this family is Google's attempt to make the inputs just as capable.
How it works
The node submits your assembled request to KIE with your saved key, waits for the render, and downloads the finished clip as a native ComfyUI VIDEO object - so the output wires into a save node, a frame-extraction node or another video pass without any URL plumbing. URLs, task ID and the full provider response come back alongside it, and the credits spent and remaining balance land on the node as floats and as an on-node receipt.
The part worth understanding before you build anything is the slot budget. KIE's own tooltips are explicit that the reference inputs share a fixed allowance of image slots: each character_ids entry takes one slot (a dual portrait-plus-body set takes two), video_list takes two, and the base ceiling is seven. That's why the docs are so insistent about mutual exclusivity, and why the pack preflights the request: mixing a first frame with clip or audio references is rejected locally rather than submitted and failed.
Inputs and outputs
Required:
prompt- the video description: visual content, style, cinematography, character action.duration- one of4,6,8,10seconds. Read the tooltip carefully: it only applies when there's no video input. Feed a clip in and the model decides the duration, and your setting is ignored. That surprises people.
Optional, and there are a lot of them: image_urls (IMAGE), first_frame_url and last_frame_url (IMAGE), audio_ids (a JSON array of audio IDs from KIE's gemini-omni-audio interface, up to 3, mutually exclusive with the first-frame image), character_ids (JSON array from the gemini-omni-character interface), video_list (JSON of video assets with start/ends trim ranges - each file must be under 100MB, the clip under 30s, and the trimmed range no longer than 10s), plus aspect_ratio (16:9 or 9:16), seed (INT, 0–2147483647, fixed seeds improve reproducibility but don't guarantee it), resolution (360p, 720p, 1080p or 4k), timeout_seconds (INT, default 1200, min 30, max 7200, step 30) and callback_url (leave empty for normal use).
Outputs: video (VIDEO), url, all_urls_json, task_id, raw_json (STRING), credits_consumed, credits_left (FLOAT).
Installing
cd ComfyUI/custom_nodes
git clone https://github.com/felipederosilva/ComfyUI-KIE-Nodes-Next
pip install -r ComfyUI-KIE-Nodes-Next/requirements.txt
Restart ComfyUI, then set your key once at Settings → KIE.ai Nodes Next → Connection - the pack validates it against KIE first and only shows a masked fingerprint afterwards. Server installs can use KIE_API_KEY, which overrides the saved key.
Requirements are requests, Pillow, numpy, PyYAML; no weights, no VRAM, because the render happens remotely. That's the other half of the trade - free local compute becomes a per-second bill.
Where people get burned
Cost. A video render at 1080p or 4K is the most expensive call in this entire pack, and the flat community read on API video is that the real price only becomes obvious once you run a few. Set a resolution you can afford to iterate at, get the performance right, then do one final pass at 4K.
Second, the duration-with-video-input rule. If you feed video_list and your 8-second setting produces a 4-second clip, nothing is broken - the model determined the length.
Third, mutual exclusivity. First-frame, audio and clip references don't stack the way you'd expect, and the pack will stop you at the door. That's a feature: a locally rejected request costs nothing.
And go in clear-eyed about identity. Character references help, and the pack's own documentation is candid that a reference image plus a prompt is not a universal identity lock - consistency depends on the model and the specific operation. Test your character on a short render before you build a scene around it.
Inputs (13)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | Create a futuristic night city short film with a slow push-in shot as the character walks out from a neon-lit street. | The video prompt, used to describe the visual content, style, cinematography, or character actions of the target video. |
| duration | COMBO | 4 | The duration of the generated video, in seconds. Valid values are 4, 6, 8, and 10. This parameter only takes effect when there is no video input. If video input is used, the output duration is determined by the model, and the `duration` parameter will be ignored. Note: When video input is provided, the output duration is automatically determined by the model. In this case, the `duration` parameter will not take effect. |
| image_urlsopt | IMAGE | — | |
| audio_idsopt | STRING | [ "audio_01hx8p0demo" ] | An array of audio IDs generated by the `gemini-omni-audio` interface. Used to provide narration, dialogue, background music, or sound references for the video. Up to 3 items. Note: This field is mutually exclusive with the first-frame image (`first_frame_url`) and cannot be provided at the same time. |
| video_listopt | STRING | [ { "url": "https://example.com/assets/source-video.mp4", "start": 0, "ends": 10 } ] | An array of video clips. Each element describes a video asset that can be used for generation and its trimming time range. Video limitations: - Each file must not exceed `100MB` - Video duration must not exceed `30s` - `ends` should be greater than `start` - The difference between the end and start times must not exceed `10s` - Maximum of 1 item, occupying two image slots - Note: This field is mutually exclusive with the first-frame image (`first_frame_url`) and cannot be provided at the same time. |
| first_frame_urlopt | IMAGE | — | |
| last_frame_urlopt | IMAGE | — | |
| character_idsopt | STRING | [ "character_01hx8p0demo" ] | An array of character IDs generated by the `gemini-omni-character` interface. Used to provide character appearance, identity, or person references for the video. Each character_id occupies 1 image slot; the basic maximum is 7. If `video_list` is provided at the same time, `video_list` occupies 2 image slots, and a maximum of 3 character_ids can be provided. Note: This field is mutually exclusive with the first-frame image (`first_frame_url`) and cannot be provided at the same time.If the incoming character_id is a dual-image set [portrait + body], it will occupy two slots. |
| aspect_ratioopt | COMBO | 16:9 | The aspect ratio of the generated video. `16:9` is landscape, and `9:16` is portrait. |
| seedopt | INT | 0-2147483648–2147483647 | The random seed. Valid range: [0, 2147483647]. If not specified, the system will automatically generate a seed. A fixed seed can improve result reproducibility, but because the model itself is stochastic, results may still vary. |
| resolutionopt | COMBO | 720p | The resolution of the generated video. Valid values are 360p, 720p, 1080p, and 4k. |
| 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 | — |