Which AI video model makes a 25-second clip? Duration check in Python

Only some Sume video models accept 25 seconds in one request. See each model's duration range and filter a target length in a few lines of runnable Python.

4 min readSume
All posts

Which video models can make 25 seconds in a single request?

On Sume, seedance-2.5 (4 to 30 seconds) and wan-3.0 (2 to 30 seconds). Among the general text-to-video models, everything else stops at 15 seconds or earlier (special-purpose models such as h3-max-recast and higgsfield-genjutsu also reach 30 seconds), so a 25-second clip from those models needs several requests joined in an editor. Seedance 2.5 and Wan 3.0 also take reference images, so a long shot can still keep one subject across the whole length.

The vendors agree on the long end. ByteDance Seed says Seedance 2.5 makes up to 30 seconds per generation, and Alibaba's Wan 3.0 page says native 30 seconds. Google's Gemini Omni 1.1 Flash post describes extension up to 40 seconds in 10 second steps, but Sume's catalog takes 3 to 10 seconds per Omni request.

Duration ranges per request

The table is the part of the catalog that decides how many requests you need. It lists the shortest and longest duration each model accepts in a single call, so read it before you write a storyboard that assumes one long take.

Duration range of each Sume video model in one request (catalog, read 2026-10-06)
ModelShortestLongest
seedance-2.54 s30 s
wan-3.02 s30 s
seedance-2, seedance-2-fast, seedance-2-mini4 s15 s
kling-34 s15 s
minimax-h3, minimax-h3-max5 s15 s
gemini-omni-flash-1.13 s10 s

Filter by target length in Python

Keep the ranges in one dict and ask which models fit. Re-read supported_durations from GET /v1/videos/models when you deploy, because the catalog can change.

RANGES = {
    "seedance-2.5": (4, 30), "wan-3.0": (2, 30),
    "seedance-2": (4, 15), "seedance-2-fast": (4, 15), "seedance-2-mini": (4, 15),
    "kling-3": (4, 15), "minimax-h3": (5, 15), "minimax-h3-max": (5, 15),
    "gemini-omni-flash-1.1": (3, 10),
}

def fits(seconds: int) -> list[str]:
    return [m for m, (lo, hi) in RANGES.items() if lo <= seconds <= hi]

def requests_needed(seconds: int, model: str) -> int:
    lo, hi = RANGES[model]
    return -(-seconds // hi)

print(fits(25))
print(requests_needed(25, "minimax-h3-max"), requests_needed(25, "wan-3.0"))

When one request is not enough

Splitting into several requests means several jobs, each with its own price and its own Idempotency-Key. Cut points will show in the result unless you plan the shots. If the story really is one continuous take, pick one of the two long models and let the job run: poll the status route, or take a webhook, rather than holding an HTTP connection open for a 30-second render.

Price follows the same arithmetic, so test it before you commit a catalog. A model priced per second multiplies by the seconds you ask for, and the reservation at submit is an estimate that Sume releases or refunds when a job fails. Read the list price for your chosen model and resolution from the current catalog, not from an old table, and keep the aspect ratio and resolution explicit so a replay of the same request gives the same job.

One more guard belongs in the function above: reject a duration that is not an integer. The duration field is an integer number of seconds, so send 8, not 7.5.

Sources

Related posts

More in Developers

All Developers posts

Written by Sume