Reduce video vendor lock-in: swap the model field, keep the pipeline
Keep the video model id in config, read each model's limits from the catalog, and your pipeline survives a vendor change. A script that lists limits.

To reduce lock-in to one video vendor, keep the model id and its limits in one config value and read the limits from the catalog at start-up, so switching is a one-line change. On Sume the same POST /v1/videos request shape takes a different model value, and GET /v1/videos/models lists each model's resolutions, aspect ratios, and durations. Higgsfield has been reported to have raised $400 million (a PR Newswire release title, read 2026-10-02); that is not a reason to avoid it, only a reason not to hard-code any single vendor.
Request and catalog facts are from Sume's Video generation docs; the funding line is from the release title.
What must stay model-specific?
Limits are not uniform. The docs say seedance-2.5 accepts 4 to 30 seconds, wan-3.0 2 to 30, gemini-omni-flash-1.1 3 to 10, and every other catalog model tops out at 15. Put those in a config that the code validates against, not in prompts.
| Model id | Accepted duration |
|---|---|
seedance-2.5 | 4 to 30 seconds |
wan-3.0 | 2 to 30 seconds |
minimax-h3 | 5 to 15 seconds |
gemini-omni-flash-1.1 | 3 to 10 seconds |
How do I read the live limits?
The catalog is the source of truth, and the script below prints each model's resolutions, duration range, and ratios. Run it on deploy and fail the build if your configured model no longer lists the values you use.
import os
import requests
URL = "https://api.sume.com/v1/videos/models"
HEAD = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
for m in requests.get(URL, headers=HEAD, timeout=30).json()["data"]:
secs = m.get("supported_durations") or []
print(
m["id"],
m.get("supported_resolutions"),
f"{min(secs)}-{max(secs)}s" if secs else "n/a",
m.get("supported_aspect_ratios"),
)What about prompts?
Prompts that name one model's quirks break on another. Keep model-specific wording in a per-model field and the shared brief in the pipeline. Is there one API for Kling, Seedance and Veo with a single bill? covers the single-bill side.
What does this not fix?
Output differs by model even for the same prompt, so a switch still needs a visual check. See a three-model bake-off.
A simple structure is a config file with one entry per model: id, allowed durations, allowed ratios, and a prompt suffix. The pipeline reads the entry, validates the request against it, and refuses to send a request the model would reject. Add a second entry as a fallback and test the switch once a month, so it works when you actually need it.
Sources
Related posts
More in Developers
- Review voice agent call recordings: STT word timings on Sume
After you ship a Gemini Live or other voice agent, transcribe the recordings with Sume STT: word timings, sentence segments, a 10-minute cap per request.
- Voice API deadlines, October 2026 to February 2027
A calendar of voice and transcription API changes from vendor pages: Gemini TTS price rise, OpenAI transcription shutdown, and the xAI voice alias move.
- Wait for an avatar video job with the SDK: waitForJob and its timeout
Avatar jobs need waitForJob, not waitForRun. Defaults, the 20-minute timeout, and why a SumeJobTimeoutError neither cancels nor refunds the render.
- waitForRun and 429 or 503 on a status read: it keeps polling
A 429 or 5xx on a status read does not fail the run. waitForRun tolerates 6 consecutive transient read failures and keeps waiting. Options and what to log.
Written by Sume