Pi 对比 OpenCode - 您应该使用哪款 AI 编程助手?
KKTG Analysis
Computing/SoftwareSmall Business/StartupsInternet Technology
Transcript
00:00:00目前有两个严肃的开源 AI 编程智能体正在争夺终端市场
00:00:04选错一个可能意味着以后要重构你的整个工作流程。
00:00:10其中一个开箱即用,提供了你想要的一切,而另一个
00:00:14几乎什么都不带,并辩称这正是其核心所在。今天,我们
00:00:19让 Open Code 和 Pi 正面交锋。
00:00:21通过这段视频,你将准确知道哪一个才真正属于你的终端。
00:00:27让我们先从这些工具究竟是什么开始。
00:00:30因为它们以截然不同的方式解决同一个核心问题,
00:00:34Open Code 和 Pi 都是基于终端的 AI 编程智能体,你在
00:00:40终端运行它们,它们连接到 Claude 或 GPT 等大语言模型,
00:00:45它们可以阅读代码、编辑文件、运行 shell 命令,并能针对
00:00:50你的代码库进行深入对话,可以把它们看作 Claude Code 的开源替代品。
00:00:55两者都用 TypeScript 编写,采用 MIT 许可,且都支持超过 20 个
00:01:01LLM 供应商,但相似之处也就到此为止了。Open Code 是由
00:01:06Terminal.shop 的创建者和 NeoVim 爱好者社区开发的。
00:01:11它采取了我所谓的“功能齐全”的策略,开箱即用。
00:01:15你会得到一个多智能体系统,拥有针对不同任务的专业智能体,
00:01:20内置带有审批对话框的权限系统、语言服务器协议(LSP)
00:01:24集成以提供代码智能、完整的模型上下文协议(MCP)支持
00:01:29用于连接外部工具、一个用于会话持久化的 SQLite 数据库,
00:01:34甚至除了终端界面外还有一个基于 Tauri 的桌面应用。Open Code 的
00:01:40哲学是:编程智能体应该通过合理的默认设置和深度集成
00:01:45实现立即可用。由 Mario Zechner 创建的 Pi 则采取了相反的
00:01:51方式。其哲学在 README 中写得很清楚:Pi 是
00:01:56极具扩展性的,因此它不必强加给用户某种工作流程。Pi
00:02:00刻意不提供子智能体、不提供 MCP 支持、不提供权限
00:02:05系统、没有计划模式,也没有内置的待办跟踪。相反,它
00:02:11提供了一个强大的扩展 API 并表示:根据你的需求构建工具,
00:02:17或者安装社区包来按你的方式实现。核心保持极简,
00:02:22其他一切都是可选的。所以这两个项目代表了在开发工具
00:02:27设计理念上的真正分歧。让我们深入了解各自的
00:02:32技术细节,然后直接进行对比。首先从
00:02:36Open Code 的架构开始。Open Code 是一个拥有约 21 个包的 monorepo。
00:02:42核心引擎位于单个包中,但有独立的包分别用于
00:02:46Web 控制台、桌面应用、TypeScript SDK、插件系统、共享
00:02:52UI 组件和文档。在底层,它运行在 Bun 上,Bun 的
00:02:57启动和执行速度明显快于 Node。至于其 LLM
00:03:02抽象层,Open Code 使用了功能丰富的 AI SDK 第五版。
00:03:08这是一个维护良好、应用广泛的库,为数十个供应商提供了
00:03:13统一的接口。实际的好处是,随着 Vercel SDK 增加
00:03:18新的集成,Open Code 几乎免费获得了这些供应商支持。
00:03:24Open Code 最突出的特点之一是其多智能体系统。它附带了
00:03:30几个专门的智能体。“构建智能体”是默认设置,一个拥有完全权限的
00:03:35开发智能体,可以读取、写入和执行任何操作。“计划智能体”是只读的,
00:03:40专为探索和分析代码而设计,不作任何更改。它只能
00:03:45写入特定的计划目录。“探索者智能体”是一个快速、轻量级的
00:03:50代码库导航专家,仅限于搜索和读取操作。
00:03:55还有一个“通用智能体”负责复杂的、作为子智能体执行的多步任务。
00:04:00用户可以通过 Tab 键在这些智能体之间切换,每个智能体都有其
00:04:05自己的权限规则集。你也可以在配置文件中
00:04:09定义自定义智能体,指定它们使用的模型、拥有的权限
00:04:14以及它们的系统提示词。至于数据持久化,Open Code 使用了
00:04:19结合 Drizzle ORM 的 SQLite。会话、消息、权限和 MCP
00:04:25凭据都存储在单个数据库文件中。这是一个很有意义的
00:04:30架构选择。SQLite 提供了事务完整性、跨会话的高效
00:04:35查询,以及一个易于备份的单一文件。Open Code
00:04:41以 WAL 模式运行它,以获得更好的并发读取性能。Open Code 的权限
00:04:46系统是分层且细粒度的。每一次工具调用都要经过权限
00:04:52检查。你可以针对每个工具和每个文件模式设置规则。例如,你可能
00:04:57允许读取所有文件,但编辑 .env 文件需要审批,并且完全
00:05:03禁止涉及生产目录的 shell 命令。权限会通过
00:05:08多个配置层级进行级联,从全局用户配置一直到项目特定的
00:05:13覆盖。当智能体需要审批时,它会直接在终端显示
00:05:18一个交互式对话框,你可以选择允许一次或始终允许该操作。其 MCP
00:05:24集成功能完备。Open Code 可以连接到本地和远程 MCP
00:05:30服务器。它支持 stdio 和 HTTP 传输,处理远程服务器的
00:05:37OAuth 身份验证,并能自动注册来自已连接 MCP
00:05:42服务器的工具。如果你已经在其他工具中使用了 MCP 服务器,Open Code
00:05:47可以立即与它们配合使用。另一个显著特点是内置 LSP 支持。
00:05:53Open Code 可以为 TypeScript、Python、Go、Rust 和其他语言启动
00:05:58语言服务器协议服务器。这使得 AI 模型能够访问真实的代码
00:06:04智能,如悬停信息、跳转到定义和符号引用,而不是仅仅
00:06:10依靠文本模式匹配。这在代码理解准确性方面是一个细微但有意义的
00:06:15优势。Open Code 还有一个技能系统,它与
00:06:20Claude Code 的技能格式兼容。技能是带有 front matter 的
00:06:25Markdown 文件,用于定义专门的行为,此外还有一个基于
00:06:30NPM 包的插件系统,几乎可以挂钩到生命周期的每一个环节,从
00:06:35加载配置、消息转换到工具执行。现在
00:06:40让我们看看 Pi 的架构。Pi 也是一个 monorepo,但架构
00:06:45不同。关键的包包括编程智能体本身、作为 LLM
00:06:51抽象层的 Pi-I、用于有状态智能体运行时的 Pi Agent Core,以及用于
00:06:57终端渲染的 Pi-2E。还有 PiMom(一个 Slack 机器人)和用于
00:07:02GPU 部署的 PiPods。Pi 最重大的技术决策是它从零开始
00:07:08构建了自己的 LLM 抽象层,而不是使用 Vercel
00:07:12AI SDK。Pi-I 是一个统一的多供应商 LLM API,支持
00:07:2030 多个供应商,包括 Vercel AI SDK 尚未涵盖的一些
00:07:24供应商,如 Minimax 和 Kimi。构建自己的层让 Pi 团队能完全控制
00:07:30流式传输行为、工具调用解析和供应商特定的优化。这
00:07:35带来的代价是维护负担,但也意味着 Pi 可以按照他们想要的方式
00:07:40实现在工具参数流式传输过程中的部分 JSON 解析等功能。
00:07:44Pi 的会话管理使用 JSONL 格式,这是一种每一行都是一个
00:07:50JSON 对象的纯文本文件。每个条目都有一个 ID 和父 ID,从而在
00:07:56单个文件中实现了树状结构。这种做法很聪明。这意味着你可以
00:08:00分支对话、导航完整的历史树,并在分支间跳转,而这一切都在一个
00:08:06易于使用标准 Unix 工具检查的文件中完成。`tree` 命令让
00:08:12你可以可视化整个对话历史并导航到任何一点。`fork`
00:08:17命令可以从任何消息创建新分支。这确实是我在编程智能体中
00:08:23见过的最好的对话管理界面之一。Pi 的
00:08:28扩展系统是其理念真正发扬光大的地方。扩展是
00:08:33由 JITI 直接加载的 TypeScript 文件,因此没有编译步骤。一个
00:08:38扩展可以注册自定义工具、命令和键盘快捷键。它可以
00:08:44订阅生命周期事件,如会话开始、智能体启动、工具调用和
00:08:49模型选择。它可以通过确认对话框、选择菜单和文本
00:08:55输入提示与用户交互。它甚至可以渲染自定义的 TUI 组件。其
00:09:01扩展 API 让你可以访问会话管理器、模型注册表、认证
00:09:06存储和事件总线。换句话说,扩展程序几乎可以做
00:09:11核心程序能做的一切。这时,Pi 在功能上那些刻意的取舍就开始
00:09:16显得合理了。没有内置权限系统?写一个扩展,在执行危险
00:09:20命令前显示确认对话框。没有子智能体?通过 tmux 启动 Pi 实例,或
00:09:27写一个扩展来协调多个智能体循环。没有 MCP?通过 CLI
00:09:33利用 CLI 工具和 README 构建一项技能,或编写一个扩展程序来添加 MCP 支持。
00:09:40没有计划模式?将计划写入 Markdown 文件,或者构建一个按你
00:09:45喜欢的方式管理计划的扩展。Pi 的终端渲染也是定制的。pi2e
00:09:51包实现了差异化渲染,并采用三种策略来最小化屏幕
00:09:56更新,使用 CSI 2026 协议进行原子更新以消除闪烁。
00:10:02它拥有自己的组件系统,包括容器、编辑器、文本渲染、
00:10:07Markdown 显示、图像支持和选择列表。编程智能体的 TUI 完全基于此框架构建。
00:10:13在工具处理方面,Pi 附带了七个内置工具——
00:10:18READ、bash、edit、write、grep、find 和 ls。这是一套刻意保持精简的工具集。
00:10:25bash 工具支持可选的 Docker 沙盒和实时流式输出。
00:10:30edit 工具使用统一的 diff 格式。所有工具在执行前都会
00:10:36使用 AJV 验证其参数,并且默认支持并行执行,
00:10:42这意味着来自 LLM 的多个工具调用会并发运行,而不是一个接一个。
00:10:48现在让我们在最重要的维度上直接对比这两个工具。
00:10:53供应商支持。两者都支持超过 20 个供应商,并兼容任何
00:10:59OpenAI 兼容的 API。Open Code 使用 Vercel AI SDK,这意味着
00:11:06随着生态系统的增长,它能继承新的供应商支持。Pi 构建了自有的 Pi-I 库,
00:11:12这赋予了它更多控制权,但需要手动集成新供应商。在实践中,
00:11:18两者都涵盖了你可能用到的所有主要供应商。在智能体模型方面,
00:11:22Open Code 附带了多个专业智能体,并允许你通过
00:11:27单次按键在它们之间切换。Pi 只提供一个智能体,并表示如果你想要子智能体,
00:11:33就用扩展构建它们或启动单独的实例。如果你想要
00:11:37开箱即用的专业模式,Open Code 在这里胜出。如果你更愿意构建
00:11:42自己的智能体拓扑结构,Pi 提供了相应的工具。Open Code 使用 SQLite。
00:11:47Pi 使用 JSONL 文件。SQLite 提供了事务完整性和高效的
00:11:53查询。JSONL 提供了可以用 cat 或 grep 检查的人类可读文件,
00:11:58且 Pi 在单个文件内的树状结构非常优雅。两者都支持会话
00:12:04分支和分叉,Pi 的树状导航界面在
00:12:08探索对话历史方面设计得特别出色。Open Code 拥有一个全面的
00:12:13内置系统,包含审批对话框、基于文件的规则以及持久的权限
00:12:19记忆。Pi 核心没有权限系统,并期望通过扩展来处理。
00:12:25如果你想要立竿见影的防护栏,Open Code 是更安全的选择。如果你
00:12:30在容器中运行,或想完全控制你的安全模型,Pi 的方式则能给你
00:12:35更多的灵活性。关于 MCP 支持。Open Code 提供完整的 MCP 支持,包含 OAuth、
00:12:41多种传输方式和自动工具注册。Pi 核心明确拒绝了 MCP,
00:12:48转而支持技能,即通过 README 说明文档化的 CLI 工具。
00:12:54Mario Zeckner 写了一篇博文,辩称 MCP 增加了复杂性,而一个
00:13:00简单的带有 README 的 CLI 工具就能达成同样的目标。如果你现有的工作流
00:13:04已经依赖于 MCP 服务器,Open Code 是明确的选择。如果你更喜欢
00:13:10追求小型、可组合工具的 Unix 哲学,Pi 的方式可能会更引起你的共鸣。
00:13:16代码智能方面。Open Code 内置了 LSP 集成,使得 AI 模型
00:13:22能够访问类型信息、定义和引用。Pi 的核心并不包含 LSP。
00:13:28这使得 Open Code 在处理强类型语言时具有显著优势,
00:13:32因为类型上下文提高了 AI 的理解力。在终端界面上,
00:13:37两者都有复杂的自定义 TUI 实现,但构建方式不同。
00:13:42Open Code 使用 Solid.js 和 OpenID 框架。Pi 则使用
00:13:48它自己的带有差异化渲染的 Pi2E 框架。两者外观都很出色,
00:13:53响应也很迅速。Open Code 此外还提供了一个基于 Tauri 的桌面
00:13:58应用和 Web 控制台。Pi 仅限终端,尽管它提供了一个 Web 组件库
00:14:03供开发者嵌入到他们自己的应用中。两者都使用基于 JSON 的
00:14:07配置,包含项目和全局层级。Open Code 使用 JSONC,
00:14:14即带注释的 JSON,这在体验上很贴心。Pi 则使用标准的
00:14:19JSON。两者都支持对模型、工具和行为的广泛定制。Open Code 的
00:14:26配置更复杂,因为可配置项更多。Pi 的则更简单,
00:14:31因为内置的功能表面积较小。那么你应该选择哪一个呢?
00:14:35以下是你需要问自己的问题。你是想要一个开箱即用、功能齐全的
00:14:39工具?还是更倾向于组建自己的工作流?如果你想
00:14:45安装一个编程智能体,并在五分钟内让一切就绪,拥有
00:14:49权限、多智能体、MCP、LSP 等各种打磨好的体验,Open Code 为此而生。
00:14:56如果你想要一个可以根据需求完全自定义的极简核心,并且你
00:15:01不介意编写 TypeScript 扩展,那么 Pi 就是为你打造的。
00:15:06MCP 对你的工作流有多重要?如果你已经在使用 MCP 服务器
00:15:11或计划使用,Open Code 原生支持它们。Pi 则刻意不支持,
00:15:16更倾向于简单的基于 CLI 的集成。你主要使用强类型
00:15:22语言工作吗?Open Code 内置的 LSP 支持为 AI 模型提供了更丰富的
00:15:28代码理解,这对于 TypeScript、Go、Rust 等语言至关重要。
00:15:34如果你主要在 Python 或动态类型语言中工作,这一优势
00:15:39会小一些。你想要桌面应用或 Web 界面吗?Open Code
00:15:44在终端之外还提供这两者。Pi 仅限终端,并以此为傲。你对
00:15:51信任和沙盒化怎么看?如果你想让智能体在进行任何
00:15:55危险操作前询问你,Open Code 的权限系统开箱即用。如果你
00:16:00宁愿在 Docker 容器中运行整个智能体,让它在沙盒内
00:16:04为所欲为,Pi 的“无权限”策略则能很好地与基于容器的工作流配合。
00:16:10你是一个想定制一切的高级用户吗?Pi 的扩展系统非常强大。
00:16:15你可以修改智能体行为的几乎每一个方面,从工具执行、会话管理
00:16:20到 TUI 本身。Open Code 也有插件系统,但它更多地专注于
00:16:25特定的钩子(hooks),而不是完全的行为覆盖。实话实说,
00:16:30结论如下。就今天来看,Open Code 是更成熟、功能更完备的产品。
00:16:34它提供了更多开箱即用的功能,与更多外部系统集成,
00:16:40且上手门槛更低。对于大多数想要开源 AI 编程智能体的开发者,
00:16:44Open Code 是更稳妥的选择。Pi 则在设计上更有趣。它的
00:16:49极致极简主义和扩展优先的理念使其具有独特的适应性。如果你是那种
00:16:55在写代码之前会花几周时间定制 NeoVim 配置的开发者,如果你想要一个
00:17:01完全按照你的设想工作的智能体,那么 Pi 会回报你的投入,其会话树导航
00:17:05功能确实是同类最佳的。这两个项目都采用 MIT 许可,且都在积极维护,
00:17:09并且都支持同样广泛的 LLM 供应商。你可以在一个下午的时间里把两个都试一下。
00:17:14代码都在 GitHub 上,而且两者都不需要订阅即可开始使用。
00:17:20安装它们,在同一个代码库上运行它们,看看哪一个更符合
00:17:27你的工作方式。这才是唯一真正重要的对比。
00:17:31安装它们,在同一个代码库上运行它们,看看哪一个更符合
00:17:37你的工作方式。这才是唯一真正重要的对比。
Community Posts
No posts yet. Be the first to write about this video!
Write about this video