微信扫码
添加专属顾问
对比Pi、OpenCode、DSH架构,揭秘Harness如何分层放置复杂度,看懂AI Agent工作逻辑。 核心内容: 1. Pi、OpenCode、DSH的复杂度落点差异 2. Pi的内环设计与扩展机制 3. Harness在任务执行中的关键作用
最近一轮 Agent Harness 测试里,同一个 DeepSeek V4 Flash,接入同一套 MCP 工具,跑 30 个跨应用任务,结果并不一样:Pi 完成 20 个,OpenCode 完成 14 个;按成功任务计算,Pi 的单任务成本约 0.028 美元,Claude Code 是 0.195 美元。DSH 没有参加这轮测试,下面不把它和这组数字并列。
任务也不是单步写代码。比如从 Gmail 找出符合条件的工单,原样写进 Google 表格,补充账号信息,再把统计发到 Slack;中间有一批诱饵工单不能碰,已经排除的记录也不能改写。模型要在几个系统之间取数、核对、写入,还得记住哪些动作已经发生。
数字看起来像排名,背后其实是另一件事:工具说明、提示词、超时、缓存、重试和状态恢复,只要有一处不同,同一个模型就会走出不同的路径。真正托住这条路径的,是模型外面的 Harness。
这也是我比较 Pi、OpenCode 和 DSH 时最关心的地方:它们并不是同一产品的简化版、标准版和平台版,而是把复杂度交给了不同的层。
把 Agent 想成一个会持续工作的研发同事,模型只负责在当前上下文里决定下一步。它并不知道某个文件句柄由谁创建,也不知道 Slack 消息是否已经成功送达。上下文怎么来、工具怎么执行、失败后如何恢复,都由 Harness 接住。
放在一起看,我会把它们的分工理解成三种放置方式:
复杂度往下移,不等于系统就更好。它带来更多约束,也带来更多需要学习和排查的边界。
Pi 默认给模型的工具只有 read、bash、edit 和 write。MCP、子 Agent、计划模式、审批界面等,并不是一开始就塞进核心,而是交给 TypeScript Extension 去接入。
Extension 的能力很深:可以注册工具、命令、Provider 和界面,修改提示词,监听会话事件,也能保存自己的状态。一个代码审查扩展可以启动语言服务器,另一个扩展可以监听文件变化;从调用点到实际执行,中间没有很长的框架链路。
换句话说,Pi 把内环做短,把工作流差异留给 Extension。四个默认工具覆盖读、改、跑、验证,更多能力则由扩展按项目需要长出来。
Mario Zechner 转发过一个 Pi 调 DeepSeek V4 Flash 的案例:近 10 亿输入 Token,缓存命中率 99.93%,总成本 2.65 美元。这个数字不能拿来替所有任务估算费用,但它说明了一件工程上的小事:请求前缀保持稳定,缓存命中时,成本差异可能比换一个模型还明显。
短内环的代价也很具体。扩展启动的语言服务器、文件观察器、PTY、临时目录和网络连接,都是扩展作者创建的资源,核心不会替它们推断所有权。
/reload 的实现能说明这个边界。Pi 会向旧 Extension runtime 发出 session_shutdown,重新加载设置、Provider、Extension、Skill 和提示词,构建新的 runtime,再发出 session_start(reason: "reload")。旧命令的调用栈不会因为 reload 自动消失;await ctx.reload() 之后继续使用旧的 ctx,就可能碰到已经失效的运行时。官方文档因此要求把 reload 当作当前 handler 的终点,长期资源在 session_start 创建,在 session_shutdown 幂等清理。
这套生命周期事件很有用,但它只提供边界,不负责替每个扩展写清理代码。扩展越多,依赖关系越靠约定、测试和代码审查维护,Pi 不会在运行时替你生成一张公共依赖关系。
Pi 的会话也有自己的“树”:每条 JSONL 记录带 id 和 parentId,当前 leaf 决定发给模型的活动路径;/tree 可以在同一会话文件中切换分支,/fork 和 /clone 则建立新的会话文件。这解决的是历史导航和上下文选择,不是插件依赖图。把两者混在一起,排障时很容易找错方向。
安全边界同样要单独算。Project Trust 能控制项目级设置和 Extension 是否加载,却不是操作系统沙箱。能够调用 bash、读取环境变量的扩展,权限仍接近运行 Pi 的用户;高风险任务要靠容器、虚拟机或远程执行环境补上隔离。
OpenCode 的核心选择不是“再提供几个工具”,而是把 Agent 做成一个有稳定服务边界的产品。
运行 opencode 时,TUI 是客户端,Agent、工具、会话和项目状态由 Server 提供;也可以单独运行 opencode serve,通过 OpenAPI 3.1 接口接入桌面端、IDE、脚本或 SDK。/event 提供 SSE 事件流,客户端不需要把一次任务堵在一个终端进程里。这个边界解释了 OpenCode 为什么能同时服务终端和其他前端,也解释了它为什么更像一个产品而不是一组可随意替换的库。
Server 内部按项目目录维护 Instance。源码里的 InstanceStore 会缓存同一目录的 Instance;加载时初始化配置、插件、LSP、格式化器、快照和 VCS 等服务,释放或 reload 时调用实例级 disposer,把这一目录下的状态一起清掉。两个目录可以各有一套状态,客户端只是通过 HTTP 请求找到对应 Instance。
插件也附着在这个边界上。插件从项目或全局配置加载,形成一组按顺序执行的 hooks;公开接口可以监听 chat.message、chat.params、tool.execute.before/after、permission.ask、shell.env 和事件流,也可以注册工具、Provider 和认证逻辑。插件状态由 InstanceState 按目录创建,Instance 释放时调用 dispose()。它不像 DSH 那样把每个插件 Fiber 和依赖关系公开成一张运行时图,但它的作用域并不是全局变量,而是项目 Instance。
权限也在产品边界内处理。OpenCode 会按工具和路径匹配规则,返回 allow、deny 或 ask;待审批请求和已经批准的规则都属于当前 Instance。这个机制解决的是用户确认和工具可见性,不是进程级隔离。插件仍在同一个 Node.js 进程里运行,能否访问外部资源,取决于部署环境和插件本身。
Session 则落在持久化层。它保存消息、消息 part、工具调用、成本、token、权限和父子关系,HTTP API 支持继续发送、abort、fork、revert 和恢复。OpenCode 的会话可以被不同客户端观察和操作,但它不是 DSH 那种“模型可见即已记录”的事件模型;很多运行时细节仍由 OpenCode 自己的 Session、Event 和数据库投影来定义。
代价也在这里:团队拿到的是统一入口、稳定 API 和一套现成工作流,Agent Loop、Session 投影和资源生命周期则更多跟着产品版本走。想改到公开 hooks 之外,通常要跟随上游实现,或者维护自己的分支。
Composio 测试里,OpenCode 完成 14 个任务,中位耗时 129.7 秒,Pi 是 132.2 秒,时间很接近。通过率的差异可能来自工具编排、提示词、重试或状态恢复;一次公开测试只能说明这组模型、工具和配置下的表现,不能给产品贴上永久标签。
DSH 关注的已经不只是 Agent Loop 本身。官方架构文档写得很明确:模型适配器、工具注册表、会话日志和 Agent Loop 都是插件。这里的“一切皆插件”不是说没有核心,Cordis 的 Context、Service、Fiber、事件和 Loader 仍然是运行时内核;变化的是,大部分 Agent 能力都能挂载、替换和撤销。
DSH 里有三种容易混淆的东西。
插件树描述这次进程实际装了什么。Profile 叠加 Bundle,再应用 Profile、用户目录和命令行 Patch,才得到最终配置。dsh --profile web --dump-config 打印的是这棵插件树;源码里存在某个包,不代表它已经在本次运行中启用。
能力图描述谁提供、谁使用一项能力。一个 Service Definition 定义接口,Provider 提供实现,Consumer 使用它。ctx.fs、ctx.shell、ctx.llm 和 ctx.web 都可以沿这条能力边界替换,工具不必知道后面是本地实现还是远程沙箱。
Session event log 记录执行事实。turn/start、step/start、assistant/*、tool/call 和 tool/result 这些事件可以回放和投影;agent/*、llm/stream、tools/* 则给运行中的拦截和策略留下入口。官方的不变量是 Model-visible means logged:进入模型请求的内容必须能从日志重建,但日志里的每个事件不必都发给模型。
把这三件事分开,很多现象就容易解释了:插件树回答“现在装了什么”,能力图回答“谁依赖谁”,事件日志回答“刚才发生了什么”。
还要分清进程和会话的配置。web、headless 是 Runtime Profile,决定进程以什么形态运行;standard、code、minimal、cordis 是 Agent Preset,决定某个会话里的工具和提示词组合。同一个 Web 进程可以承载多个会话,每个会话使用不同 Preset。运行中的父子任务沿用同一代 Preset,避免任务做到一半换了能力;跨重启要严格复现,还得固定源码、锁文件和 Preset 配置。
Provider 换掉以后,运行时怎么处理,要看 Consumer 是否长期持有它。
对于 Web Search 这类无状态能力,Provider 登记在 WebRuntime 的 Map 里,search() 或 fetch() 调用时才按配置选择当前 Provider。卸载动作只是移除注册项,使用 ctx.web 的工具不需要全部重启;多个可用 Provider 同时存在时,运行时还会要求显式指定,避免依赖注册顺序。
对于 Shell、文件系统和可能被 Consumer 长期持有的 Service,处理就重一些:旧 Service 从解析空间消失,受影响的 Consumer 退出,旧 Provider Fiber 清理完,新 Service 出现后再满足依赖并激活 Consumer。插件通过 ctx.effect() 登记资源和 disposer,资源放进别的 Service 的 Map,也不会改变它原本属于哪个 Fiber。
effect 能撤销已经登记的监听器、句柄、子进程和注册项,但不能回滚已经发出的 Slack 消息、数据库写入或共享文件修改。DSH 把运行时资源的所有权写得更清楚,却没有把外部世界变成事务系统。
DSH 插件与宿主仍在同一个 Node.js 进程里,inject 是依赖声明,不是安全隔离。Profile、Patch 和能力图也不能替代容器、微型虚拟机、远程沙箱或审批系统。另一个现实边界是:DSH 仍处于 Developer Preview,插件接口、Preset 和启动配置还可能变化。
把本地 bash 换成远程 sandbox,是研发团队经常会遇到的事情。三套 Harness 的差别,可以落到这条迁移路径上:
session_shutdown | dispose() | effect disposer | |
实际迁移时,最容易漏掉的是三件事:已经发出的消息怎样避免重复,旧 Provider 创建的连接和子进程由谁关闭,新 Provider 启动前哪些 Consumer 必须退出。文档里写“支持热替换”还不够;新配置生效、旧 PTY 还留在进程里,是非常实际的故障。
任务只需要一条短而透明的 Coding Agent 内环,Pi 的控制点最靠近代码,适合愿意自己维护 Extension 生命周期的人。团队更看重终端、IDE、桌面端共用一套入口和 API,OpenCode 的 Server/Instance 模型更省整合工作。
当 Provider、宿主、会话作用域和动态替换本身成了主要问题,DSH 的插件树、能力图和事件日志才值得承担学习成本。它提供的是一套更强的运行时约束,不是一个自动带来安全隔离的“万能底座”。
Composio 那组数字最后提醒我的,也不是 Pi 排在前面,而是 Harness 会改变模型的实际表现。落到生产系统,失败以后能不能恢复、Provider 变化时谁负责退出、插件越权时哪一层能拦住,往往比一次榜单名次更值得写进选型记录。
47f9438Composio 数字对应其公开测试的任务、工具和价格设置;DSH 仍处于 Developer Preview,源码和插件接口可能继续变化。文中架构判断以已核对的源码、官方文档和公开讨论为准,不把一次测试结果当作普遍排名。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2026-09-12
OpenAI把Codex“拆开卖了”
2026-09-12
Token狂省83%!OpenAI发布Agents API:模型内卷时代彻底终结
2026-09-12
Google Gemini桌面版进化成超级应用,可操控电脑、对接Obsidian
2026-09-12
刚刚,OpenAI重磅上线Agents API:Codex同款底座全开放
2026-09-11
月之暗面的 Kimi Code 和 Kimi Work 正式接入 CloudBase
2026-09-11
Agentic AI 时代拷问:企业级 Agent,到底需要一套怎样的全新基础设施?
2026-09-10
Android Studio Quail 4 稳定版发布: 借助 Android Skills 与 Gemma 4 极速构建应用
2026-09-10
Harness Inspector:让 Agent 交付过程可观察、可检查、可追溯
2026-06-22
2026-09-01
2026-08-31
2026-06-27
2026-06-17
2026-09-01
2026-09-01
2026-09-02
2026-06-24
2026-06-27
2026-09-11
2026-09-08
2026-09-07
2026-09-07
2026-09-02
2026-09-02
2026-09-02
2026-08-31
欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。
在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。
一、 定义
本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。
会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。
知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。
二、 账号注册与登录
登录方式:本网站支持以下登录方式,您可根据实际情况选择:
微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。
手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。
账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。
实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。
未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。
三、 服务内容与规范
知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。
服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。
禁止行为:您在使用服务时不得实施以下行为:
利用技术手段批量爬取、下载、转存知识库内容;
将知识库内容用于商业目的或未经授权地向第三方传播;
干扰本网站正常运行或侵犯其他用户合法权益;
发布违法违规信息或从事违反公序良俗的活动。
四、 知识产权声明
权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。
有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。
侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。
五、 个人信息保护
我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。
您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。
您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。
六、 免责声明
内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。
不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。
第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。
七、 违约责任
如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。
如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。
八、 法律适用与争议解决
本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。
因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。
九、 其他
本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。
本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。
我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。