今天这次排障,对我来说不是”某个模型坏了”这么简单,而是一次很典型的生产环境误操作 + 升级后链路异常 + 排障路径不断修正的复盘案例。
最后结果是:机器人恢复了,飞书能正常回复了,Memory Wiki 和 Dreaming 也基本挂上了。但过程里我犯了不少低级错误,也暴露出我在 AI Agent 运维上的几个盲点。
这篇文章不讲理论,只讲今天真实踩过的坑。
一、事情是怎么开始失控的
我的 OpenClaw 原本是能跑的,后面我做了升级,接着就开始出现异常:
- 飞书能收到消息,但机器人不回复
- 有时候报
incomplete turn detected - 有时候
queuedFinal=false, replies=0 - 有时候看起来像模型切换成功了,但实际没有任何输出
- 后面还夹杂着 Dreaming、wiki、bridge、session 等多个因素,导致我一开始判断方向越来越乱
最开始我以为是:
- Dreaming 配置有问题
- bridge / wiki 插件冲突
- Codex 没额度
- MiniMax 坏了
- OpenRouter 坏了
- session 污染了
但最后发现,这些都只是表象的一部分。
二、我今天犯的几个核心错误
1. 直接在”正在使用的机器人”上升级
这是我今天最大的错误。
我把升级操作直接做在正在对外服务的机器人上,没有先做一轮最小验证,没有灰度,没有回滚预案。结果一升级,飞书回复链路就异常了。
正确做法应该是:
- 升级前先备份配置
- 升级后只做最小测试:
/new你好- 一个简单问答
- 确认没问题再继续用
我今天的问题,本质上不是”模型不行”,而是我把升级当成了无风险操作。
2. 把”模型问题”误判成”系统全坏了”
今天中途我一度把问题理解成:
- OpenClaw 坏了
- 飞书坏了
- gateway 坏了
- session 机制坏了
但后面一层层查下来,其实不是。
最后确认的状态是:
- 飞书通道是正常的
- gateway 是正常的
- session 也能正常创建
- Memory Wiki 也落地了
- Dreaming 其实也挂上任务了
真正异常的是模型调用链路,而且还是升级后触发的链路异常,不是整个系统崩掉。
这说明我一开始把故障范围想得太大,导致排障路线变得越来越复杂。
3. 过早怀疑 Dreaming / Wiki / Bridge
因为今天刚好又在折腾 Dreaming、Memory Wiki、bridge 这些东西,所以我很自然地把锅甩给了这些插件。
但后来事实证明:
- Memory Wiki 已经装好了
- reports 目录存在
.dreams目录存在Memory Dreaming Promotion任务存在lastRunStatus: ok
也就是说,这些功能不是这次”机器人不回复”的主因。
我今天的另一个错误,就是把”最近改过的东西”自动当成”故障源”。这很常见,但不一定对。
4. 没有第一时间去看最关键的 session 文件
今天真正把问题定性的,不是表面的错误提示,而是 session 文件里的这类内容:
"role":"assistant",
"content":[],
"usage":{"input":0,"output":0,"totalTokens":0}
这说明什么?
说明不是飞书消息发不出去,而是模型层根本没产出正文。
也就是说:
- 不是”回复被吞了”
- 不是”session 没建立”
- 而是”模型返回了空响应”
这是整个排障过程中最关键的证据。
如果我一开始就先看 session 文件,排障路径会短很多。
5. 对 fallback 过于乐观
理论上,fallback 是兜底的。
但今天我遇到的问题是:
- MiniMax 一度过载/超时
- 切到 OpenRouter free 后,又出现空响应
- fallback 没有兜住,反而制造了”消息到了但没回”的假象
这让我意识到一件事:
不是所有 fallback 都算合格 fallback。
一个真正合格的 fallback,至少要满足:
- 明确报错
- 或稳定返回
而不是”看起来切换成功,其实没有正文输出”。
今天的 openrouter/free,就属于这种”表面可用,实际不适合作为自动兜底”的典型案例。
6. 在排障过程中暴露了 token
这个也是很现实的问题。
今天为了排障,我贴了不少日志和配置。过程中 gateway token 实际上暴露过一次,后面才去做了重置。
这说明我在排障时还缺少一个安全意识:
- 日志可以贴
- 配置可以贴
- 但任何 auth token、API key、gateway token 都必须默认当成敏感信息处理
哪怕只是一次临时排障,也应该在结束后立刻轮换。
7. 没把”生产稳定”和”实验测试”分开
今天还有一个很大的问题,就是我把下面这些动作混在了一起:
- 升级 OpenClaw
- 测试不同模型
- 改 fallback
- 开 Dreaming
- 装 Memory Wiki
- 调飞书回复
- 查 session 问题
这些事如果分开做,其实每件都可控。
但一旦混在同一天、同一台生产机器人上做,问题就会呈指数级变复杂。
这次最深的教训之一就是:生产机器人只做稳定动作,实验动作单独验证。
三、今天最后是怎么恢复的
最后真正把系统拉回来的,不是”修好所有功能”,而是做了两件正确的事:
-
先停止折腾 OpenRouter free
事实证明,这条链路在我当时的环境里不可靠,会返回空响应。
-
把主模型固定回 MiniMax-M2.7,然后不再继续折腾 fallback
恢复后的状态变成:
- 主模型:MiniMax-M2.7
- fallback:空
- 飞书机器人恢复正常回复
/new正常你好正常- token 已重置
- Dreaming 任务已存在
- wiki 已落地
也就是说,最终恢复不是靠”全修好”,而是靠先回到一个最小稳定状态。
四、我今天真正学到的东西
第一,AI Agent 不是”装好就完了”
它不是一个单纯的软件,而是一条链路系统,里面有:
- 渠道层(飞书)
- 网关层(gateway)
- session 层
- provider 层
- model 路由层
- plugin 层
- 定时任务层
任何一层出问题,表面现象都可能很像。
第二,不要迷信 fallback
fallback 不是配上就安全,必须经过真实验证。
第三,日志不如 session 文件有用
如果是”收到消息但没回复”,最该看的往往不是表面报错,而是 session 最终有没有 assistant 正文。
第四,升级前一定要做最小验证
这个真的不能省。
第五,先恢复服务,再追根究底
如果机器人已经在生产中,就先把它拉回稳定状态,再去研究到底是哪个 provider、哪个版本、哪个路由的问题。
五、我给自己定下的后续规则
以后我再碰 OpenClaw / AI Agent 这类系统,先按下面这套来:
- 生产机器人不上来就升级
- 升级前先备份配置
- 升级后先跑最小验证
- fallback 不用泛路由模型,优先用明确模型 ID
- 出现”没回复”先看 session 文件
- 配置和日志发出来前先检查 token
- 生产链路和实验链路分开
六、结语
今天这次排障,表面看是”机器人不回了”,但本质上是一次很典型的运维问题:
不是某一个点坏了,而是我在一个正在服务的系统上,同时做了太多变化。
最后系统恢复了,这当然是好事。
但比恢复更重要的是,我终于更清楚地知道:
以后该怎么不把它再弄坏一次。