返回列表
🧠 阿头学 · 💬 讨论题 · 💰投资

Agent Relay——让多智能体协作摆脱人肉消息总线

多智能体协作的真正瓶颈不是模型能力,而是开发者沦为"人肉消息总线"的低效架构,Agent Relay 通过对等通信层让智能体直接协作,但其核心价值主张还需要更强的工程证明。
打开原文 ↗

2026-02-28 原文链接 ↗
阅读简报
双语对照
完整翻译
原文
讨论归档

核心观点

  • 人类不应该是多智能体系统的运行时 当前开发者在多个终端间手动复制粘贴上下文、转发报错、协调轮次,这不是"多智能体协作",而是人肉编排。真正的多智能体系统应该让智能体直接通信,人类只负责设定目标和最终审阅。
  • 对等协作优于层级调用 子智能体(父→子→返回结果)适合线性、确定的任务拆解,但长周期、需要持续迭代的工作需要"像 Slack 一样的对话通道"——规划者、执行者、研究者在同一频道实时对齐、互相评审,这种横向沟通能催生更具涌现性的方案。
  • 跨模型协作是未来标配,但难点被轻描淡写 Relay 声称支持跨 Provider(Claude + Codex 同时工作),但文章完全回避了真正的工程难点:不同模型的 rate limit、延迟、Token 成本差异,以及各家模型在消息格式、工具调用风格上的不兼容性。跨 Provider 的可靠调度与一致性控制才是硬骨头。
  • 示例与宣传的落差很大 文章宣传"系统级长时间工作流"和"实时调整",但唯一的具体例子是 tic-tac-toe(两个 Agent 在一个频道互发消息)。没有给出任何关于错误恢复、幂等处理、状态持久化、无限循环防护的讨论,这些才是生产级多智能体系统的真正难点。
  • "涌现性"和"更有创意方案"缺乏任何证据 作者声称同级智能体对话"通常能带来更有创意、更具涌现性的方案",但没有对比实验、没有具体案例、没有指标数据,这更像是多 Agent 圈子里的营销用语而非被论证过的性质。

跟我们的关联

  • 对 ATou 意味着什么 如果你现在在多个 LLM 之间手动转发上下文和报错,这篇文章戳中了你的痛点。下一步可以审视自己的 Agent 系统:人类是否真的在充当"消息总线"?如果是,考虑用 Relay 或类似的通信层来重构,而不是继续加更多 Agent。
  • 对 Neta 意味着什么 这反映了 AI 基础设施的一个新赛道:不是更聪明的单体模型,而是"智能体社会学"——为 AI 打造无界面的协作基础设施。跨模型通信协议比单一厂商的生态闭环更有商业想象力,但也意味着这类 SDK 极易在官方底层更新后过时(OpenAI Swarm、Anthropic 的编排能力都在快速演进)。
  • 对 Uota 意味着什么 这是一篇典型的产品 PR 软文,作者是 Agent Relay 的直接利益相关方。核心论点(人肉消息总线是瓶颈)是真实的,但论证方式存在"稻草人谬误"(假设只有"纯手动"和"用 Relay"两个极端)和"过度外推"(用玩具代码推导复杂场景)。评估时要分离"问题真实性"和"解决方案必然性"。
  • 下一步怎么用 如果你在设计多 Agent 系统,用"人不在环"的三步法:1)角色分解但不强制层级;2)通信优先于调用;3)人类从"转发节点"升级为"旁观+插手"的参与者。这个思路不一定要用 Relay,但架构思想是可迁移的。

讨论引子

  • 你现在的多 Agent 系统中,人类充当"消息总线"的频率有多高?这是架构问题还是工具问题?
  • 对等协作(Relay 模式)vs 层级调用(子智能体模式)——在你的具体任务中,哪种更容易产生"涌现性"的好方案?有没有实际对比过?
  • 跨 Provider 协作听起来很美,但成本控制、错误处理、一致性保证这些硬问题,Relay 或类似方案真的解决了吗,还是只是把问题隐藏在 SDK 里?

