拆解四家子智能体运行时:OpenCode / Claude Code / CodeBuddy / TRAE 源码级对照

拆解四家子智能体运行时:OpenCode / Claude Code / CodeBuddy / TRAE 源码级对照

先说清楚这篇文章的边界

没有基准测试。 全文是对四家官方文档的逐条对照,不是实测数据。看到「更快」「更慢」这类表述时,请理解成「文档定义的结构性开销差异」,不是实测数字。

触发这次梳理的原因很具体:开发流程里每个任务在 merge 和 push 前都要过一遍本地子智能体代码审查,跑多了发现 OpenCode 的总时间明显比另外三家长,但说不清差距出在哪一步。摊开文档比对之后,差异集中在一个点上。

一、运行时模型:会话边界是第一分水岭

OpenCode ------ 独立子会话

jsonc 复制代码
// opencode.jsonc
{
  "agents": {
    "orchestrator": {
      "permissions": [
        { "action": "subagent", "resource": "*", "effect": "deny" },
        { "action": "subagent", "resource": "general", "effect": "allow" }
      ]
    },
    "auditor": {
      "mode": "subagent",
      "model": "anthropic/claude-sonnet-4-5#high",
      "permissions": [{ "action": "edit", "resource": "*", "effect": "deny" }]
    }
  }
}

这段配置体现了两个关键机制:

  1. 权限顺序匹配,最后命中者胜出 。所以先 deny 全部 subagent,再单独 allow general------父智能体默认没有启动子智能体的权限。
  2. 子智能体权限不是父级的子集。官方 permissions 文档原话:"A custom subagent uses its own permissions, not a subset of its parent's permissions."

mode: subagent 的智能体只在子会话中运行,通过 subagent 工具调用,子会话带全新上下文。

V2 内置的 subagent 模式智能体只有 general 和 explore------文档专门写了 V2 没有内置 scout 。两者权限出厂就不同:general 被拒绝 questions 和 launching subagents;explore 只保留 reads、globs、grep、web fetches、web searches,外部目录与 .env 读取仍走 ask。

Claude Code ------ 同一会话内的独立上下文窗口

yaml 复制代码
# .claude/agents/code-reviewer.md
---
name: code-reviewer
description: Reviews code for quality and best practices
tools: Read, Glob, Grep
model: sonnet
---

You are a code reviewer focused on correctness and security.

关键差异在文档这句话:"Subagents work within a single session." 它有自己的上下文窗口,但不另起会话。

权限模型的表述分散在文档两处,容易看岔:概述段说可以有 "independent permissions",而内置子智能体一节写 "Each inherits the parent conversation's permission rules"。实践上默认继承,permissionMode 可覆盖。

启动上下文的构成(What loads at startup 一节)是:

  • System prompt:智能体自己的提示 + Claude Code 追加的环境信息,不是 Claude Code 主系统提示
  • Task message:Claude 交接任务时写的委派提示
  • CLAUDE.md files:主对话加载的整条 CLAUDE.md 层级,内置 Explore 和 Plan 跳过
  • Git status:启动时读的仓库快照,Explore 和 Plan 无条件跳过
  • Preloaded skills:由 skills 字段显式指定,内置智能体不预加载

注意这里有个文档明写、很多人踩的坑:"You can't change which subagents receive git status. Only Explore and Plan skip it." ------ omitClaudeMd 只管 CLAUDE.md,管不了 git 快照。

配额也写死了:默认嵌套 3 层(CLAUDE_CODE_MAX_SUBAGENT_SPAWN_DEPTH 可调),同一会话 20 个并发上限(CLAUDE_CODE_MAX_CONCURRENT_SUBAGENTS),但会话内总派生次数无上限。

CodeBuddy ------ 独立上下文窗口 + 显式配额

yaml 复制代码
---
name: docs-searcher
description: Use existing docs MCP for retrieval
tools:
  - Read
mcpServers:
  - docs
---

mcpServers 有两种写法,这个区别很关键:

  • 引用全局服务器(字符串):子智能体只是借用,结束时不会关闭它
  • 声明私有内联服务器(对象):只在子智能体会话内创建,结束时自动关闭

后者隔离更彻底,但代价是每次派生都要新建连接。

配额是四家里最细的:嵌套 5 层(主会话第 0 层,不可配置),每棵会话树默认 20 并发(CODEBUDDY_CODE_MAX_CONCURRENT_SUBAGENTS),单会话派生预算 200 次(CODEBUDDY_CODE_MAX_SUBAGENTS_PER_SESSION,/clear 后重置)。

还有两个容易忽略的默认值:

  • tools 省略时继承主线程全部工具,包括全部 MCP 工具。想做最小权限必须显式写白名单。
  • 内置 Explore 的出厂模型声明是 lite 档。

MCP 默认走延迟加载:模型先经 ToolSearch 发现工具,再用 DeferExecuteTool 调用,需要直接暴露就设 defer_loading: false。

另一个工程细节:同步前台调用默认没有超时上限 ,卡住的子智能体会一直等,要设 CODEBUDDY_SUBAGENT_TIMEOUT_MS。

TRAE ------ 声明式,但编排自由度最低

