Agent.Space 博客

OpenCode Agent 与 Subagent:配置和权限指南

了解 OpenCode 主 Agent 与子代理的区别、配置和调用方法,以及如何用权限限制委派范围。

OpenCode Agent 是可以重复使用的助手配置,每个角色都能拥有自己的指令、模型偏好和工具权限。**主 Agent(primary agent)**负责你直接交互的主对话;**子代理(subagent)**则在子会话里处理更窄的任务,它既可以由主 Agent 委派,也可以由你直接调用。

这个区别比笼统地把每个角色叫作“AI 队友”更有用。它决定了对话在哪里进行、角色怎样被选中、能获得什么上下文,以及应该用哪些权限约束其工作。

本文示例以 2026 年 9 月 1 日的 OpenCode 1 官方文档为准。OpenCode 2 目前以单独的 beta 版本提供,使用不同的配置字段;本文后面会单独说明这条版本边界。

用一张表分清主 Agent 和子代理

OpenCode 官方的 Agents 文档定义了两种可由用户配置的角色。

问题主 Agent子代理
在哪里运行?主对话子会话(child session)
怎样启动?选择或切换当前主 Agent由主 Agent 委派,或用 @ 点名调用
适合什么任务?负责当前任务和与用户的主要交互探索、审查、文档等边界清楚的专门任务
使用哪个模型?自己配置的模型,未配置时使用全局模型自己配置的模型,未配置时继承调用它的主 Agent 模型
什么控制它的行为?自身权限以及适用的全局配置自身权限,以及主 Agent 是否有权调用它

OpenCode 1 内置两个用户可见的主 Agent:

  • Build 是默认开发角色,拥有较广的工具权限。
  • Plan 用于规划和分析;文件编辑和 Shell 命令默认需要询问批准。

它还内置三个用户可见的子代理:

  • General 处理广泛研究和多步骤任务,权限允许时也可以修改文件。
  • Explore 是只读的代码库研究角色。
  • Scout 是只读的外部文档和依赖源码研究角色。

此外还有负责上下文压缩、标题和摘要等任务的隐藏系统 Agent。它们不是供用户日常选择的普通角色。

如果你还在判断 OpenCode 是否适合自己的执行环境,可以先看更上层的 OpenCode 云端工作区指南。本文下面只讨论 OpenCode 内部的 Agent 角色。

OpenCode 怎样调用不同角色

主 Agent 负责主对话。在 OpenCode 1 中,你可以按 Tab,或使用自定义的 switch_agent 快捷键,在主 Agent 之间切换。切换角色会改变后续工作的当前指令和权限,但这不等于创建了另一个独立项目。

子代理有两种启动方式:

  1. 自动委派。 主 Agent 会看到可用子代理及其描述,再通过 Task 工具把合适的任务交出去。
  2. 手动调用。 你可以在消息里直接点名,例如 @general 帮我找到这个函数在哪里定义

委派任务会创建一个子会话。OpenCode 提供快捷键,让你从父会话进入子会话、在多个子会话间切换,再返回父会话。这样,子代理可以独立调查,不必把所有中间过程都塞进主对话,同时你仍然能进入子会话检查它做过什么。

description 是实际的调度信息,不只是装饰。“帮助处理代码”这样的描述太模糊,主 Agent 很难判断何时应该调用它。更有效的描述会同时写明触发条件和边界,例如:“审查当前 diff 的正确性和遗漏测试,不修改文件。”

怎样配置一个职责集中的子代理

OpenCode 1 支持在 opencode.json 或 Markdown 文件中定义 Agent。Markdown 通常更容易审查,因为配置和角色指令放在同一个文件里。全局 Agent 放在 ~/.config/opencode/agents/,项目专用 Agent 放在 .opencode/agents/。文件名就是 Agent 名称。

下面是一个适用于 OpenCode 1 的项目级 reviewer 子代理示例:

md
---description: Reviews the current changes without modifying filesmode: subagentpermission:  edit: deny  bash:    "*": deny    "git diff": allow    "git diff *": allow    "git status": allow    "git status *": allow---
Review the current changes for correctness, security, regressions,and missing tests. Report findings with file and line references.Do not modify files.

把它保存为 .opencode/agents/reviewer.md,再用一个边界清楚的请求调用:

text
@reviewer inspect the current diff and list only actionable findings

这个简短定义中的四个选择承担了主要作用:

  • description 告诉用户和主 Agent 什么时候适合使用这个角色。
  • mode: subagent 防止该配置成为主对话中可选的主角色。
  • permission 禁止编辑,并把 Shell 权限限制在几个只读 Git 命令上。
  • Markdown 正文 定义期望输出,让任务保持聚焦。

你也可以用 provider/model-id 格式设置 model。如果没有设置,子代理会继承调用它的主 Agent 所用模型。因此,Agent 配置和模型是两个不同选择:配置定义角色,模型为这个角色提供推理能力。

官方的 opencode agent create 命令可以通过交互流程生成 Markdown Agent。它会询问配置是全局还是项目专用,收集角色描述,生成 Prompt 和标识符,并让你选择权限。生成后仍要审查文件;自动生成不能替代权限检查。

权限才是真正的委派边界

Prompt 可以要求 Agent 不要编辑文件,权限则可以阻止编辑工具运行。两者都应该使用,但不能混为一谈。

