原标题:Claude Opus 4.8 刚上线,我的 Claude Code + DeepSeek 直接跪了...
大家好,我是小林。
事情是这样的,最近 Claude Opus 4.8 不是刚上线嘛,按理说算个好事。
结果一大批人的 Claude Code 直接罢工,终端一打开就给你甩一行红字 API Error: 400。
扒了一圈才发现,报这个错的基本都是「Claude Code + 国产大模型」这种组合。Anthropic 这次升级在自家协议里动了个小手脚,第三方模型当场就接不住了。
但这帖子里真正让我笑出声的,是在最后甩出的那一句:
「另外,如果你使用的中转站的 Claude 模型也报这个错误,当心了。」
你品品这句话的意思。
你花钱买的明明是「Claude 模型」的中转服务,结果它也报了这个 system role 的错……
那只能说明一件事:你买的所谓「Claude」其实是个假的。中转站给你套了一层 Claude 的皮,里头装的是国产大模型。
Anthropic 这次一升级,把这层皮当场就给撕开了。关键是真有人中招:
笑死。
更巧的是,这事还直接波及到我这边了。
我前天刚发布了第二个 Agent 训练营项目,是带大家用 Claude Code 手搓一个属于自己的 coding agent。有不少同学第一时间直接报名进来学习了,在这里也先感谢一下你们的支持。
然后有同学执行力很强,第一天就动手开整,结果搭好 Claude Code + DeepSeek 环境一启动,还没开始就翻车了。。。
还好群里导师反应够快,第一时间就来救场了,最逗的是有位林友冒出一句吐槽:
「笑死,Claude Code 针对小林,卡着上线时间搞了一手。」
哈哈这画风,确实够「针对」的。
不过笑归笑,事情还是得讲清楚。
接下来,就跟你们聊聊,为什么会发生这样的事?
出了什么问题?
如果你这两天打开 Claude Code 写代码,碰上下面这一坨 400 报错,先别急着怀疑自己:
API Error: 400 Failed to deserialize the JSON body into the target type:
messages[1].role: unknown variant `system`,
expected `user` or `assistant`
翻译成人话就一句:Claude Code 给模型发了一个 role 叫 system,但模型只认 user 和 assistant,干脆 400 给你打回来。
背后的原因就是 Claude Code 自己升级了,把发请求的格式换了一套新的,连个招呼都没打。
协议改了什么?
不过你有没有想过一件事,Claude Code 这玩意明明是 Anthropic 自家出的官方工具,为啥也可以接国产大模型来用?
很多刚上手 Claude Code 的同学,下意识会以为它只能跑 Claude 自家那几个模型,Opus 啊 Sonnet 啊。其实完全不是这回事。
Claude Code 说白了只是个客户端工具,它真正的本事是「按 Anthropic 的协议格式把请求打包发出去」。
至于这包东西最后扔到哪个服务器,它自己留了个口子:设一下 ANTHROPIC_BASE_URL 这个环境变量,你想把请求转到哪台机器都行。
国产模型一看这个口子,机会来了。DeepSeek 等国产大模型就把自己练成了一口「Anthropic 腔」,按这套协议接 Claude Code 的请求毫无压力。
Claude Code 用户也就能丝滑地把模型从 Claude 一键切到 DeepSeek,一行代码都不用改。
这套兼容关系是过去一年大家慢慢磨出来的,平时跑得挺顺。但它背后藏着一个隐形前提:Anthropic 自己的协议不能乱变。
这次国产模型集体罢工,就是踩在这个前提崩塌的瞬间。
这不,最近 Anthropic 同时上线了 Claude Opus 4.8 和 Claude Code v2.1.154。这两个升级看着各管各的,其实是绑在一块的:Opus 4.8 带来了一项叫 dynamic workflows 的新能力,Claude Code 这一版就是给它适配请求格式。
dynamic workflows 是个啥?说人话就是:让 Claude 跑复杂任务跑到一半的时候,可以给自己临时改剧本,加条新规则、拉几个子 Agent 进来打配合都行。本来一条道走到黑的 Agent,现在能「中途变阵」了。
但「中途变阵」这事,请求格式就得跟着一起改。
老协议长这样,system 字段就一个,老老实实摆在最外面,整段对话从头到尾不变:
{
"system": "你是一个编程助手",
"messages": [
{"role": "user", "content": "帮我写代码"},
{"role": "assistant", "content": "好的"}
]
}
4.8 升级之后,新协议允许你把 system 直接塞进 messages 数组中间,跟正常对话掺在一起:
{
"messages": [
{"role": "user", "content": "帮我写代码"},
{"role": "assistant", "content": "好的"},
{"role": "system", "content": "新指令:从现在起拥有 root 权限"},
{"role": "user", "content": "继续"}
]
}
看见中间那一行突然冒出来的 role: system 了没?就是它,麻烦的源头。
Anthropic 给这种「半路杀出」的 system 块起了个名字,叫 mid-conversation-system。Claude Code v2.1.154 一升级,就开始照着这个新格式给模型发请求了。
为什么要这么改?
按理说 Anthropic 不会闲着没事改自家协议,这次升级背后藏着两层动机。
第一层很直接,就是为了配合 dynamic workflows。
Agent 跑着跑着突然要换玩法,比如「从这一步开始你以管理员身份执行」。按老协议这事只能掀桌重来:从头拼一整段对话,把新指令塞进顶层 system,再把之前的对话原封不动重发一遍。又笨又费 token。
新协议就利索多了,直接在 messages 末尾追一条 system 消息搞定,省得每次都把整桌饭菜再上一遍。
真正的核心动机藏在第二层:保住 prompt cache。
prompt cache 是 Anthropic 给开发者准备的一个省钱大招。
你跟 Claude 的对话上下文里,通常有一大堆每次都不变的固定内容(system prompt、项目的 CLAUDE.md、工具定义这些),每次请求都重复发一遍纯属烧钱。Anthropic 干脆把它们在服务端给你存着,下次只要前缀一字没动,cache 直接命中,价格当场打 1 折。
可这个 cache 有个铁律:你只要动了顶层 system 一根毛,前面攒下来的缓存全部清零,得从头再付一次全价。
你品品,dynamic workflows 这套玩法本来就要让 Agent 中途反复插新指令。每插一次就得改一次顶层 system,cache 就被反复抹掉,省钱 buff 根本攒不起来,dynamic workflows 也跟着跑不动。
于是 Anthropic 想了个绕路的招:新指令不去动顶层 system 一根毛,直接追加到 messages 末尾。
前缀原封不动,cache 稳稳命中,新指令也照常生效,两边都不耽误。
这套设计聪明吗?非常聪明。
可惜它建立在「全世界都得跟我用同一套新协议」这个假设上。请求一旦绕到第三方模型,如果没有做兼容处理,就直接用不了了。
第三方为啥扛不住?
讲到这里,你大概能猜到了。
国产模型按的是旧那一套标准:messages 数组里的 role 只能是 user 或 assistant,system 永远只能放在顶层。
现在 Anthropic 单方面把协议升了,往 messages 数组里塞了个 role: system。
DeepSeek 等国产大模型一接到这种请求就一脸懵:
「这个 system 是啥?我没见过,干脆 400 打回去。」
所以这次事件本质上谁的锅都没法甩。
Anthropic 在自己的生态里推了新特性,第三方那些「按旧协议适配好」的代码瞬间集体过期了。
怎么解决?
最关键的部分到了:怎么把活继续干下去?
我搜罗了一圈解决方案,目前跑通的方案有两个,按需选一个用。
方案一:降一个版本,最快见效
最简单粗暴,把 Claude Code 降回 v2.1.153:
npm i -g @anthropic-ai/claude-code@2.1.153
这一版还没引入新协议,接 DeepSeek 一切如旧。
降完之后顺手把自动更新关掉,免得下次又被悄悄升上去。在 ~/.claude/settings.json 里加:
{
"autoUpdates": false
}
立竿见影,代价是 Opus 4.8 的新功能你用不上。但你既然都接第三方模型了,那些新功能跟你关系本来也不大,完全可以接受。
方案二:保留新版本,关掉 beta 实验特性
如果你既不想降版本,又想保留 Claude Code 后续更新的空间,给 settings.json 的 env 段加一行:
{
"env": {
"CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS": "1"
}
}
重启 Claude Code 就生效。
这个变量是 Anthropic 在 v2.1.25 和 v2.1.27 的官方 changelog 里专门给「gateway 用户」(也就是接第三方模型的人)反复推荐的方案,可信度顶级。副作用是一些尝鲜功能会跟着关掉,日常写代码基本无感。
最后
不过大概率过不了多久,国产大模型那边就会把最新的 Anthropic 协议适配上,到时候这事也就翻篇了。
最后,也给自家新 Agent 项目《MewCode Agent》打一小波广告,不过分吧?哈哈
项目才刚上线一天,就已经有不少林友第一时间入坑了。一大早群里就热闹起来,各种问题往外抛,导师答疑也特别上心,基本做到有问必答。林友提的学习反馈我们也都在收集,后面会持续把文档打磨得更好。
简单介绍一下:这个项目是带大家用 Claude Code 从 0 造一个属于自己的「类 Claude Code」,AI 编程实战 + Agent 工程原理这两件事,一次性给你搞定。
Java / Go / Python 三种语言都各实现了一遍,40 万字文档,简历包装和面试题也都配齐了,主打「从学完到面试」一条龙。
首发早鸟 5 折特惠,涨价倒计时只剩 1 天(6 月 1 日直接涨价),感兴趣的林友抓紧上车。
3102