Claude Opus 4.7 背后的三层黑箱:订阅用户正在失去的自主权

TL;DR 一条被静默废弃的环境变量,牵出 Claude Opus 4.7 背后的三层黑箱。订阅用户当前跑的是哪个模型、在哪个 Harness 里跑、后台 Runtime 做了什么调整,全都超出可见范围。Anthropic 的主要客户是企业,订阅用户的利润空间被逐步压缩。BYOK 能部分绕开,长期要等中国开源模型和 AI SaaS 消费者法律建设。


一条失效的环境变量

推特上有人贴出一段反编译的 cli.js 代码,指控 Anthropic 在 Claude Code 2.1.112 里静默废弃了一个环境变量:

let j8 = S6(process.env.CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING)
      && (H.includes("opus-4-6") || H.includes("sonnet-4-6"));
if (Vh8(A.model) && !j8) i6 = { type:"adaptive", display:x6 };
else { /* 固定 budget_tokens 路径 */ }

翻译一下:CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING 这个环境变量,只有当模型名同时包含 opus-4-6sonnet-4-6 时才生效。也就是说,你现在跑 Claude Opus 4.7(cli.js 里的 claude-opus-4-7),设了这个变量等于没设,代码会悄悄走向 adaptive 分支,你全程无感。

我在本地 /opt/homebrew/lib/node_modules/@anthropic-ai/claude-code/cli.js(2.1.111 版本)里验证了同样的逻辑。推文属实。

接下来我顺手拆了一下 cli.js 的其他部分,发现这不是孤立事件,而是一整套设计。

三个配套证据

在 cli.js 里跑几轮 grep,很快找到三条关联证据。

第一条:LEGACY_MODEL_REMAP=1 to opt out。意思是默认情况下,Claude Code 会把你对 legacy 模型(Opus 4.5、Opus 4.1)的请求自动重定向到新模型。你得手动设 LEGACY_MODEL_REMAP=0 才能真的用到 legacy 版本。这个 env var 在官方文档里没有明显位置,我是在代码字符串里挖出来的。

第二条:Opus 4.6 和 Sonnet 4.6 的 assistant prefill 功能被硬下线。cli.js 里的原话:

no longer supported on either Opus 4.6 or Sonnet 4.6 — both return a 400 no longer supported on Claude Opus 4.7 or later models and returns a 400 error

prefill 是 Anthropic API 从一开始就提供的能力,允许调用方预填模型的回答前缀。许多 JSON 输出、格式约束、few-shot 提示都靠这个实现。Anthropic 现在在 Opus 4.6 及之后的模型上直接返回 400。API 层的一次能力删除,生效即定局,订阅用户只能被动接受。

第三条:Opus 4.6 是一个"存在但跳过"的短命版本。cli.js 里能找到完整的日期戳 model ID claude-opus-4-6-20251101 和 fast 变体 claude-opus-4-6-fast,但 Legacy Models 表格里只列了 Opus 4.5、4.1 为 “still active”,Opus 4.6 没有被正式列出。叙事上从 4.5 直接跳到 4.7,4.6 被悄悄跳过。想"回退到上一个稳定版",得自己拼 model ID + 设 LEGACY_MODEL_REMAP=0 + 通过订阅 gate,整套流程没有一步在官方文档里被完整说明。

三条证据合起来很清楚:这不是"某个开发者忘了删代码",而是一套将模型决策权从用户移回厂商的系统性设计。

你买的不是一个模型

鸭哥(@grapeot)在 04-07 那篇分析 Claude Code 降智事件的文章里,给出了一个目前最准确的拆解框架。他把用户感受到的"Claude 变笨了"拆成三层:

  1. Model 层:模型权重本身。这一层相对透明,版本号可验证。
  2. 协议层:API 和 SDK 接口。相对可观测。
  3. Runtime 层:thinking budget、temperature、caching 策略、降智策略等推理时参数。这一层完全不可见。

Stella Laurenzo 用 6852 个 session 的量化数据证明了 Runtime 层存在不透明的质量波动。鸭哥在那篇里还算了一笔账:subscription 模式下,power user 的实际推理成本约等于月费的 122 倍。厂商有强经济动机在 Runtime 层做用户感知不到的降级。

