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
- 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.
- Pandas DataFrame to a Sume bulk queue in 100-row chunks
Turn a product DataFrame into Sume Format bulk queues: one item per row, 100 rows per queue, a stable key per chunk, and SKU order saved beside each queue id.
- Pin the model id in an ad test: sume/auto follows the catalog
sume/auto is a pure function of the request plus the catalog version, so two ad arms made weeks apart can land on different models. Pin an explicit id in tests.
- Poll hundreds of AI jobs without a thundering herd: jitter and budgets
Poll many Sume jobs without synchronized bursts: jitter, next_poll_after_seconds, per-plan read budgets, and the math on how much polling a plan can absorb.
Written by Sume