问题出现得很突然,日志倒是留得挺全。把检索到的段落拼成 content 数组发给 claude-3-5-sonnet,接口返回 400,原文 content.0.text: field required,原来命中的那几段 PDF 解析出来是空串,仍然被塞进了块里。

刚开始盯着「图片块只给 type 没给 source,整个数组校验失败」,折腾了半个多小时,排掉了。

这类报错背后常见的原因有几处,逐个排除就行。空字符串的 text 块不算合法内容,服务端直接判字段缺失。另一种情况是数组里混了 None,序列化后变成 null 而不是空串。

另外,按字符数过滤时把只含空白的块漏掉了。

上来先打印块的 type 和文本长度找出空块

python -c "import json;d=json.load(open('req.json'));print([(b['type'],len(b.get('text',''))) for b in d['messages'][0]['content']])"

然后按 strip 后长度过滤并保留至少一块

python -c "import json;d=json.load(open('req.json'));c=[b for b in d['messages'][0]['content'] if b.get('text','').strip()];print(len(c))"

末了用清洗后的请求重发验证

curl -sS https://api.anthropic.com/v1/messages -H "x-api-key: $ANTHROPIC_API_KEY" -H "anthropic-version: 2023-06-01" -d @req_clean.json

别只看报错消失,验证要多做一步。请求返回 200,content 数组里每一块的 text 长度都大于零,空命中段落被记进日志但没有再发给模型。

空块不是无害的占位,Anthropic 会逐块校验结构,宁可在本地拼装时剔掉,也别指望服务端宽容。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189