记录一下那天晚上的排查过程。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 都要当不可信字符串处理。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