这个三层框架放到 Claude Code 上,还要再加一层 Harness

  • Harness 是 Claude Code 本身的 agent loop、工具调用系统、权限管理器、prompt 注入器
  • Harness 会在你每次交互里注入 system prompts(例如 Auto mode 的 6 条指令、Bypass 模式下什么都不注入)
  • Harness 可以单方面改 thinking 预算的默认值、hotfix 某个模型的行为
  • Harness 是闭源的混淆 JavaScript,2.1.111 版本的 cli.js 有 10 MB,变量名全是 AbSKYj8 这样的单字母,只有字符串常量能 grep 到

合起来:订阅 Claude Code 时你买到的不是"Opus 4.7",而是 Anthropic 版 Opus 4.7 × Anthropic 的 Harness × Anthropic 的 Runtime。三层的每一层,Anthropic 都保留单边修改权。

黑箱的日常

这套架构在日常使用中的表现,大致是这样:

Model 层:你以为你用的是 Claude Opus 4.7。后台 Anthropic 有没有在负载高峰期把你路由到蒸馏版,低峰期再切回来,你看不到。cli.js 里有 getRuntimeMainLoopModel 这样的函数,具体路由逻辑超出可见范围。

Harness 层:切换到 Bypass 模式和切换到 Auto 模式,你的模型收到的 system prompt 不一样。Auto 模式会注入 6 条指令,其中 3 条是反思考(“Execute immediately”、“Prefer action over planning”、“Minimize interruptions”),Bypass 模式一条都不加。这是一个直接影响模型行为倾向的变量,但 Claude Code 的 UI 只告知权限差异、隐去 prompt 差异。我搜了整个 cli.js 2.1.111 确认过:Prefer action over planning 这条字符串全文只出现一次,就在 Auto mode 的 meta reminder 里。

Runtime 层:adaptive thinking 是不是开着、budget_tokens 是多少、caching 命中率、temperature、fastMode 是否激活,这些都由 Harness 内部决定。cli.js 里能看到 fastMode 是一个 runtime-only 参数,但它什么时候被打开、按什么规则开,订阅用户无从知道。

用户能感知到的只有最终输出。输出变差时你难以分辨是 Model 问题、Harness 问题还是 Runtime 问题,更谈不上要求厂商改回上一个版本。

为什么 Anthropic 要这么做

Anthropic 不是慈善机构,这些设计有清晰的商业动机。

Anthropic 的主要收入来源是企业客户(Managed Agents 产品线、API 企业订阅、云合作伙伴分成)。个人订阅(Claude Max/Pro)是获客和留存工具,不是利润中心。企业客户要的是稳定 SLA 和可控成本,个人订阅用户的重度使用反而是成本中心。

在这个结构下,厂商的最优策略是:

  • 对企业客户暴露版本控制(你可以选定特定 model snapshot)
  • 对订阅用户隐藏版本控制(我给你路由到当前 default,具体什么模型你不关心)
  • Runtime 层降级优先对订阅用户开放,企业客户签了 SLA 不能随便改
  • 文档上淡化"opt out 的 env var"(LEGACY_MODEL_REMAP=0CLAUDE_CODE_DISABLE_THINKING 等)

这套策略在法律上没问题。订阅服务条款通常写着"Anthropic 可随时更新服务",你同意的就是这么一个随时变化的产品。这是订阅合约的本质不对称:你付固定费用,换一个可变质量的服务。

我订阅 Anthropic 和 OpenAI 都是这种状态。

BYOK 是部分解法

如果不接受这种不对称,短期内有一个可以立即用的绕过方案:BYOK(Bring Your Own Key)。

具体做法:

  • 用 Claude Agent SDK 或 Anthropic 官方 Python SDK 直连 API
  • 自己传 modelthinking.budget_tokensmax_tokens 等参数
  • 自己实现 agent loop,绕开 Claude Code 的 Harness
  • 自己按 token 付费

代价是失去了 Claude Code 的工具生态(MCP、权限管理、hooks、skills)。但换回来的是:

  • Model 参数一阶可见
  • Runtime 参数一阶可控
  • 没有 Harness 在中间注入 system prompt
  • 能用任何 model ID,只要 API 层还 serve

