快速开始
- 在 TUI 中执行
/agents打开配置面板。 - 按
Tab切换到User或Project标签页。 - 选择
Create new agent...,输入 Subagent 描述并确认。 - 生成后直接在会话中调用它:
什么是 Subagent
当一个任务需要跨多个文件探索、需要稳定的领域判断标准,或者不希望把大量搜索过程塞进主会话上下文时,可以使用 Subagent。主会话负责理解用户目标和编排,Subagent 负责完成一个清晰的子任务,并把最终结果返回给主会话。 Subagent 的核心价值:
Subagent 的核心特性:
如果你已经知道具体文件或具体命令,直接使用对应工具通常更高效;Subagent 更适合开放式、多步骤、需要判断和汇总的任务。
内置 Subagent
Qoder CLI 会注册一组内置 Subagent。不同版本、运行模式和功能开关下,/agents 的 BuiltIn 标签页可能显示不同列表,请以实际列表为准。
常用内置 Subagent:
在特定模式或功能开启时,还可能看到:
内置 Subagent 由 Qoder CLI 提供和维护,不能像用户级或项目级 Subagent 那样直接编辑。需要定制行为时,创建同名或新名称的自定义 Subagent,并通过来源优先级覆盖或显式调用。
查看和使用 Subagent
查看可用列表
TUI 方式
在 TUI 中输入:/agents 面板按来源分组展示 Subagent,并支持查看详情、创建、启用/禁用、编辑自定义项和重新加载。修改 .qoder/agents/ 或 ~/.qoder/agents/ 后,可以执行:
Headless 方式
在非交互环境中,可以使用:来源和优先级
Qoder CLI 会从多个来源发现 Subagent。同名定义按优先级覆盖,优先级从低到高如下:
实际生效的是最高优先级的同名定义;被覆盖的定义会在
qodercli agents list 中标记为 shadowed。
显式调用
TUI 模式
在 TUI 会话中,最稳定的方式是在输入中直接写出 Subagent 名称:@ 提及已经加载的 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:
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 会自动生成完整的配置文件。 操作步骤:- 在 TUI 中执行
/agents进入配置面板。 - 按
Tab切换到User或Project标签页。 - 选择
Create new agent...并按Enter。 - 输入 Subagent 描述,按
Enter确认。
方式二:手动编写配置(进阶)
如果你需要完全控制 Subagent 配置,可以手动创建 Markdown 配置文件:name 字段。
用 --agents 临时注入
--agents 适合 Headless、脚本和一次性自动化。它接收一个 JSON 对象,键是 Subagent 名称,值是定义内容。通过 --agents 注入的 Subagent 只对当前进程生效,并且同名时优先级最高。
--agents 使用 prompt 字段作为系统提示词。当前 JSON schema 支持:description、prompt、tools、disallowedTools、mcpServers、model、effort、color、maxTurns、initialPrompt、skills、permissionMode。如果需要 timeoutMins、temperature、hooks、memory、background 或 isolation,请使用 Markdown 配置。
配置 Subagent
选择作用域
创建或注入自定义 Subagent 时,可以选择以下作用域:配置工具
tools 和 disallowedTools 都可以写成逗号分隔字符串或字符串数组。字符串数组既可以使用 YAML 内联数组,也可以使用 YAML 列表:
Read、Grep、Glob、Bash、Write、Edit、WebFetch、WebSearch、Agent。
MCP 工具使用完全限定名:
Agent(name) 表达式:
Agent:
tools 注册可用工具,再应用 disallowedTools 移除工具。对于 MCP 工具,必须先通过 mcpServers 或全局 MCP 配置发现,再通过 tools 放行,Subagent 才能使用。
配置 MCP
可以引用已经配置好的 MCP 服务:mcpServers 支持数组格式,也支持对象格式。内联服务字段如下:
定义 Hook
hooks 写在 Subagent frontmatter 中时,只对该 Subagent 会话生效。支持的事件包括 PreToolUse、PostToolUse、PostToolUseFailure、Stop、SubagentStart、SubagentStop、Notification。
hooks 不支持字符串简写。每个事件的值必须是 matcher 数组;每个 matcher 里再通过 hooks 数组声明一个或多个 Hook。
Subagent 中的 Stop 会映射为 SubagentStop,即在该 Subagent 完成时触发,而不是在主会话结束时触发。
hooks 支持以下类型:
frontmatter schema 也接受
once,但普通 Subagent frontmatter 中该字段不会作为一次性 Hook 语义保留;需要一次性行为时,请在 Hook 命令或外部状态中自行控制。
配置权限模式
permissionMode 控制 Subagent 工具调用的审批方式。
permissionMode 建议使用上表中的规范值。运行时会兼容大小写、下划线、连字符等写法;yolo 会被兼容解析为 bypassPermissions,但公开配置建议直接写 bypassPermissions。
需要注意:
- 未声明
permissionMode时,Subagent 继承父会话当前模式。 - 父会话已经处于
acceptEdits、bypassPermissions或auto时,Subagent 不能通过自己的配置把权限降得更严格。 plan不会污染主会话计划状态,它只在该 Subagent 的隔离上下文中生效。
配置远程 Subagent
远程 Subagent 通过 Agent Card 加载,不使用 Markdown 正文作为系统提示词,而是根据远程 Agent Card 暴露的能力和描述完成调用。agentCardJson 内联 Agent Card JSON。远程 Subagent 支持 auth 字段;常用认证类型包括 apiKey、http 和 oauth。需要认证时,建议把远程 Subagent 放在用户级配置中,避免把凭据提交到项目仓库。
使用 settings.json 覆盖已有 Subagent
settings.json 不能创建新的 Subagent,只能覆盖已经被发现的同名 Subagent。当前支持覆盖启用状态、模型配置、运行限制、工具白名单,并追加 MCP 服务。
- 设置
"enabled": false暂时隐藏某个 Subagent。 - 为某个 Subagent 单独调整模型和温度。
- 为自动化场景限制最大轮次或最长执行时间。
- 在不修改原始 Markdown 的情况下收紧工具集合。
- 为已有本地 Subagent 追加 MCP 服务。
hooks、mcpServers、permissionMode 会被移除,isolation 只有 worktree 会被保留。
本地 Subagent 可配置全字段表
以下字段适用于 Markdown frontmatter。未识别字段会被忽略。测试效果
创建或修改 Subagent 后,建议按下面顺序验证:- 执行
/agents reload或重新打开会话。 - 在
/agents或qodercli agents list中确认它出现在预期来源下。 - 检查
description是否具体说明了何时应该调用它。 - 用显式名称调用一次:
- 如果配置了只读工具,故意要求它“不要修改文件,只输出审查结果”,并确认没有出现写入操作。
- 如果配置了
disallowedTools,尝试让它执行被禁用的能力,确认它会换用其他方式或返回限制说明。 - 如果配置了 MCP,检查 Subagent 是否能发现目标 MCP 工具,并确认
tools没有把该工具挡掉。 - 如果配置了
background或要求后台运行,确认启动结果立即返回;主会话没有其他工作时会显示等待状态,完成通知随后自动回到主会话。
@name;如果仍不可用,查看 /agents 面板中的加载错误。
最佳实践
- 一个 Subagent 只承担一种清晰职责,不要把审查、实现、测试、发布都塞进同一个提示词。
description写给调度判断使用,正文提示词写给 Subagent 自己使用;两者都要具体。- 默认先给只读工具,需要写入时再加入
Edit、Write或Bash。 - 对高风险 Subagent 设置
maxTurns、timeoutMins和明确的permissionMode。 - 需要独立改动时使用
isolation: worktree,并在结果返回后检查 worktree 路径和实际 diff。 - 依赖 MCP 工具时,同时写清
mcpServers和tools,避免工具发现了但没有授权使用。 - 项目级 Subagent 适合提交到版本控制,用户级 Subagent 适合个人偏好和跨项目工作流。
- 修改配置后先显式调用测试,再依赖隐式调度。
- 对插件分发的 Subagent,不要依赖
hooks、mcpServers、permissionMode这类会被安全策略移除的字段。
常见问题
Subagent 和主会话有什么区别?
Subagent 在独立上下文中运行,使用自己的系统提示词、工具集合、运行限制和权限声明。它的结果会返回给主会话,由主会话继续整理并回复用户。为什么我创建的项目级 Subagent 没有出现?
确认文件位于.qoder/agents/<name>.md,frontmatter 至少包含 name 和 description,并且当前项目已被信任。修改后执行 /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 的权限没有变得更严格?
如果父会话已经处于acceptEdits、bypassPermissions 或 auto,Subagent 不能通过自己的 permissionMode 把权限降得更严格。未声明 permissionMode 时也会继承父会话当前模式。
后台 Subagent 的结果在哪里看?
后台运行时,主会话会先收到启动结果,可以继续处理不依赖该结果的工作。如果暂时没有其他工作,主会话流中会显示等待状态,表示会话仍在运行。任务完成后,结果会自动返回主会话,由主会话继续整理或执行后续步骤。在 TUI 中可以通过/tasks 查看状态和结果,或停止仍在运行的任务。