markdown 复制代码
---
name: security-auditor
description: Performs security audit on code looking for vulnerabilities
tools: Read, Glob, Grep
model: glm-5.2
---

两个硬限制:

  1. 只有内置智能体「Agent」可调用 Subagent(文档「使用限制」一节)
  2. model 只支持 TRAE 提供的内置模型,不支持自定义模型

tools 不配置默认加载全部可用工具;同一工具同时出现在 tools 和 disallowedTools 时后者优先。功能还需在 设置 → Beta → Subagents 打开开关。

二、结构对照表

维度 OpenCode Claude Code CodeBuddy TRAE
运行时模型 独立子会话 主会话内的独立上下文窗口 独立上下文窗口 独立上下文窗口
权限模型 完全独立,非父级子集 继承父对话,permissionMode 可覆盖 省略则继承全部工具 仅 tools/disallowedTools 白名单
启动加载 全新上下文 + 自己的权限与工具池 系统提示 + CLAUDE.md + git 快照 系统提示;启用 memory 时注入 MEMORY.md 系统提示
上下文开关 无(子会话天生全新) omitClaudeMd(管不了 git 快照) 无 无
嵌套限制 general 默认不能再启动 默认 3 层 上限 5 层 未单列
并发 / 预算 未单列 20 并发,总数无上限 20 并发 / 200 次派生 未单列
强制轻量路径 命令 subagent: false 默认即轻量 内置轻量 Explore 无

三、OpenCode 的 subagent 三态:最容易被误解的机制

命令 frontmatter 的 subagent 字段:

yaml 复制代码
---
description: Audit changes for bugs and missing tests
agent: general
subagent: true
---

Audit $ARGUMENTS for bugs and missing tests.
值 行为
true 一定起子会话,即使所选智能体是 mode: primary
false 一定留在当前会话,即使所选智能体是 mode: subagent
省略 所选智能体是 mode: subagent 时才起子会话

true 和 false 之间隔着一次完整的子会话创建开销。后台只解除阻塞,不降低启动成本。

两个版本兼容细节:旧的 subtask 字段仍被接受,是 subagent 的废弃别名,两者同时出现时 subagent 胜出;V2 的权限动作名也从 V1 的 task 改成了 subagent。

四、可复现的验证路径

想在自己的环境里确认这些差异,不需要跑基准测试,看两处就够了:

  1. 看权限是否独立 :OpenCode 给子智能体显式 deny 一条 edit,父会话不受影响;Claude Code 子智能体默认继承父权限,得靠 tools 或 permissionMode 显式收窄。
  2. 看启动上下文 :Claude Code 的内置 Explore 不加载 CLAUDE.md 与 git 快照,而自定义智能体默认都加载------放一条只在 CLAUDE.md 里的规则,就能观察到差异。

五、官方文档自己承认延迟

这是翻文档时最意外的发现。Claude Code 写:

Latency matters. A subagent that isn't a fork starts fresh and may need time to gather context.

CodeBuddy 的 Performance Considerations 写:

Latency : Sub-agents start from a clean state each invocation and may add latency as they gather context needed to work effectively.

「每次从干净状态起步」是四家共有的设计,OpenCode 只是默认走得更重。唯一被官方明确写为「比全新子智能体更便宜」的路径是 Claude Code 的 fork------fork 继承整段对话,第一次请求能复用父会话的 prompt cache,文档原话是 "a fork costs less than a fresh subagent"。

总结

按任务风险分级,而不是全站一刀切:快查类任务用 OpenCode 的 subagent: false,特权或高风险操作用默认 mode: subagent。

如果你对这几个平台做过延迟实测,或者在生产里踩过别的坑,欢迎在评论区补充------尤其是各家的 MCP 连接成本,那部分文档里只有零散描述,没有系统对比。

相关推荐
Dawson Zhu1 小时前
《Agentic Design Patterns》第 19 章导读:评估与监控
人工智能·语言模型·架构·aigc·agi
vivo互联网技术1 小时前
Agent 不能只记录调用了什么,还要记录为什么调用 | KDC 系列 03
架构·agent
rannn_1111 小时前
项目缓存实战:热点 Key 击穿、缓存穿透与多级缓存架构
java·缓存·架构
Dawson Zhu2 小时前
《Agentic Design Patterns》第 20 章导读:优先级排序
人工智能·语言模型·架构·aigc·agi
野生技术架构师2 小时前
Dubbo 还是 Spring Cloud?从架构本质到落地选型
spring cloud·架构·dubbo
独孤九剑打醒他2 小时前
【原创开源·航空篇】太阳能水闭环氢能航空:双燃料掺氢助燃与露天储氢安全模型
架构·开源·汽车·硬件工程·能源
晴殇i3 小时前
双模式、多 Agent、三端接力:我用 TRAE 把「YACA」从需求推到了交付
架构
海宇大数据3 小时前
零信任架构实战:基于海宇企业综合风险报告构建自动化供应链保理对公尽调网关
运维·人工智能·架构·自动化
诚心呈意共享外卖配送系统3 小时前
多平台订单聚合系统的技术架构:接 API 只是开始
java·开发语言·架构·系统架构·创业创新