我自己当前还保留在订阅模式,Claude Code 的 agent loop 和 skills 生态对日常工作流够用。但对质量特别关键的任务(深度分析、代码审查、长上下文推理),直接走 SDK 是更可靠的选择。

这也和 yage 那篇 AgentOpt 分析里反复强调的一条一致:Harness engineering 的收益越来越小,把思考从模型内部转移到管线外部才是真正的杠杆。

长期出路:开源和法律

BYOK 只是短期绕过。长期看,个人开发者要对抗这种垄断,有两条路。

第一条是等开源模型接近前沿。DeepSeek、Qwen、GLM、Kimi 这些中国开源模型过去一年的进步速度很快。如果 2027 年前后开源模型跑到 Claude 4.x 的水平,订阅用户就有了议价权。你不用 Anthropic 了,他们就不能随便降级。

中国开源模型还有一个结构性优势:它们没有"订阅转企业"的变现焦虑,商业化路径是云服务和 API 批发,不是订阅用户的使用时长。模型权重发出来就是公共资源,你可以用任何 Harness 跑,Runtime 参数完全自己定。

我关注中国开源生态的原因之一就是这个。

第二条是推动 AI 订阅服务的消费者法律建设。目前全球针对 AI SaaS 的消费者保护法律处于真空期。订阅条款允许厂商随时更新服务,用户层面版本回退权缺位、质量保证条款缺位、数据使用规则不公开。这些在传统软件(macOS、Windows)和云服务(AWS、GCP)都有明确法律约束,AI 订阅服务还是一片待建状态。

欧盟的 AI Act 解决的是"高风险 AI 系统"的问题,和"订阅服务质量可变"这个问题关联不大。美国的消费者保护框架更是滞后。中国的《生成式人工智能服务管理暂行办法》主要针对内容合规,同样未覆盖这个问题。

法律建设是慢变量,个人开发者能做的是:在中文技术社区把这个问题持续讨论出来,给未来的立法积累案例。这也是我写这篇文章的原因之一。

结尾

这次我花了两个小时拆 cli.js,结果比预期悲观一些。不是因为某个 feature 废弃了,而是因为看到了设计意图:Anthropic 把模型使用决策权逐层上收,订阅用户逐层失去可见性和可控性

CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING 只是这个过程里一个很小的样本。同类现象还会继续出现,每次都会被包装成"我们更新了服务以提供更好的体验"。

订阅这个模式买的是一个会持续变化的产品,这点用户必须接受。但如果厂商在变化过程中缺乏透明度、缺少提前告知、关上回退路径,合约的不对称就会被推到对用户完全不利的一端。

个人用户能做的三件事:

  1. 短期:需要可控时切 BYOK,日常流畅时用订阅,两者各司其职。
  2. 中期:持续跟踪开源模型进展,把关键 workflow 做到"模型可替换",让任何一家厂商的 Runtime 都随时可换。
  3. 长期:在能写的地方把这些观察写出来,推动消费者法律和行业惯例对 AI 订阅服务做出清晰约束。

能做的就是这些。


附:本文涉及的 cli.js 字符串(全部来自本地 Claude Code 2.1.111 的 cli.js 静态分析)

  • CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING && (includes("opus-4-6") || includes("sonnet-4-6")) 白名单逻辑
  • LEGACY_MODEL_REMAP=1 to opt out 环境变量
  • no longer supported on Claude Opus 4.7 or later models and returns a 400 error(prefill 废弃)
  • no longer supported on either Opus 4.6 or Sonnet 4.6(同上)
  • claude-opus-4-6-20251101claude-opus-4-6-fastclaude-opus-4-7 的 model ID
  • Auto mode 6 条 system prompt 指令
  • Bypass Permissions 模式零 system prompt 注入(全文验证一次)

参考:

  • yage.ai 2026-04-07《Claude Code 降智事件》
  • yage.ai 2026-04-09《AgentOpt 模型选择》

如果这篇文章对你有帮助,欢迎请我喝杯咖啡,支持我继续创作更多内容。

Buy me a coffee