我们正处于一个很好的时代,AI工程层面的流行框架总有人会迅速用go或rust重写一遍,更小巧,更节省资源,也更优雅。
开源社区值得关注的AI Agent底层基础组件少不了要介绍一下pi-mono。OpenClaw等各种龙虾内核基本都是pi-mono。包括我上周做的那个海豚多智能体协作软件www.ai-dolphin.com也用到了相似的思路,让AI重新用Go实现的。
现在Pi-mono有了Rust版本。
作者是Jeffrey Emanuel
以下是他的介绍:
我终于完成了Rust版本的Mario Zechner优秀的Pi Agent——经他同意后我将其命名为pi_agent_rust。
如果你不熟悉Pi,它是一个极简且可扩展的智能体框架(类似于Claude Code和Codex),除其他用途外,它还是OpenClaw项目内部的核心智能体框架。
我之所以说Rust“版本”而非“移植”,是因为它的实现方式与原版差异很大,已不能简单称为移植。可以说,为实现增量功能所编写的代码复杂度超过了项目其他部分的总和。
尽管如此,它提供了与原版相同的特性和功能,并已证明与数百个流行的Pi扩展兼容(一致性测试显示224个扩展全部完美运行)。
但其架构方式有一些重大变化。
原版Pi Agent依赖Node或Bun来访问文件系统并执行其他各种任务,这也是Pi扩展系统的工作方式。我早期就决定不采用这种方式。
相反,我希望将这些功能直接集成到二进制文件中;也就是说,为所有原版中通常由Node/Bun提供的功能提供等效实现。
我这样做有几个原因:第一,在资源占用和延迟方面性能更高。在实际端到端的大会话工作负载(非玩具微基准测试)中,pi_agent_rust目前表现如下:
• 在100万token规模的会话中,比传统Node快4.95倍,比传统Bun快2.80倍
• 在500万token规模的会话中,比传统Node快4.32倍,比传统Bun快2.14倍
• 在相同场景下,RSS内存占用降低约8到13倍
但另一个原因是安全性和可控性:通过以端到端的方式在内部处理所有事务,我们可以采用各种巧妙的方法来加固系统,抵御不安全或恶意的扩展。
那些扩展不再能直接访问宿主文件系统:它们现在需要通过pi_agent_rust进行交互,我们可以在运行扩展前仔细分析它们,并在运行时阻止可疑行为。
实际上,这意味着需要显式的能力门控主机调用,并实施策略/风险/配额控制,以及运行时遥测/审计能力。
为了实现这一切,我不得不在Rust中从头开始构建缺失的运行时基础层,而不仅仅是翻译TypeScript语法:
• 定义并实现类型化的主机调用ABI,用于扩展与主机的交互
• 为工具/执行/HTTP/会话/UI/事件等构建原生Rust连接器,而非依赖Node/Bun的环境访问
• 实现兼容性/垫片层,确保实际使用的Pi扩展仍能正确运行
• 添加能力策略评估、运行时风险评分、每个扩展的配额限制,以及在执行路径上的审计遥测
• 通过结构化并发(asupersync)连接整个系统,确保取消/生命周期可确定且故障处理显式化
• 构建足够庞大的一致性测试和基准测试框架,以验证数百个扩展和真实长会话工作负载下的行为和性能
这是对执行模型的全面重新架构,同时保留了Pi的工作流程和扩展生态系统。确实,这方面的代码规模和复杂性远超项目的其他部分。
用具体数字说明:仅扩展/运行时/安全子系统现在就有约86.5k行Rust代码,分布在src/extensions.rs(约48.1k)、src/extensions_js.rs(约23.4k)、src/extension_dispatcher.rs(约13.4k)和src/extension_index.rs(约1.7k)中,仅这些文件就有大约2500个可调用单元。
作为对比,原版Pi coding-agent的生产代码总计约27.4k行。因此,这个子系统本身的规模大约是原版框架的3.2倍,这也是为什么称其为“移植”会严重低估实际构建的工作量。
除此之外,pi_agent_rust引入了一系列真正超越旧版框架的新功能,而不仅仅是更快的核心:
• 运行时的安全性和控制力显著增强:具有显式策略配置(安全/平衡/宽松)的能力门控主机调用、每个扩展的信任生命周期(待定→已确认→受信→终止)、显式终止开关操作,以及经过审计的状态转换。
• Shell执行中介是确定性的且能感知参数:基于规则/特性的风险评分加上生成前的heredoc AST检查(dcg_rule_hit, dcg_heredoc_hit),而非依赖粗略的拒绝模式。
• 隔离和取证是一等公民:防篡改的运行时风险分类账工具(验证/重放/校准)、统一的事件证据包,以及强制兼容控制,让你能在不整个禁用扩展系统的情况下隔离问题。
• 扩展运行时架构是原生的:JS扩展在嵌入式QuickJS中运行,具有类型化的主机调用边界,以及用于工具/执行/HTTP/会话/UI/事件的原生Rust连接器,外加对现实世界遗留扩展的兼容垫片。
• 负载下的运行时行为经过明确设计:确定性的主机调用反应器网络、快速通道与兼容通道路由,以及用于在争用下获得更可预测吞吐量和延迟的预热隔离池移交。
• 长会话可靠性得到提升:JSONL v3会话带索引侧车加速和可选的SQLite后端会话,以及通过--session-durability、--no-migrations和migrate进行的操作控制。
• 模型提供商和身份验证覆盖更广且操作上更明确:原生支持Anthropic/OpenAI(Chat + Responses)/Gemini/Cohere/Azure/Bedrock/Vertex/Copilot/GitLab,以及大型OpenAI兼容路由;pi --list-providers目前显示90个提供商及其别名和所需的环境变量密钥。
• 身份验证不仅仅是API密钥:支持OAuth(Anthropic/OpenAI Codex/Gemini CLI/Antigravity/Kimi/Copilot/GitLab以及扩展定义的OAuth)、AWS凭证链(Bedrock)、服务密钥交换(SAP AI Core)和Bearer令牌流程。
• 运维工具更强大:pi doctor支持范围检查(配置、目录、身份验证、shell、会话、扩展)、机器可读输出(--format json|markdown)和安全自动修复(--fix)。
• 扩展/包生命周期工作流程内置:安装、移除、更新、更新索引、搜索、信息、列表。
我想感谢Mario创建了如此出色的框架,并且在我询问是否可以将它移植到Rust时没有拒绝我。我可能会开玩笑地“吐槽”他没有完全使用Rust,但这并不意味着我不对他的工作抱有极大的敬意。
PS:可能仍然存在bug。如果你发现了,请在GitHub Issues中告诉我,我会当天修复。完美和及时发布之间总需要权衡,我觉得现在是发布这个项目的时候了。
#过个有ai年# http://t.cn/AXtk1r0x