Rust 版 Pi 工作基本完成了,记录下

💡 原文中文,约2000字,阅读约需5分钟。
📝

内容提要

作者用 Rust 重写 Pi Agent,动机是学习 Rust、理解 Agent 内部机制、打造可复用库并减少运行开销。项目包含 CLI、TUI 和 SDK,支持多模型、流式响应、工具调用、会话保存与恢复,拆分为九个 crate。后续计划改进插件、补充模型适配、测试长任务性能,并探索执行隔离与编辑器集成。

🔎

延伸解读

从重写中理解 Agent 的隐藏复杂度

作者用 Rust 重写 Pi Agent,核心动机之一是弄清 Agent 内部机制。文章指出,平时使用 AI 编码工具只看到输入需求、等待改代码,但自己实现时,必须处理工具调用后的执行、错误结果回传、流式消息取消、程序中断后历史恢复等细节。这些在简单聊天 API 调用中未必遇到,却是完整 Agent 绕不过去的问题。这提醒读者,Agent 的难点往往不在核心循环,而在周围的错误处理、取消和会话保存。

模块化设计让 Agent 能力可嵌入

项目采用 Cargo workspace,将模型适配、Agent 循环、工具执行和会话管理拆分为九个 crate,如 rpi-ai、rpi-agent、rpi-tools、rpi-harness 和 rpi-cli。这种分层让 rpi 不仅能作为终端工具运行,还能作为库嵌入其他 Rust 程序。最小 Agent 不需要终端界面或持久化,需要文件工具就加工具层,需要会话保存和上下文压缩再接 Harness。这种设计提高了复用性,也降低了不同应用场景的集成成本。

原生程序的开销收益与实现代价

作者想验证 Rust 原生程序能省下多少开销,认为终端工具交付可执行文件,安装时少管理 Node 和 npm 依赖,值得尝试。文章提到启动和内存收益已有测试结果,但代价也很明显:Rust 的异步接口、共享状态和动态插件都需要仔细处理。把原版代码逐行翻译过来,很多地方并不好用,接口也得重新整理。这说明重写并非简单移植,而是需要根据语言特性重新设计。

当前状态与后续打磨方向

项目已有 CLI、TUI 和 SDK,工作区版本 0.3.14,支持 Anthropic 和 OpenAI 兼容接口、流式响应、工具调用、取消、JSONL 会话保存与恢复。后续计划包括让插件更易写和安装、补充 Gemini 和 Bedrock 等模型适配、测试长会话内存增长和工具循环吞吐等性能,以及探索执行隔离、编辑器集成和多 Agent 编排。作者也指出目前还有不少需要打磨的地方,发布状态以仓库 Releases 和 crates.io 为准。

❓

Q&A

为什么作者要用 Rust 重写 Pi Agent?

作者用 Rust 重写 Pi Agent 的动机包括:学习 Rust、理解 Agent 内部机制、打造可复用库以及减少运行开销。

Rust 版 Pi 项目目前包含哪些组件?

项目包含 CLI、TUI 和 SDK,支持多模型、流式响应、工具调用、会话保存与恢复,并拆分为九个 crate。

Rust 版 Pi 的 Agent 核心循环是怎样的?

核心循环是:请求模型,发现工具调用,执行工具,回传结果,再请求模型。周围的错误处理、取消、会话保存是需要花心思的地方。

Rust 版 Pi 的 crate 是如何划分的?

项目使用 Cargo workspace,将模型适配、Agent 循环、工具执行和会话管理拆分为多个 crate,主要包括 rpi-ai、rpi-agent、rpi-tools、rpi-harness、rpi-cli 等。

Rust 版 Pi 后续有哪些扩展计划?

后续计划包括:让扩展更容易写和安装、继续补模型适配(如 Gemini、Bedrock)、把性能测试往长任务上补,以及探索执行隔离、编辑器集成和多 Agent 编排。

如何运行 Rust 版 Pi 的示例代码?

可以运行两个例子:cargo run -p minimal 和 cargo run -p tools-example。它们使用模拟 Provider,不需要模型密钥。第二个例子会驱动真实工具,在临时目录写文件并验证内容。

🏷️

标签

➡️

继续阅读