Kimi K3 现已上线查看 Kimi K3
Gemini 3.6 Flash API 迁移网关,区分显性请求错误与被静默忽略的参数
教程

Gemini 3.6 Flash 迁移指南:5 处 API 变化与 1 个静默失效

Jacey
Jacey
创始人
2026年7月21日
29 分钟阅读
一句话结论 切到 gemini-3.6-flashgemini-3.5-flash-lite,请求格式有五处变化。其中四处会返回 HTTP 400,你立刻就知道。剩下一处不会:temperaturetop_ptop_k 现在传了会被收下,然后被忽略。如果你靠 temperature=0 来保证输出稳定,切过去之后接口照样返回 200,而你原本指望的那个保证已经没了。先修这一处,再修那四处。
Last verified: 2026-07-21
Google 在 2026 年 7 月 21 日发布了 Gemini 3.6 Flash 和 Gemini 3.5 Flash-Lite。发布当天的报道大多在讲跑分和价格。这一页讲的是更窄也更急的一件事:请求格式变了,而且官方明说这套新规则从这两个模型开始生效,此后发布的所有模型都适用

如果你打算只改配置文件里的一个模型名、指望别的都照旧,请先读完第一节再上线。

五处变化,按"你多久会发现"排序

变化在新模型上会发生什么你怎么发现
temperaturetop_ptop_k收下,然后忽略不会发现。不报错,也没有警告。
thinking_budgetthinking_level 同时传请求被拒HTTP 400
请求最后一条消息的角色是 model请求被拒HTTP 400
FunctionResponsecall_idname请求被拒HTTP 400
candidate_countGemini 3.x 不支持请求失败,或该字段被丢弃

五处里有四处会自己喊出来:集成测试能拦住,报错监控会叫你,一个下午就能修完。真正会带着问题进生产环境的,是第一处。

危险的那一处:temperature、top_p、top_k 现在会被静默忽略

官方原话没有含糊:这几个参数"已废弃且会被忽略",并且"在未来的模型代次中,传这些参数会返回 HTTP 400 错误",要求现在就从所有请求里删掉
这个顺序值得读第二遍,因为它决定了风险落在什么时候。今天这个参数是个空操作,以后才会变成报错。也就是说,你最可能对自己系统产生误判的时间点,恰好是现在,因为一切都还返回 200。
Gemini 3.6 Flash 采样参数看似仍在工作,但信号在进入生产推理路径前已消失
Gemini 3.6 Flash 采样参数看似仍在工作,但信号在进入生产推理路径前已消失
请求链路仍会接收采样参数,但它们已不再影响 Gemini 3.6 Flash 的输出。

哪些流水线会不报错地坏掉

静默的空操作只有在你原本依赖它的时候才危险。常见的依赖有四类:

  • 靠确定性吃饭的流水线。 凡是设了 temperature=0 好让重复调用结果一致的:用模型输出做缓存键的、做去重的、把分类结果喂给下游状态机的。这个设置现在是惰性的,它原本给你买来的那点输出稳定性,现在买不到了。
  • golden file / 快照测试。 那些钉死 temperature=0、把模型输出和存好的期望字符串做 diff 的测试套件。换模型之后它们开始飘,而且飘起来的样子像模型能力退步,不像配置问题,于是你会往错误的方向查。
  • 靠低温度维持的结构化输出。 有些团队一直没上结构化输出,而是把 temperature 压到接近 0、top_p 收紧,让模型稳定吐出能解析的 JSON。现在这两个旋钮同时失效。
  • 按路由分别调过的配置。 产品里有"创意程度"滑块的,或者"摘要"用一个温度、"头脑风暴"用另一个温度的。滑块在你的界面上还能拖,但它拖不动模型了。

这四类都不会产生任何堆栈报错。它们产生的是"和你验证过的略有不同"的输出,而系统自报健康。

网关也不会提醒你

这一点连谨慎的团队都会踩。模型网关会发布一份机器可读的元数据,说明每个模型支持哪些参数,上层工具链靠读这份元数据决定该往下传什么。

