【Claude】API Error: 400 Failed to deserialize the JSON body into the target type: messages[1].role: …
目录
一、报错信息
2026-05-29报错完整信息:
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 560
二、问题描述
我因为2026-05-29凌晨研究Clash Verge的Tun模式下能否下载npm install -g authropic-ai/claude-code,打开TUN模式之后Claude就跑不起来了;
因为问题比较新所以国内外解决这个问题的帖子没有太多,大多帖子都是提问该问题而非解决该问题。
三、解决流程
所以后来想了一个办法:用powershell打开opencode,让opencode搭deepseek-v4-pro帮我检查错误并修复,opencode给我的反馈如下:
(1)问题出在了哪
DeepSeek Anthropic API 兼容性问题: DeepSeek 的 /anthropic 端点不支持 Anthropic 格式中的 system 角色消息。
DeepSeek API 支持 Anthropic 顶层的 system 参数,但不支持 messages 数组里出现 system 角色。Claude Code 把 system prompt 放在了 messages 数组里导致报错。所以:
方案一是写一个本地代理,把 Claude Code 发出的请求做一次转换——将 messages 数组中的 system 角色消息提取到 Anthropic 顶层的 system 参数。
opencode在我的C:\Users\zzz17\.claude中加入了一个名为deepseek-proxy.py的文件,具体内容如下:
import json
import sys
import requests
from flask import Flask, request, Response
TARGET_URL = "https://api.deepseek.com/anthropic/v1/messages"
API_KEY = "sk-(你的API key)"
app = Flask(__name__)
@app.route("/v1/messages", methods=["POST"])
def proxy():
data = request.get_json(force=True)
messages = data.get("messages", [])
system_parts = []
filtered = []
for msg in messages:
if msg.get("role") == "system":
content = msg.get("content", "")
if isinstance(content, list):
parts = [c.get("text", "") for c in content if c.get("type") == "text"]
system_parts.append("\n".join(parts))
else:
system_parts.append(str(content))
else:
filtered.append(msg)
if system_parts:
data["system"] = "\n\n".join(system_parts)
data["messages"] = filtered
headers = {
"Content-Type": "application/json",
"x-api-key": API_KEY,
"anthropic-version": "2023-06-01",
}
stream = data.pop("stream", False)
resp = requests.post(
TARGET_URL,
json=data,
headers=headers,
stream=stream,
timeout=300,
)
if stream and resp.status_code == 200:
return Response(
resp.iter_content(chunk_size=1024),
status=resp.status_code,
content_type=resp.headers.get("Content-Type", "text/event-stream"),
headers={k: v for k, v in resp.headers.items()
if k.lower() not in ("content-encoding", "transfer-encoding")},
)
else:
return Response(
resp.content,
status=resp.status_code,
content_type=resp.headers.get("Content-Type", "application/json"),
headers={k: v for k, v in resp.headers.items()
if k.lower() not in ("content-encoding", "transfer-encoding")},
)
if __name__ == "__main__":
port = int(sys.argv[1]) if len(sys.argv) > 1 else 8765
app.run(host="127.0.0.1", port=port, debug=False)
在我的 C:\Users\Adimin\Documents\WindowsPowerShell\中添加了Microsoft.PowerShell_profile.ps1脚本。
# Auto-start Claude Code DeepSeek proxy
$proxyScript = "$env:USERPROFILE\.claude\deepseek-proxy.py"
$proxyRunning = Get-Process -Name python -ErrorAction SilentlyContinue | Where-Object { $_.CommandLine -like "*deepseek-proxy.py*" }
if (-not $proxyRunning) {
Start-Process -WindowStyle Hidden python -ArgumentList $proxyScript, "8765"
}
并将 C:\Users\Admin\.claude\settings.json中的BASE_URL指向本地代理 http://127.0.0.1:8765。
后来我和opencode讲了我是改成了Tun模式才导致这样的情况,并让opencode帮我分析原因,它认为原因可能有2:
这很可能是巧合,Clash TUN 模式本身不会修改请求体中的 JSON 内容。
真正的原因更可能是:
1. Claude Code 自动更新到了 v2.1.154(构建时间 2026-05-28,就是昨天),新版本改变了 system prompt 的发送格式——把它放在了 messages 数组里作为 system 角色,而 DeepSeek API 不接受这种格式。这和 TUN 模式碰巧同时发生,让你误以为是 TUN 导致的。
2. 另一种可能:TUN 模式改变了路由。直连时请求命中的是 DeepSeek 国内节点,走 Clash 代理后命中了 DeepSeek 海外节点,两个节点的 API 校验严格程度不同——海外节点对 system 角色更严格。
所以,方案二就是回退到ClaudeCode的上一个版本并阻止其自动更新。
在powershell中运行:
npm install -g @anthropic-ai/claude-code@2.1.153
并在C:\Users\Admin\.claude\settings.json中,添加
"ANTHROPIC_MODEL": "deepseek-v4-pro",(已有不用添加,添加下一行)
"CLAUDE_CODE_DISABLE_AUTOUPDATER": "1"
就可以了。
四、总结
Claude Code在2026-05-28更新了,DeepSeek API 支持 Anthropic 顶层的 system 参数,但不支持 messages 数组里出现 system 角色,而Claude Code 把 system prompt 放在了 messages 数组里导致报错。
操作方式就是让Claude Code回退到上一个版本,并禁止其自动更新。
Powershell运行:
npm install -g @anthropic-ai/claude-code@2.1.153
settings.json中添加 "CLAUDE_CODE_DISABLE_AUTOUPDATER": "1"。
{
"env": {
"ANTHROPIC_AUTH_TOKEN": "sk-***************************",
"ANTHROPIC_BASE_URL": "http://127.0.0.1:8765",
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "deepseek-v4-flash",
"ANTHROPIC_DEFAULT_OPUS_MODEL": "deepseek-v4-pro[1M]",
"ANTHROPIC_DEFAULT_OPUS_MODEL_NAME": "deepseek-v4-pro",
"ANTHROPIC_DEFAULT_SONNET_MODEL": "deepseek-v4-pro[1M]",
"ANTHROPIC_DEFAULT_SONNET_MODEL_NAME": "deepseek-v4-pro",
"ANTHROPIC_MODEL": "deepseek-v4-pro",
"CLAUDE_CODE_DISABLE_AUTOUPDATER": "1"
},
引入opencode解决问题的方法见下一篇博客:
【Claude】Win11系统VSCode环境中Claude+Deepseek报错的全自动解决方式
五、二更&评论区QA整理
5.1、升降版本操作流程
VSCode升级

VSCode中claude code降级+禁止更新



CCSwitch升级

powershell中claude降级+禁止版本更新
见上文。
2026-05-29
ly13757760312要一直禁止更新吗,什么时候接触
青山入墨雨如画作者要一直禁止更新,等新版本稳定了再说吧
ly13757760312方案2运行npm install -g @anthropic-ai/claude-code@2.1.153没有用欸
青山入墨雨如画作者需要同时升级VSCode、CCSwitch版本,降低powershell中的claude版本(即运行上述代码),并将VSCode中的claude插件版本降低,然后重启电脑
PINKIZE确实可以解决,但是好像没法禁止自动更新,每次打开都要重新回退版本
青山入墨雨如画作者VSCode中的claude code插件可以禁止自动更新;powershell全局claude禁止自动更新需要给全局settings.json(C:\Users\Admin\.claude\settings.json)中添加settings.json中添加: "CLAUDE_CODE_DISABLE_AUTOUPDATER": "1"。
man_cth禁止自动更新好像没生效,有其他手段吗?
成殇Sir最后一行改成这个"DISABLE_AUTOUPDATER": "1"。
m0_71162461降级是可以解决的,降到153就行。此外需要注意如果使用vscode则需要看claude code for VS是否也自动更新到156了,如果也更新了则需要同步降级。
琎850vscode的这个怎么降级啊。
gznsjx到那个扩展里面,卸载右边那个向下的箭头有安装指定版本。
2401_86136646感谢兄弟和楼主,解决了,后来的兄弟们,如果用vscode按照这位楼主和我回复的这位兄弟操作就可以了。
gznsjx在编辑器用的,把编辑器的claude code插件自动更新给关了,然后重新下回153版本。
2403_89457125怎么阻止自动更新啊,回退到153版本后,我把powershell关掉重启然后又是新版本了。
青山入墨雨如画作者问问AI(比如opencode)看看能不能让它强制操作一下。
unkind_0218把Claude code放vscode里面了,原来是拓展也自动更新了,我说怎么方法二不好使,还要让vscode里面的拓展恢复之前的版本。
1a.vida上午九点多还能用,十点多就不行了。试了方法二,npm降级Claude,vs扩展用上个版本,都不行。最后也是让opencode写了本地代理的脚本ok了。
2301_81516641我直接按总结里搞得,但是过一会就又跳400了,再在powershell里执行npm install -g @anthropic-ai/claude-code@2.1.153就行了,有兄弟知道怎么回事吗?
2401_86676924因为自动更新没有关闭成功,版本回退后你试试在setting.json文件里再加一句"DISABLE_AUTOUPDATER": "1"。
JQi~当我回退 Claude Code v2.1.153时。使用vscode新建终端.cmd指向claude版本v2.1.153没问题,再次新建终端 .cmd指向变成claude版本v2.1.156 很奇怪。
2501_92039708我回退到153之后用了一会也自动更新到156了,但是依旧能正常用,报错没有了,这是什么原因?
青山入墨雨如画作者可能是ClaudeCode自动更新,可以在全局settings.json中加一行禁止自动升级的代码试试看~
JQi~方法一(推荐):禁用扩展自动更新 + 删除新版本扩展
# 1. 删除 v2.1.156 扩展目录
Remove-Item -Recurse -Force "$env:USERPROFILE\.vscode\extensions\anthropic.claude-code-2.1.156-win32-x64"
# 2. 回退 npm 全局包到 v2.1.153
npm install -g @anthropic-ai/claude-code@2.1.153
# 3. 重启 VS Code,确认版本
claude --version
m0_50544004退到150版本了,还是报错
m0_50544004电脑重启了下就好了
gxt19950304回退到2.1.153可以解决,那么接下来就看deepseek会不会更新来适配了
le120698我是只用了VS的插件加CC Switch。怎么处理?
weixin_73485221vs插件页面找到Claudecode,取消勾选自动更新。之后点击Claudecode插件下的设置按钮,选择“安装特定版本...",之后选个v2.1.155及之前的版本重新安装就行。
CIZI_把VS code里面的自动更新取消勾选,然后终端运行code --install-extension anthropic.claude-code@2.1.153就行了。
VRG_327但是把claude的默认编辑器改成vscode后,env里会有"EDITOR": "code",这时需要把 "CLAUDE_CODE_DISABLE_AUTOUPDATER": "1"加在"EDITOR": "code"后面,不然不知道为什么还是会自动更新。
weixin_41044245大神,采用您的方案一,需要回退版本吗?
1.我的CC v2.1.153版本有个content[].thinking的报错;
2.在v2.1.156版本messages[1]的报错,role: unknown variant
`system`.
请问这种情况下,您的方案一能一次性解决这2个BUG吗?青山入墨雨如画作者我其实没打算推荐方案一,因为当时想的这个文章的性质是“attempt records”嘛,所以就把方案一也写上了,推荐用方案二。
2026-06-01
@-@怎么去拥有一道彩虹现在更新到2.1.159好像又可以了==,不知道是claude还是deepseek做了新操作
1a.vida好嘛,我真无语了,好不容易调好的又不能用了又得重新改回去
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)