GEMINI LABJP
SUNSET — gemini-robotics-er-1.6-preview shuts down on August 31. Thirteen days out, which makes this the week to actually start the migrationMIGRATION — The replacements are gemini-robotics-er-2-preview and gemini-robotics-er-2-streaming-preview, both in public preview since July 30 and both accepting text, image, video, and audio inputPRICING — Gemini 3.7 Flash went GA on August 13 at an introductory price that runs through December 31, 2026, so anything spanning the new year needs a two-stage cost estimateDEPRECATION — The temperature, top_p, and top_k sampling parameters are now deprecated. If your code sets them explicitly, measure the output difference without them while there is still timeVIDEO — Gemini Omni Flash, a model for generating and editing video, is available in Google AI Studio and through the Gemini APILOGS — The Interactions API now supports developer logs, viewable for supported calls from the AI Studio dashboardSUNSET — gemini-robotics-er-1.6-preview shuts down on August 31. Thirteen days out, which makes this the week to actually start the migrationMIGRATION — The replacements are gemini-robotics-er-2-preview and gemini-robotics-er-2-streaming-preview, both in public preview since July 30 and both accepting text, image, video, and audio inputPRICING — Gemini 3.7 Flash went GA on August 13 at an introductory price that runs through December 31, 2026, so anything spanning the new year needs a two-stage cost estimateDEPRECATION — The temperature, top_p, and top_k sampling parameters are now deprecated. If your code sets them explicitly, measure the output difference without them while there is still timeVIDEO — Gemini Omni Flash, a model for generating and editing video, is available in Google AI Studio and through the Gemini APILOGS — The Interactions API now supports developer logs, viewable for supported calls from the AI Studio dashboard
Articles/API / SDK
API / SDK/2026-08-18Intermediate

Routing Between Gemini 3.7 Flash and 3.1 Pro by Rework Cost, Not Speed

A single question replaced my model-selection ritual: can a machine catch this output when it is wrong? Here is how that splits work between 3.7 Flash and 3.1 Pro, plus the pricing math across the December 31 cutover.

Gemini 3.7 FlashGemini 3.1 Pro2Model Selection2Cost Design2Gemini API214

On August 13, the day Gemini 3.7 Flash went generally available, I opened the config file for my content pipeline and sat there for ten minutes without typing anything.

The edit itself is one line. Swap a model name string, save, done.

What stopped me was noticing that I rebuild the reasoning behind that one line from scratch every single time a new model ships.

Every new model puts me back in the same spot

I run four technical blogs and a handful of apps as an indie developer. The Gemini API sits inside both, doing the unglamorous parts: rough translation, classification, summarization.

Model generations turned over more times this past year than I care to count. My process each time was to skim a benchmark table and conclude "this will probably be fine."

That is a weak way to decide. Benchmarks measure average capability, not the shape of the failures that occur in my specific pipeline.

The trouble never came from a weaker model returning something obviously mediocre. It came from a well-formed, confident answer that happened to be factually wrong, and that nobody caught before it moved downstream.

The last thing I check is whether a machine can catch the mistake

So I narrowed the decision to one question: when this step produces a wrong output, can something automated reject it before a human reads it?

If yes, a fast, cheap model is fine. A slightly higher error rate just means the gate rejects more and retries more. The extra cost is one more API call — not an hour of my afternoon.

If no, the calculus flips. A bad output that clears the step gets discovered after publication. Fixing it means replacing content, invalidating caches, and sometimes apologizing. The few cents saved turn into hours.

Put differently, model selection is not really a question of accuracy. It is a question of who pays for the rework — the machine or me. If the machine can absorb it, use Flash. If I absorb it, keep Pro.

Sorting my own pipeline by that rule produced this:

StepHow errors get caughtModel assigned
Suggest article tagsMatch against existing tag dictionary (automated)3.7 Flash
Draft Google Play store listing translationsCharacter limits and banned-term list (automated) plus a final read3.7 Flash
Classify review sentimentSchema validation and enum checks (automated)3.7 Flash
Judge whether a technical claim holdsNot automatable3.1 Pro
Decide the design approach in a code exampleNot automatable3.1 Pro

The top three break loudly when they break. The bottom two fail quietly and plausibly, which is exactly the dangerous kind.

Steps that move to Flash ship with their gate

Anything I move to Flash gets its validation written first. Reverse that order and you feel the savings immediately while the quality drift takes weeks to surface.

Here is how the classification step looks. The schema constrains the shape, out-of-range enum values get rejected, and only the rejects escalate to the larger model.

import json
 
from google import genai
from google.genai import types
 
