把微信变成 AI Agent 的入口

这件事最开始其实没有想得那么复杂。

前两天我看到 OpenClaw 已经可以接微信,我第一反应是:既然它能接,那我们现在这一套 ChatGPT、LMN516、Control Tower,是不是也可以放进微信里?我平时本来就一直在微信里,很多时候手机也在手边。如果我突然想到一个问题,或者想让 AI 帮我做一件事,最自然的入口其实不是重新打开一个后台,也不一定非得打开 ChatGPT,而可能就是发一条微信。

我之前口述的时候有时会把它说成 OpenCloud,实际这次接的是 OpenClaw。它在这条链路里更像一个 Agent Runtime:负责把微信里的消息接进来,维持会话,再把后面的模型、工具和系统能力接上去。

一开始的目标很简单:先让它能回。

但真正做下来,我发现“微信里能出现一句 AI 回复”和“我真的愿意把它当成日常入口”,中间还有不少东西。

这次接入经历的几个阶段

第一步:先把微信这条路跑通

最开始我们做的事情,本质上还是一个聊天链路:

我
↓
微信
↓
OpenClaw
↓
模型
↓
OpenClaw
↓
微信

先不谈 Agent,也不谈执行。只看最基本的一件事:我在微信里发一句话,后面能不能收到这句话,模型能不能理解,然后回复能不能再回到微信。

这一步做通的时候其实已经挺有意思。因为以前我对“AI 在哪里”这件事还是会有一点 App 思维:ChatGPT 在 ChatGPT 里,微信在微信里,LMN516 在网站里。接通以后,这几个边界就没有原来那么硬了。

AI 不一定非得有一个自己的聊天界面。

微信也可以只是一个入口。

这跟我之前把 Gmail、快捷指令、Mac 剪贴板这些东西接进 LMN516 的感觉很像。只要中间能力开放出来,入口本身就可以换。

不过能回以后,问题很快就开始出现。

第二步:真正麻烦的是反复测试

刚接通的时候,我最关心的是“它有没有回复”。但测试几轮以后,标准马上就变了。

我开始关心:

  • 为什么有时很快,有时明显慢;
  • 为什么同样一句话,有时很顺,有时像卡住;
  • 为什么系统明明完成了一个 turn,微信里却没有可见回复;
  • 如果连续聊几轮,上下文能不能保持;
  • 如果开始调用工具,整体还会不会稳定。

今天我就遇到过一条很典型的提示:

I finished the turn, but it did not produce a visible reply.

它其实非常能说明问题。

从模型或者 Agent 的内部来看,这一轮可能“完成”了;但对我来说,没有看到回复,就等于没有完成。

这两个“完成”不是一回事。

以前做 LMN516 的 Control Tower 时,我们就一直在解决这个问题:代码写了不等于上线,上线不等于我看到了,我看到了也不一定等于我验收。现在把 AI 放进微信,类似的问题又出现了一次。

模型完成
≠
Agent 完成
≠
消息成功返回
≠
我在微信里真的看到

所以后来我们不再只盯着模型有没有正常结束,而是开始看完整链路。

第三步:我开始很在意响应时间

把 AI 放在网页里时,慢几秒有时候还能忍。但放进微信以后,体感会变得很敏感。

因为微信本来就是一个即时通讯工具。

我发一句话以后,下意识会期待它像一个人在聊天一样,很快有反应。哪怕最后答案质量一样,4 秒和 12 秒的感觉也完全不一样。

所以有一段时间我们一直在压响应时间。我当时希望尽量把普通对话压到大约四秒左右,不是说每一次都必须精确四秒,而是希望它进入一种“聊天时不会明显打断节奏”的范围。

后来我越来越清楚,响应时间也不能只看模型。

响应时间是一整条链路的预算

一次微信里的回复,中间至少可能经过:

微信收消息
↓
OpenClaw 收到并整理会话
↓
模型推理
↓
必要时调用工具 / MCP
↓
拿到结果
↓
组织最终回复
↓
OpenClaw 发回
↓
微信变成可见消息

任何一段慢,最后都会变成我的“怎么还没回”。

这件事后来也改变了我们看性能的方式。以前容易问“模型快不快”,后来会问“整条链路里到底是哪一段在花时间”。

如果只是模型慢,那是模型问题;如果是工具调用慢,就要看工具;如果回复已经生成但没有成功显示,那又是消息回传的问题。

第四步:额度第一次变成了产品体验

再往后,另一个问题开始明显起来:额度。

一开始我可能会把额度理解成一个后台数字,或者某个 API 的限制。但当微信成为日常入口以后,额度会直接变成体验的一部分。

比如连续测试、上下文变长、Agent 需要做更多判断,都会增加消耗。额度不足或者触发限制以后,表现出来的可能不是一个很漂亮的“额度不足”页面,而是回复变慢、失败、重试,甚至某一轮没有正常返回。

这时候我才觉得,额度不是一个财务问题,它也是架构问题。

如果只是偶尔玩一下,额度不够最多就是今天先不用。

但如果我希望微信真的成为一个长期入口,那就要开始考虑:

  • 普通聊天和重任务是不是要走不同模型;
  • 哪些东西应该直接读 LMN516,而不是每次重新推理;
  • 哪些上下文应该压缩;
  • 工具结果能不能复用;
  • 失败以后怎么重试,什么时候不该重试;
  • 最终要不要给不同类型的请求设不同预算。