你开着好几个终端:一个智能体在制定计划,另一个在执行。你像个极有耐心的中层经理一样在它们之间来回切换标签页。你把 CI 里的报错复制出来粘到 Claude;又把 Codex 的反馈粘到 OpenCode。你按下回车表示同意:好吧,就这一次,让 claude 跑一下 find . -type f -name "*.ts" -print0 | xargs -0 grep -Hn "any" 也完全没问题。你的研究智能体发现了有意思的东西,把它写进一个 SUPER_DETAILED_RESEARCH.md 文档里。你的规划智能体需要它,但你把那段 Markdown 粘进规划智能体后,它又发现还有别的点需要上下文。于是你找到另一个终端,把 Markdown 又复制回研究提示词里。然后你微调计划。然后你调整正在跑计划的 codex 终端。然后你审阅输出。然后因为还不太对,你又从头再来一遍。唉,又要压缩上下文?!天哪……我累坏了。写软件本来挺好玩!你知道什么不好玩吗?给一堆 LLM 当“高级消息总线”。

今天我很兴奋想给你展示一种更好的方式——你不再是瓶颈。

与其让你夹在中间当胶水……要是它们能直接互相“聊起来”,会怎样?

The Agent Relay SDK

Relay 为多智能体系统提供了一个确定性的基础:

  • 实时推送通信

  • 启动与释放智能体

  • 频道、表情回应、已读回执——基本就是 slack,但面向无界面(headless)场景,并且是为智能体打造的

Relay 不是一套定制的 harness,因此你可以按自己喜欢的方式带上配置。你的 skills 和配置应该开箱即用。

想象一下,让两个智能体下井字棋。用 relay SDK 做这件事很简单:

import { AgentRelay, Models } from "@agent-relay/sdk";

const relay = new AgentRelay();

relay.onMessageReceived = (msg) =>
  console.log(`[${msg.from} → ${msg.to}]: ${msg.text}`);

const channel = ["tic-tac-toe"];

const x = await relay.claude.spawn({
  name: "PlayerX",
  model: Models.Claude.SONNET,
  channels: channel,
  task: "Play tic-tac-toe as X against PlayerO. You go first.",
});

const o = await relay.codex.spawn({
  name: "PlayerO",
  model: Models.Codex.GPT_5_3_CODEX_SPARK,
  channels: channel,
  task: "Play tic-tac-toe as O against PlayerX.",
});

await Promise.all([
  relay.waitForAgentReady("PlayerX"),
  relay.waitForAgentReady("PlayerO"),
]);

relay.system().sendMessage({ to: "PlayerX", text: "Start." });

await AgentRelay.waitForAny([x, o], 5 * 60 * 1000);
await relay.shutdown();

没有 Relay 的话:

  • 你得在智能体之间手动拷贝棋盘状态。

  • 你得负责判断轮到谁走。

  • 你会无聊又痛苦地看着平局在慢动作里发生

同样的原语也能扩展到更复杂的任务。当你有长时间运行的工作流时,在工作进行过程中就能获得反馈会非常有价值;规划者、执行者和研究者都可以向前讨论并评估计划,无需等人类说一句“k”。

当然,你需要的时候也可以旁观并随时插手,但智能体在没有你的情况下把事情推进下去的能力,往往好得出乎意料。

我们不是已经有子智能体了吗?

虽然这在直觉上感觉像子智能体,但它们其实差别很大,而且是互补的。

  1. 子智能体是分层的。(即 Parent → child → result)这对于“做这个子任务”很好用,但在系统级或长时间运行的工作上就不灵了。当你需要实时调整或反馈时怎么办?有了 relay,你仍然可以利用子智能体(而且应该!)来完成子任务。有了 relay,你可以让同级智能体来回对话,直到形成结论。这通常能带来更有创意、更具涌现性的方案。

  2. 子智能体无法跨 provider 工作。你会希望针对当前任务从多个提供商中选用最合适的模型,并且让它能与其他 agent.s 无缝协作。

开源,也欢迎贡献

如果你曾觉得自己像在管理一支速度很快、却非常健忘的工程团队……这就是为你准备的。去(或者更可能是把链接丢给你的智能体)https://github.com/AgentWorkforce/relay 试一试。

