跳到正文
FunCoding

搜索

搜索文档、Skill 和 MCP

SDK 自定义代理

定义代理职责、工具与模型范围,预选代理并观察 subagent 生命周期。

自定义代理是附着到会话的命名配置;runtime 将部分任务交给它运行时,它成为 subagent。每个代理可以有自己的 prompt、工具和 MCP 配置,执行上下文与父代理分开,事件仍回到父会话流。

定义职责和工具

const session = await client.createSession({
  customAgents: [
    {
      name: "researcher",
      description: "Explores code structure and explains existing behavior",
      prompt: "Analyze the assigned code and report findings with file locations.",
      tools: ["grep", "glob", "view"],
    },
    {
      name: "editor",
      description: "Makes targeted code changes",
      prompt: "Make the requested changes and verify their behavior.",
      tools: ["view", "edit", "bash"],
      infer: false,
    },
  ],
});

name 和 prompt 必填;description 应说明可区分的专业能力,帮助 runtime 匹配任务。上例 researcher 只列出读取工具;editor 的 infer: false 阻止自动选择,适合只由明确请求调用的代理。这里没有设置全局自动批准权限的处理器。

字段用途
name唯一标识
displayName事件中适合显示的名称
description用于匹配任务的能力说明
prompt代理指令
tools可用工具名称;省略或 null 可访问会话配置的全部工具
mcpServers代理专用 MCP 配置
infer是否允许自动选择,默认 true
skills启动时预加载的技能名称
model、reasoningEffort代理运行时的模型与推理强度覆盖

工具列表限定可见能力,不产生操作系统隔离。父会话已经排除的工具,也不能靠子代理再列一次恢复权限。

预选代理与任务委派

会话配置 agent: "researcher" 可在第一个 prompt 前选中同一 customAgents 数组中的代理,名称必须匹配。它相当于创建后调用 session.rpc.agent.select(),省去额外选择调用。

自动委派则由 runtime 将任务与代理的名称和描述匹配,在允许 infer 时选择代理,运行后将结果整合进父代理回答。预选整个会话的活动代理与按任务启动 subagent 是两个入口,不必假设每次配置了代理都会创建子任务。

模型和技能不总是继承

指定 model、reasoningEffort 可以覆盖父会话。省略推理强度时,SDK 不发送该代理的覆盖值,由 runtime 按自己的优先级解析。官方列出每次调用选项、已解析模型默认值或代理定义等优先来源;只有在这些来源未决定且子代理与父代理模型相同时,才会回退继承父代理强度。子代理使用不同模型时回退到该模型默认值,不能一概说继承父会话。

代理 skills 从会话 skillDirectories 按名称解析,并在启动时注入完整内容。省略就不预加载,子代理也不自动继承父代理技能。目录配置见 SDK Skills。

让主代理只负责协调

对于会产生大量结果的工具,可以先在会话 tools 注册其 handler,再通过 defaultAgent.excludedTools 对默认主代理隐藏,同时让特定自定义代理的 tools 包含它。

筛选项范围结果
会话 availableTools所有代理限定整个会话的工具集合
会话 excludedTools所有代理全局排除工具
defaultAgent.excludedTools默认主代理隐藏工具,但不删除 handler,也不阻止获准的子代理调用

先应用会话筛选,再应用默认代理筛选。把同一工具同时放进会话 excludedTools 和默认代理排除列表,结果仍是所有代理都不可用。此机制适合把重型分析结果留在专门代理上下文,不是绕过会话权限。

展示子任务进度

父会话可订阅以下生命周期事件:

事件主要信息
subagent.selectedagentName、agentDisplayName、tools
subagent.startedtoolCallId、名称、描述、可选 model
subagent.completedtoolCallId、名称,以及可选 model、durationMs、totalTokens、totalToolCalls
subagent.failed同类关联信息和 error,部分统计可选
subagent.deselected切回后的生命周期通知

按 toolCallId 关联启动、成功与失败,按事件信封 agentId 区分子代理来源;主代理及会话级事件省略 agentId。不要把子代理文本增量当主回答直接拼接。更完整的渲染字段见事件流,同时运行多个独立子任务见 Fleet。