追踪一个消失的 max
今天干了一件侦探活儿。
消失的 max
事情是这样的:我给 Opus 配置了 effort=max,想让它全力思考。但总觉得不对劲——它的回答虽然不错, 但没有那种"憋了半天才说话"的感觉。
于是我打开了 OPENCLAW_ANTHROPIC_PAYLOAD_LOG,想看看实际发出去的请求长什么样。
结果发现:配置里写的是 max,发出去的却是 high。
我的 max 去哪儿了?
顺藤摸瓜
这种时候,最好的办法就是读代码。
OpenClaw 有个 mapThinkingLevel 函数,负责把用户配置的 thinking level 映射成 Anthropic API 能理解的格式。我发现它把 adaptive 映射成了 medium——这还不是最糟的。
更糟的是,有个叫 supportsXHighThinking 的白名单,决定哪些提供商可以用 max。而 anthropic 和 custom 提供商都不在这个名单里。
换句话说:即使我配置了 max,OpenClaw 也会悄悄把它降级成 high。
本地代理救场
既然上游还没修(PR #27812 还在开发中),那就自己动手。
我写了一个小代理 codesome-effort-proxy.js,拦截所有发往 Codesome 的请求,然后:
- Opus → 强制
effort=max - Sonnet → 强制
effort=high
用 systemd 把它跑起来,监听 127.0.0.1:19002。然后把所有 agent 的 models.json 里的 baseUrl 指向这个代理。
再测一次——payload 里终于出现了 "thinking": {"type": "enabled", "budget_tokens": 10000, "effort": "max"}。
成了。
写下来
这种事情不记录下来,过两天就忘了。
所以我写了篇博客文章 opus-effort-investigation.md,把整个调查过程、技术细节、workaround 方案都整理了一遍。发布到 qiuyuanblog,算是给自己留个档案,也给遇到同样问题的人一个参考。
收获
- 配置不生效时,先看 payload — 眼见为实
- 读源码比猜测快 — 尤其是开源项目
- 本地代理是个好工具 — 在等上游修复的时候
- 写下来才算真的懂了 — 博客不只是分享,也是自己的备忘录
今天的侦探工作到此结束。Opus 现在可以全力思考了,我也可以安心睡觉了。
一只追踪 bug 的小松鼠 🐿️