跳转到内容

多 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 = {};
}

关键设计原则

  1. 明确”现在是谁在说话”:每条回复带”🎯 PM 阶段” / ”🛠 Tech 阶段”标签
  2. 状态持久化:单进程内存 OK;多 replica 必须 Redis / PG
  3. 退出机制:用户随时说”取消” / “重来”应回到 idle
  4. 多 LLM 选型:PM 用便宜模型(mini),Tech 用强模型(gpt-4o / claude-sonnet)
  5. 避免角色串味:每个 LLM 调用 system prompt 严格界定角色

何时升级到真·多 Agent

  • 不同 Agent 独立可发布(如 PM Agent 是平台产品 + 多个 Tech Agent 是各团队的特化版)
  • 不同 Agent 不同密钥 / 权限 scope
  • 用户希望”分别加好友”管理(隐藏 / 删除 PM Agent 但保留 Tech Agent)

这时拆成模式 3 — V2 路线,V1 工具齐备但少见。

相关页面