Gemini Omni edit input is capped at 10 seconds: trim first on Sume

Google says Omni edit inputs must be 10 seconds or less. Cut the clip with Sume's video-trim at $0.02 a job, then send the short clip to the edit request.

4 min readSume
All posts

Google's Gemini Omni docs say input videos for editing and extension must be 10 seconds or less, so a 40-second take has to be cut before you ask for an edit. On Sume the cut is POST /v1/video-trim, a fixed-price media tool that costs $0.02 per job and returns a new MP4 without touching the source.

The limits on both sides

Google's guide also says video references support a maximum of three clips of up to three seconds each. Sume's Video Router row for gemini-omni-flash-1.1 repeats the reference shape: up to 10 images and up to 3 clips of 3 seconds each, addressed as <IMAGE_REF_0> and <VIDEO_REF_0>. Edit mode takes video_url and lets the source clip set the output length.

Clip-length limits that matter before an Omni edit (read 2026-10-05)
LimitValueWhere it comes from
Edit and extension input10 seconds or lessGoogle Omni API guide
Video references3 clips, 3 seconds eachGoogle Omni API guide
Output length on editSet by the source clipSume Video Router docs
Trim duration field0.2 to 900 secondsSume video-trim docs

Cut with video-trim

Video trim takes one media.sume.com clip from your workspace, a start in seconds, and exactly one of end or duration. It does not fetch from the open internet, so import the clip first with POST /v1/media-imports. Every write needs an Idempotency-Key. The default precision is exact, a frame-accurate re-encode, which is what you want before an edit.

import os, time, requests

H = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
B = "https://api.sume.com"

r = requests.post(f"{B}/v1/video-trim", timeout=60,
                  headers={**H, "Idempotency-Key": "trim-first-001"},
                  json={"video_url": os.environ["CLIP_URL"], "start": 12, "duration": 9})
r.raise_for_status()
job = r.json().get("data", r.json())
job_id = job["request_id"]

while True:
    s = requests.get(f"{B}/v1/jobs/{job_id}/status", headers=H, timeout=30).json()
    s = s.get("data", s)
    if s.get("result_ready") or s.get("status") in ("completed", "failed", "canceled"):
        break
    time.sleep(3)

res = requests.get(f"{B}/v1/jobs/{job_id}/result", headers=H, timeout=30)
print(res.status_code, res.text[:400])

Then edit

The trim result contains a video_url that points to a new artifact, never the source. Put that URL in the video_url field of the Omni edit request shown in the edit walkthrough, with a short instruction and Google's own advice to say "Keep everything else the same". The docs do not show a trim-to-edit example end to end, so test one clip before you batch.

Choosing the cut points

Keeping the source untouched is the quiet benefit here. The trim writes a new artifact, so the original take stays available for a second cut if the first edit does not land.

  • Cut on a motion boundary, such as the end of a gesture, so the edit has a clean start.
  • Use precision: exact when the edit must start on a specific frame, and keyframe only when speed matters more than accuracy.
  • If the trim clamps to the source end, the result carries the trim_clamped_to_source warning, so read the warnings before you edit.
  • Edit the best 9 seconds first, then stitch the edited piece back into the long take on a timeline.

Budget the two steps

A 9-second 720p edit costs about $0.90 at the $0.10 list rate, or $1.13 billed after the 1.25 multiplier and rounding up to cents (9 x 0.10 = 0.90, x 1.25 = 1.125). Add $0.02 for the trim. Edit jobs reserve against an estimate of the clip length, which defaults to 8 seconds when you send no duration, so a failed reserve shows up as 402 insufficient_credits before any provider work starts.

Sources

Related posts

More in Developers

All Developers posts

Written by Sume