拆解四家子智能体运行时: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" }]
}
}
}
这段配置体现了两个关键机制:
- 权限顺序匹配,最后命中者胜出 。所以先
deny全部subagent,再单独allowgeneral------父智能体默认没有启动子智能体的权限。 - 子智能体权限不是父级的子集。官方 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
---
两个硬限制:
- 只有内置智能体「Agent」可调用 Subagent(文档「使用限制」一节)
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。
四、可复现的验证路径
想在自己的环境里确认这些差异,不需要跑基准测试,看两处就够了:
- 看权限是否独立 :OpenCode 给子智能体显式
deny一条edit,父会话不受影响;Claude Code 子智能体默认继承父权限,得靠tools或permissionMode显式收窄。 - 看启动上下文 :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 连接成本,那部分文档里只有零散描述,没有系统对比。