这些问题现在都还没有完全做完,但它们已经从“以后再说”变成了真实的问题。

第五步:我后来发现,只能聊天其实还不够

真正让这件事发生变化的,是我们开始问:既然已经在微信里了,它为什么只能回答我?

比如我在微信里说:

“帮我看一下现在还有哪些任务没完成。”

如果它只是根据聊天上下文猜一遍,那它仍然只是一个 Bot。

我更希望它真的去读 Control Tower。

我再说:

“这个问题你继续做。”

它不应该只回复“好的,我来处理”,而应该真正建立一次执行,把任务交给 Worker,然后把状态再回来告诉我。

这时候目标就从“微信聊天机器人”变成了“微信里的 AI Agent”。

Bot 和 Agent 的差别

这两者最明显的差别,不是后者更会说话,而是后者有一个真实世界。

Bot 的世界基本在当前对话里。

Agent 的世界里还应该有:

任务
状态
工具
权限
执行
证据
失败
重试
结果

于是我们开始把 OpenClaw 接到 LMN516 已经存在的 Control Tower MCP。

第六步:微信开始接进 LMN516 的任务系统

这部分是这次接入里我觉得最关键的一步。

因为 LMN516 本来就已经有一套 Q、RUN、Control Tower、Worker 的结构。

一个需求先变成 Q,一次真实执行有自己的 RUN。Worker 做了什么,做到哪一步,有没有阻塞,有什么证据,最后有没有完成,都可以围绕同一个任务继续追踪。

所以我们没有再给微信单独造一套“微信任务系统”,而是让 OpenClaw 去接已经存在的那套能力。

现在这条链路更接近:

微信、OpenClaw 与 LMN516 Control Tower 的完整关系

我
↓
微信
↓
OpenClaw
↓
LMN516 MCP
↓
Control Tower
↓
Q / RUN
↓
Heavy Worker
↓
真实执行(代码 / GitHub / LMN516)
↓
状态与证据回写
↓
微信

8 月 21 日,我们先给 Control Tower MCP 增加了 list_open_items

这件事看起来只是多了一个工具,但它很重要。因为从这一步开始,外部 Agent 不需要靠聊天记忆猜“我还有什么事没做”,而是可以直接读取 LMN516 当前未解决的事项、阻塞、需要用户做什么、关联了哪些 RUN。

之后又补了 report_run_status

它解决的是另一半:Worker 不只是被派出去,还要把真实执行状态和证据写回来。

比如:

RUNNING
VERIFYING
WAITING_USER
BLOCKED_EXTERNAL
DONE
FAILED

这些状态不是为了好看,而是为了避免微信里出现一种很假的体验:

“好的,我已经开始处理了。”

然后什么都没有发生。

我现在越来越不喜欢这种“语言上的执行”。

如果一个 Agent 说自己开始做,那系统里最好真的有一个 RUN;如果它说完成,那最好有证据;如果做不了,也应该告诉我卡在哪里。

到写这篇文章的时候,它还没有完全结束

这一点我觉得也应该写清楚。

现在并不是说整个 WeChat Agent 已经 100% 收口,然后我回来写一篇成功案例。

实际状态更像是:

  • 微信和 OpenClaw 的基础聊天链已经跑起来;
  • LMN516 的 MCP 已经可以让外部 Agent 查询未完成事项;
  • RUN 状态回传能力已经写进实现;
  • Q ↔ RUN 的归属、终态不能倒退、证据记录这些规则也已经补上;
  • 但 Production 里的完整暴露和真正端到端的 WeChat → Worker → 状态回传 smoke,还在继续验证。

这其实更接近我们真实做东西的方式。

不是等所有事情都完美以后,再事后写一条非常顺的路线。

真正的过程里会有接通、失败、测试、误判、限额、响应时间、重新拆问题,然后目标也会变。

从接通到 Agent 化的路线

这件事对我真正有意思的地方

如果只从功能上说,这件事可以被总结成一句很普通的话:

“我把 AI 接入微信了。”

但我自己现在更在意的是另外一件事。

以前我把不同系统看成不同地方:

微信 = 聊天
ChatGPT = AI
GitHub = 代码
LMN516 = 网站
Control Tower = 任务

现在它们开始慢慢变成:

微信 = 入口
OpenClaw = Agent Runtime
LMN516 = 我的系统
Control Tower = 任务与状态
Worker = 执行
GitHub / API / 数据库 = 能力

这样以后,“我在哪儿”就没那么重要了。

我可以在微信里说一句话,但真正发生的事情可能在 LMN516、GitHub、数据库或者别的服务里。

对我来说,这跟之前把 Gmail 接进 LMN516、把快捷指令接进小泡泡,其实是一条线。

我开始越来越不把一个 App 当成一个封闭的地方,而是把它看成一个入口或者一种能力。

微信这次比较特殊,是因为它离我太近了。

如果以后我不用专门打开一个开发后台,也不用切换很多页面,只是在微信里说:

“看一下那个任务现在到哪儿了。”

“继续。”

“这个通过了。”

“把这个想法先记下来。”

然后后面的系统真的知道我在说哪一件事,并且能做、能回、能留下证据,那它就已经不是把一个聊天机器人塞进微信这么简单了。

它更像是:我自己的系统,终于长出了一个我每天都会使用的入口。

现在这条路还没有完全走完。

但至少已经从“能不能接进微信”走到了另一个问题:

接进去以后,它到底只是陪我聊天,还是能真正成为我系统里的一部分。