Gemini Omni 4K on Sume: send 4K or 4k, 10 s max, 16:9 or 9:16
Sume's gemini-omni-flash-1.1 takes 4K, and lowercase 4k works as an alias. Requests run 3 to 10 seconds, 16:9 or 9:16. Python body builder.

What do I send for 4K on Gemini Omni through Sume?
Set resolution to 4K. Lowercase 4k is accepted as an alias, so either spelling works. A request on gemini-omni-flash-1.1 is 3 to 10 seconds long and 16:9 or 9:16 only, and native audio is always on, so leave generate_audio out (the API rejects false).
Google's Gemini Omni 1.1 Flash post lists 360p, 720p, 1080p and 4K, a 360p draft mode, first and last frame control and scene extension to 40 seconds in 10 second steps. Sume's catalog exposes the resolutions and the 3 to 10 second request, not an extension parameter, so plan longer shots as separate requests.
Sume's catalog also lists up to 10 reference images and up to 3 reference videos, each clip no longer than 3 seconds. That is enough to pin a product or a character across a 10 second shot, and the Video Router accepts image_url plus an optional end_image_url for the start and end of the take.
Request limits for gemini-omni-flash-1.1
| Field | Accepted | Note |
|---|---|---|
| resolution | 360p, 720p, 1080p, 4K (and 4k) | Lowercase 4k is an alias |
| duration | 3 to 10 s | Integer seconds |
| aspect_ratio | 16:9 or 9:16 | Nothing else |
| generate_audio | Not a field | Native audio is always produced |
| reference images / videos | Up to 10 / up to 3 | Each reference video up to 3 s |
| List price at 4K | $0.30 per second | Catalog list 2026-08-28, subject to change |
Body builder that checks the rules
The function normalizes the resolution, enforces the ranges locally and returns a body for POST /v1/videos. It runs offline, so it fits in a unit test.
ALLOWED = {"360p", "720p", "1080p", "4K"}
def omni_body(prompt: str, seconds: int, resolution: str = "720p",
aspect_ratio: str = "16:9") -> dict:
res = "4K" if resolution.lower() == "4k" else resolution
if res not in ALLOWED:
raise ValueError(f"resolution must be one of {sorted(ALLOWED)}")
if not 3 <= seconds <= 10:
raise ValueError("gemini-omni-flash-1.1 takes 3 to 10 seconds")
if aspect_ratio not in ("16:9", "9:16"):
raise ValueError("aspect_ratio must be 16:9 or 9:16")
return {"model": "gemini-omni-flash-1.1", "prompt": prompt, "duration": seconds,
"resolution": res, "aspect_ratio": aspect_ratio}
print(omni_body("A paper boat on a rain-lit street", 10, "4k"))
try:
omni_body("x", 12)
except ValueError as e:
print("rejected:", e)Draft cheap, finish sharp
Google says its 360p draft mode is up to 60 percent faster and a third of the cost of standard 720p (Google's figure, not a Sume measurement). Sume lists 360p at $0.03 per second and 4K at $0.30, so a 10 second draft reserves a small fraction of the 4K final. Resolution is the main lever on price for a fixed duration, so treat it as the last choice, not the first. Iterate on the prompt at 360p, then raise only the resolution for the take you keep, with a new Idempotency-Key because the body changed.
If you need a clip longer than 10 seconds in one request, wan-3.0 in the Sume catalog accepts 2 to 30 seconds. It is a different model, so the look will differ from Omni's. Check each model's descriptor at GET /v1/videos/models before you hard-code a range.
Sources
Related posts
More in Developers
- Get the video URL from a Sume webhook: pick the artifact by type
A Sume job.completed payload lists artifacts with id, url, type and content_type. Select the video by content_type, not array index. TypeScript for Node.
- Go net/http client for Sume images: handle 200 and 202 on a model swap
A Go program that posts to Sume /v1/images with the model id from an env var and branches on 200 versus 202, so a gpt-image-1 swap is not a rebuild.
- gpt-image-1 returns 404 model_not_found on Sume: which id to send
gpt-image-1, gpt-image-1.5 or gemini-2.5-flash-image sent to Sume /v1/images return 404 model_not_found. Ids to send instead, plus a lookup.
- GPT Image 2.5 custom size: the pixel rules and the 1024x1536 call
GPT Image 2.5 on Sume takes custom pixels via image_size: multiples of 16, edge up to 3840, aspect up to 3:1. Check your size, then call it with Python.
Written by Sume