Rust 实现 Claude Code 与 Codex 跨机协作:消息队列驱动多 Agent 互唤醒

发布时间:2026/10/27 8:09:09
Rust 实现 Claude Code 与 Codex 跨机协作:消息队列驱动多 Agent 互唤醒 1. 为什么要把 Claude Code 和 Codex 接在一起用1.1 两个 Agent 各自的脾气Claude Code 和 Codex 是目前命令行里最常被拿来对比的两个 AI 编程 Agent。我两个都用了一段时间说句实在话它们不是替代关系而是互补关系。Claude Code 的长处在于长上下文理解和多文件重构。你给它一个模糊的需求比如“把项目里所有跟用户鉴权相关的逻辑抽成一个独立模块”它能自己翻文件、自己找依赖、自己改调用点整个过程不需要你一步步喂。它的工具调用链比较深适合做那种“想清楚再动手”的活。Codex 的长处在于单点执行的确定性和沙箱隔离。你让它跑一条命令、改一个函数、生成一段测试它给的结果很稳而且默认在受限环境里跑不会乱动你的系统。它更像一个听话的执行器你指哪它打哪。问题就出在这我经常需要它们配合。比如让 Claude Code 做架构级的重构规划规划完了让 Codex 去逐条执行或者反过来Codex 跑测试发现挂了把失败信息丢给 Claude Code 去分析根因。以前我只能手动复制粘贴一来一回效率极低而且上下文一断两边都“失忆”。1.2 跨会话通信到底难在哪很多人以为让两个 Agent 互相发消息很简单不就是调个 API 吗。实际做下来难点根本不在“发消息”而在下面这几件事会话状态怎么保持Claude Code 和 Codex 各自维护自己的会话上下文你从外部塞一条消息进去它未必认因为它不知道这条消息属于哪个会话、该接在哪轮对话后面。谁来“叫醒”谁Agent 默认是被动等待输入的你不给它一个触发信号它就一直挂着。所谓“互相叫醒”本质是要有一个常驻的调度层去监听事件、判断该唤醒哪个 Agent。跨机器的消息怎么走如果两个 Agent 跑在同一台机器上用本地 socket 或文件队列就够了但一旦跨电脑就得考虑网络传输、消息序列化、断线重连。消息格式怎么统一Claude Code 和 Codex 对输入的理解方式不一样你得设计一个中间层把一方的输出翻译成另一方看得懂的输入。我写这个工具的核心动机就是把上面这四件事一次性解决掉让两个 Agent 像两个同事一样能互相喊话、互相交接任务。1.3 这个工具适合谁如果你只是偶尔用一下 AI 写代码那这个工具对你意义不大手动复制粘贴完全够用。但如果你符合下面任意一条它就值得你花时间搭起来你同时用 Claude Code 和 Codex且经常需要它们协作完成一个任务你有多个开发机希望在一台机器上触发的任务能在另一台机器上被 Agent 接手你在做 AI Agent 相关的开发或研究想看看多 Agent 协作在真实工程里怎么落地你想让 Agent 之间形成“规划-执行-验证”的闭环而不是每次都人工介入。下面我按“整体设计思路 → 核心机制拆解 → 实操搭建 → 问题排查”的顺序把这个工具从头到尾讲清楚。涉及具体实现的地方我会给出可直接参考的代码和配置。2. 整体设计思路与架构选型2.1 为什么选消息队列而不是直接调 API最开始我试过最朴素的做法写个脚本A 的输出直接作为参数去调 B 的命令行。跑了两天就放弃了原因有三个。第一阻塞问题。Claude Code 处理一个复杂任务可能要几分钟脚本会一直卡在那里等期间什么都干不了。第二可靠性问题。中间任何一步失败整条链就断了没有重试、没有补偿。第三扩展性问题。我想加第三个 Agent 进来或者想让消息跨机器走这套直连的写法就得推倒重来。所以我改成了消息队列 事件驱动的架构。核心思路是每个 Agent 外面包一层“适配器”适配器负责把 Agent 的输入输出翻译成统一的消息格式然后所有消息都往一个队列里丢。调度器从队列里取消息判断这条消息该给谁再通过对应的适配器唤醒那个 Agent。这个设计的好处是解耦。Agent 之间不直接认识对方它们只认识队列。我想加新 Agent、想换传输方式、想加消息过滤都只动调度层不动 Agent 本身。2.2 三层架构拆解整个工具我分成三层从下往上说。传输层负责消息怎么从 A 到 B。同机通信用 Unix domain socket跨机通信用 TCP 加一层简单的消息帧协议。我没上 Kafka、RabbitMQ 这种重型中间件因为对个人开发者来说太重了维护成本高而且这个场景的消息量根本用不上。一个轻量的本地队列加 TCP 转发就够了。调度层是核心负责“谁该被叫醒”。它维护一张 Agent 注册表记录每个 Agent 的 ID、类型、所在机器、当前状态空闲/忙碌。当一条消息进来调度器根据消息里的目标字段决定路由如果目标 Agent 正忙消息就排队等待。适配层是每个 Agent 的“翻译官”。Claude Code 适配器知道怎么把一条标准消息转成 Claude Code 能接受的输入格式也知道怎么从它的输出里提取出有效内容。Codex 适配器同理。这一层是跟具体 Agent 强相关的换 Agent 主要就是换这一层。2.3 消息协议怎么定消息格式我参考了常见的 Agent 通信协议思路但做了简化。一条消息包含这几个字段字段类型说明msg_idstring消息唯一 ID用于去重和追踪fromstring发送方 Agent IDtostring目标 Agent ID为空表示广播typestring消息类型task / result / query / notifysessionstring会话 ID用于关联同一任务的多轮消息payloadobject实际内容结构随 type 变化timestampint发送时间戳用于排序和超时判断session字段是我踩坑之后加的。最开始没有它结果两个 Agent 同时处理多个任务时消息全串了A 任务的回复跑到了 B 任务的上下文里。加上 session 之后每个任务有独立的会话线互不干扰。type字段决定了接收方怎么处理。task是派活接收方要执行result是交活接收方通常只记录query是提问期待对方回一条resultnotify是纯通知不需要回复。2.4 为什么用 Rust 写核心热词里有人问“基于 Rust 语言的 AI Agent”靠不靠谱我用下来觉得这个选择是对的。核心调度层我用 Rust 写原因很实际并发模型省心调度器要同时监听多个 Agent 的状态、处理队列、转发消息Rust 的 async 加 channel 写起来很干净不用担心数据竞争。单文件部署编译出来就是一个二进制扔到任何一台机器上都能跑不需要装运行时。跨机器部署时这点特别爽。资源占用低调度器常驻在后台Rust 版本内存占用稳定在几十兆换成某些带 GC 的语言跑久了内存会飘。适配层我留了脚本接口因为不同 Agent 的调用方式变化快用脚本改起来比重新编译快。核心用 Rust边缘用脚本这个组合我个人比较满意。3. 核心机制拆解叫醒、传话、跨机3.1 “互相叫醒”是怎么实现的Agent 本身不会主动醒来所以“叫醒”这个动作必须由外部触发。我的做法是给每个 Agent 配一个守护进程守护进程常驻监听队列里属于自己的消息。守护进程的逻辑很简单从队列取消息 → 判断是不是给自己的 → 是的话把消息转成 Agent 的输入格式 → 启动 Agent 进程 → 把输入喂进去 → 等 Agent 输出 → 把输出打包成消息丢回队列。这里有个关键细节Agent 进程是每次唤醒时新起的还是常驻的。我两种都试过。常驻的好处是启动快、上下文连续坏处是状态容易脏一个任务出错可能污染后续任务。新起的好处是干净、隔离好坏处是每次都要重新加载上下文慢。最后我选了混合模式同一个 session 内的多轮消息复用同一个 Agent 进程session 结束后进程销毁。这样既保证了单任务内的上下文连续又避免了跨任务污染。3.2 消息怎么从一方“翻译”给另一方Claude Code 和 Codex 对输入的理解不一样直接转发原文经常出问题。我举个例子Claude Code 输出的重构方案里可能带一堆 Markdown 格式的说明文字Codex 拿到这种输入会懵因为它期待的是明确的指令。所以适配层要做内容提取和格式转换。我的做法是在消息 payload 里区分“给机器看的”和“给人看的”两部分。给机器看的是结构化的指令比如{action: run_tests, target: src/auth}给人看的是自然语言说明。转发时只把结构化部分传给对方 Agent自然语言部分存起来供人查阅。这个设计还有个额外好处可审计。所有消息都留了记录出问题的时候能回溯到底哪一步传错了。3.3 跨电脑通信的落地方式跨机器这块我用的是最朴素的方案中心调度 TCP 转发。假设你有两台机器机器 A 跑 Claude Code机器 B 跑 Codex。你在两台机器上都装调度器的客户端客户端连到同一个调度中心可以跑在第三台机器也可以跑在其中一台。消息从 A 的客户端发出经调度中心路由到 B 的客户端再唤醒 B 上的 Codex。为什么不搞点对点直连因为点对点要处理 NAT 穿透、要维护连接状态复杂度高。中心调度虽然多了一跳但逻辑简单、好调试而且调度中心天然就是消息的审计点。传输安全方面我在 TCP 之上加了一层简单的加密和校验防止消息在网络上被篡改。具体实现不展开思路就是用对称加密保护 payload用 HMAC 做完整性校验。3.4 会话隔离与并发控制前面提到 session 字段解决消息串线的问题这里展开说下并发控制。调度器维护一个会话表每个 session 记录当前状态进行中、等待回复、已完成。同一 session 内的消息严格串行处理保证顺序不同 session 之间并行互不影响。还有个超时机制。如果一条query消息发出去超过设定时间没收到result调度器会标记这个 session 为异常并通知发起方。超时时间我默认设 5 分钟因为复杂任务确实可能跑很久设太短会误判。注意并发数不要开太大。我一开始把并发调到 10结果两个 Agent 同时抢同一份文件改出了冲突。后来限制到 3稳定多了。Agent 协作不是并发越高越好关键是任务之间有没有资源竞争。4. 实操搭建从零把工具跑起来4.1 环境准备与依赖安装先说环境。我主力是 macOS但也在 Ubuntu 上跑过两边都 OK。Windows 的话建议用 WSL原生 Windows 下 Unix socket 支持不完整会踩坑。需要装的东西Rust 工具链编译调度器核心Claude Code官方安装方式装完确认claude命令能用Codex同样确认命令行可用Python 3.10适配层脚本用Rust 安装用官方脚本就行装完cargo --version能出版本号就对了。Claude Code 和 Codex 的安装各自按官方文档走这里不重复重点确认它们能在终端里正常启动、正常接受输入。4.2 调度器核心的编译与配置调度器的配置文件我用 TOML放在~/.agent-bridge/config.toml。一个最小配置长这样[center] listen 0.0.0.0:7788 secret your-shared-secret [agents.claude] type claude-code machine local adapter adapters/claude.py [agents.codex] type codex machine remote-b adapter adapters/codex.pysecret是跨机通信的共享密钥两台机器要一致。machine字段标记 Agent 在哪台机器上local表示本机其他值对应远程客户端注册的机器名。编译调度器cd agent-bridge cargo build --release编译完二进制在target/release/agent-bridge。启动./agent-bridge --config ~/.agent-bridge/config.toml启动后它会打印监听地址和已注册的 Agent 列表。看到两个 Agent 都注册上了说明配置没问题。4.3 适配器脚本的编写要点适配器是脚本每个 Agent 一个。以 Claude Code 适配器为例核心要做三件事接收标准消息、转成 Claude Code 输入、把输出转回标准消息。import json import subprocess import sys def handle(msg): payload msg[payload] # 把结构化指令转成自然语言提示 prompt build_prompt(payload) # 调用 claude 命令行 result subprocess.run( [claude, -p, prompt], capture_outputTrue, textTrue, timeout600 ) # 把输出打包成标准消息 return { msg_id: new_id(), from: claude, to: msg[from], type: result, session: msg[session], payload: {raw: result.stdout}, timestamp: now() }build_prompt是关键它决定了结构化指令怎么变成 Agent 看得懂的话。我的经验是提示要具体、要带上下文别指望 Agent 猜。比如{action: run_tests}要展开成“请在项目根目录运行测试套件把失败的用例和错误信息完整返回”。Codex 适配器结构一样只是调用命令和输出解析不同。Codex 的输出格式更规整解析起来反而简单。4.4 跨机部署的完整步骤假设机器 A 跑调度中心加 Claude Code机器 B 跑 Codex。机器 A 上启动调度中心确认listen地址是0.0.0.0:7788防火墙放行这个端口。启动 Claude Code 适配器注册到本地调度中心。机器 B 上装调度器客户端配置里center指向机器 A 的 IP 和端口secret跟 A 一致。启动客户端它会连到 A 的调度中心并注册自己。然后启动 Codex 适配器。验证连通性在机器 A 上发一条测试消息给 Codex看机器 B 上 Codex 有没有被唤醒、有没有回消息。我第一次配的时候卡在防火墙消息发出去没反应查了半天才发现是端口没放行。4.5 一个完整的协作流程演示光说机制太抽象走一个真实流程。场景我在机器 A 上让 Claude Code 分析一个 bug分析完让它把修复任务派给机器 B 的 Codex 执行。第一步我给 Claude Code 发指令“分析 src/auth 目录下的登录失败问题找出根因把修复方案整理成结构化任务。”第二步Claude Code 分析完输出一段分析加一个结构化任务。适配器把结构化任务打包成task类型消息to字段填codex丢进队列。第三步调度中心收到消息查注册表发现 codex 在机器 B转发过去。第四步机器 B 的客户端收到消息唤醒 Codex 适配器Codex 执行修复。第五步Codex 执行完输出结果打包成result消息to字段填claude原路返回。第六步机器 A 的 Claude Code 收到结果可以继续做验证或收尾。整个过程我只需要发第一条指令后面全自动。这就是“互相叫醒、互发消息”的实际价值。5. 常见问题与排查技巧实录5.1 消息发出去了但对方没反应这是最常见的问题排查顺序我总结成一张表排查点检查方法常见原因调度中心是否收到看调度中心日志发送方适配器没连上路由是否正确看消息的 to 字段和注册表Agent ID 拼写错误目标机器是否在线ping 或看客户端心跳网络断了或客户端挂了目标 Agent 是否被唤醒看目标机器进程列表适配器脚本报错退出Agent 是否卡住看 Agent 进程 CPU 占用任务太复杂或死循环我遇到最多的是适配器脚本报错。脚本里任何未捕获的异常都会导致适配器静默退出消息就石沉大海。后来我在适配器外面包了一层异常捕获出错时把错误信息作为result发回去至少让发起方知道出问题了。5.2 会话串线怎么定位会话串线的表现是A 任务的回复跑到了 B 任务的上下文里Agent 开始答非所问。定位方法把调度中心的消息日志按 session 分组打印看有没有消息的 session 字段跟它实际所属的任务对不上。我遇到过一次原因是适配器在生成回复消息时session 字段是从一个全局变量读的并发时被覆盖了。改成从当前消息里透传 session 就解决了。经验session 字段一定要透传不要重新生成。发起方生成一次后续所有相关消息都带着它直到任务结束。5.3 Agent 输出格式不稳定怎么办Claude Code 和 Codex 的输出都是自然语言为主格式不固定。你让它输出 JSON它可能给你包一层 Markdown 代码块你让它输出纯文本它可能加一堆解释。我的处理方式是容错解析。解析器先尝试直接解析 JSON失败就尝试剥离 Markdown 代码块再解析再失败就用正则提取关键字段。三层兜底下来绝大多数输出都能处理。如果实在解析不出来就把原始输出整个存下来标记为“需人工处理”不要让流程卡死。Agent 协作系统里能降级处理比追求完美解析更重要。5.4 跨机延迟高怎么优化跨机通信的延迟主要来自三块网络往返、消息序列化、Agent 启动。网络往返没法优化太多除非你把两台机器放同一个局域网。序列化我用的 JSON够用如果追求极致可以换 MessagePack但收益有限。真正能优化的是Agent 启动。前面说过我用了混合模式同 session 复用进程。实测下来复用进程比每次新起能省 3 到 5 秒。对于多轮交互的任务这个优化很值。还有个技巧预热。调度器启动时可以预先拉起一个空闲的 Agent 进程待命消息来了直接喂给它省掉冷启动时间。这个我还在试验效果不错但内存占用会高一些。5.5 安全与权限的注意事项Agent 能执行命令这意味着它能改文件、能跑脚本。跨机场景下一台机器上的 Agent 可能被另一台机器上的消息触发去执行操作这里面的权限控制必须想清楚。我的做法是白名单加确认。适配器里维护一个允许执行的操作白名单白名单外的操作需要人工确认。跨机消息默认只允许读操作和测试操作写操作要显式授权。另外secret密钥不要硬编码在配置里明文存用环境变量注入。跨机通信的加密密钥定期轮换。这些是基本的安全习惯别嫌麻烦。6. 我踩过的坑和几条实在建议6.1 别一上来就搞跨机我最开始就是直接上跨机结果调试成本极高。一个 bug 你分不清是本地逻辑问题还是网络问题排查起来两头跑。后来我改成先本机跑通再拆到跨机。本机用 Unix socket逻辑验证完再把传输层换成 TCP其他代码不动。这样每一步的变量都可控出问题好定位。6.2 日志要打够但要能关调试期我把日志打到最详细每条消息的收发、每次 Agent 的唤醒都记。上线后日志量太大磁盘扛不住又加了日志级别开关。建议从一开始就设计好日志分级error只记异常info记关键流程debug记全部细节。默认跑info排查问题时临时开debug。6.3 Agent 的“脾气”要摸清Claude Code 和 Codex 在不同任务上的表现差异很大。有的任务 Claude Code 一次就过Codex 要来回好几次有的反过来。我的建议是给每个 Agent 配不同的超时和重试策略。Claude Code 适合长任务超时设长点Codex 适合短任务超时短、重试多。这些参数在适配器里配不要写死。6.4 这个工具后续还能怎么扩展目前这个工具解决的是两个 Agent 的协作。往大了想它可以扩展成多 Agent 编排平台加更多 Agent 类型、加任务依赖图、加可视化面板。我最近在试的一个方向是让 Agent 自己决定该叫醒谁。现在的路由是我在消息里写死to字段未来可以让 Agent 根据任务内容自己判断该找哪个 Agent 协作。这需要给 Agent 一份“同事能力清单”让它知道每个 Agent 擅长什么。还有个方向是任务持久化。现在消息在内存队列里调度器重启就丢了。加上持久化之后任务可以跨重启恢复这对长时间运行的任务很重要。6.5 给想复现的朋友的几句实话这个工具不算复杂但也不是一两个小时能搞定的。如果你只是想体验一下两个 Agent 协作我建议先用最简单的脚本直连跑通感受一下价值再决定要不要上这套完整架构。如果你决定搭从本机单 Agent 开始先让一个 Agent 能被消息唤醒并回复再加第二个再拆跨机。每一步都验证通过再往下走别跳步。最后Agent 协作的价值不在于技术多炫而在于它真的能帮你省时间。如果搭完之后你发现手动复制粘贴更快那说明你的任务场景还不适合自动化别硬上。工具是为人服务的不是反过来。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询