做点不需要你亲自当运行时的东西。

链接:http://x.com/i/article/2027535041564225536

TLDR: Your software should coordinate. Our SDK can help you do that.

Tell me if this sounds familiar.

You have multiple terminals open. One agent is building a plan. Another is executing it. You’re tabbing between them like a very patient middle manager. You copy errors out of CI and paste them into Claude. You paste feedback from Codex into OpenCode. You press enter to say yes, it’s totally fine that claude runs find . -type f -name "*.ts" -print0 | xargs -0 grep -Hn "any" just this once. Your research agent finds something interesting and writes it to a SUPER_DETAILED_RESEARCH.md document. Your planner needs it, but after pasting the markdown in the planner finds something else it needs context on. So you find the other terminal and copy the markdown back into the research prompt. Then you tweak the plan. Then you adjust the codex terminal running the plan. Then you review the output. Then you start again because it wasn’t quite right. Ugh, compacting again?! Man… I’m exhausted. Software used to be fun! You know what’s not fun? Being a glorified message bus for a bunch of LLMs.

Today I’m excited to show you a better way, one where you are no longer the bottleneck.

Instead of YOU being the glue in the middle… what if they could just, like, talk to each other?

TLDR: 你的软件应该能协同工作。我们的 SDK 可以帮你做到这一点。

看看这段经历你熟不熟悉。

你开着好几个终端:一个智能体在制定计划,另一个在执行。你像个极有耐心的中层经理一样在它们之间来回切换标签页。你把 CI 里的报错复制出来粘到 Claude;又把 Codex 的反馈粘到 OpenCode。你按下回车表示同意:好吧,就这一次,让 claude 跑一下 find . -type f -name "*.ts" -print0 | xargs -0 grep -Hn "any" 也完全没问题。你的研究智能体发现了有意思的东西,把它写进一个 SUPER_DETAILED_RESEARCH.md 文档里。你的规划智能体需要它,但你把那段 Markdown 粘进规划智能体后,它又发现还有别的点需要上下文。于是你找到另一个终端,把 Markdown 又复制回研究提示词里。然后你微调计划。然后你调整正在跑计划的 codex 终端。然后你审阅输出。然后因为还不太对,你又从头再来一遍。唉,又要压缩上下文?!天哪……我累坏了。写软件本来挺好玩!你知道什么不好玩吗?给一堆 LLM 当“高级消息总线”。

今天我很兴奋想给你展示一种更好的方式——你不再是瓶颈。

与其让你夹在中间当胶水……要是它们能直接互相“聊起来”,会怎样?

The Agent Relay SDK

Relay gives you a deterministic foundation for multi-agent systems:

  • real time push communication

  • Spawning and releasing agents

  • channels, emoji reactions, read receipts — basically slack, but for headless and built FOR agents

Relay is NOT a custom harness so you can bring your own configuration as you like it. Your skills and configurations should work out of the box.

Imagine getting two agents to play tic tac toe. With the relay SDK this is simple:

import { AgentRelay, Models } from "@agent-relay/sdk";

const relay = new AgentRelay();

relay.onMessageReceived = (msg) =>
  console.log(`[${msg.from} → ${msg.to}]: ${msg.text}`);

const channel = ["tic-tac-toe"];

const x = await relay.claude.spawn({
  name: "PlayerX",
  model: Models.Claude.SONNET,
  channels: channel,
  task: "Play tic-tac-toe as X against PlayerO. You go first.",
});

const o = await relay.codex.spawn({
  name: "PlayerO",
  model: Models.Codex.GPT_5_3_CODEX_SPARK,
  channels: channel,
  task: "Play tic-tac-toe as O against PlayerX.",
});

await Promise.all([
  relay.waitForAgentReady("PlayerX"),
  relay.waitForAgentReady("PlayerO"),
]);

relay.system().sendMessage({ to: "PlayerX", text: "Start." });

await AgentRelay.waitForAny([x, o], 5 * 60 * 1000);
await relay.shutdown();

