多 Agent 协作
复杂应用常要多个 Agent 协作:PM Agent 处理需求 → Tech Agent 拆任务 → Reviewer Agent 审代码 → Notification Agent 通知。本页讲三种编排模式。
模式 1:人类作为编排器(最简)
用户 ↔ PM Agent ↔ 用户 ↓ 用户手动转 Tech Agent ↓用户 ↔ Tech Agent ↔ 用户特点:用户手动在群里切 Agent;Agent 之间不直接通信。
适合:MVP / 简单场景 / 不需要自动化。
实现:每个 Agent 独立 SDK 进程,用户在 app 里加多个 Agent。
模式 2:业务侧编排(中等)
用户 ↔ Orchestrator Agent ↔ 用户 │ │ (业务侧编排:调 LLM / 决定下一步) │ ├─ 内部:调 Tech-LLM 解析 ├─ 内部:调 Review-LLM 审 └─ 调 Slack / Jira / 等外部 API特点:只暴露一个 Agent 给用户;业务侧用代码编排(switch / 状态机 / LangGraph)多 LLM 调用 + 工具。
适合:大多数生产场景。
实现:一个 SDK 进程,handler 内部按消息内容路由到不同业务子模块。
agent.addMessageHandler(async (msg) => { const intent = await classifyIntent(msg.payload?.text); switch (intent) { case "request_feature": await handleAsPM(msg); // 内部调 PM-LLM + 创建 issue break; case "ask_technical": await handleAsTech(msg); // 内部调 Tech-LLM + RAG break; case "review_code": await handleAsReviewer(msg); // 内部调 Code Review LLM break; }});模式 3:Agent ↔ Agent(高级)
用户 ↔ PM Agent │ ▼ (PM Agent 把任务发给 Tech Agent — 自动) PM Agent ↔ Tech Agent │ ▼ Tech Agent → 给用户私聊结果特点:Agent 之间通过 Hashee 协议通信。需要:
- PM Agent 把 Tech Agent 加为它自己的”联系人”(PM-Agent 用户身份注册,加 Tech-Agent H2A 关系)
- 或者:两 Agent 同在一个群(H2G)
适合:高复杂度场景(V2+ 路线,V1 工具齐备但少见落地)。
实现复杂度:每个 Agent 都要:
- 维持自己的密钥 + token
- 处理 inbound from 另一 Agent (
sender_type === "agent") - 协议设计:“任务派发”自定义 message subtype 或 artifact
V1 推荐:先用模式 2,避免分布式复杂度。
实战代码(模式 2 — 业务侧编排)
import { HasheeAgent } from "@hasheeai/agent-sdk-ts";import OpenAI from "openai";
const openai = new OpenAI();const agent = await HasheeAgent.init({ /* ... */ });
// === 编排状态机 ===
const state = new Map<string, { phase: "idle" | "gathering" | "designing" | "reviewing"; data: any }>();
agent.addMessageHandler(async (msg) => { if (msg.payload?.type !== "text") return;
const s = state.get(msg.conversation_id) ?? { phase: "idle" as const, data: {} };
switch (s.phase) { case "idle": if (msg.payload.text.match(/新需求|新功能/)) { await transitionToGathering(msg, s); } else { await agent.send(msg.conversation_id, { type: "text", text: "说"新需求 XXX"开始新一轮 PM → Tech → Review 流程。", }); } break;
case "gathering": // PM 角色:收集需求 await handleAsPM(msg, s); break;
case "designing": // Tech 角色:拆任务 + 出方案 await handleAsTech(msg, s); break;
case "reviewing": // Reviewer 角色:审 + 出反馈 await handleAsReviewer(msg, s); break; }
state.set(msg.conversation_id, s);});
async function transitionToGathering(msg: any, s: any) { s.phase = "gathering"; s.data = { request: msg.payload.text }; await agent.send(msg.conversation_id, { type: "text", text: "🎯 进入 PM 阶段。\n\n我会先问几个问题理清需求。\n\n**用户场景是什么?谁会用?**", });}
async function handleAsPM(msg: any, s: any) { s.data.userScenario = msg.payload.text; // 用 PM-LLM 回应 const r = await openai.chat.completions.create({ model: "gpt-4o-mini", messages: [ { role: "system", content: "你是 PM。基于用户场景,问下一个关键问题(成功指标 / 优先级 / deadline)。简短。" }, { role: "user", content: msg.payload.text }, ], }); // 几轮问答后切到 Tech if (s.data.userScenario && s.data.successMetric) { s.phase = "designing"; await agent.send(msg.conversation_id, { type: "text", text: `✓ PM 阶段完成。\n\n📋 总结:\n- 需求:${s.data.request}\n- 场景:${s.data.userScenario}\n- 指标:${s.data.successMetric}\n\n👉 切到 Tech 阶段。**请描述当前系统现状 + 限制条件**。`, }); } else { await agent.send(msg.conversation_id, { type: "text", text: r.choices[0]?.message?.content ?? "" }); s.data.successMetric = msg.payload.text; }}
async function handleAsTech(msg: any, s: any) { s.data.systemContext = msg.payload.text; const r = await openai.chat.completions.create({ model: "gpt-4o", messages: [ { role: "system", content: `你是 Tech Lead。基于 PM 收集的需求 + 系统现状,输出技术方案:架构 / 风险 / 工作量预估。
需求:${s.data.request}场景:${s.data.userScenario}指标:${s.data.successMetric}`, }, { role: "user", content: msg.payload.text }, ], });
s.data.techDesign = r.choices[0]?.message?.content; s.phase = "reviewing";
await agent.send(msg.conversation_id, { type: "text", text: `🛠 Tech 方案:\n\n${s.data.techDesign}\n\n---\n\n👉 切到 Review 阶段。**有疑问 / 调整 / 批准**?`, });}
async function handleAsReviewer(msg: any, s: any) { const r = await openai.chat.completions.create({ model: "gpt-4o", messages: [ { role: "system", content: `你是 Reviewer。基于以下方案 + 用户反馈,给出最终决策建议。
方案:${s.data.techDesign}`, }, { role: "user", content: msg.payload.text }, ], });
await agent.send(msg.conversation_id, { type: "text", text: `👁 Review 结果:\n\n${r.choices[0]?.message?.content}\n\n---\n\n再说"新需求"开始下一轮。`, }); s.phase = "idle"; s.data = {};}关键设计原则
- 明确”现在是谁在说话”:每条回复带”🎯 PM 阶段” / ”🛠 Tech 阶段”标签
- 状态持久化:单进程内存 OK;多 replica 必须 Redis / PG
- 退出机制:用户随时说”取消” / “重来”应回到 idle
- 多 LLM 选型:PM 用便宜模型(mini),Tech 用强模型(gpt-4o / claude-sonnet)
- 避免角色串味:每个 LLM 调用 system prompt 严格界定角色
何时升级到真·多 Agent
- 不同 Agent 独立可发布(如 PM Agent 是平台产品 + 多个 Tech Agent 是各团队的特化版)
- 不同 Agent 不同密钥 / 权限 scope
- 用户希望”分别加好友”管理(隐藏 / 删除 PM Agent 但保留 Tech Agent)
这时拆成模式 3 — V2 路线,V1 工具齐备但少见。
相关页面
- 客服 bot 教程 — 意图路由模式
- 团队知识 Agent
- Agent 是什么 — 第一性原理