用 anthropic 0.40 的 SDK 把一份扫描版 pdf 转成 base64 放进 document 块,model 写 claude-3-5-sonnet-20241022,接口返回 400,原文是 media_type: application/pdf is not supported,换成 png 图片块就能过。
把日志和配置对完,能解释这个现象的基本就这几处。document 块只支持 base64 来源,url 来源要开 beta 头;pdf 里是纯扫描图,文本层为空,模型拿不到可读内容;base64 字符串中间带了换行,解码后文件损坏;SDK 版本过旧,document 块被序列化成 image 块。
动手时先确认 pdf 有没有文本层
python -c "import fitz;d=fitz.open('a.pdf');print(len(d[0].get_text()))"
然后按页渲染成 png 再逐页送
python -c "import fitz;d=fitz.open('a.pdf');[p.get_pixmap(dpi=150).save('pg%d.png'%i) for i,p in enumerate(d)]"
接着检查 base64 是否含换行符
python -c "import base64;s=base64.b64encode(open('a.pdf','rb').read()).decode();print(10 in [ord(c) for c in s])"
等前面都确认过,再用官方示例请求体对齐字段名
curl https://api.anthropic.com/v1/messages -H "x-api-key: $ANTHROPIC_KEY" -H "anthropic-version: 2023-06-01" -d @doc.json
白天有业务在跑,能验证的部分都压到了晚上做。
当时还开着另一个排查窗口,两边日志对照着看才定位到。
别只看报错消失,验证要多做一步。请求返回 200,content 里能读到 pdf 的正文要点,页数与源文件一致,不再出现 media_type 报错。
扫描件和文本型 pdf 要分开处理,前者本质是图片,直接送 document 块只会得到空内容而不是报错。这类问题最好一次改到位,反复小改反而容易把原因搅混。
