◉GEMINI LABJP
●TTS — The three TTS preview models shut down on 12/18 per the deprecations page, not 11/17●CLI 0.68 — Gemini CLI stable is v0.68.0, with v0.69.0-preview.0 (11/10) on the preview channel●GEMINI 2.5 — gemini-2.5-pro and 2.5-flash shut down on the API on 12/1, 16 days left. Move to 3.8 Flash or 3.5 Flash-Lite●NODE 26 — On Node 26, Gemini CLI's timeout settings reportedly stop applying to model requests●OMNI 1.1 — From 12/3, requests to gemini-omni-1.1-flash are routed to 1.2 Flash automatically●NEW — Getting Consistent JSON Through the OpenAI-Compatible Layer, in Three Steps●TTS — The three TTS preview models shut down on 12/18 per the deprecations page, not 11/17●CLI 0.68 — Gemini CLI stable is v0.68.0, with v0.69.0-preview.0 (11/10) on the preview channel●GEMINI 2.5 — gemini-2.5-pro and 2.5-flash shut down on the API on 12/1, 16 days left. Move to 3.8 Flash or 3.5 Flash-Lite●NODE 26 — On Node 26, Gemini CLI's timeout settings reportedly stop applying to model requests●OMNI 1.1 — From 12/3, requests to gemini-omni-1.1-flash are routed to 1.2 Flash automatically●NEW — Getting Consistent JSON Through the OpenAI-Compatible Layer, in Three Steps
Articles/Gemini Basics
◉ Gemini Basics/2026-08-16Beginner

The Strongest Gemini Is in Preview and the Cheap One Is GA. That Ordering Should Drive Your Model Choice

Sort the Gemini lineup by release stage instead of capability and the order inverts: the strongest reasoning model sits in preview while the fast, inexpensive Flash models are GA. Here is how a solo developer handles that, plus a 30-line script that counts how many preview models your code already depends on.

Gemini99model selection6preview3GAsolo development4

On the night of August 16, I was going through the image models that stop working the next day when one line made me pause.

The model that stops does not have -preview in its name. It stops anyway.

Meanwhile, the model that currently does the deepest reasoning for me does have -preview in its name. And I have been running it in a production pipeline.

I had been treating the suffix as a safety marker. It turns out it was never protecting anything.

GA and preview differ in warning, not in polish

If you read GA and preview as "finished" versus "unfinished," you will pick the wrong model.

In day-to-day work, only one distinction has mattered to me:

Whether the model's shutdown shows up in the deprecation table with a date attached.

GA models get retired too. imagen-4.0-generate-001, which was scheduled to stop on August 17, is not a preview model by name. It was a GA model being retired on a published date.

Preview models can quietly get replaced before they ever reach that table. When the image preview models stopped back in June, I found out after a morning batch had already failed.

So the difference is not whether a model disappears. It is whether you are given time to prepare before it does.

Once I framed it that way, the question I ask when picking a model changed. Instead of "which one is smartest," I now start with "when would I be told this one is going away."

Right now, capability order and GA order do not match

Here is the lineup as I wrote it down in August 2026, sorted by release stage rather than performance. It reads a little uncomfortably. Stages shift over time, so take away the habit of re-sorting rather than any single row.

ModelStageTypical use
Gemini 3.1 PropreviewTop-tier reasoning for work that needs depth
Gemini 3.7 FlashGA (August 13)Coding, web development, agentic workflows
Gemini 3.6 FlashGAGeneral purpose with better token efficiency, priced below 3.5 Flash
Gemini 3.5 Flash-LiteGALow latency and low cost, for high-volume subagents
Gemini 3.1 Flash TTSpreviewSpeech synthesis with controllable delivery

The list does not descend from strongest to weakest. The most capable tier is in preview, and the tier that runs your daily workload is GA.

For an indie developer, that narrows the decision to one thing: the more thinking a job needs, the more likely you are handing it to a model that can change without notice.

In my own setup, anything that runs every day — cleaning up article drafts, drafting the store descriptions I ship to the App Store and Google Play — sits on GA Flash models. Work that runs only a few times a month, like talking through a design problem, goes to the preview Pro model.

The reason is recoverability, not quality. If something I run a few times a month breaks, I can fix it by hand that day. Something that fires at five in the morning does not give me that option.

Count your preview dependencies before you decide anything

Deciding to "avoid preview" is useless until you know how many places already use it.

So I keep a small script that collects every spot where a model ID appears and sorts them into three buckets. There is nothing clever in it. It picks up strings and splits them by the shape of the name.

#!/usr/bin/env python3
"""check_preview_models.py
Collect every place in a codebase that names a Gemini model and
bucket them into GA / preview / alias.
Usage: python3 check_preview_models.py <directory>
"""
import re
import sys
from pathlib import Path
 
MODEL_RE = re.compile(r"[\"']((?:gemini|imagen|gemma)[a-z0-9._-]*)[\"']")
TEXT_SUFFIX = {".py", ".ts", ".tsx", ".js", ".mjs", ".json", ".yaml", ".yml", ".toml"}
 
 
def classify(model_id: str) -> str:
    if model_id.endswith("-latest"):
        return "alias"          # target swaps silently
    if "-preview" in model_id or "-exp" in model_id:
        return "preview"        # warning window may be short
    return "ga?"                # looks GA, but see the trap below
 
 
