多 agent 协作¶
Rein 是单-agent harness,刻意不做内置的多 agent 编排引擎(角色、群聊、路由、状态图)——这是定位选择。但因为 Rein 的 Agent 就是个普通对象、run() 返回文本,你能用纯 Python 把多个 agent 拼起来协作。
一个被低估的好处
每个子 agent 仍是完整的 Rein agent —— 各自有自己的熔断四道闸、HITL 审批、断点续跑、可观测,甚至自己的工具和知识库。你是在用一堆「生产级单 agent」拼协作,而不是塞进一个黑盒编排器。
① 委派式(agent 即工具)¶
把一个 agent 包成另一个 agent 的工具,让协调者自己决定何时委派:
from rein import Agent
researcher = Agent("anthropic/...", system="你是市场研究员")
writer = Agent("anthropic/...", system="你是商业文案")
boss = Agent("anthropic/...", system="你统筹调研与成文")
@boss.tool
def research(topic: str) -> str:
"把课题委派给研究员 agent"
return researcher.run(topic).output # 一个 agent 调另一个
@boss.tool
def write(brief: str) -> str:
"把要点交给文案 agent 成文"
return writer.run(brief).output
boss.run("出一份新能源市场简报") # boss 自己决定先调研、再成文
② 流水线(A 的输出 → B 的输入)¶
固定顺序时,直接串起来:
outline = planner.run("规划文章结构").output
draft = writer.run(f"按这个结构写:{outline}").output
final = editor.run(f"润色这篇:{draft}").output
③ 并行(同时跑,再汇总)¶
import asyncio
async def main():
ra, rb = await asyncio.gather(
optimist.arun("评估这个项目"),
skeptic.arun("评估这个项目"),
)
return ra.output, rb.output
跨进程 / 跨框架:走 A2A¶
上面三种是「同进程内」协作。要让你的 agent 被别的进程 / 别的框架的 agent 调用,把它暴露成 A2A 服务:
反过来,把「调远程 A2A agent」做成一个工具,你的 agent 就能调别人的(还是 agent 即工具):
import httpx
@agent.tool
def ask_remote(question: str) -> str:
"向远程 A2A agent 提问"
resp = httpx.post("https://other-agent.example.com/", json={
"jsonrpc": "2.0", "id": "1", "method": "message/send",
"params": {"message": {"role": "user", "parts": [{"kind": "text", "text": question}]}},
}).json()
return resp["result"]["status"]["message"]["parts"][0]["text"]
什么时候该用专门的多 agent 框架?¶
| 需求 | 建议 |
|---|---|
| 层级委派 / 流水线 / 并行 | Rein 的 agent 即工具够用,更透明可控 |
| 跨进程/跨框架互操作 | Rein A2A 服务端接入 A2A 生态 |
| 复杂 agent 网络(动态路由、群聊、共享黑板、复杂状态机) | 用 CrewAI / AutoGen / LangGraph,或在它们里把 Rein agent 当执行节点 |
Rein 不和它们抢「编排」这件事 —— 它把每个单 agent 做到生产级,协作交给组合或 A2A。