client = genai.Client(api_key="YOUR_API_KEY")
 
ALLOWED = {"bug", "feature_request", "praise", "pricing", "other"}
 
SCHEMA = {
    "type": "object",
    "properties": {
        "label": {"type": "string", "enum": sorted(ALLOWED)},
        "confidence": {"type": "number"},
    },
    "required": ["label", "confidence"],
}
 
 
def classify(text: str, model: str = "gemini-3.7-flash") -> dict:
    response = client.models.generate_content(
        model=model,
        contents=f"Classify the following review.\n\n{text}",
        config=types.GenerateContentConfig(
            response_mime_type="application/json",
            response_schema=SCHEMA,
        ),
    )
    return json.loads(response.text)
 
 
def classify_with_gate(text: str) -> dict:
    result = classify(text)
 
    # Gate: escalate only out-of-range labels and low-confidence calls
    if result["label"] not in ALLOWED or result["confidence"] < 0.6:
        return classify(text, model="gemini-3.1-pro")
 
    return result

The confidence threshold is yours to tune. I started at 0.8, watched more than 30% of traffic escalate to Pro, and settled at 0.6. Set it too high and the cheap model stops earning its place.

One note on the code you may be migrating from. I used to pin temperature to something like 0.1 to keep output stable, but temperature, top_p, and top_k were deprecated on July 21. While they still work, run the same input through a few times with those parameters removed and watch how much the output actually drifts. Measuring that now is much calmer than measuring it the week they stop taking effect.

Steps only a human can check stay on Pro for now

The remaining two steps have not moved, no matter how fast 3.7 Flash is. Not because of throughput — because I pay the full price when they are wrong.

Judging a technical claim is the clearest case. A sentence like "this API behaves this way" reads perfectly well whether or not it is true. If it is false, someone loses an afternoon inside their own codebase because of it. I do not yet have an automated check that catches that class of error.

Google describes 3.7 Flash as substantially improved on software engineering and agentic workflows, and I have no reason to doubt it. My reason for keeping Pro is not a ranking of capability. It is who cleans up afterward.

The three thinking levels — low, medium, high — do let me draw the line more finely than before. There is now a middle option: keep the step on Flash and raise the thinking level instead of moving it wholesale. Migrating at high first and stepping down only while gate rejection rates stay flat is the safer order.

If price is the argument, calculate across December 31

"Flash is cheaper" comes with an expiration date attached. Gemini 3.7 Flash launch pricing is $0.75 per million input tokens and $3.75 per million output tokens, and it holds through December 31, 2026. The day after, it becomes $1.50 and $7.50.

That is a doubling. If you are reading today's invoice and concluding you have room, the premise changes in January.

The reliable move is to run your own volume through both rates now. Here are figures derived from daily call counts and per-call token sizes.

Scale (per day)Monthly at launch pricingMonthly from 2027Annual difference
50 calls (4,000 in / 800 out)$9.00$18.00$108.00
300 calls (8,000 in / 1,200 out)$94.50$189.00$1,134.00
1,500 calls (12,000 in / 2,000 out)$742.50$1,485.00$8,910.00

At the small end, $108 a year is not going to change anyone's architecture. Past the middle row, it starts to matter.

If you want the absorption side of that math, the batch tier offsets the Gemini 3.7 Flash price increase almost exactly walks through which models the change applies to and how to project the January invoice. How much work you can push into non-urgent lanes scales with your volume.

What to do next

Open your config and count the places a model name appears. Then ask one question at each of them: when this output is wrong, who notices first — a machine, or me?

If the answer is the machine, that line can move to the faster model today. If the answer is you, leaving it alone is the cheaper decision. In my case, that one question resolved three of five call sites without any further deliberation.

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

API / SDK2026-07-05
Designing Batch Image Costs with Nano Banana 2 Lite: Decide by Measuring
How to fold the fastest, cheapest image model, Nano Banana 2 Lite, into high-volume generation: measuring per-image cost, a two-tier setup with a quality model, and retry handling grounded in real numbers.
API / SDK2026-08-17
After generated_images Disappeared: Three Branches Between the Response and a Saved File
Once you switch to generate_content, the line that breaks is usually the save. Here are the three branches on the response side - zero image parts, a shifting image count, and picking the extension - plus a receiver function you can drop in.
API / SDK2026-08-16
Moving to the Batch Tier Cancels Out the Gemini 3.7 Flash Price Increase Exactly
Introductory pricing for Gemini 3.7 Flash ends on December 31, 2026, and the rate doubles the next day. Here is which models are affected, which are not, and how to project your January bill from the usage you already have.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links
See all →