截至 2026 年 7 月 21 日,OpenRouter 的 models 接口里,google/gemini-3.6-flashgoogle/gemini-3.5-flash-litesupported_parameters 仍然列着 temperaturetop_pseed。网关照收照转,模型那头照样忽略。这条链路上没有任何一环会报错,元数据也不会告诉你这个字段已经是死的。
Google 自己的页面也有同样的滞后。Gemini 3.6 Flash 的企业平台页至今还在展示 temperature、topP、topK 的默认值(1.0、0.95、64),而同一页上写着自定义值会被忽略。
结论很直白:今天还在为这两个模型调温度、想以此改善输出质量的人,是在调一个空操作。 如果你们团队还挂着一张"找出摘要任务的最佳 temperature"的工单,可以关掉了。

拿什么替代 temperature

官方给的替代不是另一个参数,而是 system instruction(系统指令,也就是写在对话最前面、约束模型全局行为的那段话):把你想要的行为写成模型能读到的规则,而不是写成一个采样常数。

这是表达方式的真正改变,所以要做的是"翻译",不是"删除":

你原来用数字表达的意图现在写在哪里
temperature=0,要简短、可复现的回答写进 system instruction:规定格式、长度、语气,并明确要求不要开场白
低温度用来保证 JSON 能解析用结构化输出,gemini-3.6-flashgemini-3.5-flash-lite 都支持
高温度用来要多样性在指令里要求"在一次回复里给出 N 个不同方案",因为 candidate_count 也一并没了
第三行值得停一下。这次迁移同时删掉了 temperaturecandidate_count,也就是把团队做输出多样性的两条路一次性拿掉了。如果你有功能依赖多样性,那需要一次真正的重新设计,不是改个配置。

上线前怎么把所有调用点找出来

直接搜参数名,别只信配置层,因为这些值通常散在好几个地方、由不同的人在不同时候设下:

# Gemini 原生写法与 OpenAI 兼容写法,以及承载它们的配置对象
grep -rn "temperature\|top_p\|topP\|top_k\|topK\|candidate_count\|candidateCount" \
  --include="*.py" --include="*.ts" --include="*.js" --include="*.go" --include="*.java" .

# 把它们包起来的那层
grep -rn "generation_config\|generationConfig\|GenerateContentConfig\|thinking_budget\|thinkingBudget" .
搜完代码还要看代码之外:YAML / JSON 配置、提示词管理平台、notebook、评测脚本,以及任何存了模型设置的 Terraform 或后台控制台。半年前有人在后台面板上拨过的一个旋钮,正是那种能躲过 code review 活到今天的东西。

会直接报错的那四处

这四处简单,因为接口会告诉你。按测试套件暴露出来的顺序修就行。

thinking_budget 和 thinking_level 不能同时出现

Gemini 3.x 用字符串枚举 thinking_level 取代了数字型的 thinking_budget,取值是 minimallowmediumhigh。两个同时传,返回 400。官方的迁移说明是thinking_budget 换成 thinking_level,不是为了兼容而两个都留着。

选值之前有两个默认档要知道,因为两个模型不一样:

  • gemini-3.6-flash 默认 medium
  • gemini-3.5-flash-lite 默认 minimal,这是为吞吐量优化的。
官方明说 Flash-Lite 的 minimal 默认档不适合当自主子智能体用,在多步任务上会过早终止工具调用。如果你要让 Flash-Lite 写代码、跑终端命令、调外部 API,就得主动提到 mediumhigh这是整个迁移里唯一一处"接受默认值"其实是一个产品决策、而不是走过场的地方。
这条警告我们复现出来了,而且值得说清它长什么样——因为它不长得像一次失败。 我们在模型发布当天跑了 216 次调用,覆盖 8 个"模型 + 思考档"组合,9 道题各重复 3 次。只有一处答错:Flash-Lite 跑在它的 minimal 默认档上,在一道三步通知链的题目上三次全挂。三次的形态完全一样:前两个工具都调对了,然后它停下来,报告任务完成,但那封通知根本没发出去。 没有报错、没有异常,返回的是一个格式完整、下游服务会照单全收的响应。同一个模型提到 high 档,三次全过。
迁移层面的教训很窄,但很锋利:如果你把一个多步流程搬到 Flash-Lite 上、又没有显式设 thinking_level,请求不会失败,它会就一件没做完的事给你一个自信的答复。 所以要显式设档位,并且去断言这个流程本该产生的副作用,而不是断言你拿回来的那个响应。

不能再预填模型回合

