Someone once asked me which Gemini model my morning-summary automation was using, and I couldn't answer. I opened the screen and it just said "Gemini." I couldn't even find the field where a model name would go.
What I'd like to say up front is this: the first job before a deadline isn't migrating, it's counting where your model names live. The 2.5 models are rerouted on December 1, and several audio previews stop on November 17. As of November 11, 2026, that leaves 20 days and 6 days. Here is the way I trace the names, in three kinds of places.
What changes, and when
I checked the official deprecations page on November 11, 2026. These are the rows that matter here.
| Model | Date | What happens |
|---|---|---|
| gemini-2.5-pro | 2026-12-01 | API calls are automatically routed to gemini-3.8-flash and billed at 3.8 Flash rates |
| gemini-2.5-flash | 2026-12-01 | Routed to gemini-3.5-flash-lite and billed at its rates |
| gemini-3.1-flash-live-preview and one other Live model | 2026-11-17 | Shut down. Replacement: gemini-3.8-live |
| Three TTS previews | 2026-11-17 | Shut down. Replacement: gemini-3.8-flash-tts or gemini-3.8-flash-lite-tts |
The 2.5 models don't stop. They keep answering, just from a different model, which is exactly why it's easy to miss. The official page asks you to read the migration guide for breaking changes before December 1. Output length or shape can shift without a single error on screen.
Names usually live in one of three places
As an indie developer, I use the Gemini API for image classification in my apps. I assumed the model name lived in exactly one place in the code. When I actually went looking, there was a name outside the code too, so fixing the code alone would have changed nothing.
In most setups the places fall into three kinds.
| Kind | Typical spots | How to find it |
|---|---|---|
| Settings screen | Automation-tool scenarios, AI Studio prompts, the model picker in a chatbot builder | Open the part that calls Gemini and look for a "Model" field |
| Environment variable | Hosting or server settings, a .env file | Look for names like GEMINI_MODEL or MODEL_NAME |
| No-code / spreadsheet | Apps Script behind a spreadsheet, form integrations, something a contractor built | Search for strings starting with "gemini-" |
I go in that order. Starting with what you can see keeps your hands moving.
When the settings screen shows nothing
Some parts have no model field. Look for wording like "uses the default model." If the service decides, the name isn't in your hands at all, and the only job is to watch the service's announcements.
My mistake here was reading "I couldn't find it" as "it doesn't exist." The field was simply on another screen. Now anything I searched for and didn't find goes into the ledger as "unconfirmed," never as "none."
Put the names next to their deadlines
Once you know where the names are, list them. Make a spreadsheet with four columns and save it as CSV.
| Column | What to write |
|---|---|
| place | settings screen, environment variable, or no-code |
| where | which tool, which part |
| model | the model name exactly as written |
| owner | who can change it (you, a contractor, the service) |
This script matches your list against the deadline table and sorts by days left. It uses no external libraries. The point is to decide what to touch first by days remaining, not by gut feeling.
import csv
import sys
from datetime import date
# Deadline table. Only dates confirmed on the official deprecations page.
DEADLINES = {
"gemini-2.5-pro": (date(2026, 12, 1), "rerouted to gemini-3.8-flash (billed at 3.8 Flash rates)"),
"gemini-2.5-flash": (date(2026, 12, 1), "rerouted to gemini-3.5-flash-lite (billed at its rates)"),
"gemini-3.1-flash-live-preview": (date(2026, 11, 17), "shut down; replacement gemini-3.8-live"),
"gemini-2.5-flash-native-audio-preview-12-2025": (date(2026, 11, 17), "shut down; replacement gemini-3.8-live"),
"gemini-3.1-flash-tts-preview": (date(2026, 11, 17), "shut down; replacement gemini-3.8-flash-tts etc."),
"gemini-2.5-flash-preview-tts": (date(2026, 11, 17), "shut down; replacement gemini-3.8-flash-tts etc."),
"gemini-2.5-pro-preview-tts": (date(2026, 11, 17), "shut down; replacement gemini-3.8-flash-tts etc."),
}
def main(path, today=None):
today = today or date.today()
rows = []
with open(path, newline="", encoding="utf-8") as f:
for r in csv.DictReader(f): # columns: place, where, model, owner
model = r["model"].strip()
if model in DEADLINES:
due, note = DEADLINES[model]
rows.append(((due - today).days, r, due, note))
else:
# A name missing from the table is not "safe"; it is unchecked.
rows.append((9999, r, None, "not in the deadline table; check the official page"))
for left, r, due, note in sorted(rows, key=lambda x: x[0]):
when = f"{left} days left until {due}" if due else "no date known"
print(f"[{r['place']}] {r['where']} / {r['model']} / owner {r['owner']} -> {when}: {note}")
if __name__ == "__main__":
main(sys.argv[1])Try it with a three-row CSV like this one.
place,where,model,owner
settings screen,automation scenario "morning summary",gemini-2.5-flash,me
environment variable,server setting GEMINI_MODEL,gemini-2.5-pro,me
no-code,Apps Script behind a spreadsheet,gemini-3.1-flash-tts-preview,contractorRun on November 11, 2026, the no-code row comes first with 6 days left, followed by the two December 1 rows at 20 days. On screen, the settings-screen row had looked like the urgent one. I only saw the contractor's row was first once the list was sorted by date.
Why unlisted names go last
A name that isn't in the table isn't safe, it's unchecked. gemini-2.5-flash-lite, for instance, is not deprecated on the official page, but a model that isn't listed could still become unavailable for another reason. I'd rather the script say "no date known" where I can see it than quietly imply all is well.
When you can't fix it yourself
Rows owned by a contractor or by the service are out of your hands. Two things still help.
- To a contractor, send the model name, the place, and the deadline in one message, with a screenshot if you have one.
- If the service picks the name, put a reminder on your calendar to check its announcements page.
Leave those rows alone and you'll learn about them on the morning of the deadline. I have left a contractor-built piece unchecked myself. These days, the rows I can't fix are the first ones I contact about.
What to do next
Open one settings screen and see whether a model field exists. Copy whatever you find into the first row of the CSV. If a name is hard to read, reading a model name in four parts may help. To count names inside code mechanically, see counting them from your own folder. For checking what actually answered after a reroute, I wrote about logging requested versus served models.
With even one row in the ledger, you can meet December 1 calmly. That is a line I try to hold, even in busy weeks.