Google 的 Gemini 3.8 Live 模型页更新了,模型 ID 是 gemini-3.8-live,定位是低延迟语音 Agent 和实时对话的默认选择。这一版不是小修小补,几个变更会直接影响已经跑在 3.1 Flash Live 上的代码——不处理就会报错,处理了体验又会明显不一样。

先给一个数字边界:输入 token 上限 131,072,输出 65,536,支持交错推理(interleaved reasoning),但 thinking_level 参数不再支持,迁移时要把 session 里的 thinking_config 拿掉。

函数调度

函数调用这次从"同步阻塞"改成了"异步非阻塞"为默认。behavior: NON_BLOCKING 是新的默认模式,工具声明里还能显式写 behavior: BLOCKING 保持旧的同步阻塞行为,用于向后兼容。

非阻塞意味着模型发起工具调用后不会停下来等结果,用户可以继续说。结果回来时,靠调度参数决定模型怎么接:

function_response = types.FunctionResponse(
    id=fc.id,
    name=fc.name,
    response={"result": "ok", "scheduling": "INTERRUPT"}  # 也可是 WHEN_IDLE 或 SILENT
)

三个取值各管一种场景:INTERRUPT 是结果一到就打断当前输出、立刻处理,适合安全告警这类不能等的;WHEN_IDLE 是等模型说完当前这轮再处理,适合查订单状态这类常规操作;SILENT 是不打断、把结果留到后续对话再用,适合后台画像更新这类静默任务。

send_client_content 与 turn_complete

send_client_content 现在支持整个会话生命周期的内容更新,并且要显式标注角色是 user 还是 model。真正要注意的是 turn_complete:只要设成 true,就会无条件打断模型正在进行的生成。

这意味着前端不能再"每发一个小块就自动带上 turn_complete"。这个参数只该在"用户明确要打断模型"时用——比如抢话、纠错。如果发的内容不带 turn_complete,服务端会继续等后续消息再回,这正是多轮语音对话需要的默认行为。

主动音频与情绪对话

两条硬性变更,一条加一条删。

主动音频(proactive audio)现在是永久启用,proactive_audio: false 会直接返回错误。也就是说,模型在用户没说话时也会主动出声,这个开关没了,想关也关不掉。

情绪感知对话(affective dialogue)则从 API 里整体移除,代码里所有 enable_affective_dialog 配置都要删掉。之前靠这个做情绪化人设的应用,需要自己另想办法。

turn coverage 默认变成 TURN_INCLUDES_AUDIO_ACTIVITY_AND_ALL_VIDEO,视频帧默认会发给模型。想省上下文和费用,就只在需要时发帧。

能力边界

这版的能力支持情况比较明确,选型前先对一遍:

能力 支持情况
音频生成 支持
函数调用 支持
Live API 支持
搜索接地 支持
交错推理 支持
缓存 不支持
代码执行 不支持
文件搜索 不支持
图像生成 不支持
结构化输出 不支持

回复模态是音频,应用如果需要文字转写,得额外开启输出音频转写(output audio transcription),否则拿不到文本。

对开发者意味着什么

这一版的核心变化是把"异步"和"打断"这两件事正式化了。以前语音 Agent 的痛点是:模型一调工具,对话就卡住等结果,用户感觉 Agent 死了。现在 NON_BLOCKING 默认、加上三种调度语义,工具调用可以跑在后台,模型继续陪用户说话,结果回来再按 INTERRUPT / WHEN_IDLE / SILENT 决定怎么插进来。这对实时语音客服、现场巡检这类"边说话边查数据"的场景是实质提升。

代价是迁移成本明确存在:模型字符串要从 gemini-3.1-flash-live-preview 换成 gemini-3.8-live,thinking_config 要删,enable_affective_dialog 要删,proactive_audio: false 会炸。这些不是可选的,是硬性的。

待观察的一点是主动音频强制开启:对客服类产品,"模型主动出声"未必是想要的,现在没有开关,只能靠应用层去压。文档里没有说明后续会不会给回这个控制权,需要盯着模型页的更新。