如果请求里最后一条非空消息的角色是 model,接口返回 400。预填以前是常用技巧:在结尾追加一条半截的助手消息,比如 {"role": "model", "parts": [{"text": "{"}]},逼模型以 JSON 左花括号开头,或者压掉它啰嗦的开场白。
这两个目的现在都归到同样两个地方:写进 system instruction,或者需要机器可解析的形状时用结构化输出。搜一下代码里所有会在结尾追加助手/模型消息的请求构造逻辑,重点看重试和续写那部分,预填往往是在那里动态拼出来的,而不是写死在代码里的字面量。

每个 FunctionResponse 都要带 call_id 和 name

generateContent 接口时,每个 FunctionResponse 都必须带上对应的 call_id 和函数的 name。最容易中招的是手写的工具调用循环,因为不少是在"回一个结果就够了"的年代写的,它们从零重建响应对象,而不是把模型发过来的东西原样带回去。
修法是机械的:把模型那次 function call 的 call_id 留住,回填到你返回的响应上。如果工具循环是基于某个框架搭的,升级框架,别在外面打补丁绕过去。

candidate_count 没有了

candidate_count 在 Gemini 3.x 不支持,删掉。如果你原来用它一次采样多个答案再挑最好的,这个逻辑现在得显式写出来:要么在一次回复里要多个方案,要么发多次请求、分别付费。

改之前 / 改之后:一个能干净迁移的请求

下面是一个把所有废弃字段都带齐的 Gemini 原生调用,以及能活下来的那一版。

# 改之前:在 2.5 时代的模型上正常,在 3.6 Flash 上要么报错、要么静默走样
config = {
    "temperature": 0,          # 现在被忽略,不报错
    "top_p": 0.95,             # 现在被忽略,不报错
    "top_k": 40,               # 现在被忽略,不报错
    "candidate_count": 1,      # Gemini 3.x 不支持
    "thinking_budget": 8192,   # 与 thinking_level 同传则 400
}

# 改之后:意图从采样常数搬进了指令
config = {
    "system_instruction": (
        "回答不超过三句话。用陈述句。"
        "不要写开场白,不要复述问题,不要追问。"
        "如果答案不确定,用一句话说明不确定。"
    ),
    "thinking_level": "medium",
}
"改之后"这一版的价值不在于更短,而在于你想要的行为现在是用模型真的会读的文字写下来的,顺带下一个接手的工程师也能看懂你当初想干什么。配置文件里一个孤零零的 temperature=0,从来不解释自己。
如果你是通过 OpenAI 兼容的网关调这两个模型,同样要删掉这些字段,因为网关会照转、模型会照丢。在 EvoLink 上,这个调用就是标准 OpenAI SDK 换一个 base_url(接口基础地址):
import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["EVOLINK_API_KEY"],
    base_url="https://api.evolink.ai/v1"
)

response = client.chat.completions.create(
    model="gemini-3.6-flash",
    messages=[
        {"role": "system", "content": "回答不超过三句话,不要开场白。"},
        {"role": "user", "content": "总结这份事故报告。"}
    ]
    # 不传 temperature、top_p:传了会被收下,然后在下游被忽略
)

print(response.choices[0].message.content)
import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env["EVOLINK_API_KEY"],
  baseURL: "https://api.evolink.ai/v1",
});

const response = await client.chat.completions.create({
  model: "gemini-3.6-flash",
  messages: [
    { role: "system", content: "回答不超过三句话,不要开场白。" },
    { role: "user", content: "总结这份事故报告。" },
  ],
  // 不传 temperature、top_p
});

console.log(response.choices[0].message.content);
还有一个细节能省掉一轮困惑:模型 ID 就是 gemini-3.6-flash没有 preview 后缀,也没有日期戳,所以没有带日期的别名可以钉。如果你的部署流程假设存在 -preview-001 变体,那个假设会在发请求的那一刻失败。
本文只覆盖发生了变化的那些字段。完整的请求参数参考、能力支持矩阵,以及第一次调用最容易撞上的那几个报错,见我们的 Gemini 3.6 Flash 接入指南

一个能抓住静默失效的迁移顺序

顺序是有讲究的,因为会报错的那几处很容易,不报错的那一处不容易。按这个顺序走:

