现场是这样的。google-genai 1.0 调 gemini-3-pro-preview 做两轮函数调用,把上一轮 model 返回的 functionCall 手工拼回 contents,第二轮返回 400,原文 Function call is missing a thought_signature in functionCall parts。

中间走过弯路,把「SDK 版本过旧,不认识新增字段」当成主因,改完现象没变。

把日志和配置对完,能解释这个现象的基本就这几处。回填时把 thoughtSignature 字段丢掉了;手工拼 Content,而不是原样回传 parts;functionCall 被转成纯文本塞进了历史。

先把上一轮返回的 parts 原样打印出来

python -c "import json;print(json.dumps(resp.candidates[0].content.parts, default=str, ensure_ascii=False))"

回填时整段复用 parts,不要重建对象

python -c "print('history.append(resp.candidates[0].content)')"

然后改用 SDK 的 automatic function calling

python smoke_gemini.py --afc true

升级 google-genai 到最新版再复测

pip install -U google-genai

隔了一天再看,现象没变,说明不是偶发。

那几天正好在做别的变更,先把时间线对齐才敢动手。

怎么算真的好了,看的是同一批现象。第二轮请求返回 200,函数调用能连续多轮,历史里每个 functionCall 都带 thoughtSignature。

容易忽略的是,这个字段是模型内部推理的凭据,删掉不影响第一轮,第二轮才会报错,凡是手工裁剪历史的地方都要保留完整 parts。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189