拆解四家子智能体运行时: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 连接成本,那部分文档里只有零散描述,没有系统对比。

相关推荐
行走的陀螺仪6 小时前
Super-Agent 架构演进(下):解耦设计与 NestJS 工程落地
架构·大模型·agent
Decay__7 小时前
17_MySQL 监控体系构建 —— mysqld_exporter + Prometheus + Grafana 全栈实战
运维·数据库·sql·mysql·架构
阿文和她的Key7 小时前
算力零售化的四层架构:从 0.01 元月卡看 AI 服务的计量、履约与复购
人工智能·架构·零售
天远数科7 小时前
零信任架构实战:基于天远全能家政风险报告构建自动化即时到家保洁与短工抢单安全核验网关
运维·人工智能·架构·自动化
小园子的小菜8 小时前
Netty 核心组件 Channel、ChannelHandler 与简易 RPC 架构实战详解
网络协议·rpc·架构
ZhengEnCi18 小时前
GPT-6 Astra 爆改 Qwen 权重真有那么神吗:权重空间编程 0.016% 参数的真相
算法·架构
码流子20 小时前
移动收费怎么做?手持终端+App+收费中心的架构实践
java·开发语言·架构
梦曦i21 小时前
uni-app x下自研架构的工程化突围
前端·架构·uni-app x
这个DBA有点耶21 小时前
连拿六年第一后宣布出海:国产数据库凭什么敢撕掉“平替”的标签?
数据库·人工智能·架构