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