这篇文章不打算聊那些虚头巴脑的 Agent 概念,我们直接进代码。
如果你最近在折腾 OpenClaw,你一定会发现它的调用链路长得离谱。从前端下达一个指令,到最终在你的本地环境(甚至是一个嵌入式设备)执行,中间绕过了复杂的 Gateway 协议转换和 Pi-embedded 的环境隔离。
很多开发者反馈“明明配置了 Skill,但 Agent 就是不调”,或者“调用了但回显超时”。这大多是因为没搞清楚 OpenClaw 的三层解耦架构。
核心架构:不仅仅是 RPC 调用
OpenClaw 异于传统 Agent 框架(如 LangChain)的地方在于:它是一个“云端大脑+本地肢体”的结构。
Orchestrator (大脑): 通常部署在 GPU 集群或云端,负责 LLM 推理和任务拆解。
Gateway (协议桥): 负责鉴权、流量整形以及将 LLM 生成的 JSON 指令翻译成特定环境的指令集。
Pi-embedded (执行端): 运行在你的 Mac/Linux 或树莓派上,真正去跑 Python 脚本、截图或点按鼠标。
- Gateway 层:指令的“净化器”
当你通过 API 或 Web UI 发送一条指令时,最先承接压力的是 src/gateway/server.py。
在源码中,你会看到一个关键的装饰器 @route_to_executor。Gateway 在这里做了一件极其重要的事:上下文压缩(Context Pruning)。
伪代码片段:gateway/dispatcher.py
def dispatch_task(payload):
# 提取意图,过滤掉无用的对话历史
intent = extractor.analyze(payload.content)
# 匹配最合适的 Pi 节点(可能有多个执行端)
node_id = registry.get_active_node(payload.affinity)
return forward_to_node(node_id, intent)
工程避坑点: 很多时候你的指令没响应,是因为 Gateway 层的 registry 没更新。OpenClaw 默认使用 Redis 维护节点心跳,如果你的 Redis 挂了或网络存在大延迟,指令就会在 Gateway 堆积。
- 深入 Pi-embedded:它是如何“接管”电脑的?
这是 OpenClaw 最硬核的部分。进入 packages/pi-embedded/runtime,你会发现它并没有直接调用系统的 subprocess。
为了安全,它实现了一套名为 "Cell Isolation" 的沙箱机制。
核心逻辑:executor.py
Pi-embedded 接收到 Gateway 传来的二进制流后,会触发 ExecutionEngine。它包含两个核心模块:
Environment Snapshot: 在执行前先快照当前环境变量。
Skill Loader: 动态加载 .ocskill 文件。
注意: 很多开发者在写自定义 Skill 时发现找不到第三方库。这是因为 Pi-embedded 默认在独立的 venv 中运行。你需要在项目的 claws.yaml 中明确定义 dependencies,由执行端在启动时自动静默安装。
- 完整调用链追踪(Trace Log)
我们以“帮我查一下 CPU 温度并生成图表”为例,看看数据是怎么流转的:
Orchestrator: 识别出需要 System_Monitor 技能,生成 JSON:{"action": "get_cpu_metrics", "format": "chart"}。
Gateway: 验证该指令的签名,查找在线的 Pi 节点,封装成 Protobuf 协议通过 WebSocket 发送。
Pi-embedded (Receiver): 收到消息,解包。
Sandbox: 启动一个临时 Python 进程,将本地传感器权限挂载进去。
Skill Execution: 执行 get_temp.py。
Callback: 结果(图片二进制流)顺着原路返回。
- 源码中隐藏的“彩蛋”与坑
在阅读 core/utils/telemetry.py 时,你会发现 OpenClaw 默认开启了性能上报。虽然它是开源的,但在企业级部署时,务必将 OC_ANONYMOUS_REPORT 设为 false。
另外,长连接抖动是目前该框架最大的痛点。如果你的 Pi 节点在内网,建议在 Gateway 前置一个 Nginx,并开启 proxy_set_header Upgrade $http_upgrade;,否则你会遇到没完没了的 1006 错误。
总结
OpenClaw 并不是一个简单的包装层,它的 Gateway-Pi 架构解决的是 Agent 在现实物理世界落地的“最后一公里”问题。
如果你想深入研究,我建议先从 packages/pi-embedded 里的 protocol.py 看起,那里定义了万物互联的语言。