Node: flip a video backend to Sume a day before the Veo 3.1 shutdown
Google ends three Veo 3.1 preview ids on Oct 22 and its page gives a date, not an hour. A 19-line Node switch moves traffic to Sume early, with an override.

Use a pure function that returns sume once the clock passes a cutoff set one day before Google's date, and let an environment variable override it for rehearsals. Google's deprecations page says veo-3.1-generate-preview, veo-3.1-fast-generate-preview and veo-3.1-lite-generate-preview shut down on October 22, 2026, and names gemini-omni-1.1-flash as the replacement. It states a date and no hour.
Why a day early
A date with no time zone can mean the first minute of October 22 anywhere on Earth. Flipping on October 21 UTC costs a day of Sume traffic and removes the guess. Keep Google reachable until the date passes, so a rollback is one environment variable.
The switch
pickBackend takes now as an argument so a test can pass any instant. sumeBody builds the request for POST /v1/videos. Sume's catalog id is gemini-omni-flash-1.1, which is not the spelling Google uses (gemini-omni-1.1-flash), so do not copy the id across. The Sume docs list 3 to 10 seconds, 360p/720p/1080p/4K and 16:9 or 9:16 for it.
// Google ends the three Veo 3.1 preview ids on Oct 22, 2026. Its page gives a date, not an hour,
// so flip a day early.
const CUTOFF = Date.parse("2026-10-21T00:00:00Z");
export function pickBackend(now = Date.now(), force = process.env.VIDEO_BACKEND) {
if (force === "sume" || force === "google") return force; // rehearsal override
return now >= CUTOFF ? "sume" : "google";
}
export function sumeBody(prompt) {
return {
model: "gemini-omni-flash-1.1",
prompt,
duration: 8,
resolution: "1080p",
aspect_ratio: "16:9",
};
}
console.log(pickBackend(Date.parse("2026-10-20T23:59:59Z")), pickBackend(Date.parse("2026-10-21T00:00:00Z")));Limits of this approach
A time switch moves every caller at once. If you need a gradual cutover, replace the date test with a percentage keyed on a stable user or job id.
Moving the backend does not translate options. Durations differ by model, so check GET /v1/videos/models that a model whose supported_durations covers your clip length exists before the flip. Sume has no seed or size field on this route, and both return 400.
Sources
Related posts
More in Developers
- Node https.request: POST /v1/images on Sume, no fetch, no packages
Call Sume's image API from Node using only node:https: JSON body, bearer key, 40-second timeout that actually aborts, and 200 versus 202 handling.
- Node test contract test for a Sume video wrapper, no mock library
Test a Sora-replacement wrapper with node:test and a local http server that answers 202, in_progress, then completed. No network and no key needed.
- Omni draft grid: four 360p variants, then one final. What it costs
Google's Draft Room idea, run through the Sume API: four 8-second 360p drafts that change one thing each, then a 1080p final. Total $2.70, with a script.
- One Sume webhook signature, three languages: a shared test vector
A fixed secret, timestamp and body that must sign to the same sume-v1 value in Python, Node and Go. Use it to test a verifier in any language you add.
Written by Sume