Without Relay:

  • You’d have to copy the board state between agents.

  • You’d be the one to decide whose turn it is.

  • You’d be bored and miserable watching ties happen in slow motion

The same primitive scales for other more complex tasks. When you have long running workflows it’s hugely beneficial to have feedback while the work is being done; planners and executors and researchers can all discuss and evaluate plans forward without waiting for a human to say “k”.

Of course you can observe and interject when you need to, but the agents are surprisingly good at making it work without you.

The Agent Relay SDK

Relay 为多智能体系统提供了一个确定性的基础:

  • 实时推送通信

  • 启动与释放智能体

  • 频道、表情回应、已读回执——基本就是 slack,但面向无界面(headless)场景,并且是为智能体打造的

Relay 不是一套定制的 harness,因此你可以按自己喜欢的方式带上配置。你的 skills 和配置应该开箱即用。

想象一下,让两个智能体下井字棋。用 relay SDK 做这件事很简单:

import { AgentRelay, Models } from "@agent-relay/sdk";

const relay = new AgentRelay();

relay.onMessageReceived = (msg) =>
  console.log(`[${msg.from} → ${msg.to}]: ${msg.text}`);

const channel = ["tic-tac-toe"];

const x = await relay.claude.spawn({
  name: "PlayerX",
  model: Models.Claude.SONNET,
  channels: channel,
  task: "Play tic-tac-toe as X against PlayerO. You go first.",
});

const o = await relay.codex.spawn({
  name: "PlayerO",
  model: Models.Codex.GPT_5_3_CODEX_SPARK,
  channels: channel,
  task: "Play tic-tac-toe as O against PlayerX.",
});

await Promise.all([
  relay.waitForAgentReady("PlayerX"),
  relay.waitForAgentReady("PlayerO"),
]);

relay.system().sendMessage({ to: "PlayerX", text: "Start." });

await AgentRelay.waitForAny([x, o], 5 * 60 * 1000);
await relay.shutdown();

没有 Relay 的话:

  • 你得在智能体之间手动拷贝棋盘状态。

  • 你得负责判断轮到谁走。

  • 你会无聊又痛苦地看着平局在慢动作里发生

同样的原语也能扩展到更复杂的任务。当你有长时间运行的工作流时,在工作进行过程中就能获得反馈会非常有价值;规划者、执行者和研究者都可以向前讨论并评估计划,无需等人类说一句“k”。

当然,你需要的时候也可以旁观并随时插手,但智能体在没有你的情况下把事情推进下去的能力,往往好得出乎意料。

Don’t we already have subagents?

While this feels similar to subagents, they’re actually quite different and complementary.

  1. Subagents are hierarchical. (i.e Parent → child → result ) That works for “do this subtask.” but it breaks for systems or long running work. What happens when you need to adjust or have feedback in real time? With relay, you can still take advantage of subagents (and should!) to complete a subtask. With relay, you can have peer conversations back and forth to come to a conclusion. This generally allows for more creative and emergent solutions.

  2. Subagents don’t work cross provider. You want to be able to use the best model from multiple providers for the given task and you want it to work seamlessly with other agent.s

我们不是已经有子智能体了吗?

虽然这在直觉上感觉像子智能体,但它们其实差别很大,而且是互补的。

  1. 子智能体是分层的。(即 Parent → child → result)这对于“做这个子任务”很好用,但在系统级或长时间运行的工作上就不灵了。当你需要实时调整或反馈时怎么办?有了 relay,你仍然可以利用子智能体(而且应该!)来完成子任务。有了 relay,你可以让同级智能体来回对话,直到形成结论。这通常能带来更有创意、更具涌现性的方案。

  2. 子智能体无法跨 provider 工作。你会希望针对当前任务从多个提供商中选用最合适的模型,并且让它能与其他 agent.s 无缝协作。

Open source and open to contributions

If you’ve felt like the manager of a very fast, very forgetful engineering team…This is for you. Go to (or probably just point your agent to) https://github.com/AgentWorkforce/relay and try it out.

Build something that doesn’t require you to be the runtime.

Link: http://x.com/i/article/2027535041564225536

开源,也欢迎贡献

