Skip to content
FunCoding

Search

Search docs, Skills and MCP

SDK 自定义代理

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

This page has not been translated into English yet. The original Chinese version is shown below.

自定义代理是附着到会话的命名配置;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。