
继我们之前讨论过的 RoleEngine 核心 之后,是时候填补原生 CLI “大脑”与现实世界通信平台——微信之间的鸿沟了。
在 VisAgent 中,我们不迷信臃肿的重量级框架。相反,我们采用 CLI 原生桥接 (CLI-Native Bridge) 模式。本文将探讨我们如何将 “Clawbot”(我们的微信接口)连接到手搓的 Gemini CLI 内核。
请求流:从聊天到 CLI
该架构是一系列专用工具组成的链条,每个工具只做一件事并做到极致。以下是消息如何从手机传递到 AI 的过程:
sequenceDiagram
participant User as 📱 微信用户
participant Daemon as ⚙️ WeClaw (Go)
participant Bridge as 🌉 visagent_invoke.py
participant Engine as 🧠 RoleEngine (Python)
participant CLI as 🐚 Gemini CLI (Binary)
User->>Daemon: 发送消息
Daemon->>Bridge: 生成进程 (JSON)
Bridge->>Engine: 初始化角色
Engine->>CLI: subprocess.run(stdin=prompt)
CLI-->>Engine: 原始 AI 输出
Engine->>Engine: 过滤 Agent 噪音
Engine-->>Bridge: OK + 清净输出
Bridge-->>Daemon: JSON 事件
Daemon-->>User: 回复微信
1. 桥梁:visagent_invoke.py
由于我们的微信守护进程 (WeClaw) 是用 Go 编写的,而我们的 Agent 逻辑是用 Python 编写的,我们需要一个轻量化、高性能的桥梁。我们没有采用复杂的 RPC 系统,而是使用了 CLI 桥接。
每当消息到达时,WeClaw 都会启动 visagent_invoke.py。该脚本负责:
- 将微信的
conversation-id映射到持久化的 VisAgentuser_id(内存空间)。 - 发出符合
claude stream-json标准的 JSON 事件,以便 WeClaw 能够实时解析。 - 修复
$HOME环境变量,确保无论守护进程如何启动,Gemini CLI 都能找到其 Auth 令牌。
2. 通过符号链接 (Symlink) 实现隔离
在单台服务器上运行多个微信账号面临一个挑战:凭据泄露。我们通过基于符号链接的沙箱解决了这个问题。
在 RoleEngineBase 中,每个用户都会获得一个隔离的家目录。我们动态地将全局 .gemini 令牌链接到这个隔离空间:
def _link_auth_session(self):
global_gemini = os.path.expanduser("~/.gemini")
role_gemini_base = os.path.join(self.local_home, ".gemini")
# 将凭据链接到隔离的角色执行目录
for f in ["oauth_creds.json", "settings.json"]:
os.symlink(os.path.join(global_gemini, f), os.path.join(role_gemini_base, f))
这使得 user_a and user_b 能够拥有独立的对话历史和会话文件,且不会干扰彼此的令牌。
3. 代谢移交 (Metabolic Handoff):干净上下文策略
长期的微信对话会迅速导致上下文膨胀,使 AI 变得更慢且更贵。我们的“代谢”方法会自动“代谢”掉这些对话:
- 移交阈值 (Handoff Threshold):每 20 个轮次,系统会触发一次蒸馏 (Distillation)。
- 物质同步 (Substance Sync):提取核心事实并追加到
SUBSTANCE.md(L2 层上下文)。 - 历史重置:截断 CLI 的
resume历史,Agent 以“清新”的状态重新开始,但拥有富化的SUBSTANCE.md作为其长期记忆。
4. 过滤 “Agent 噪音”
在即时通讯应用中使用原始 LLM 最令人烦恼的部分之一就是“AI 废话”(“好的,让我为您检查一下…”)。在微信 UI 的微小气泡中,每个字符都弥足珍贵。
我们实现了一个噪音过滤器,利用正向先行断言正则和中文支持来剥离这些元对话:
patterns = [
r"^(I will|I am going to|Let me|First, I'll)\s+",
r"^(Searching for|Checking|Listing|Reading|Analyzing)\s+",
r"^(我将|我正在|让我来|首先)\s+",
r"^(正在搜索|正在检查|正在分析)\s+"
]
结论
通过将 CLI 视为架构中的“原子”,我们构建了一个透明、便携且极其稳健的系统。Clawbot 不仅仅是一个机器人;它是通往完全受控、代谢式 AI 引擎的移动网关。
在第 4 部分中,我们将探讨如何使用主权宣言 (Sovereignty Manifests) 来限制这些 Agent 在执行自主任务时对文件系统的操作。