起因
今天准备Vibe Coding的时候,发现claude code居然罢工了,吓得我赶紧看一下是不是token烧完了, 看了一下,还有余粮,然后回去看了一下报错信息
API Error: 400 Failed to deserialize the JSON body into the target type: messages[1].role: unknown variant `system`, expected `user` or `assistant` at line 1 column 9307
原因
我估计应该是deepseek api返回的格式与claude code规定的json格式不一致
deepseek 风格
{
"messages": [
{"role": "system", "content": "You are a helpful assistant"},
{"role": "user", "content": "Hello"}
]
}
Anthropic 风格
{
"system": "You are a helpful assistant",
"messages": [
{"role": "user", "content": "Hello"}
]
}
但是我又纳闷了,怎么之前好好的,限制突然不能用,怀疑是claude code这边有问题
上网搜集
发现两篇文章,刚好提到了这个问题
是因为claude code的自动更新导致的这个问题,最新版本是v2.1.154
Claude Code 升级至 v2.1.154 版本后,会将系统提示词以 system 角色放入 messages 消息数组中发起请求。但 DeepSeek 的 Anthropic 兼容接口存在格式限制,仅支持 user、assistant 两种角色,无法识别、解析 system 角色参数,最终导致 JSON 反序列化失败,触发 400 错误。
解决方案
1. 版本回退(立即生效)
如果还是想用claude code,删除当前的claude code,安装上一个版本v2.1.153,不用怕,配置文件~/.claude.json都还在
npm uninstall -g @anthropic-ai/claude-code
npm install -g @anthropic-ai/claude-code@2.1.153
添加配置,防止自动更新
编辑 ~/.claude/settings.json(linux|mac) 或者 C:/Users/用户文件夹/.claude/settings.json(windows)
在env里添加"DISABLE_AUTOUPDATER": "1"
"env": {
##保持不变
"DISABLE_AUTOUPDATER": "1"
},
Windows:怎么有一股熟悉的味道
然后claude code就可以正常使用了
2. 等待DeepSeek修复(长期方案)
目前还没修复,不过感觉应该很快,也就换个格式的事情