AI Studio silently routing gemini-3.1-pro-preview requests to Flash Lite

I’m making API requests to gemini-3.1-pro-preview through Google AI Studio. Network inspection of the streaming response shows that earlier chunks report modelVersion: “gemini-3.1-pro-preview”, but the final chunk (with finishReason: “STOP”) reports modelVersion: “3.1-flash-lite-preview-03-2026”.

The AI Studio usage dashboard confirms this. Input tokens are exclusively attributed to Gemini 3.1 Pro, but output tokens show Flash Lite consumption — even though I never selected that model. This was not a gradual transition: requests on the morning of Sep 2 were correctly served by Pro, but from the evening onward every request was routed to Flash Lite. By Sep 3, Pro output tokens dropped to 0.

This does not happen when using the same model through Vertex AI. My account has a paid billing plan with remaining credit. Context length is ~35K tokens. Thinking level is set to HIGH.

Raw streaming response data — note the modelVersion change between the two final chunks:

data: {"candidates": [{"content": {"parts": [{"text": "”\u003c/p\u003e\n\u003c/div\u003e\n\u003c/details\u003e\n\u003c/sidestory\u003e"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 34772,"candidatesTokenCount": 2480,"totalTokenCount": 37252,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 34772}],"serviceTier": "standard"},"modelVersion": "gemini-3.1-pro-preview","responseId": "wfGZapXjKNOB_uMPjLWhQA"}
data: {"candidates": [{"content": {"parts": [{"text": ""}],"role": "model"},"finishReason": "STOP","index": 0}],"usageMetadata": {"promptTokenCount": 34772,"candidatesTokenCount": 2480,"totalTokenCount": 37252,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 34772}],"serviceTier": "standard"},"modelVersion": "3.1-flash-lite-preview-03-2026","responseId": "wfGZapXjKNOB_uMPjLWhQA"}

Dashboard screenshots:

Is this expected behavior? Is there a way to ensure requests are actually served by the Pro model?

Update: After extensive testing, the routing trigger is input token count, not content. Requests with ~12,600 prompt tokens are served by Pro; adding ~73 more tokens causes routing to Flash Lite. The threshold appears to be approximately 12,600–12,700 input tokens. Content, safety settings, API endpoint, and API key are all ruled out as factors.

Thank you @atanos for this critical investigation. I can confirm this exact behavior starting around September 4th, and we are observing the identical silent routing issue in our Google Cloud Platform (GCP) environment.

In our pipeline, we rely on gemini-3.1-pro-preview with high reasoning enabled (thinking_level: HIGH) for complex logical tasks:

  1. Thinking Bypassed / Truncated Output: Since September 4, as soon as the input context crosses the ~12.6k token mark, the request returns almost instantly (TTFT drops to near zero). The model completely bypasses the thinking chain or spends virtually zero time thinking, outputting an extremely brief, degraded, and truncated response.

  2. Impact on GCP Workloads: Prior to September 4, identical prompts with long contexts thought properly and produced full, high-quality responses under Pro. Now, even with explicit high thinking settings, the reasoning capability is completely disabled.

  3. Billing and Metering Discrepancy: If requests are being silently redirected to Flash Lite while GCP meters prompt tokens against Pro pricing, this creates a serious discrepancy for cloud workloads that depend on guaranteed Pro reasoning.

Could someone from the Google / GCP team please clarify:

  • Is this silent downgrade an upstream routing bug under high TPU load, or an unannounced policy?
  • If this is a fallback mechanism, can we have an option to fail explicitly (such as 503 or 429) rather than silently returning degraded Flash Lite outputs without reasoning?

Would appreciate any insights from the team. @staff

Quick follow-up and additional testing update regarding gemini-3.1-pro-preview:

We tested across the Google AI Studio web interface (including Build mode) and via Gemini API Tier 3 keys. The behavior is completely consistent:

