Skip to main content
子代理(Subagent)是 Qoder CLI 中专门处理某类任务的 Agent。它可以拥有自己的系统提示词、工具集合、模型配置、权限模式、运行限制和 Hook,适合把代码探索、方案设计、接口审查、测试补齐、迁移评估等工作拆给更聚焦的执行者。

快速开始

  1. 在 TUI 中执行 /agents 打开配置面板。
  2. Tab 切换到 UserProject 标签页。
  3. 选择 Create new agent...,输入 Subagent 描述并确认。
  4. 生成后直接在会话中调用它:

什么是 Subagent

当一个任务需要跨多个文件探索、需要稳定的领域判断标准,或者不希望把大量搜索过程塞进主会话上下文时,可以使用 Subagent。主会话负责理解用户目标和编排,Subagent 负责完成一个清晰的子任务,并把最终结果返回给主会话。 Subagent 的核心价值: Subagent 的核心特性: 如果你已经知道具体文件或具体命令,直接使用对应工具通常更高效;Subagent 更适合开放式、多步骤、需要判断和汇总的任务。

内置 Subagent

Qoder CLI 会注册一组内置 Subagent。不同版本、运行模式和功能开关下,/agentsBuiltIn 标签页可能显示不同列表,请以实际列表为准。 常用内置 Subagent: 在特定模式或功能开启时,还可能看到: 内置 Subagent 由 Qoder CLI 提供和维护,不能像用户级或项目级 Subagent 那样直接编辑。需要定制行为时,创建同名或新名称的自定义 Subagent,并通过来源优先级覆盖或显式调用。

查看和使用 Subagent

查看可用列表

TUI 方式

在 TUI 中输入:
/agents 面板按来源分组展示 Subagent,并支持查看详情、创建、启用/禁用、编辑自定义项和重新加载。修改 .qoder/agents/~/.qoder/agents/ 后,可以执行:

Headless 方式

在非交互环境中,可以使用:
列表会显示所有发现到的 Subagent。若同名 Subagent 被更高优先级来源覆盖,列表会标记 shadowed 项。

来源和优先级

Qoder CLI 会从多个来源发现 Subagent。同名定义按优先级覆盖,优先级从低到高如下: 实际生效的是最高优先级的同名定义;被覆盖的定义会在 qodercli agents list 中标记为 shadowed

显式调用

TUI 模式

在 TUI 会话中,最稳定的方式是在输入中直接写出 Subagent 名称:
也可以在 TUI 输入中使用 @ 提及已经加载的 Subagent:

Headless 模式

在 Headless 模式中,通过 qodercli -p 传入同样的自然语言请求:

隐式调用

使用自然语言直接输入任务内容,让 Qoder CLI 帮助你选择合适的 Subagent 处理任务

TUI 模式

在 TUI 会话中,Qoder CLI 会根据可用 Subagent 的 description 判断是否有匹配的可用 Subagent:

Headless 模式

在 Headless 模式中,把任务描述传给 qodercli -p 后 Qoder CLI 同样会根据 Subagent 的 description 判断使用哪个 Subagent:
提示:如果某个 Subagent 必须被使用,建议使用显式的调用方式。

作为本次会话主 Agent

--agent 会把某个已加载 Subagent 作为当前会话的主 Agent。此时该定义的 initialPrompt 会作为本次会话的初始提示使用。

TUI 模式

启动 TUI 时指定 --agent
进入 TUI 后,本次会话会使用 api-reviewer 作为主 Agent。/agents 面板中的运行入口不会切换主会话 Agent,它会通过 @agent-name 触发一次 Subagent 调用。

Headless 模式

在 Headless 模式中,和 -p 一起使用:

编排多个 Subagent

使用自然语言描述 Subagent 的先后执行顺序,Qoder CLI 会按照编排的流程处理任务。

TUI 模式

在 TUI 会话中直接输入:

Headless 模式

在 Headless 模式中,通过 qodercli -p 传入同样的编排请求:
如果多个任务彼此独立,可以明确要求并行调度;如果有依赖关系,像上面这样说明先后顺序。--max-turns 是本次 Headless 查询的总轮次上限;要限制单个 Subagent,请在 Subagent 配置中设置 maxTurns

自定义 Subagent

创建本地持久化 Subagent 定义

方式一:AI 辅助生成(推荐)

这是创建 Subagent 最简单的方式。你只需要用自然语言描述需求,Qoder CLI 会自动生成完整的配置文件。 操作步骤:
  1. 在 TUI 中执行 /agents 进入配置面板。
  2. Tab 切换到 UserProject 标签页。
  3. 选择 Create new agent... 并按 Enter
  4. 输入 Subagent 描述,按 Enter 确认。
