这个问题在线上不会自己消失,按现象、配置、日志三步走基本能定位。 照着别家的写法构造 content=[{‘type’:’string’,’text’:’你好’}],返回 400,提示 content.0.type 只能是 text、image 或 document 之一,请求被直接拒绝。
这类问题不处理会继续放大,轻则个别请求失败,重则整批任务全部卡住。
先分清是哪一类原因
- 块类型写成了 string,而合法值是 text
- 混用了不同厂商的报文结构,字段名对不上
- 数组里夹了空块或 null,导致类型校验失败
- 图片块里缺少 source 字段,整个 content 被判非法
按顺序处理
1. 把块类型改对并保留 text 字段
content=[{'type':'text','text':'总结这段话'}]
2. 用官方 SDK 构造,避免手写结构出错
client.messages.create(model='claude-3-5-sonnet-20241022', max_tokens=512, messages=[{'role':'user','content':'hi'}])
3. 发送前打印一次序列化结果做检查
print(json.dumps(payload, ensure_ascii=False)[:300])
4. 图片走 source 里的 base64 结构
content.append({'type':'image','source':{'type':'base64','media_type':'image/png','data':b64}})
怎么确认已经恢复
请求返回 200,content 数组第一个块的 type 是 text,正文正常返回,带图请求也能被接受。
容易忽略的地方
content 既可以直接传字符串,也可以传块数组,但同一个请求里两种写法不能混用,混着写往往就触发这种类型报错。 如果按上面的顺序做完仍不生效,把配置和日志按时间对齐再看一遍,通常能发现被忽略的一层。