报错是这么冒出来的。模型返回的 arguments 是 "{\"order_id\":\"A1\"}",直接按字典取键拿到的是字符串,下游报 AttributeError: 'str' object has no attribute 'get',日志里参数看着完全正常。
中间走过弯路,把「SDK 已经解析过一次 代码里又 loads 一遍」当成主因,改完现象没变。
这类报错背后常见的原因有几处,逐个排除就行。模型把对象序列化成了字符串。少数情况下是few-shot 示例里给的参数本身就是字符串。
还有一种情况,网关透传时把对象转成了字符串。
第一件事是打印参数的类型和原文
python -c "import json;a='{\"order_id\":\"A1\"}';print(type(a),a[:20])"
再往下写一个只解析一层的兜底函数
python -c "import json;a='{\"order_id\":\"A1\"}';b=json.loads(a);print(type(b),b)"
接着把 schema 参数声明成 object 并给正确示例
python -c "print({'type':'object','properties':{'order_id':{'type':'string'}}})"
剩下的就是在业务入口加断言拦住字符串
python -c "assert isinstance(b,dict)"
别只看报错消失,验证要多做一步。参数稳定是 dict,order_id 能直接取到,下游不再出现字符串访问属性。
容易忽略的是,参数类型错乱大多来自示例,schema 和 few-shot 里的写法会被照抄,改示例比加解析代码更治本。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
