mistralai 1.2 的 SDK 传多段 content 数组,接口返回 422,原文 content must be a string,同样的写法在 OpenAI 侧正常,历史消息是从 OpenAI 格式直接转过来的。

这类报错背后常见的原因有几处,逐个排除就行。Mistral 的 content 只接受纯字符串,不支持分段数组;tool 角色的消息字段名与 OpenAI 不同;消息里混了 image_url 类型,该模型不支持视觉;SDK 版本低于 1.0,参数结构还是老的。

上来先用 curl 发一条纯字符串消息验证通路

curl -s https://api.mistral.ai/v1/chat/completions -H "Authorization: Bearer $MISTRAL_KEY" -d '{"model":"mistral-large-latest","messages":[{"role":"user","content":"hi"}]}'

再往下打印 SDK 实际发出的 JSON

python -c "import json;from mistralai import Mistral;print(json.dumps({'messages':[{'role':'user','content':'hi'}]}))"

接着在转换层把数组拼成一个字符串

python -c "c=[{'type':'text','text':'a'},{'type':'text','text':'b'}];print(''.join(x['text'] for x in c))"

末了确认安装版本后重跑一次

pip show mistralai | Select-String Version

改之前我把相关日志按时间截了一段存着,事后对时间线用得上。

中途换过一次思路,把范围缩到最小的那一层,反而快了。

恢复的判定其实很直接。请求返回 200,多段内容被拼成一段文本后模型能正常回答,不再出现 422。

这里还有个坑。跨厂商迁移时最容易被忽略的就是 content 结构,OpenAI 的数组写法不是通用标准。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189