Agent System 模块对比分析
2026/4/27大约 4 分钟
Agent System 模块对比分析
1. 模块边界
这里的 Agent System 指模型如何把工作分发给子代理、如何维护代理定义、如何在代理之间传递任务与消息,以及这些代理与主会话的隔离关系。
2. Claude Code:围绕 AgentTool 的多形态代理系统
2.1 关键源码路径
claude-code-rev/src/tools/AgentTool/AgentTool.tsxclaude-code-rev/src/tools/AgentTool/loadAgentsDir.tsclaude-code-rev/src/tools/AgentTool/runAgent.tsclaude-code-rev/src/tools/AgentTool/forkSubagent.tsclaude-code-rev/src/tools/AgentTool/resumeAgent.tsclaude-code-rev/src/tools/TaskCreateTool/TaskCreateTool.tsclaude-code-rev/src/tools/TaskListTool/TaskListTool.tsclaude-code-rev/src/tools/TaskUpdateTool/TaskUpdateTool.tsclaude-code-rev/src/tools/SendMessageTool/SendMessageTool.tsclaude-code-rev/src/tools/TeamCreateTool/TeamCreateTool.tsclaude-code-rev/src/tools/TeamDeleteTool/TeamDeleteTool.ts
2.2 模块职责
Claude Code 的代理系统不是单一“spawn agent”能力,而是多条能力链叠加:
AgentTool.tsx是统一入口,负责解析子代理参数、选择代理类型、决定前台/后台、worktree/remote 等运行模式。loadAgentsDir.ts负责装载内置代理、用户代理、项目代理、插件代理,并处理 tools、skills、hooks、MCP 依赖、permissionMode、memory、background、isolation 等 frontmatter。TaskCreateTool/TaskListTool/TaskUpdateTool提供任务列表语义,和子代理本身并列存在。SendMessageTool、TeamCreateTool、TeamDeleteTool则把代理系统扩展为团队协作系统,而不只是 parent-child 调度。
2.3 实现方式
Claude Code 的子代理更像“当前会话之上的可治理执行单元”:
- 主代理通过
AgentTool选择代理定义。 - 运行前会结合 permission mode、MCP 要求、agent definition、环境变量决定最终执行方式。
- 执行方式可以是前台同步、后台异步、fork worktree,甚至 remote CCR。
- 代理运行过程中,进度、handoff、通知、resume、disk output、message routing 都由 AgentTool 配套模块处理。
- 若开启 swarm / team 能力,代理之间可以通过
SendMessageTool和 mailbox 进行定向或广播通信。
2.4 设计特点
- 代理定义非常富。除了 prompt,本身还带 model、effort、MCP 依赖、skills、memory、maxTurns、background、isolation。
- 代理系统与 worktree、remote、permissions、team 协作深度耦合。
- AgentTool 本身已经接近一个“代理调度平台”。
3. Opencode:围绕 Session 与 TaskTool 的子会话代理系统
3.1 关键源码路径
opencode/packages/opencode/src/agent/agent.tsopencode/packages/opencode/src/tool/task.tsopencode/packages/opencode/src/session/prompt.tsopencode/packages/opencode/src/session/index.tsopencode/packages/opencode/src/session/processor.tsopencode/packages/opencode/src/permission/index.ts
3.2 模块职责
Opencode 的代理系统更集中在两个核心对象上:
agent/agent.ts:定义代理类型、默认权限、模式、prompt、model、steps,以及从配置合并自定义 agent。tool/task.ts:把“创建或恢复一个子代理会话并向其发 prompt”暴露成标准工具。
3.3 实现方式
Opencode 的子代理本质上是“一个新的 session”:
TaskTool根据subagent_type读取代理定义。- 创建或恢复一个 session,并为这个 session 附加专门权限。
- 使用
SessionPrompt.prompt()向该 session 发送 prompt。 - 子代理输出以
task_id + <task_result>的形式回给调用方。
相比 Claude Code,这条链路更像“子会话调用”,而不是复杂的执行基础设施。
3.4 设计特点
agent.ts里的内置代理已经覆盖build、plan、general、explore、compaction、title、summary等角色。- 代理权限直接通过
Permission.merge()组合,模型和 prompt 也直接归在 agent 定义中。 TaskTool会显式限制 todowrite / todoread / task 等权限,保证子代理不会无约束递归扩张。
4. 核心差异
| 维度 | Claude Code | Opencode |
|---|---|---|
| 代理入口 | AgentTool + task/team/message 多工具协同 | TaskTool 为主,agent 定义提供角色约束 |
| 代理定义 | 来源多样,frontmatter 能力丰富 | 主要由 agent.ts 和配置合并定义 |
| 隔离方式 | foreground / background / worktree / remote / team swarm | 主要是新建或恢复 session |
| 通信模型 | mailbox、team、broadcast、resume 较完整 | 返回 task result 为主,通信面更窄 |
| 系统定位 | 代理调度平台 | 子会话执行机制 |
5. 设计取舍
5.1 Claude Code 的取舍
- 目标是让代理真正承担并行执行、团队协作、跨环境运行的职责。
- 因此它把代理系统和任务、消息、团队、隔离环境都做了统一编排。
- 好处是能力极强;代价是 AgentTool 及其周边复杂度明显更高。
5.2 Opencode 的取舍
- 目标是用最直接的方式把代理建模为“受限的子会话”。
- 因此 agent 定义负责角色能力,TaskTool 负责新 session 生命周期。
- 好处是结构清楚;代价是缺少 Claude Code 那种更完整的多代理协作层。
6. 结论
Claude Code 的 Agent System 更像一个多形态代理执行平台;Opencode 的 Agent System 更像一个基于 session 的子代理机制。前者强调调度、隔离和协作,后者强调角色定义和调用链简单。