Compared to before:

  • The thinking speed is noticeably faster.
  • The token generation speed is also faster.
  • However, the output quality is much lower, and the word count is significantly less.

Given the faster thinking and generation speeds alongside the noticeable drop in quality and response length, we strongly suspect that the output is being routed to another model, such as Lite.

If this is an upstream bug, please investigate and fix it as soon as possible.

Could @Logan_Kilpatrick and @Payal_Sharma2 please take a look?

Hello @atanos ,

Can you share a HAR file while reproducing the issue. These are the steps below:

  1. Open Chrome DevTools: right-click anywhere on the page and choose Inspect.
  2. In the DevTools panel, select the Network tab. The tool automatically begins recording network activity.
  3. Select Preserve log.
  4. Click block Clear network log.
  5. Reproduce the issue by interacting with the Google Cloud console.
  6. When you’re done reproducing the issue, click download Export HAR (sanitized) and save the generated HAR file.

Hi @Pooja_Kapse , thanks for following up.

A HAR from the AI Studio web interface won’t capture this. The web app calls an internal endpoint (alkalimakersuite-pa.clients6.google.com), and requests on that path are served correctly by Pro with thinking intact. The downgrade occurs on the public API at generativelanguage.googleapis.com, so a HAR exported from the web UI would only show a healthy request.

Instead I have a deterministic reproduction using plain curl with an API key — no client library, no framework. All requests were POSTs to models/gemini-3.1-pro-preview:streamGenerateContent?alt=sse on a Tier 1 paid account, made on 17–18 September 2026 (UTC-4). The three runs below used the same endpoint and the same generationConfig, and differ only in the prompt:

responseId promptTokens final modelVersion thinking
2dGsau-eK8-v_PUPka6ssQc 9,350 3.1-flash-lite-preview-03-2026 1,412 tokens
6K2saq73Ks2d-8YPy87w0A8 21,824 3.1-flash-lite-preview-03-2026 1,476 tokens
UsusapO6INSo_PUPhuXSsAQ 22,050 gemini-3.1-pro-preview 1,678 tokens

Each prompt was run repeatedly and the outcome is stable per prompt. The prompt used in rows 1 and 2 has produced the downgrade in every run, across two days and multiple variations of its content.

In the two downgraded runs, every chunk of the stream reports gemini-3.1-pro-preview, and only the very last chunk reports 3.1-flash-lite-preview-03-2026. Row 3 is public-domain classical Chinese text with a one-line summarisation instruction; rows 2 and 3 are 226 tokens apart with opposite outcomes.

I should also update my earlier finding in this thread. In early September the trigger appeared to be input token count, with a threshold near 12,600 — at the time this was reproducible under controlled conditions (disabling one section to drop below the threshold stopped the downgrade; replacing that section with unrelated content of equal token count did not), and the same threshold was independently reported earlier in this thread on a different path. That behaviour no longer reproduces. Row 3 above has the highest prompt token count of the three and was served by Pro, while row 1 at 9,350 tokens was downgraded. Whatever determines the outcome now, it is not token count — which suggests the routing logic itself changed at some point between September 4 and September 17.

I’ve since tested and ruled out maxOutputTokens, topK, topP, temperature, frequencyPenalty, presencePenalty, thinking level, message structure (fragmented, merged, and single-turn), and the client itself. What remains is that different prompts produce consistently different outcomes — rows 2 and 3 are the clearest case, nearly identical in length and sent with identical settings, yet one is always downgraded and the other never is. I can’t determine from the outside what distinguishes them, and I’d rather not speculate.

On the reported modelVersion, there are only two possible readings, and both need addressing:

  • The request was served by Flash Lite while reported as Pro for the entire stream. That is a silent downgrade.
  • The request was served by Pro and the final chunk misreports it as Flash Lite. That is a reporting defect affecting model identity and usage attribution.

