Agent SDK

定义与管理子 Agent

划分专职职责,关联子任务消息,理解声明式委派与运行时控制的区别。

什么时候拆分 Agent

当一个任务包含可独立完成的职责时,可以定义子 Agent。例如主 Agent 整理审查结论,reviewer 只检查代码中的缺陷。分工应有清楚的输入、可用工具和输出要求;简单的一次问答不需要建立多个角色。

agent.Definition 描述子 Agent,执行循环仍在运行时。Bridge 不在 Go 宿主里自行调度模型循环。

注册一个审查成员

options = options.WithAgentDefinition("reviewer", agent.Definition{
    Description: "检查代码中的可复现缺陷,并给出文件位置。",
    Prompt: "只审查,不修改文件。每项结论包含触发条件、文件位置和影响。没有证据时说明尚未确认。",
    Tools: []string{"Read", "Glob", "Grep"},
}).WithAllowedTools("Agent", "Read", "Glob", "Grep")

在任务中明确要求使用 reviewer,并给出检查范围。允许 Agent 工具不意味着你已经批准子 Agent 的所有业务动作;子成员工具和运行时权限仍需按实际策略配置。

Description 帮助主 Agent 判断何时委派,Prompt 约束该成员的职责,Tools 选择它需要的工具。Model 可指定成员模型,但必须是运行时可用的标识,不应在文档或业务代码里假设每个账号都拥有同一个模型。

收集委派结果

流式消息中的 ParentToolUseID 用来关联父工具调用。保留这个关联,界面才能把子成员的过程放回对应任务。不要把所有子 Agent 文本直接拼进主 Agent 的回答,也不要只根据成员名称归类并发任务。

后台任务还可能产生 TaskStarted、TaskProgress、TaskNotification 等消息。它们用于状态跟踪;当前用户回合的 result 与所有后台任务都已结束不是同一件事。宿主应分别记录回合状态和任务状态。

停止与后续消息

session.Control().StopTask(ctx, taskID) 停止指定后台任务。taskID 必须来自运行时返回的任务身份,不是显示名称。检查能力与调用错误后,再更新界面。

SendTaskMessage 可给后台子任务排队后续消息,当前属于 nxs 能力。发送成功表示消息被控制入口接受,不应直接展示成“子任务已完成修改”。完成情况仍从后续事件确认。

原生子任务控制扩展

ControlSubagent 是 nxs 的扩展入口,需要 CapabilitySubagentControl,对应 subagent_control_v1。它在活跃父会话的 MCP 调用身份内使用。普通宿主请求不能伪造一个身份,在任意时刻调用它来绕过父任务边界。

先用声明式 Definition 完成接入。只有产品确实需要管理子任务生命周期时,再按公开运行时契约接入控制扩展。Claude Code 不提供这个 Nexus 扩展。

验证分工是否有效

用一个小型只读任务验证:主 Agent 是否实际委派、成员是否只读取约定范围、返回结果是否带证据、取消是否能结束相关任务。再检查权限拒绝或成员失败时,主 Agent 是否如实报告未完成部分。

工具数量和成员数量增加后,模型上下文与执行时间也会变化。成本记录见用量与预算,消息归属见消息流