OpenClaw Agent引擎内核:Pi‑Mono内核(Pi‑Agent Runtime)
OpenClaw Agent引擎内核:Pi‑Mono内核(Pi‑Agent Runtime)
OpenClaw智能体真正内核叫Pi‑Mono(简称Pi内核),使用TypeScript编写,运行在Node.js环境;整体采用外层Gateway调度器 + 内层Pi‑Mono执行内核双层架构:Gateway做上层编排,Pi‑Mono负责底层Agent循环、模型调用、工具执行、会话生命周期管理,是OpenClaw智能体的心脏。
一、内核整体分层模型
整体分为三层,解耦设计:
- 外层:Gateway调度层(runEmbeddedPiAgent,约1200行代码)
属于Pi的外层运行时控制器,不负责LLM推理,只做管控:会话串行执行、API‑Key动态轮换、错误分级重试、上下文窗口裁剪、Hook拦截、多租户隔离、资源限流、上下文溢出恢复。Gateway通过内部RPC调用Pi‑Mono,不走HTTP,延迟更低。- 动态重试算法:最大重试次数 =
min(160, max(32,24 + 密钥数量×8));配置越多API‑Key,自动分配更多重试机会,实现负载分摊;错误区分限流、鉴权失败、服务器异常、上下文超限,分类处理而不是无脑重试。
- 动态重试算法:最大重试次数 =
- 内层:Pi‑Mono内核(Agent核心执行引擎)
真正的Agent Loop实现,核心入口文件:pi‑embedded‑runner.ts:主循环;pi‑embedded‑subscribe.ts:流式解析;pi‑embedded‑helpers.ts:上下文组装、工具解析、记忆加载。
Pi‑Mono严格遵循ReAct范式(思考‑行动‑观察循环),内核只保留4个原子原语:read、write、edit、bash;上层所有复杂技能全部基于这4个原语扩展,保证内核极简稳定,业务能力交给上层插件化Skill系统实现。
- 外围支撑子系统(由Pi内核驱动)
- 会话系统:
AgentSession,每个对话独立Session实例; - 记忆系统:SQLite + 向量混合存储;短期会话上下文 + 定期总结的长期记忆;读取
SOUL.md、AGENTS.md、USER.md构建系统提示词; - 工具执行节点Node:分为Local‑Node本地执行、Remote‑Node远程Docker隔离执行;高危指令自动放入沙箱运行;
- 模型适配器:统一抽象Model Provider,兼容OpenAI、Anthropic Claude、Gemini、Ollama本地模型。
- 会话系统:
二、Pi‑Mono内核完整Agent Loop执行流程(核心工作流)
每一次用户消息,Pi内核严格执行6步闭环循环:
1. 会话初始化
Gateway收到消息后创建或复用AgentSession;Pi‑Mono读取:SOUL.md(人格、价值观)、AGENTS.md(行为约束)、记忆库、历史对话上下文,拼接完整System‑Prompt。
2. 上下文压缩与窗口治理
Pi‑Mono内置上下文裁剪逻辑:当token快要溢出时自动做摘要压缩、丢弃久远对话,保留最近关键信息,防止超长上下文报错。
3. 流式调用LLM模型
通过流式SSE接收模型返回内容,Pi‑Mono实时解析返回内容,区分三类输出块:
- 普通文本块:实时推送到Telegram、微信等消息渠道;
- 思考块(Reasoning):可选展示推理过程;
- Tool‑Call工具调用指令(JSON格式):Pi‑Mono解析工具名称和参数,交给Node执行器运行shell、文件读写、浏览器、代码运行等任务。
4. 工具执行与结果回填
工具执行完成后,Pi‑Mono把执行结果注入对话上下文,再次把更新后的全部上下文丢回给LLM,开启新一轮思考循环;循环直到模型输出最终回答,不再产生工具调用为止。
> 重点:**循环次数完全由模型决定**,内核不硬编码最大循环轮次上限;复杂任务会自动多轮思考、多次调用工具,这是OpenClaw自主完成复杂任务的关键。
5. 会话持久化
本轮对话结束后,Pi‑Mono将对话存入SQLite;后台异步任务提取重要信息写入长期记忆文件`MEMORY.md`,实现跨会话记忆。
6. 返回结果
把最终回答通过WebSocket推送回Gateway,再分发至对应消息渠道。
三、内核关键技术特性
1. 模型无关抽象层
Pi‑Mono将模型调用做抽象隔离,上层代码完全不需要关心后端是云端模型还是本地Ollama模型;同时统一处理流式解析、工具调用格式适配,适配不同模型的Function‑Call格式差异。
2. 嵌入式RPC通信模式
Gateway和Pi‑Mono使用进程内RPC通信,而非HTTP请求,大幅减少序列化开销;Gateway接管全部状态流,可以拦截、修改Agent思考过程、工具调用指令,方便做权限校验、人工审批、日志审计;Pi内核本身保持纯粹,只专注推理逻辑,业务逻辑剥离给上层Gateway,做到内核极简可维护。
3. 文档驱动内核配置
Pi内核不使用硬编码系统提示词,全部依靠*.md配置文件配置Agent行为:
SOUL.md:人格、边界、价值观;AGENTS.md:工具使用规则、思考模式;HEARTBEAT.md:定时后台任务;
修改文档即可改变Agent行为,不用修改内核源码,降低自定义成本。
4. 安全隔离机制
- 内核区分可信本地节点与隔离远程节点;Shell、系统命令默认放入Docker沙箱执行;
- Pi‑Mono会解析工具指令,高危操作(删除文件、系统级命令)触发Gateway人工确认流程;
- 本地优先:全部会话数据、记忆文件默认保存在本机
~/.openclaw目录,不会上传第三方服务器。
四、和同类Agent内核对比
- Manus:内核是单进程整体代码,调度、循环、工具执行耦合在一起;OpenClaw采用Pi‑Mono微内核,控制平面和执行内核分离,扩展性更强;
- AutoGPT:循环轮次写死上限;Pi‑Mono内核由模型自主决定循环次数;
- 普通ReAct框架:大多是库(Library);Pi‑Mono是独立运行时Runtime,自带会话管理、记忆、多渠道接入、API‑Key负载均衡、自动重试,开箱即用。
五、源码精简版架构(目录层面)
src/
├─ gateway/ # 网关进程,控制平面
└─ agents/pi‑core/
├─ pi‑embedded‑runner.ts # Agent主循环
├─ pi‑embedded‑subscribe.ts # 流式解析器
├─ session‑utils.ts # 会话与上下文处理
├─ memory‑core.ts # 记忆内核
└─ tool‑executor.ts # 工具调用解析
六、一句话总结内核本质
Pi‑Mono内核本质:一个Node.js实现的、文档驱动、支持自动多轮思考、内置工具调用、具备动态容错能力的ReAct智能体运行时;Gateway负责管控,Pi‑Mono负责思考与执行,二者组合构成OpenClaw完整Agent引擎。
如果你需要,我可以给你:
- 简化版伪代码实现Pi‑Agent‑Loop;
- 拆解Pi内核中工具调用的JSON解析逻辑。
核心结论
- Pi‑Mono(OpenClaw内核)和OpenCode同源,但二者是完全独立产物,OpenClaw不会复用OpenCode的Agent运行时代码;OpenCode只是OpenClaw可选的模型代理服务商,并不是它底层引擎。
- 先理清项目归属关系:
- Pi‑Mono:Mario Zechner(libGDX创始人)开发;Pi‑Mono里面包含两套组件:
pi‑agent‑core:通用Agent运行时(OpenClaw采用这部分);pi‑coding‑agent:也就是后来独立拆分出来的 OpenCode(专门面向编程场景的Agent)。
- OpenClaw:Peter Steinberger基于
pi‑agent‑coreSDK嵌入Pi‑Mono基础内核,然后自己独立开发Gateway网关、会话持久化、记忆系统、沙箱执行、Skill插件体系;完全抛弃pi‑coding‑agent(OpenCode)的Agent循环、权限逻辑、会话实现,OpenClaw自己重写上层调度逻辑。 - OpenCode:脱离Pi‑Mono主仓库之后独立发展,基于Bun+TypeScript重构,变成专注代码开发的Agent;它有自己独立的Agent Loop、权限系统、子Agent调度,和OpenClaw的Pi‑Mono运行时互不依赖。
- Pi‑Mono:Mario Zechner(libGDX创始人)开发;Pi‑Mono里面包含两套组件:
一、两层关系拆解
1)代码层面:仅共用早期底层原语定义,运行时完全分开
- 早期Pi‑Mono仓库里,无论是OpenClaw用的
pi‑agent‑core,还是OpenCode前身pi‑coding‑agent,都继承Mario定下的极简理念:只有4个基础原语read/write/edit/bash; - OpenCode拆分独立项目之后:
- OpenCode自己实现一整套Agent Runtime,内置build、plan等专属Agent、权限规则、子Agent调度逻辑;
- OpenClaw只取用
pi‑agent‑core里基础ReAct循环、LLM适配层;会话存储、工具校验、上下文裁剪、多轮循环、记忆层全部由OpenClaw自研,不共用OpenCode代码;OpenClaw甚至不会读取OpenCode的.pi配置文件,两套环境隔离。
2)业务层面:OpenCode只是OpenClaw众多模型代理中的一个Provider
OpenClaw配置里的opencode,只是模型中转服务:
- OpenCode对外提供API网关,统一封装Claude、GPT‑4o、Kimi、GLM;OpenClaw可以选择调用OpenCode托管的模型;
- OpenCode只负责LLM推理;Agent思考循环、工具执行还是由OpenClaw内部Pi‑Mono内核完成;OpenCode不会介入OpenClaw智能体执行流程。
简单类比: - Pi‑Mono内核 = 发动机基础组件库;
- OpenClaw = Peter基于基础组件造了一台全能办公自动化整车;
- OpenCode = Mario拿同一套组件库单独造了一台专门写代码的专用汽车;
两台车发动机零件源头相同,但整车控制逻辑完全独立;OpenCode还顺便对外提供加油站服务(模型API)给OpenClaw使用。
二、关键区分要点
- 内核归属
- OpenClaw Agent引擎:Pi‑Mono(pi‑agent‑core)+ OpenClaw自研Gateway;
- OpenCode Agent引擎:独立自研Runtime,和Pi‑Mono后期版本代码分叉。
- 开发者区分
- Pi‑Mono与OpenCode:Mario Zechner;
- OpenClaw:Peter Steinberger;两个人是奥地利开发者好友,但后期各自独立迭代项目。
- 使用边界
- OpenClaw可以不用OpenCode,直接对接OpenAI、Anthropic原生API;
- OpenCode完全不能给OpenClaw提供Agent内核;二者Agent运行时互不调用。
三、一句话精简总结
OpenClaw的Pi‑Mono内核和OpenCode源自同一个早期Pi仓库,但代码早已分叉:OpenClaw只取用Pi‑Mono底层基础SDK,完全不用OpenCode的Agent内核;OpenCode对OpenClaw而言仅仅是可选的模型API服务商。
如果你愿意,我可以画出三者依赖层级图:Pi‑Mono‑core → OpenClaw;Pi‑coding‑agent → OpenCode。
核心证据分4类:GitHub仓库目录结构、NPM包划分、官方文档、代码依赖、作者本人表述;同时区分:早期同一个monorepo单仓(badlogic/pi‑mono),后期代码分叉拆分。
证据1:原始仓库 badlogic/pi‑mono 的目录结构(最硬核源码证据)
GitHub仓库:github.com/badlogic/pi‑mono,Mario Zechner(badlogic)维护的Monorepo(单仓),packages目录原生就分为两大模块:
packages/agent:发布为@mariozechner/pi‑agent‑core(Pi‑Mono内核,OpenClaw所依赖的Agent运行时,包含Re‑Act循环、AgentSession、4个基础原语read/write/edit/bash、上下文处理、工具调用解析)。packages/coding‑agent:发布为@mariozechner/pi‑coding‑agent,这就是后来独立改名后的 OpenCode,面向编程场景的CLI程序、编程专属子Agent、TUI终端界面、编程扩展插件系统。
原始仓库结构直接证明:二者最开始放在同一个Pi仓库内,共用一套底层基础代码、原语定义、pi‑ai模型适配层,只是分成两个子包:
- pi‑agent‑core:通用Agent内核(OpenClaw选用);
- pi‑coding‑agent:代码专用Agent(后续独立成OpenCode)。
后续事件:Mario把
pi‑coding‑agent拆分成独立项目OpenCode;而pi‑agent‑core继续留在pi‑mono仓库;二者之后各自独立迭代,代码分叉。OpenCode后期甚至迁移至Bun重构,脱离pi‑mono主仓库代码树。
证据2:OpenClaw仓库里的依赖与源码引用(OpenClaw侧代码证据)
- OpenClaw仓库
github.com/steipete/openclaw:- package.json里直接依赖
@mariozechner/pi‑agent‑core,只引入agent内核包,没有引入pi‑coding‑agent; - 源码目录
src/agents/pi‑embedded‑runner.ts,直接导入pi‑agent‑core内部的createAgentSession、工具解析逻辑;Peter(OpenClaw作者)只是嵌入式调用pi‑agent‑core的运行时,自己开发Gateway、记忆系统、沙箱、多渠道适配层,完全不使用pi‑coding‑agent的代码。
- package.json里直接依赖
- OpenClaw的README原文致谢:
Special thanks to Mario Zechner and pi‑mono.
明确承认OpenClaw底层运行时来自pi‑mono仓库;OpenClaw全程没有依赖pi‑coding‑agent(OpenCode),只是共用同一个早期仓库的上游底座。
证据3:NPM包发布事实
Mario在同一个pi‑mono仓库编译输出2个NPM包:
@mariozechner/pi‑agent‑core:通用Agent内核,供给OpenClaw;@mariozechner/pi‑coding‑agent:就是OpenCode前身;
两个包共用仓库里packages/ai(pi‑ai模型适配层),模型调用、流式解析逻辑早期代码完全同源,后期OpenCode独立之后才重写Runtime。
证据4:作者本人和第三方权威技术文档佐证
- Mario Zechner本人在博客、AI Engineer London演讲里说明:pi‑mono仓库分为内核SDK(agent‑core)和编码Agent(coding‑agent);OpenClaw使用SDK,pi‑coding‑agent后续独立为OpenCode。
- 技术文档:xiaow.dev、needhelp.icu的调研文档写明:
Pi‑coding‑agent就是OpenCode前身,和pi‑agent‑core起源于同一个pi‑mono monorepo;OpenClaw仅使用pi‑agent‑core,后期OpenCode脱离pi‑mono独立演进,二者运行时代码分叉。
- 社区共识:Armin Ronacher(Flask作者)的文章提到,pi‑mono的agent‑core是OpenClaw内核,coding‑agent演化成OpenCode。
理清边界(纠正容易混淆的点)
- 同源 ≠ 后期共用代码
- 2025‑10–2025‑12:同一个pi‑mono仓库,代码同源;
- 2026‑01之后:pi‑coding‑agent独立拆分出来更名为OpenCode;OpenCode重写Agent Runtime,不再复用pi‑mono后续版本代码;OpenClaw继续依赖pi‑agent‑core;二者后期代码完全独立。
- OpenClaw从来没有把OpenCode当作内核;OpenCode对于OpenClaw仅可作为可选的模型API服务商,和Agent内核无关。
极简总结证据链
同一个GitHub仓库 badlogic/pi‑mono → 分出两个子包:pi‑agent‑core(OpenClaw Pi‑Mono内核)、pi‑coding‑agent(OpenCode前身),这就是二者源自同一个早期Pi仓库的直接证据;后期项目拆分分叉,各自独立演进。
如果你需要,我可以给你:
- pi‑mono早期commit历史链接,查看二者还未拆分时代码;
- OpenClaw package.json里依赖pi‑agent‑core的原文片段。
更多推荐

所有评论(0)