输入描述后,Qoder CLI 会自动生成配置:
生成完成后,可以在对应目录找到配置文件继续微调:
提示:建议先使用 AI 生成初始 Subagent,再迭代优化,让它符合你的具体需求。这种方式能快速得到一个可定制的基础配置。

方式二:手动编写配置(进阶)

如果你需要完全控制 Subagent 配置,可以手动创建 Markdown 配置文件:
Markdown 文件必须以 YAML frontmatter 开头。frontmatter 声明配置,正文就是该本地 Subagent 的系统提示词。
需要让某个 Subagent 在独立 worktree 中执行时,在 frontmatter 增加:
文件名不决定 Subagent 名称;实际名称来自 frontmatter 的 name 字段。

--agents 临时注入

--agents 适合 Headless、脚本和一次性自动化。它接收一个 JSON 对象,键是 Subagent 名称,值是定义内容。通过 --agents 注入的 Subagent 只对当前进程生效,并且同名时优先级最高。
--agents 使用 prompt 字段作为系统提示词。当前 JSON schema 支持:descriptionprompttoolsdisallowedToolsmcpServersmodeleffortcolormaxTurnsinitialPromptskillspermissionMode。如果需要 timeoutMinstemperaturehooksmemorybackgroundisolation,请使用 Markdown 配置。

配置 Subagent

选择作用域

创建或注入自定义 Subagent 时,可以选择以下作用域:

配置工具

toolsdisallowedTools 都可以写成逗号分隔字符串或字符串数组。字符串数组既可以使用 YAML 内联数组,也可以使用 YAML 列表:
常用工具名包括 ReadGrepGlobBashWriteEditWebFetchWebSearchAgent MCP 工具使用完全限定名:
如果希望某个 Subagent 只能继续调用特定 Subagent,请使用 Agent(name) 表达式:
如果不希望它继续调度任何 Subagent,可以禁用 Agent
工具集合的处理顺序是:先根据 tools 注册可用工具,再应用 disallowedTools 移除工具。对于 MCP 工具,必须先通过 mcpServers 或全局 MCP 配置发现,再通过 tools 放行,Subagent 才能使用。

配置 MCP

可以引用已经配置好的 MCP 服务:
也可以内联定义只给这个 Subagent 使用的 MCP 服务:
mcpServers 支持数组格式,也支持对象格式。内联服务字段如下:

定义 Hook

hooks 写在 Subagent frontmatter 中时,只对该 Subagent 会话生效。支持的事件包括 PreToolUsePostToolUsePostToolUseFailureStopSubagentStartSubagentStopNotification hooks 不支持字符串简写。每个事件的值必须是 matcher 数组;每个 matcher 里再通过 hooks 数组声明一个或多个 Hook。 Subagent 中的 Stop 会映射为 SubagentStop,即在该 Subagent 完成时触发,而不是在主会话结束时触发。
每个事件下是一组 matcher;每个 matcher 中的 hooks 支持以下类型: frontmatter schema 也接受 once,但普通 Subagent frontmatter 中该字段不会作为一次性 Hook 语义保留;需要一次性行为时,请在 Hook 命令或外部状态中自行控制。

配置权限模式

permissionMode 控制 Subagent 工具调用的审批方式。 permissionMode 建议使用上表中的规范值。运行时会兼容大小写、下划线、连字符等写法;yolo 会被兼容解析为 bypassPermissions,但公开配置建议直接写 bypassPermissions 需要注意:
  • 未声明 permissionMode 时,Subagent 继承父会话当前模式。
  • 父会话已经处于 acceptEditsbypassPermissionsauto 时,Subagent 不能通过自己的配置把权限降得更严格。
  • plan 不会污染主会话计划状态,它只在该 Subagent 的隔离上下文中生效。

配置远程 Subagent

远程 Subagent 通过 Agent Card 加载,不使用 Markdown 正文作为系统提示词,而是根据远程 Agent Card 暴露的能力和描述完成调用。
也可以使用 agentCardJson 内联 Agent Card JSON。远程 Subagent 支持 auth 字段;常用认证类型包括 apiKeyhttpoauth。需要认证时,建议把远程 Subagent 放在用户级配置中,避免把凭据提交到项目仓库。

使用 settings.json 覆盖已有 Subagent

settings.json 不能创建新的 Subagent,只能覆盖已经被发现的同名 Subagent。当前支持覆盖启用状态、模型配置、运行限制、工具白名单,并追加 MCP 服务。
常见用途:
  • 设置 "enabled": false 暂时隐藏某个 Subagent。
  • 为某个 Subagent 单独调整模型和温度。
  • 为自动化场景限制最大轮次或最长执行时间。
  • 在不修改原始 Markdown 的情况下收紧工具集合。
  • 为已有本地 Subagent 追加 MCP 服务。
