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.

4 min readSume
All posts

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

All Developers posts

Written by Sume