两种 Agent 间通信机制 —— 根据是否共享对话历史来选择。
## `delegate` —— 传递接力棒
`delegate` 将当前请求(连同全部对话历史)交给另一个 Agent。被委托的 Agent 能看到相同的消息,以原始 Agent 的身份继续对话。
适合**路由场景** —— 由一个 Agent 决定由谁来处理请求。
```typescript
// Create Hook —— 路由器
export function Create(
ctx: agent.Context,
messages: agent.Message[]
): agent.Create {
const input = messages[messages.length - 1]?.content || "";
if (input.toLowerCase().includes("code")) {
return {
delegate: {
agent_id: "yao.code-agent",
messages,
},
};
}
if (input.toLowerCase().includes("report")) {
return {
delegate: {
agent_id: "yao.report-agent",
messages,
options: { metadata: { source: "router" } },
},
};
}
return { messages }; // 本地处理
}
```
`delegate` 也可以从 `Next` Hook 返回 —— 在看到 LLM 响应之后再决定路由。
## `ctx.agent.Call` —— 作为函数调用
`ctx.agent.Call` 在**独立上下文**中运行另一个 Agent,拥有独立的对话历史,结果返回给调用方 Hook。适合**子任务场景** —— 需要隔离的并行或顺序处理。
```typescript
// Create Hook —— 并发发给多个专项 Agent
export function Create(
ctx: agent.Context,
messages: agent.Message[]
): agent.Create {
const query = messages[messages.length - 1]?.content || "";
// 并行调用
const results = ctx.agent.All([
{
agent: "yao.web-searcher",
messages: [{ role: "user", content: query }],
},
{
agent: "yao.kb-searcher",
messages: [{ role: "user", content: query }],
},
]);
// 将结果合并为单条上下文消息
const context = results
.filter((r) => !r.error)
.map((r) => r.content)
.join("\n\n");
const enriched = [
{ role: "system" as const, content: `搜索结果:\n${context}` },
...messages,
];
return { messages: enriched };
}
```
## 对比
| | `delegate` | `ctx.agent.Call` |
|---|---|---|
| 对话历史 | 共享 | 独立 |
| 适用场景 | 路由 | 子任务、并行处理 |
| 结果是否返回调用方 | 否 | 是 |
| 可用位置 | Create、Next Hook | Create、Next Hook |
| 流式输出到客户端 | 自动 | 通过 `onChunk` 选择性启用 |
## 从子 Agent 流式输出到客户端
```typescript
const result = ctx.agent.Call("yao.sub-agent", messages, {
onChunk: (msg) => {
ctx.Send(msg); // 实时转发 chunk
return 0; // 0 = 继续,非零 = 停止
},
});
```
## 顺序流水线
链式调用 Agent,每个 Agent 的输出作为下一个的输入:
```typescript
export function Create(
ctx: agent.Context,
messages: agent.Message[]
): agent.Create {
// 第一步:提取意图
const intentResult = ctx.agent.Call("yao.intent-agent", messages);
const intent = intentResult.content;
// 第二步:根据意图执行
const actionResult = ctx.agent.Call("yao.action-agent", [
...messages,
{ role: "assistant", content: intent },
{ role: "user", content: "Execute the above." },
]);
// 将两个结果注入为上下文
const enriched = [
{
role: "system" as const,
content: `意图:${intent}\n执行结果:${actionResult.content}`,
},
...messages,
];
return { messages: enriched };
}
```
## 真实示例:Robot 流水线
`robot-host` Assistant 将每个阶段(灵感 → 目标 → 任务 → 校验 → 交付)路由到专项 Agent,每个阶段通过 `ctx.agent.Call` 独立运行,结果传递给下一阶段:
```typescript
// 简化自 yaobots/assistants/yao/robot-host
export function Create(
ctx: agent.Context,
messages: agent.Message[]
): agent.Create {
const phase = ctx.memory.chat.Get("phase") as string || "inspiration";
if (phase === "inspiration") {
return {
delegate: {
agent_id: "yao.robot-inspiration",
messages,
},
};
}
// ... 更多阶段
return { messages };
}
```
## 下一步
所有核心机制都介绍完了,是时候构建一个真实的 Agent 了。
→ **[实战:书签 Agent](./build-assistant)**