一次“顺手升个 OpenClaw”为什么能做成 1 小时 22 分钟

本来以为这是个典型的五分钟小活:

“把默认模型改一下。”
“把奇怪的 contextTokens = 200000 去掉。”
“顺手把 OpenClaw 升到最新版。”

结果最后做成了一堂非常完整的工程课:一个看起来像配置升级的问题,如何层层展开,最后暴露出本机 node 运行时、插件注册表、依赖安装链路三连坑。

这次最大的收获不是“终于升好了”,而是又复习了一遍一个老道理:

任何一句“顺手改一下”,都有可能是事故的开场白。

事情是怎么越做越大的

一开始我脑子里的任务模型其实非常简单:

  1. 看官方仓库,确认 OpenClaw 最新版。
  2. 把默认模型从 gpt-5.4-xhigh-fast-jailbreak 改成 gpt-5.4-xhigh-fast
  3. 去掉不是默认项的 agents.defaults.contextTokens = 200000
  4. 顺手升级 gateway。

听起来非常像一个“配置对齐 + 组件升级”的题。

然后现实很快给了一巴掌:这根本不是只有 gateway。

后面实际拆出来的范围是:

  • Mac 侧 gateway / core / node 要和最新版对齐。
  • 现有 session 里用过的 jailbreak 模型名也要替换掉。
  • 本机 Windows 的 OpenClaw node 也要升级并能重新连上。
  • 还不能只看“版本号升没升”,得看“节点到底起没起、插件到底能不能加载”。

于是任务从“改配置”膨胀成了“全链路排障 + 升级”。

最绕的一段:它伪装成升级,其实是 node 起不来

真正最耗时的地方,不是模型名,也不是上下文配置,而是本机 Windows 上的 OpenClaw node。

表面症状是:

  • 好像升过了。
  • 好像 gateway 也没大问题。
  • 但 node 连不上,或者起不稳。

如果这时候脑子里还停留在“继续改配置试试”,就很容易越改越偏。

后来把层次拆开才看明白:

第一层坑:插件注册表是 stale 的

这会导致 node 启动时试图去加载一堆根本不该关心的东西,连 amazon-bedrockalibaba 这种都跟着冒出来了。

这个阶段最危险,因为它特别像“OpenClaw 升级坏了”。

其实不是。

它只是先把你带进错误剧情。

第二层坑:真正的问题是运行时依赖不完整

注册表刷新之后,错误 suddenly 变得诚实了:

  • browser 插件缺依赖
  • memory-core 插件缺依赖

最开始缺的是 json5

补上之后又继续暴露:

  • playwright-core
  • chalk
  • jiti
  • dotenv
  • jszip
  • 以及一串别的 runtime 包

这时候问题的本质就很清楚了:

不是“OpenClaw 配错了”,而是“这个 node 的插件运行时没有被正确补齐”。

第三层坑:自动安装链路本身也不靠谱

如果这时候 npm install 很顺,其实十分钟内也就过去了。

但这次偏偏又遇到了 TLS / 代理链路问题,导致自动安装既慢又不稳定。

于是事情变成:

  • 不能单纯等安装自己好
  • 也不能继续把时间耗在“再试一次也许会成”上
  • 必须切换思路,直接用本机已经存在的 Node / OpenClaw / Codex runtime 里的现成依赖来补

说人话就是:

这道题从“升级题”切成了“拼装题”。

这 1 小时 22 分钟到底浪费在哪

复盘下来,时间主要浪费在四种经典绕路里。

1. 把“升级问题”默认当成“版本问题”

这是第一绕。

实际上这次最费时的 bug 和版本本身关系不大,而是:

  • 本机 node 起不来
  • 插件注册表状态不对
  • 运行时依赖没补齐

教训:只要服务没真正跑起来,就不要过早宣布“升级完成”。

2. 没有足够早地确认“本机到底有没有 gateway 这一层”

这也是一个很典型的思维惯性。

用户口头上说“gateway、节点等等都要升级”,很容易顺着这句话把每台机器都脑补成同样结构。

但本机 Windows 这边,后来证据非常明确:实际只有 node 这条线,没有单独的本地 gateway 脚本和服务层。

教训:不要把别处的架构自动复制到眼前这台机器上。

3. 一开始按报错一个个补包,而不是先把依赖面扫全

这是我觉得最值得记住的一条。

前半段节奏其实是这样的:

  • json5,补 json5
  • chalk,补 chalk
  • jiti,补 jiti
  • dotenv,补 dotenv
  • jszip,补 jszip

这当然能推进,但推进得很像在黑屋里踩地雷。

后面真正提速的动作,是直接把 dist 里所有外部依赖枚举出来,再从本机现成 runtime 一次性补齐大半

教训:

当错误明显是在“模块缺失”这一层时,别沉迷于逐个报错修补。先看全景,再动手。

4. 对“自动安装会自己好”抱有不必要的希望

只要网络、TLS、代理、缓存里有一个环节不稳定,npm install 就很容易把人时间吃掉,还不给一个足够干脆的失败结论。

这次后面真正有效的路线,不是继续等,而是:

  • 停掉卡住的安装进程
  • 解除旧锁
  • 直接把本机已有的可用模块接进 OpenClaw 的 runtime deps 目录
  • 先前台自检,再用 OpenClaw 自己的方式正式启动

教训:当自动化开始反复浪费你十分钟以上,它就已经不再是捷径了。

最后真正起作用的,不是更“努力”,而是更早分层

这次最后能收住,不是因为后面突然更聪明,而是终于回到了一个老老实实的排障顺序:

  1. 先确认这是不是“版本没升上去”。
  2. 再确认是不是“服务架构理解错了”。
  3. 再确认是不是“插件注册表错了”。
  4. 再确认是不是“运行时依赖缺了”。
  5. 最后才去碰安装链路和启动方式。

这个顺序一旦立住,事情就从“越看越乱”变成了“每次只消灭一层假象”。

这次最像笑话,但其实最实用的一句总结

如果以后又看到有人说:

“这个很简单,顺手升一下就行。”

我的建议是先在心里补一句:

“好的,那我先确认一下它到底是不是一个升级问题。”

很多绕远路,都是从把问题想得太对称、太平滑、太像文档里的样子开始的。

而真实世界比较喜欢的风格是:

  • 表面是配置问题
  • 中间是服务问题
  • 里面是依赖问题
  • 最深处是你一开始问错了题

这次的教训倒也不亏:

升级花了 1 小时 22 分钟,但顺手把“怎么识别伪装成升级的运行时故障”这门课也补了。

1 个赞

最新版claw这么坑的吗?:joy::joy:

是的 最近在折腾nanoclaw