插件提供的 Subagent 会应用额外安全策略:插件 Subagent 的 hooksmcpServerspermissionMode 会被移除,isolation 只有 worktree 会被保留。

本地 Subagent 可配置全字段表

以下字段适用于 Markdown frontmatter。未识别字段会被忽略。

测试效果

创建或修改 Subagent 后,建议按下面顺序验证:
  1. 执行 /agents reload 或重新打开会话。
  2. /agentsqodercli agents list 中确认它出现在预期来源下。
  3. 检查 description 是否具体说明了何时应该调用它。
  4. 用显式名称调用一次:
  1. 如果配置了只读工具,故意要求它“不要修改文件,只输出审查结果”,并确认没有出现写入操作。
  2. 如果配置了 disallowedTools,尝试让它执行被禁用的能力,确认它会换用其他方式或返回限制说明。
  3. 如果配置了 MCP,检查 Subagent 是否能发现目标 MCP 工具,并确认 tools 没有把该工具挡掉。
  4. 如果配置了 background 或要求后台运行,确认启动结果立即返回;主会话没有其他工作时会显示等待状态,完成通知随后自动回到主会话。
如果没有被调用,先改用显式名称或 @name;如果仍不可用,查看 /agents 面板中的加载错误。

最佳实践

  • 一个 Subagent 只承担一种清晰职责,不要把审查、实现、测试、发布都塞进同一个提示词。
  • description 写给调度判断使用,正文提示词写给 Subagent 自己使用;两者都要具体。
  • 默认先给只读工具,需要写入时再加入 EditWriteBash
  • 对高风险 Subagent 设置 maxTurnstimeoutMins 和明确的 permissionMode
  • 需要独立改动时使用 isolation: worktree,并在结果返回后检查 worktree 路径和实际 diff。
  • 依赖 MCP 工具时,同时写清 mcpServerstools,避免工具发现了但没有授权使用。
  • 项目级 Subagent 适合提交到版本控制,用户级 Subagent 适合个人偏好和跨项目工作流。
  • 修改配置后先显式调用测试,再依赖隐式调度。
  • 对插件分发的 Subagent,不要依赖 hooksmcpServerspermissionMode 这类会被安全策略移除的字段。

常见问题

Subagent 和主会话有什么区别?

Subagent 在独立上下文中运行,使用自己的系统提示词、工具集合、运行限制和权限声明。它的结果会返回给主会话,由主会话继续整理并回复用户。

为什么我创建的项目级 Subagent 没有出现?

确认文件位于 .qoder/agents/<name>.md,frontmatter 至少包含 namedescription,并且当前项目已被信任。修改后执行 /agents reload,并查看 /agents 面板中的加载错误。

为什么同名 Subagent 没有按我预期生效?

同名时高优先级来源会覆盖低优先级来源。优先级是 Built-in < User < Project < Plugin < Flag。可以用 qodercli agents list 查看 shadowed 项。

description 和正文提示词有什么区别?

description 用于说明何时调用这个 Subagent,影响调度选择;正文提示词是 Subagent 被调用后看到的系统提示词,影响它怎么完成任务。

可以同时使用多个 Subagent 吗?

可以。对于彼此独立的任务,Qoder CLI 可以并发调度多个 Subagent;对于有依赖关系的任务,在提示中说明先后顺序。

可以让 Subagent 再调用其他 Subagent 吗?

可以,但需要工具集合里保留 Agent。如果只允许调用特定 Subagent,可以使用 Agent(name)Agent(name1, name2);如果完全不允许继续调度,使用 disallowedTools: [Agent]

为什么 Subagent 不能使用我配置的 MCP 工具?

先确认 MCP 服务已经被 mcpServers 或全局配置发现,再确认 tools 中放行了对应工具名。只写 mcpServers 不等于自动授权所有 MCP 工具。

为什么 Subagent 的权限没有变得更严格?

如果父会话已经处于 acceptEditsbypassPermissionsauto,Subagent 不能通过自己的 permissionMode 把权限降得更严格。未声明 permissionMode 时也会继承父会话当前模式。

后台 Subagent 的结果在哪里看?

后台运行时,主会话会先收到启动结果,可以继续处理不依赖该结果的工作。如果暂时没有其他工作,主会话流中会显示等待状态,表示会话仍在运行。任务完成后,结果会自动返回主会话,由主会话继续整理或执行后续步骤。在 TUI 中可以通过 /tasks 查看状态和结果,或停止仍在运行的任务。

可以编辑内置或插件 Subagent 吗?

内置和插件 Subagent 不建议直接编辑。需要定制时,创建用户级或项目级 Subagent;如果使用同名覆盖,注意来源优先级和插件安全策略。