Gemini Video Omni (Direct API)
10-second clips with audio, and edits that chain
- images
- video
- video
- text
- interaction_id
- cost_info
- cache_key
Video generation with synchronized audio is the one genuine capability gap between closed and open models, and this node is the cheapest way to touch it from ComfyUI. Gemini Video Omni (Direct API) calls Google's Gemini Omni model (flash preview) with your own key: text, reference images, or a video go in; a 3–10 second 720p/24fps clip with audio comes out. ComfyUI has a built-in Gemini Video Omni node, but it bills through the credit system at $0.146 per second. Direct API is roughly 30% cheaper, and cost_info shows the real USD from the API's own token counts.
This is also, bluntly, early-adopter territory. There's barely any community discussion of the Omni API yet, so you're working from the README and the model's behavior more than from a pile of war stories. That's fine - the pack documents it unusually well.
How it works
Gemini Omni is stateful. The node calls the Interactions API (client.interactions.create()), which returns an interaction_id for every turn. Wire that into a second Video Omni node and the second prompt edits the first video server-side - same scene, same characters, no re-describing anything. The generated video comes back through Google's Files API, polled until it's ACTIVE and then downloaded without re-encoding, so what you get is exactly the bytes that came off the wire.
The conversational loop is the reason this node exists:
Video Omni ("A 5-second clip of a woman playing violin in a park, 16:9")
| interaction_id
v
Video Omni ("Same video, but at sunset")
| interaction_id
v
Video Omni ("Replace the violin with a cello")
ComfyUI's caching makes this cheap to iterate: change only the last node's prompt and every upstream turn is a cache hit at $0. Only the edit you changed gets billed.
The inputs that matter
prompt- there is no duration widget, so state it explicitly: "a 6-second clip of…" is followed reliably. Describe scene, dialogue, and sound; output is always 720p/24fps with audio.model- one choice,gemini-omni-flash-preview. Nothing to tune.seed- a lie in the nicest way. It's not sent to the API (Omni video is non-deterministic regardless); changing it just forces ComfyUI to re-execute the node.images- up to 14 batched reference images for subjects, style, or a first frame.video- a reference video to edit (≤10s). And here's the region trap: editing an uploaded video is blocked by Google in the EEA, Switzerland, and the UK. Editing a generated video viainteraction_idworks everywhere - use that.interaction_id/store- the chaining pair.storemust stay on or the turn can't be continued; stored interactions expire server-side after ~55 days. You can even paste an ID to resume a session later.timeout_sec- default 480s for good reason; video calls are slow.
Outputs and cost
video (VIDEO) feeds any video-save or playback node; want frames or the audio track separately? Wire it into ComfyUI core's Get Video Components. You also get text, interaction_id (for the next chained node), cost_info, and cache_key.
Billing is by output tokens - about $0.10 per second of 720p video plus a small input cost: roughly $0.31 for 3s, $0.61 for 6s, $1.01 for 10s.
Installing it
Same pack, same steps - Manager, search "ComfyUI-Gemini-Direct", or:
cd ComfyUI/custom_nodes/
git clone https://github.com/jeremieLouvaert/ComfyUI-Gemini-Direct.git
pip install -r ComfyUI-Gemini-Direct/requirements.txt
Then restart, set your key (gemini_api_key.txt in ComfyUI root, GEMINI_API_KEY env var, or the api_key input), and enable billing. Two version gotchas: the VIDEO input/output type requires ComfyUI 0.28+ (the modern Video API), and google-genai must be 2.0+, since Google removed the legacy Interactions API schema server-side in June 2026 - if you hit a "legacy Interactions API schema" error, pip install -U google-genai.
Common issues
- Reference videos under 3 seconds may be silently misprocessed by the API - the node warns in the console, but the damage is done.
- Chaining silently breaks if
storewas turned off on the upstream node. - The one-time "interactions API is experimental" warning on first use is harmless.
- No prompt, no
interaction_id, and the node raises cleanly - it needs at least one to do anything.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | Describe the scene, dialogue and sound. State the desired DURATION explicitly (3-10s) -- there is no duration widget. Output is fixed at 720p/24fps with audio. | |
| model | COMBO | gemini-omni-flash-preview | Gemini Omni video model. |
| aspect_ratio | COMBO | 16:9 | Output aspect ratio. |
| seed | INT | 00–18446744073709550000 | Re-run trigger only -- NOT sent to the API. Gemini Omni video is non-deterministic regardless of seed; change this to force ComfyUI to re-execute the node. |
| imagesopt | IMAGE | Reference images (batched), up to 14. | |
| videoopt | VIDEO | Reference video to edit (<=10s, >=3s recommended). EEA/CH/UK: editing an UPLOADED video is region-blocked. Wire interaction_id instead to edit a GENERATED video. | |
| interaction_idopt | STRING | Interaction ID of a previous turn to continue/edit server-side. Wire from another Gemini Video Omni node's interaction_id output, or paste one to resume across sessions (expires ~55 days; requires store=True). | |
| storeopt | BOOLEAN | true | Retain this interaction server-side so it can be continued via interaction_id. Required for chaining. Set False for privacy -- breaks chaining on this turn. |
| api_keyopt | STRING | Google AI API key. Falls back to GEMINI_API_KEY env var or gemini_api_key.txt in ComfyUI root. | |
| timeout_secopt | INT | 48010–1800 | HTTP timeout (seconds) for the Gemini API call. Default 480s. |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| text | STRING | — |
| interaction_id | STRING | — |
| cost_info | STRING | — |
| cache_key | STRING | — |