资讯动态

Claude Code Agents 能互相通信吗?Munder Difflin 的原子文件邮箱与消息路由器实现解析

发布时间:2026/9/17 11:52:56 来源:尧图企业网站定制
Claude Code Agents 能互相通信吗Munder Difflin 的原子文件邮箱与消息路由器实现解析【免费下载链接】munder-difflinA local multi-agent harness that works with your existing Claude Code, Codex subscriptions, allows you to run an office of agents项目地址: https://gitcode.com/GitHub_Trending/mu/munder-difflinClaude Code 的多个独立 Agent 会话默认无法互相发现、互相发消息——它们各自活在自己的世界里。这篇技术指南以 Munder Difflin一个本地多 Agent 编排 harness的 hive 消息系统为具体实现案例讲清楚Agent 之间如何通信这个问题的完整答案默认的父子汇报模型缺了什么、基于文件邮箱inbox/outbox与路由器的协调层如何补上这个缺口、一条消息内部携带哪些结构化字段以及路由、防循环、人工升级是如何在源码层面落地的。读完你既能理解邮件即协议的架构设计也能直接对照 hive 路由核心实现 与运行时协议文档模板 PROTOCOL.md 源码 把同样的模式复刻到自己的多 Agent 系统里。默认行为subagent 只向上汇报不横向对话先说结论开箱即用的 Claude Code 里Agent 之间不能直接对话。一个 Claude Code Agent 是一个有目标、有工具的运行中会话它可以孵化subagent子代理——短生命周期的帮手把一块工作并行分发下去。这听起来很像 Agent 在互相说话但实际上并不等价subagent 完成后只做一件事就是把结果交还给启动它的那个 Agent。整个数据流是严格的父子两级往返像经理派活、下属交报告。这个模型缺的是两个对等的顶级会话你独立启动的两个 Agent无法互相发现、互换消息。Agent A 没有 Agent B 的地址没有共享收件箱没有总线没有把这条消息发给负责鉴权模块的那个人这种能力。每个会话都活在独立的世界里。单任务场景下这没什么问题但一旦你想让多个 Agent 协作完成一个项目——研究员喂给构建者、审查者标记修复、编排者分发任务——就必须让它们真正通信。于是需要加一层。协调层邮箱mailbox加路由器router最可靠的 Agent 间通信方式在 Munder Difflin 里被实现得近乎无聊地简单文件。每个 Agent 有自己的工作目录agents/your-id/里面放着inbox/收件箱和outbox/发件箱两个子目录。发送方把一条 JSON 消息写进自己的outbox/协调进程路由器周期扫描每个 outbox把消息移进接收方的inbox/接收方在下一轮任务开始时读取 inbox处理完后把文件移入inbox/.done/保证一条消息不会被处理两次。这个机制就是全部——没有 Redis、没有 RabbitMQ、没有需要值守的守护进程。基础设施只是一个目录加rename系统调用。它之所以成立靠的是三条特性持久Durable消息就是文件。进程中途崩溃已经写下的内容不会丢路由器重启后接着投递。可审计Auditable每条消息、每次投递都是一个文件由协调进程提交进 git可以按顺序回放谁在什么时候说了什么。这依赖 单一提交者 git 模式hive 中只有主进程运行 git。无冲突Conflict-free每个文件只有一个写者投递是原子 rename。多个 Agent 同时忙碌也不会有锁竞争或竞态。唯一保持系统干净的铁律绝不写进别人的文件夹。你只能写自己的 outbox路由交给路由器。单写者保证是并发安全的根基——这条规则在 PROTOCOL.md 协议模板 里以Do not write into another agents folder的形式写给了每个 Agent。一条消息里到底有什么speech act、线程与 hop 计数消息不是自由文本它携带一点结构让接收方知道对方期待什么。在 Munder Difflin 中消息字段由 HiveMessage 接口 定义运行时写入每个 hive 的 PROTOCOL.md 给出了 Agent 视角的发送格式{ to: agent-id | god | broadcast, act: request | inform | propose | query | agree | refuse | done, subject: one-line summary, body: the details, conversation: carry this across a thread (optional), in_reply_to: message id youre replying to (optional) }Agent 只需填这几个字段id、from、hops和时间戳由 harness 在投递时补全。逐项拆解to发给谁另一个 Agent 的 id、god编排者、broadcast广播给全体或者人类。act言语行为speech actrequest、query、propose、inform、agree、refuse、done七选一类型定义见 src/main/hive.ts#L54。subject和body实际内容一行摘要加正文细节。conversation/in_reply_to线程 id 与回复引用让来回对话保持分组。speech act 是安静的主角。它编码了意图而意图正是防止聊天失控的关键只有request、query、propose期待回复inform和done是终态——不要回复它们。在实现层面消息规范化逻辑 会为每条消息计算requires_reply标志默认规则就是[request, query, propose].includes(act)。这一条约定就杜绝了两个彬彬有礼的 Agent 用谢谢/不客气无限互谢的死循环。作为兜底每条消息还携带hop 计数跳数。路由时的检查在 routeMessage一旦msg.hops HOP_CAP常量定义在 src/main/hive.ts#L192值为 12消息被直接丢弃并记录一条hop-cap丢弃日志——即使线程行为异常也会在失控前被掐断绝不会 ping-pong 到永远。路由器源码轮询、归一化、原子投递与归档Munder Difflin 的路由器不是事件驱动的而是轮询的。startRouter 的注释说明了原因Poll-based router. Cheap and robust vs fs.watch quirks on macOS——默认每 1500 毫秒执行一次routeOnce()用固定间隔换跨平台健壮性。routeOnce()src/main/hive.ts#L1709-L1760的完整流程可以拆成五步扫描遍历agents/下每个 Agent 的outbox/只处理.json结尾的文件。解析与修复读文件、JSON.parse。解析失败时尝试修复 JSON 字符串内的字面换行repairLiteralLineBreaksInJsonStrings仍失败则把文件归档为outbox/.sent/bad-f并记录malformed-json丢弃日志避免在坏文件上反复空转。归一化normalize(partial, id)补全id、hops、requires_reply、时间戳等字段msg.from id——发送者以所属目录为准这是绝不写进别人文件夹在服务端的强制。路由调用routeMessage(msg)解析目标并投递见下文。归档renameSync(full, join(outbox, .sent, f))消息在发件箱留下.sent副本不会被重复处理收件方处理后再进inbox/.done/。两端留痕正是可审计的落点。投递本身走deliver()src/main/hive.ts#L1538-L1546目标 Agent 没有inbox/目录则返回 false 让调用方记录丢弃否则atomicWriteJson(join(inbox,${msg.id}.json), msg)原子写入。所谓原子看 atomicWriteJson 的实现 就一目了然先写临时文件p.tmp-random再renameSync(tmp, p)覆盖——同目录 rename 在同一文件系统上是原子操作这正是无锁并发安全的底层依据。路由目标解析routeMessage还包含几层防御broadcast广播走 selectBroadcastTargets 纯函数排除发送者自己、只发不收的 prep assistant、以及已归档关闭的 PTYAgenthookless 的 provider 不再被排除——直接邮件能送达的 Agent广播也必须能送达二者保持对称。human与god都解析为 godIdto human || to god ? godId : tohive 没有独立的人工审批队列发往人类的信由 GOD Agent 作为人类在场上的代理接管。投递失败不静默没有 inbox 的 id 记录no-inbox丢弃日志并弹回 godhookless/terminal 型 provider 走终端工作单投递投不进且渲染器不可用也弹回 god——任何消息要么送达要么让 god 知道绝不凭空消失。每条被路由的消息都会写入log.jsonl事件流kind: message带delivered数组只报告真实投递而非意图并触发hive:message事件让前端办公室地板上飞过一枚信封动画。两个特殊地址编排者GOD和你点对点不是唯一重要的方向两个特殊地址补全了整个系统。第一个是编排者——在 Munder Difflin 的 hive 里叫 GOD Agent。任何含糊的、跨模块的、需要签字的请求都发给它而不是让对等 Agent 私下拉扯。它分发任务、持有共享计划board.md的唯一执笔者而且是唯一被允许跑 git 提交的进程。这份职责直接写进了 GOD 的系统提示词你的工作是 ORCHESTRATE 而不是 implement……路由消息、分配 owner不要替别人干活src/main/hive.ts#L1487 附近。正因为提交权与裁决权集中在它身上协调才不会碎片化成旁路私聊。相关机制在 GOD 编排者工作原理 有更完整的展开。第二个是你人类。发往to: human的消息不会进任何 Agent 的收件箱——路由器把它交给 god人类在场地上的代理god 把决策点落到任务卡片的humanQA数组上卡片状态置为blockedharness 在 ASK ME 面板上呈现给人类人的回复作为a记回同一条目同时作为一条 inbox 消息回到 god。每次问答都留在卡片上形成完整的决策历史。这套Agent 够不到人时如何升级的循环在 human-in-the-loop 一文里有完整描述。记忆是更慢的一种对话还有一个容易被忽略的通道共享记忆。消息是 Agent 当下的协作方式记忆是跨时间的协作方式。每个 Agent 的memory.md用于追加持久事实而这些笔记会被挖掘进全 hive 可检索的语义记忆库——在 Munder Difflin 里是可选的 MemPalacemempalace search query全队按语义检索mempalace wake-up开工前取一份记忆摘要PROTOCOL.md 对应段落。于是 Agent 可以听到队友一小时前学到的知识而无需发任何消息。快车道邮箱慢车道共享记忆。一支好团队两条道都用。值得一提的实现细节hive 根目录的 mempalace 挖掘配置把inbox/、outbox/列入忽略清单MINE_IGNORE_LINES——消息是易变的临时协调数据不该污染长期记忆反过来memory.md是 Agent 主动追加的持久知识才值得被挖掘。这个区分本身就是快车道 vs 慢车道的工程化表达。语义记忆的整体设计见 semantic-memory-for-ai-agents。所以——它们能对话吗能但要重复一个值得强调的前提不是靠它们自己。单个 Claude Code Agent 加它的 subagent 构成的是经理-帮手树不是对话。缺的那块其实很小——邮箱、路由器、几条 speech act 规则、一个 hop 上限——一旦补齐独立 Agent 就能像真实团队一样协作请求工作、回报done、向编排者升级、只在真正要紧时呼叫人类。从孤立会话到协同团队的这个转变也正是 协调 AI 编码 Agent 一文的核心论点。想亲手验证这套机制可以直接跑 Munder Difflin免费开源在运行时 hive 目录里观察agents/id/outbox/.sent/里的已发副本、agents/id/inbox/.done/里的已读记录、hive 根目录的registry.json名册、fleet.json实时状态、log.jsonl事件流和PROTOCOL.md协议文档全都可以打开即读。配合 hive 路由源码、广播目标选择 与 hive 相关测试一条文件邮箱让 Agent 互相对话的完整证据链就在仓库里等着你。FAQClaude Code Agent 开箱即用就能互相说话吗不能。Agent 可以孵化 subagent但 subagent 只会把结果交还给启动它的 Agent两个独立顶级会话之间没有原生点对点通道需要加协调层。需要 Redis 或 RabbitMQ 这类消息代理吗不需要。最稳健的做法是基于文件每个 Agent 写自己的 outbox路由器用原子 rename 把消息移进接收方 inbox。持久、可审计、零额外基础设施——Munder Difflin 的 routeOnce 实现 就是完整范例。Agent 怎么避免无限循环对话靠 speech act 加 hop 计数。只有request、query、propose期待回复inform和done是终态同时每条消息带 hops 字段超过 HOP_CAP 12 就被路由器丢弃并记录日志。Agent 如何联系到人类发送to: human的消息。路由器把它交给 GOD 编排者人类的代理决策以humanQA的形式挂到被阻塞的任务卡片上人的回复作为正常消息回到 god 再传给相关 Agent完整问答历史留在卡片上。Agent 之间会不会把消息写到对方的文件夹里不会协议与实现都强制单写者Agent 只写自己的outbox/投递只由主进程通过atomicWriteJson临时文件 renameSync完成msg.from以发送者所属目录为准从服务端堵死了越权写入的可能。【免费下载链接】munder-difflinA local multi-agent harness that works with your existing Claude Code, Codex subscriptions, allows you to run an office of agents项目地址: https://gitcode.com/GitHub_Trending/mu/munder-difflin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价