在 OpenCode 1 中,权限有三种结果:

  • allow:不询问,直接运行;
  • ask:暂停并等待用户批准;
  • deny:阻止操作。

规则既可以针对一整类工具,也可以针对更窄的输入,例如具体 Shell 命令模式。多个模式同时匹配时,最后一个匹配规则生效。因此应先写范围最广的默认规则,再写更具体的例外。

主 Agent 还有一层独立的委派边界:permission.task。它控制模型可以自动调用哪些子代理。一个受限的编排 Agent 可以先禁止所有子代理,再只允许指定角色:

json
{  "agent": {    "orchestrator": {      "mode": "primary",      "permission": {        "task": {          "*": "deny",          "explore": "allow",          "reviewer": "ask"        }      }    }  }}

被禁止的角色会从 Task 工具描述里移除,因此模型不应该再尝试向它委派。在 OpenCode 1 中,这个限制不会阻止用户用 @ 手动点名一个仍然可见的子代理。同样,hidden: true 只会把子代理从自动补全中隐藏,并不是安全控制;只要 Task 权限允许,模型仍可能调用这个隐藏角色。

实用原则很简单:只开放任务真正需要的最小工具范围,单独限制自动委派,并分别测试一项应被允许和一项应被拒绝的操作。更完整的命令模式和审批说明可以参考 OpenCode 权限指南

按任务选择主 Agent 或子代理

当一个角色需要负责与用户的对话和主要决策顺序时,使用主 Agent。当任务拥有明确输入、有限工具和可以返回给父会话检查的输出时,使用子代理。

任务更合适的起始角色原因
实现前规划改动Plan 主 Agent让分析留在主对话,同时限制修改行为
实现并验证一项小范围改动Build 主 Agent主角色可以协调编辑、命令和用户决策
只查找相关代码Explore 子代理只读搜索任务的边界清楚
研究上游官方文档Scout 子代理外部研究与工作区修改分开
审查 diff自定义 reviewer 子代理输出明确,禁止编辑后更便于审计
根据已确认事实起草文档自定义 docs 子代理可以只开放指定文件,不提供 Shell 权限

任务很小、需要持续和用户来回沟通,或只有复制大部分主对话才能解释清楚时,不要委派。子代理会增加一层上下文边界和一份需要检查的结果。只有专业分工或并行确实能改善工作流时,这些额外成本才值得。

OpenCode 子代理不等于多 Agent 团队工作流

OpenCode 子代理是在 OpenCode 内部被调用的可复用角色,工作记录在子会话里。它不会自动建立拥有独立负责人、共享交付规则、合并权限或跨 Agent harness 协作的团队流程。

这些问题属于另一个层级。团队工作流可能让 Codex、Claude Code 和 OpenCode 分别运行在独立会话里,给每个会话明确的文件边界,再由审查角色整合结果。多 Agent 编码工作流指南讨论的是这种项目级协作。

两种模式可以同时存在。一个 OpenCode 会话可以在内部使用 Explore 子代理,而整个项目只把一个有边界的工作流分配给 OpenCode。需要把术语说清楚:

  • OpenCode 主 Agent / 子代理角色描述同一个 Agent harness 内部的委派。
  • 多 Agent 团队工作流描述多个独立工作会话或不同 harness 之间的职责和交接。

谨慎迁移 OpenCode 1 与 OpenCode 2 beta 配置

OpenCode 官方 V2 文档说明,这个 beta 版本未来会成为 OpenCode 2.0,目前仍在变化,并以 opencode2 和 OpenCode 1 并行运行。官方 V1 迁移指南说明,V2 可以读取受支持的 V1 配置和旧版 Agent Markdown,所以已有 V1 文件不会自动失效。不过,原生 V2 字段使用不同的 schema;当等价的 V1/V2 顶层字段同时存在时,原生 V2 配置优先。

配置对象V1 兼容字段原生 V2 字段
Agent 集合agentagents
权限集合permissionpermissions
Shell 操作bashshell
委派操作tasksubagent
规则结构对象或简写动作有顺序的 { action, resource, effect } 规则

本文前面的 reviewer 示例属于 OpenCode 1;V2 可能通过兼容路径读取它,但不能假定把字段机械改名后行为就完全相同。如果要把某个条目迁移为原生 V2,应完整转换该嵌套 Agent、Provider、Command 或 Model 条目,不要在同一个条目内部混写 V1/V2 格式。先确认自己运行的是哪个二进制文件,再按官方迁移文档和其中的“Verify your setup”清单逐项核验,并重新检查迁移后的权限。

这条版本边界变化很快,内置 Agent 和默认行为也可能不同。例如,2026 年 9 月 1 日的 V2 beta 文档没有把 Scout 列为内置子代理。

这对 Agent.Space 用户意味着什么

OpenCode 的主 Agent 和子代理展示了:同一个 Agent harness 可以把规划、执行、探索和审查拆成不同角色,但不需要把每个角色都当作不同模型或不同产品。因此,真正有用的评估问题是:哪个 harness 负责当前任务?每个角色背后运行什么模型?角色能访问什么?谁批准敏感操作?结果怎样返回主流程?

Agent.Space 并未声称会创建、同步或强制执行本文展示的 OpenCode 配置。判断这些行为时,应以对应版本的 OpenCode 官方文档和你的本地配置为准。

准备把这些角色、权限和交接问题用于真实任务时,可以打开 Agent.Space,先从一个能够端到端检查的小型工作流开始。