Gemini 3.6 Flash 生产迁移流程,从请求盘点、行为验证到灰度发布和回滚
Gemini 3.6 Flash 生产迁移流程,从请求盘点、行为验证到灰度发布和回滚
安全上线 Gemini 3.6 Flash,应先盘点隐藏控制项,再验证输出行为,最后用可回滚的灰度流量切换。
  1. 先盘点。 跑上面那两条 grep,把每一个设了采样参数的地方列出来,包括配置中心和后台面板。同时写下每一个当初是在保护什么行为。
  2. 翻译意图,不要只是删。 每找到一个 temperature,先想清楚它是干什么用的,再写出等价的 system instruction。只删不译,就是在发一次质量退步上线。
  3. 修那些 400。thinking_budget 换成 thinking_level,删掉 candidate_count,去掉预填的模型回合,给每个 FunctionResponse 补上 call_idname
  4. 主动选一个思考档位,Flash-Lite 上尤其重要,它的 minimal 默认档不适合自主多步任务。这也是整个迁移里最大的一个省钱开关:在我们那套任务上,3.6 Flash 跑 minimal 档比同一个模型跑默认的 medium 档单次便宜 73.6%,而 medium 档下思考 token 占了计费输出的 85%。要测的是你的负载能不能扛住降档,不是这笔省钱是不是真的。
  5. 先用新模型重新生成快照基线,再谈对比。 老的 golden file 是在一个如今已经不起作用的参数下产生的,它不是一个有效的参照物。
  6. 在同一套任务集上跑新旧两个模型的评测,对比的是输出分布,不只是通过率。静默的行为变化,先体现在格式、长度、啰嗦程度的漂移上,之后才体现为答错。
  7. 灰度真实流量时盯着下游的解析器,而不是只盯接口错误率。如果有东西要悄悄坏掉,它会坏在消费模型输出的那段代码里,不会坏在调用本身。
第 5 步是最多团队跳过的一步。如果你拿新输出去 diff 那些"temperature=0 还起作用时"生成的 golden file,每一处 diff 看起来都像模型问题,而它们一个都不是。

让官方的迁移 skill 先跑一遍

Google 为这次迁移发布了一个 agent skill,装一次然后指向你的项目。
npx skills add google-gemini/gemini-skills --skill gemini-interactions-api --global

装好之后,在编码 agent 里指向你的项目:

/gemini-interactions-api migrate my app to Gemini 3.6 Flash

值得跑。它处理的是机械活:找出废弃字段、改写请求构造、更新调用点,上面第 3 步的大部分它都能包。

它做不了的是第 2 步。工具能看出 temperature=0 该删,但它不知道这个值当初是因为某个下游服务假设"同样输入必须得到同样输出"才加上的,它也写不出那条能保住这个意图的 system instruction。 把这个 skill 当成一次代码扫荡,然后意图翻译自己来。

关停时间表:什么时候由不得你

迁移是可选的,直到它不再可选。官方废弃页给了日期:
模型关停日期官方推荐的替代品
gemini-2.5-flash2026-10-16gemini-3.6-flash
gemini-2.5-flash-lite2026-10-16gemini-3.1-flash-lite
gemini-3.1-flash-lite2027-05-07gemini-3.5-flash-lite
gemini-3-flash-preview尚未宣布关停日期gemini-3.6-flash
gemini-3.6-flashgemini-3.5-flash-lite尚未宣布关停日期不适用
注意第二行,这是这一页里最容易写错、也最容易看错的一处。Google 给 gemini-2.5-flash-lite 指定的替代品是 gemini-3.1-flash-lite,不是刚发布的 gemini-3.5-flash-lite。你当然可以直接跳到最新的 Lite,但那是你自己的选择、不是官方写明的升级路径,而且那是跨两代而不是一代。要按跨两代的规格去规划和测试。
这里有两个日期在真正起作用。如果你在用 2.5 系的任一 Flash 模型,你有到 2026 年 10 月 16 日为止,也就是从本文发布算起大约三个月。如果你在用 gemini-3-flash-preview,官方没给结束日期,但预览版模型本来就不是能拿来排路线图的东西。

Computer Use:四份官方材料,两个答案

有一个能力问题,现在无法从文档里得出结论。这两个模型到底支不支持 Computer Use,Google 自己的材料说法不一致:

四份官方页面,两个互相矛盾的答案,靠读是读不出结论的。如果 Computer Use 在你的关键路径上,在提交方案之前先用你自己的账号和端点实测一次,并且备好一个可切换的兜底模型。这一节会在实测有结果后更新,并标注观测日期。本文其他每一处变更都有一致的文档依据,只有这一处没有。

