Seven pre-flight checks before an Omni, H3 or Recast job

Duration, resolution, ratio, edit conflicts, reference counts, refused fields and URLs: seven per-model checks that catch a refused Sume video request.

4 min readSume
All posts

Most refused video requests on Sume fail one of seven checks, and five of them can be run in code before you submit. Omni wants 3-10 seconds, MiniMax 5-15, and Recast a 5-30 second source; each model also has its own resolution strings and its own list of refused fields.

The table is the checklist. Every limit comes from the Sume docs and catalog (read 2026-10-09).

The checklist by model

Check 1 and 2 catch most mistakes. A 12-second Omni request, a 720p MiniMax request and a 480p Recast request all fail there.

Pre-flight checks per model on Sume (read 2026-10-09).
CheckOmni Flash 1.1H3 and H3 MaxH3 Max Recast
1. Duration3-10 s5-15 sSource 5-30 s, no shot over 15 s
2. Resolution360p, 720p, 1080p, 4KH3: 480p, 768p, 2K, 4K. H3 Max: 480p, 768p, 1080p768p or 1080p
3. Aspect ratio16:9 or 9:16adaptive, 21:9, 16:9, 4:3, 1:1, 3:4, 9:16None
4. Edit conflictsvideo_url alone: no frames, no referencesNot an edit modelvideo_url plus photos only
5. Reference counts10 images, 3 videos of 3 s or less9 images, 3 videos, 3 audio, 12 in all1-4 photos
6. Refused fieldsgenerate_audio: false, bitrate_mode, reference_audio_urlsgenerate_audio, bitrate_modeFrames, audio, aspect_ratio, model_params
7. URLsPublic HTTPSPublic HTTPSPublic HTTPS

A pre-flight function

This covers the numeric checks and the edit conflict. It is a filter for obvious errors; the API remains the authority.

RULES = {
    "gemini-omni-flash-1.1": (3, 10, {"360p", "720p", "1080p", "4K"}),
    "minimax-h3": (5, 15, {"480p", "768p", "2K", "4K"}),
    "minimax-h3-max": (5, 15, {"480p", "768p", "1080p"}),
    "h3-max-recast": (5, 30, {"768p", "1080p"}),
}

def preflight(body):
    lo, hi, res = RULES[body["model"]]
    errs = []
    d = body.get("duration")
    if d is not None and not lo <= d <= hi:
        errs.append(f"duration {d} outside {lo}-{hi}")
    r = body.get("resolution")
    if r is not None and r not in res:
        errs.append(f"resolution {r} not accepted")
    if "video_url" in body and body["model"] == "gemini-omni-flash-1.1":
        for k in ("image_url", "end_image_url", "reference_image_urls", "reference_video_urls"):
            if k in body:
                errs.append(f"video_url cannot ride with {k}")
    return errs

A refused body and its fix

This Omni body fails twice: 12 seconds is above the 10-second limit, and 768p is not an Omni resolution. The fixed body below it uses 10 seconds and 720p, which is $1.25 on Sume (10 x $0.125).

// refused
{ "model": "gemini-omni-flash-1.1", "prompt": "Harbor at dawn", "duration": 12, "resolution": "768p" }

// accepted
{ "model": "gemini-omni-flash-1.1", "prompt": "Harbor at dawn", "duration": 10, "resolution": "720p", "mode": "async" }

Limits and gotchas

Add the price check last: multiply the per-second rate for the resolution by the seconds, and stop if the total exceeds the budget you set for that request.

  • Omni edit sends no aspect_ratio and no duration as a rule; the output keeps the source framing.
  • A request refused at validation comes back as an error, not as an accepted job, so the fix costs time and not a job.
  • Send an Idempotency-Key on every real submit, so a retry does not create a second paid job.
  • The checks move when the catalog moves. Re-read GET /v1/videos/models when you update the table.

Sources

Related posts

More in Developers

All Developers posts

Written by Sume