Which ids stop working on Nov 17
Google's deprecations page lists five audio-related preview ids with a shutdown date of November 17, 2026.1 The page is explicit that listed dates are the earliest possible dates and that the exact date is communicated with advance notice.1 With 17 days left from today (Oct 31), assume the ids may fail on the 17th and plan to be done before it.
| Retiring id | Kind | Recommended replacement |
|---|---|---|
gemini-3.1-flash-tts-preview | TTS | gemini-3.8-flash-tts or gemini-3.8-flash-lite-tts |
gemini-2.5-flash-preview-tts | TTS | gemini-3.8-flash-tts or gemini-3.8-flash-lite-tts |
gemini-2.5-pro-preview-tts | TTS | gemini-3.8-flash-tts or gemini-3.8-flash-lite-tts |
gemini-3.1-flash-live-preview | Live | gemini-3.8-live |
gemini-2.5-flash-native-audio-preview-12-2025 | Live | gemini-3.8-live |
All of this comes from the deprecations table.1 Two things are easy to miss:
- Other preview Live ids in the same table are already past their dates (
gemini-live-2.5-flash-previewandgemini-2.0-flash-live-001show December 9, 2025), so a config that still names them is already broken rather than about to break.1 gemini-3.5-live-translate-previewis a preview Live id too, but the table shows no shutdown date announced for it.1 It is not part of this deadline, though a preview id with no date can still get one.
Search your code, your environment variables, your feature-flag values and your vendor dashboards for each of the five strings. Voice-agent frameworks such as LiveKit or Pipecat often carry the model id in a config file rather than in code, so grep configuration as well as source.
Pick the replacement: three ids, three jobs
Google's release notes describe the September 22 launch of two GA TTS models: gemini-3.8-flash-tts, the flagship creative model, and gemini-3.8-flash-lite-tts, "built to replace gemini-3.1-flash-tts-preview for high-throughput production and real-time voice agent cascades."2 gemini-3.8-live is the Live replacement, described on its model page as the default for most low-latency voice agents.3
| Property | gemini-3.8-flash-tts | gemini-3.8-flash-lite-tts | gemini-3.8-live |
|---|---|---|---|
| Role | Maximum fidelity, acting, dialects | Throughput, latency, cost efficiency | Real-time voice dialogue |
| Languages | 130 | 101 | 70 supported languages (Live API) |
| Input limit | 8,192 tokens | 8,192 tokens | 131,072 tokens |
| Output limit | 16,384 (serving limit) | 16,384 (serving limit) | 65,536 tokens |
| Live API | Not supported | Not supported | Supported |
The figures come from the Flash TTS, Flash-Lite TTS and 3.8 Live model pages, and the Live overview for the 70-language figure.4536
For TTS the choice is workload-driven. Google positions Flash TTS for audiobooks, studio narration, multi-speaker dialogue, heavy vocal-burst acting and regional dialects; Flash-Lite TTS for high-volume production, real-time agent cascades, read-aloud features and everyday single-speaker generation.4 A phone agent reading short replies belongs on Flash-Lite unless a listening test says the fidelity gap matters. If you used gemini-2.5-pro-preview-tts for quality reasons, test Flash TTS first; Google does not say which 3.8 model matches the old Pro preview, only that either is the recommended replacement.1
Both models share the same API schema, so switching between them is a one-parameter change.5 That matters for the fallback plan below.
Voices
Both 3.8 TTS models support prebuilt voices, the Extended Voice Library served from GET /v1beta/voices, custom Voice design personas and Voice replication, with persistent stored voices by default plus optional stateless keys.4 Google suggests replacing long "Audio Profile / Director's Notes" prompt blocks with a persona created in Voice design, then carrying the voice_... id through requests with minimal or empty style strings.4
What to check:
- Prebuilt voice names you use today. The speech guide's examples use the prebuilt voice
Kore.7 Confirm each voice you ship still exists on the 3.8 models and listen to it; Google's pages do not promise the same voice sounds identical across model generations, and I did not find a statement either way. - Language coverage. If you serve a language that is among Flash's 130 but not Flash-Lite's 101, Flash-Lite may not be an option for it.4 The pages I read do not list which languages differ, so test each language you serve.
- Replicated voices. Voice replication is listed for both models.5 Run a consent and quality check again on the new model rather than assuming the stored voice behaves the same.
What breaks in the TTS request
Google's migration notes for the 3.8 TTS models are the part most likely to cause a silent regression, because the old request still returns a 200 with the wrong audio.4
- Input is a verbatim transcript. Inline direction such as "Say cheerfully: Hello!" or "Speaker 1: Hello!" may be spoken aloud. Delivery and speaker labels move into
speech_metadata(style,speaker).4 - Inline tags are for events only. Angle-bracket tags such as
<laugh>,<sigh>,<breath>or<short pause>stay in the text; whispering and similar styles belong inspeech_metadata.style.4 - Every multi-speaker turn names its speaker in
speech_metadata, matching a configured speaker.4 - Default output is WAV with a RIFF header on unary requests, where
gemini-3.1-flash-tts-previewand earlier returned headerless raw PCM (audio/l16).4 If your code wraps PCM in a WAV header, you will now produce a corrupted file with a double header. If a telephony pipeline needs raw PCM, mu-law or A-law, setresponse_format.mime_typeexplicitly.4
A minimal request in the shape Google documents:
import base64
from google import genai
client = genai.Client()
def speak(text: str, style: str, model: str = "gemini-3.8-flash-lite-tts") -> bytes:
interaction = client.interactions.create(
model=model,
input=[{
"type": "user_input",
"content": [{
"type": "text",
"text": text, # verbatim transcript only, no "Say cheerfully:"
"annotations": [{"type": "speech_metadata", "style": style}],
}],
}],
# telephony: ask for headerless PCM or mu-law explicitly
response_format={"type": "audio", "mime_type": "audio/l16"},
generation_config={"speech_config": [{"voice": "Kore"}]},
)
return base64.b64decode(interaction.output_audio.data)The guide requires google-genai >= 2.25.0 for Python or @google/genai >= 2.24.0 for JavaScript, so check your lockfile too.7
What breaks in the Live session
The gemini-3.8-live page lists what changes when you come from gemini-3.1-flash-live-preview:3
thinking_levelis not supported. Removethinking_levelandthinking_configfrom session setup. If you rely on configurable reasoning depth, the separategemini-3.8-live-extended-thinkingmodel takesthinkingLevelof low, medium or high;minimalis not supported there.8- Function calling is non-blocking by default (
behavior: NON_BLOCKING). Setbehavior: BLOCKINGon a tool declaration to keep the old sequential behavior. Scheduling modesSILENT,WHEN_IDLEandINTERRUPTEDare supported.3 send_client_contentworks for the whole session with explicituserormodelroles, andturn_complete=trueunconditionally interrupts active generation.3- Proactive audio is permanently on. Setting
proactive_audio: falsereturns an error.3 - Affective dialogue is removed. Delete any
enable_affective_dialogsetting.3 - Turn coverage defaults to
TURN_INCLUDES_AUDIO_ACTIVITY_AND_ALL_VIDEO. Video frames go to the model by default, so send frames only when needed to control context and cost.3 - Audio is the supported response modality. Enable output audio transcription if your app needs text.3
- With async reasoning active,
turnComplete: truedoes not mean idle. Checkinteraction_status(IN_PROGRESSversusIDLE) for that case.8
Two of these are likely hard failures: Google says proactive_audio: false returns an error, and thinking_level is documented as unsupported, so remove both before the first test. The removed affective dialogue flag is also documented as something to delete.3
Audio formats did not change in anything I read: input is 16-bit PCM at 16 kHz, output is 16-bit PCM at 24 kHz, over a stateful WebSocket.6
Session limits
Google's session-management guide states these limits in general terms: without compression, audio-only sessions last 15 minutes and audio-video sessions 2 minutes; a connection lasts about 10 minutes; context window compression extends a session without a time limit; and session resumption lets one session continue over multiple connections, with resumption tokens valid for 2 hours after the last session termination.9 A GoAway message arrives before the connection ends.9 The guide's examples use gemini-3.8-live.9
I did not find a per-model table of session limits in the pages I read, so I cannot tell you whether the numbers differ from the preview models. Do not assume they match. Put it in the test plan: run a 20-minute audio call and a 3-minute video call, with and without compression, and record where each one ends. In code, enable both mechanisms:
from google.genai import types
config = types.LiveConnectConfig(
response_modalities=["AUDIO"],
# no thinking_level / thinking_config on gemini-3.8-live
context_window_compression=types.ContextWindowCompressionConfig(
sliding_window=types.SlidingWindow(),
),
session_resumption=types.SessionResumptionConfig(handle=previous_handle),
)Store each new_handle from SessionResumptionUpdate messages against the call, and reconnect with it when GoAway arrives or the socket drops.9
Price: what I could confirm
I could not confirm per-unit rates for the three replacements. The pricing page text available to me stopped before the Live and TTS sections, and the 3.8 Live model page only links to a pricing section.3 I am not going to quote numbers from memory.
What to do instead: open the pricing section for each of the three models, copy the list rates into your own sheet, and compare against what your current preview ids cost per call. Voice agents bill by audio units that differ from text tokens, so measure cost per finished call from your own request log rather than extrapolating from a rate card. If you hold negotiated terms with Google, use those. Also note that Live sessions send video frames to the model by default on 3.8, which can change cost if you stream camera input.3
Test plan, with dates
Today is Oct 31 and the earliest shutdown is Nov 17. A schedule that leaves a buffer:
- Oct 31 to Nov 3: inventory. List every call site and config for the five ids, by service and environment. Record call volume per id for the last 14 days so you know what the canary share means.
- Nov 3 to Nov 8: offline tests. Run your recorded prompts through the new ids. For TTS: transcript fidelity (does the audio say exactly the text, with no spoken directions), file validity (one RIFF header, correct sample rate), voice and language coverage, time to first audio. For Live: setup succeeds, tool calls with non-blocking behavior, barge-in, transcript completeness, the long-session test above, and reconnection through resumption.
- Nov 9 to Nov 10: staging soak with real clients, including the telephony or WebRTC bridge that touches the audio.
- Nov 10 to Nov 13: canary. Move a small share of live traffic, then widen it if error rate, latency and call-completion rate hold.
- Nov 14: finish the move. Everything left on a retiring id goes now.
- Nov 15 to Nov 16: freeze and watch. No other changes; confirm that no traffic still names a retiring id.
Fallback routes
Plan the fallback before the cutover, not during an incident.
TTS. The most reliable fallback is the other Gemini 3.8 TTS model. They share a schema and voice ecosystem, so Flash-Lite can fall back to Flash and the reverse, changing only the model parameter.5 Cross-vendor fallback is harder: voice ids are vendor-specific and not portable, so a voice that exists on one vendor does not exist on another.10 If you add a second vendor, pick its closest voice in advance, listen to it, and accept that callers will hear a different voice during a failover.
Live. gemini-3.8-live and gemini-3.8-live-extended-thinking differ in function-calling support (extended thinking supports only non-blocking calls and no scheduling), so one is not a drop-in fallback for the other without testing your tools.8 The structural fallback is a cascade: speech-to-text, a text model, and gemini-3.8-flash-lite-tts, which Google positions for real-time voice agent cascades.2 The deprecations page lists gemini-3.5-transcribe-live and gemini-3.5-transcribe for speech-to-text, with no shutdown date announced.1 The cascade has higher latency and loses native audio behaviors such as barge-in handled inside the model, so decide in advance when your orchestrator flips to it: for example, when session setup fails twice in a row, or on a 5xx before the first audio.
Where a gateway helps, and where it doesn't
INFRO's documented speech endpoint is POST /v1/audio/speech, served for Google AI (Gemini) connections among others; for Google it produces wav or pcm, and a format a target cannot make is refused before the call so the next route target is tried.10 Routing and failover can move a TTS request from gemini-3.8-flash-lite-tts to gemini-3.8-flash-tts on your own Google connection when the first times out or returns a 5xx before the response starts. INFRO's model retirement tracking records Google's shutdown dates, warns organizations still sending a retiring id, and from the shutdown date refuses it before any provider call, naming the replacement. That turns a vendor-side failure into a clear error you can alert on, though it does not replace migrating. The endpoint list in INFRO's docs does not include a realtime WebSocket endpoint, so Live API sessions still connect to Google directly; the request log and usage figures apply to what goes through the gateway.10 See the INFRO docs (opens in a new tab) and the audio and speech page (opens in a new tab).
Checklist for the last two weeks
- All five retiring ids found in code, config, flags and vendor dashboards.
- Each TTS call uses
speech_metadata; no spoken directions in the input text. - WAV header wrapping removed, or
audio/l16,audio/mulaworaudio/alawset explicitly. thinking_level,thinking_config,proactive_audio: falseand affective dialogue settings removed from Live setup.- Tool declarations have
behaviorset deliberately (BLOCKINGorNON_BLOCKING). - Context window compression and session resumption enabled and tested past 15 minutes.
- Voices and languages verified per model; rates copied from the pricing page into your cost sheet.
- Fallback path tested by forcing the primary to fail.
- Zero traffic on retiring ids by Nov 16.