如果你这周正好在重新选供应商

一次你没排期的迁移落进了这个迭代,工作量是一两天的细致修改,不是一个周末的重写。也正因为你已经在动每一个调用点了,这是个顺带看一眼"模型是怎么到你手里的"的自然时机。

有两件事值得顺手检查:

  • 切换期间你能不能把新旧两个模型并排跑? 上面第 6 步要求你能。如果你现在的接法让 gemini-3.5-flashgemini-3.6-flash 跑同一套任务集这件事很别扭,那这份别扭下次迁移还在,而下次一定会有:官方已经说了,这套规则适用于此后发布的所有模型。
  • 一个新模型从发布到你能调用,要多久? gemini-3.6-flash 是第一天就以正式版身份上线的,没有 preview 后缀。模型上线和你的代码能调到它之间的那段时间差,是你每次打新都要付的成本。
EvoLink 就是围绕这两件事做的:一个 OpenAI 兼容端点同时接 Gemini、Claude、GPT 等模型,所以两个模型之间做 A/B 是改一个 model 字符串,而不是接第二套 SDK、配第二份凭证;新模型也从你已经在用的同一个端点接进来。如果你想先看这个模型本身的状态,我们的 Gemini 3.6 Flash 发布追踪有可用渠道和模型 ID 的细节;3.6 Flash 与 3.5 Flash 的对比讲的是这次升级到底该不该做。那是另一个问题:本文讲的是决定要做之后,怎么做才不出事。
如果这不是你今年第一次迁移 Gemini,我们还有两篇写的是各自那一对模型:Flash 线上的 从 Gemini 3 Flash Preview 迁到 Gemini 3.5 Flash,以及 Pro 线上的 Gemini 3 Pro 废弃迁移指南要按它们各自写明的那一对模型去读,别拿来套这一次。 本文这些参数废弃是从 3.6 这一代才开始生效的,所以为更早那一对写的指南会告诉你采样参数仍然可用,而在 gemini-3.6-flash 上它们已经不可用了。

常见问题

给 Gemini 3.6 Flash 传 temperature 会报错吗? 不会。目前 temperaturetop_ptop_k 是被收下然后忽略,不报错也没有警告。官方说未来的模型代次会对这些参数返回 HTTP 400,所以这份安静是暂时的;但就现在而言,一个带着这些参数的请求看起来完全健康。
要确定性输出的话,拿什么替代 temperature=0? 官方写明的替代是 system instruction:把要求的格式、长度、语气写成模型能读到的规则。需要机器可解析的输出就用结构化输出,两个新模型都支持。没有任何一个数值参数接替 temperature 的位置。
gemini-3.6-flash 还能用 thinking_budget 吗? 不能。Gemini 3.x 用字符串枚举 thinking_level,取值 minimallowmediumhigh。同一个请求里同时传 thinking_budgetthinking_level 会返回 HTTP 400。默认档位 3.6 Flash 是 medium,3.5 Flash-Lite 是 minimal
gemini-2.5-flash-lite 的官方替代品是哪个? 官方废弃页写的是 gemini-3.1-flash-lite,不是 gemini-3.5-flash-lite,关停日期 2026 年 10 月 16 日。你也可以直接换成 3.5 Flash-Lite,但那是跨两代、属于你自己的决定,不是文档给出的升级路径。
这些变更对 Gemini 3.5 Flash-Lite 也适用吗? 适用。废弃采样参数、改用 thinking_level、禁止预填模型回合、FunctionResponse 的新要求、删掉 candidate_count,这些在 gemini-3.5-flash-lite 上全都一样;并且官方说了,此后发布的所有模型都适用。所以代码改法两边相同,你不必先定下切到哪一个才能动手改。 至于选哪一个,那是另一个问题,见我们的 Gemini 3.6 Flash 与 3.5 Flash-Lite 选型对比
有没有带日期的版本号可以钉? 没有。模型 ID 就是 gemini-3.6-flash,没有 preview 后缀也没有日期戳。如果你的部署工具链预期存在一个带日期的别名,它会在发请求时失败。

参考资料

准备好把 AI 成本降低 89% 吗?

现在就开始使用 EvoLink,体验智能 API 路由的强大能力。