def scan(root: Path):
    found = []
    for path in sorted(root.rglob("*")):
        if not path.is_file() or path.suffix not in TEXT_SUFFIX:
            continue
        lines = path.read_text(encoding="utf-8", errors="ignore").splitlines()
        for lineno, line in enumerate(lines, 1):
            for m in MODEL_RE.finditer(line):
                found.append((classify(m.group(1)), m.group(1), f"{path}:{lineno}"))
    return found
 
 
def main() -> int:
    root = Path(sys.argv[1] if len(sys.argv) > 1 else ".")
    found = scan(root)
    if not found:
        print("No model IDs found. Check your environment variables too.")
        return 0
    for bucket, label in (("preview", "preview (short warning window)"),
                          ("alias", "alias (target swaps silently)"),
                          ("ga?", "looks GA (verify in the deprecation table)")):
        rows = [r for r in found if r[0] == bucket]
        print(f"\n[{label}] {len(rows)} occurrences")
        for _, model_id, where in rows:
            print(f"  {model_id:38s} {where}")
    risky = sum(1 for r in found if r[0] in ("preview", "alias"))
    print(f"\n{len(found)} total, {risky} to check first.")
    return 1 if risky else 0
 
 
if __name__ == "__main__":
    sys.exit(main())

The reason it walks .json and .yaml files is that model names hide in configuration far more often than in code. Grepping only your Python files feels thorough and still misses the one line that matters.

Aliases get their own bucket on purpose. A name like gemini-flash-latest will point at a different model one day without any shutdown notice arriving. That is a different kind of uncertainty from preview, and mixing the two leads to the wrong fix.

The line the script labels "GA" is the one that was about to break

I ran it against a small sample project, and the output is the part of this article I most want you to see.

[preview (short warning window)] 2 occurrences
  gemini-3.1-pro-preview                 sample/app/draft.py:1
  gemini-3.1-flash-tts-preview           sample/app/tts.ts:1
 
[alias (target swaps silently)] 1 occurrences
  gemini-flash-latest                    sample/conf/models.json:1
 
[looks GA (verify in the deprecation table)] 3 occurrences
  gemini-3.6-flash                       sample/app/draft.py:2
  gemini-3.5-flash-lite                  sample/app/tts.ts:2
  imagen-4.0-generate-001                sample/conf/models.json:1
 
6 total, 3 to check first.

Sitting in the bottom bucket, labeled as probably GA, is imagen-4.0-generate-001. That is the model with a shutdown date already set.

The script is not wrong. By name alone, it genuinely is not a preview model. The shape of a model name tells you nothing about whether it is about to be retired.

So I treat this sorting as a tool for deciding what order to check things in, not as a danger detector. Preview entries and aliases get verified first; the GA column gets checked line by line against the deprecation table.

The separate question of a deprecated SDK method versus a retired model is covered in generate_images Survives Until 2027. Your Image Generation Still Stops on August 17. This sorting is the step that keeps those two from blurring together.

Write down where preview is allowed, in your own words

Avoiding preview entirely is not realistic, because the model that thinks hardest lives there.

I draw the line with three rules.

  1. A person reviews the output before anything continues — preview is fine, since a failure is visible immediately.
  2. It runs unattended on a schedule — GA only, because I would not notice until the next morning.
  3. The output is stored and has to be reproducible later — no preview, because the same output may never be producible again.

The third one came out of June. I tried to regenerate a wallpaper app background that a preview model had produced, under the same conditions, and could not. If generated artifacts become assets, the disappearance of the model that made them belongs in the plan.

Writing these rules down matters more than it sounds. While they live only in your head, they quietly bend on the day a deadline is close.

Choosing among GA models, incidentally, tends to be settled by the invoice rather than by capability. How to absorb the pricing of 3.7 Flash, which reached general availability on August 13, is covered in Moving to the Batch Tier Cancels Out the Gemini 3.7 Flash Price Increase Exactly.

One thing to do today

Run the script once against your own project and keep a note of just the preview and alias lines it prints.

Nothing needs fixing yet. Knowing the count is what shortens the scramble on the day the next shutdown notice arrives.

I went into that June morning without knowing my own number. These days the script runs on the first of every month, so that particular surprise only had to happen once. Thank you for reading.

Share

Thank You for Reading

Gemini Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • ✦Copy-paste ready implementation code
  • ✦New advanced guides published daily
  • ✦$5/mo or $10 for lifetime access
View Membership →

If you found this article helpful, a small tip ($1.50) would mean a lot to us. Your support helps keep this site ad-free and covers server and hosting costs.

Related Articles

◉ Gemini Basics2026-10-24
When Model Names Stop Making Sense: Reading Them in Four Parts
How to read a long Gemini model name like gemini-3.8-flash-lite-tts as generation, line, variant and release stage, plus a short script and where to check words you can't read.
◉ Gemini Basics2026-10-27
Gemini for Windows Opens with Alt + Space. Count What Already Owns That Key Before You Install
The Gemini app for Windows is summoned with Alt + Space, and its help page says nothing about what to do when the key does nothing. Here is what to count before installing, and a five-step order for the day it fails.
◉ Gemini Basics2026-09-13
I edited the Drive doc, asked Gemini again, and it quoted the old sentence back
When Gemini answers from an outdated version of a Drive file, the file usually isn't the problem — the conversation is. Here's how sources stay attached for the whole conversation, why you can't remove one mid-thread, and what to do about partial reads.