Google's own migration checklist for gemini-3.7-flash tells you to delete three sampling parameters most teams have carried in their generation config for years. If you migrated by swapping the model string, you are shipping dead parameters and paying for a thinking level you never chose.
Most model migrations are a string swap. This one is not. Google's migration checklist for gemini-3.7-flash opens with the model id change and then, under the heading Remove deprecated sampling parameters, instructs you to strip temperature, top_p, and top_k from generation configs. Those three have been in nearly every production Gemini call since the first API, usually set once by whoever built the wrapper and never revisited. On this model they are no longer the dial you think they are, and the checklist also tells you to remove candidate_count, which it notes is unsupported in Gemini 3.x.
The second item is the one that quietly changes your bill and your latency. The checklist says to replace thinking_budget with the string enum thinking_level. For gemini-3.7-flash, thinking_level accepts low, medium, and high, and the default is medium. Read that again if you chose a Flash model for speed: unless you set thinking_level explicitly, every call is running medium thinking, not low. The cheapest performance win available to most teams this week is one line setting thinking_level to low on the endpoints where latency matters more than depth.
There is a trap in how teams usually perform this migration. Google's FAQ answers the obvious question directly: yes, thinking_budget is still supported for backward compatibility, but the guidance is to migrate to thinking_level for more predictable performance, and, in the documentation's own words, do not use both in the same request. Backward compatibility is what makes this dangerous rather than safe. A team that migrates by adding thinking_level in the call site while a shared config helper still injects thinking_budget is now sending both, and nothing about the code review will make that visible.
Two more items are worth an audit pass while you are in there. Gemini 3 models use thought signatures to maintain reasoning context across API calls, and the documentation describes these as encrypted representations of the model's internal thought process, so any middleware that trims unrecognized fields out of responses is silently severing the model's reasoning continuity between turns. Separately, the checklist notes that only when using the generateContent API, all FunctionResponse objects must include call_id and name, which is a fast way to explain function calling failures that appeared right after a migration and looked like model regression.
The general lesson is worth more than the specific parameters. A migration checklist that says remove is telling you something a benchmark never will. Deprecated parameters do not usually announce themselves at runtime, they just stop meaning what they used to, and the code keeps sending them for years.
Try it today
- Grep your codebase and shared config helpers for temperature, top_p, top_k and candidate_count on any gemini-3.7-flash call path, and strip them from the generation config.
- Set thinking_level explicitly rather than relying on the default. It defaults to medium on gemini-3.7-flash; use low on latency sensitive endpoints and reserve high for tool heavy or long reasoning work.
- Search for thinking_budget separately, including in wrappers and defaults, and confirm no request can end up carrying both thinking_budget and thinking_level.
- Check that any response middleware preserves thought signatures rather than stripping unrecognized fields.
- If you use the generateContent API, confirm every FunctionResponse object carries both call_id and name.