记录一下那天晚上的排查过程。gpt-4o-mini 返回的 tool_calls 里 arguments 是字符串,我直接当 dict 取键,报 TypeError: string indices must be integers,同一段代码在别的模型上能跑。

刚开始盯着「模型偶尔返回空字符串」,折腾了半个多小时,排掉了。

这类报错背后常见的原因有几处,逐个排除就行。arguments 按协议就是 JSON 字符串,需要自己解析。也可能是流式返回下分片拼接不完整,解析失败。

少数情况下是函数名大小写与注册的不一致。

动手时先把原始 tool_calls 打出来

python -c "import json;d=json.load(open('resp.json'));print(d['choices'][0]['message']['tool_calls'][0]['function'])"

解析前判断类型并兜底空串

python -c "import json;s='{\"city\":\"上海\"}';print(json.loads(s) if s else {})"

流式场景按 index 累积分片再解析

python -c "print('accumulate delta.tool_calls by index')"

等前面都确认过,再用 pydantic 校验参数结构

python -c "from pydantic import BaseModel;print(BaseModel.model_validate({'city':'上海'}))"

怎么算真的好了,看的是同一批现象。解析后的参数能稳定通过校验,200 次调用里失败 1 次(空串),被兜底逻辑转成空 dict 后走澄清分支。

这里还有个坑。工具调用返回的是文本协议不是对象,任何模型给的 arguments 都要当不可信字符串处理。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189