如果你曾觉得自己像在管理一支速度很快、却非常健忘的工程团队……这就是为你准备的。去(或者更可能是把链接丢给你的智能体)https://github.com/AgentWorkforce/relay 试一试。

做点不需要你亲自当运行时的东西。

链接:http://x.com/i/article/2027535041564225536

相关笔记

You have multiple terminals open. One agent is building a plan. Another is executing it. You’re tabbing between them like a very patient middle manager. You copy errors out of CI and paste them into Claude. You paste feedback from Codex into OpenCode. You press enter to say yes, it’s totally fine that claude runs find . -type f -name "*.ts" -print0 | xargs -0 grep -Hn "any" just this once. Your research agent finds something interesting and writes it to a SUPER_DETAILED_RESEARCH.md document. Your planner needs it, but after pasting the markdown in the planner finds something else it needs context on. So you find the other terminal and copy the markdown back into the research prompt. Then you tweak the plan. Then you adjust the codex terminal running the plan. Then you review the output. Then you start again because it wasn’t quite right. Ugh, compacting again?! Man… I’m exhausted. Software used to be fun! You know what’s not fun? Being a glorified message bus for a bunch of LLMs.

Today I’m excited to show you a better way, one where you are no longer the bottleneck.

Instead of YOU being the glue in the middle… what if they could just, like, talk to each other?

The Agent Relay SDK

Relay gives you a deterministic foundation for multi-agent systems:

  • real time push communication

  • Spawning and releasing agents

  • channels, emoji reactions, read receipts — basically slack, but for headless and built FOR agents

Relay is NOT a custom harness so you can bring your own configuration as you like it. Your skills and configurations should work out of the box.

Imagine getting two agents to play tic tac toe. With the relay SDK this is simple:

import { AgentRelay, Models } from "@agent-relay/sdk";

const relay = new AgentRelay();

relay.onMessageReceived = (msg) =>
  console.log(`[${msg.from} → ${msg.to}]: ${msg.text}`);

const channel = ["tic-tac-toe"];

const x = await relay.claude.spawn({
  name: "PlayerX",
  model: Models.Claude.SONNET,
  channels: channel,
  task: "Play tic-tac-toe as X against PlayerO. You go first.",
});

const o = await relay.codex.spawn({
  name: "PlayerO",
  model: Models.Codex.GPT_5_3_CODEX_SPARK,
  channels: channel,
  task: "Play tic-tac-toe as O against PlayerX.",
});

await Promise.all([
  relay.waitForAgentReady("PlayerX"),
  relay.waitForAgentReady("PlayerO"),
]);

relay.system().sendMessage({ to: "PlayerX", text: "Start." });

await AgentRelay.waitForAny([x, o], 5 * 60 * 1000);
await relay.shutdown();

Without Relay:

  • You’d have to copy the board state between agents.

  • You’d be the one to decide whose turn it is.

  • You’d be bored and miserable watching ties happen in slow motion

The same primitive scales for other more complex tasks. When you have long running workflows it’s hugely beneficial to have feedback while the work is being done; planners and executors and researchers can all discuss and evaluate plans forward without waiting for a human to say “k”.

Of course you can observe and interject when you need to, but the agents are surprisingly good at making it work without you.

Don’t we already have subagents?

While this feels similar to subagents, they’re actually quite different and complementary.

  1. Subagents are hierarchical. (i.e Parent → child → result ) That works for “do this subtask.” but it breaks for systems or long running work. What happens when you need to adjust or have feedback in real time? With relay, you can still take advantage of subagents (and should!) to complete a subtask. With relay, you can have peer conversations back and forth to come to a conclusion. This generally allows for more creative and emergent solutions.

  2. Subagents don’t work cross provider. You want to be able to use the best model from multiple providers for the given task and you want it to work seamlessly with other agent.s

Open source and open to contributions

If you’ve felt like the manager of a very fast, very forgetful engineering team…This is for you. Go to (or probably just point your agent to) https://github.com/AgentWorkforce/relay and try it out.

Build something that doesn’t require you to be the runtime.

Link: http://x.com/i/article/2027535041564225536

📋 讨论归档

讨论进行中…