The attached dashboard covers the test period. Input tokens are attributed to Pro only, while output tokens are split between Pro and Flash Lite on the same day. That points to the first reading. But under the second reading the metering system is recording the wrong model, which is a billing-accuracy problem rather than a cosmetic one. Preview status may explain variability in output quality, but not a response that reports one model while usage is attributed to another. Either way the current behaviour shouldn’t stand.

Beyond that, two things are worth fixing regardless of cause:

  1. A client reading modelVersion as the stream arrives sees gemini-3.1-pro-preview for the entire response, and finds out otherwise only from the final chunk — after the content has already been received.
  2. There is no explicit signal and no opt-out. As @yuuji asked earlier: if this is a capacity fallback, could it fail explicitly (503/429) rather than silently returning a degraded response?

Even if the routing is intentional and stays, callers should be able to detect that it happened. At present there is no documented way to know, and no way to request that it not happen.

The prompt used in rows 1 and 2 is derived from a third party’s work, which I’m not able to share publicly. If your team needs a payload, I can construct a minimal synthetic case instead — let me know if that would help.

Following up on my offer of a minimal synthetic case in post #6.

Three single-turn requests to gemini-3.1-pro-preview:streamGenerateContent?alt=sse, same API key, identical generationConfig (temperature 1.03, topP 0.97, maxOutputTokens 1024), sent 20 September 2026 (UTC-4).

# prompt promptTokens final modelVersion thoughts responseId
1 写一段两人在咖啡馆见面的小故事。(不允许出现做了很多事情,最后时间只前进了几分钟。) 26 3.1-flash-lite-preview-03-2026 0 ZnSvapyiI6yl1MkP-buqoQ0
2 写一段两人在咖啡馆见面的小故事。(不允许出现做了很多事情,最后时间只过去了几分钟。) 25 gemini-3.1-pro-preview 983 K3avatLpD8zQ_uMPzaiWmQM
3 写一段两人在咖啡馆见面的小故事。 12 gemini-3.1-pro-preview 981 a3SvasrnPK-3_uMP1YG_2Qs

English translations:

  1. “Write a short story about two people meeting in a café. (Don’t let a lot happen while the clock only moves forward a few minutes.)”
  2. “Write a short story about two people meeting in a café. (Don’t let a lot happen while the clock only passes by a few minutes.)”
  3. “Write a short story about two people meeting in a café.”

Rows 1 and 2 differ by one word — 前进 and 过去 are near-synonyms here, both describing time elapsing. Row 1 is downgraded on every run, and the downgraded response does no thinking at all. Input tokens are billed as Pro in all three cases. The same sentence produces the downgrade at 26 tokens and at 21,000 (row 2 of the table in my previous post), so request size is not the factor.

Three things I’d like to ask for:

  1. The misclassification itself. Your abuse-monitoring documentation lists, under working with developers on policy compliance, “changing which model answers a specific request” as one possible measure, and describes the first step as reaching out by email to understand the use case. Request 1 above asks for a café scene with a note about narrative pacing. If it isn’t that mechanism, what distinguishes request 1 from request 2? If it is, which policy does the request fall under?
  2. A signal when substitution happens — as described in post #6, and still the case here.
  3. Billing consistent with the model that served the request. Input tokens for request 1 are attributed to Pro while the response came from Flash Lite. Either the request should not be downgraded, or its input should not be billed at Pro rates.

For anyone seeing similar symptoms: the substitution is only visible in the final chunk of the stream (modelVersion), and in the usage dashboard, where output tokens are attributed to a model you did not select.

Correction to post #2. The ~12,600-token threshold I reported does not hold as a general rule: in those tests, the two configurations served by Pro had different prompt sizes (10,480 and 12,601 tokens). I have since retested the replacement text I used at the time, and on its own it does not trigger the downgrade. I no longer have a complete reconstruction of those early-September configurations and can’t say what was happening then.

The responseIds above are safe to inspect in full.