news 2026/9/28 20:56:57

OpenMausBot架构深度解析:一个harness server如何统一Claude、Codex、Grok的协议流

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OpenMausBot架构深度解析:一个harness server如何统一Claude、Codex、Grok的协议流

OpenMausBot架构深度解析:一个harness server如何统一Claude、Codex、Grok的协议流

【免费下载链接】OpenMausBotOpen Source Alternative to Grok Bot with a virtual machine that bots can use项目地址: https://gitcode.com/gh_mirrors/op/OpenMausBot

OpenMausBot 是一款开源的 Grok Bot 替代品,它的核心是一个harness server(协议统一层):无论你给 Bot 接的是 Claude Code、Codex 还是 Grok CLI,服务端看到的都是同一套事件流和工具契约。对新手来说,理解这个统一层就理解了整个项目 80% 的架构。🧩

为什么需要 harness server?

三大引擎的"原生协议"完全不同:

引擎原生交互方式会话恢复机制
Claude CodeCLI 进程 + stream-json(stdin 写提示词)--resume <sessionId>游标
CodexCLI 进程 + 自有 JSON 事件流会话 ID 续接
GrokCLI / ACP(Agent Client Protocol)原生会话上下文

如果每个前端都直接对接一种引擎,UI、审批、日志、MCP 工具挂载就得写三遍。OpenMausBot 的做法是:把所有引擎"压平"进同一个对话运行时,即 harness server 中的统一契约。

核心契约定义在 server/contracts.ts,其中ProviderAdapter接口只要求每种引擎实现 5 个能力:

  • sendTurn():发送一轮对话(携带文本、图片、系统提示、MCP 集成描述符)
  • interruptTurn():打断当前回合
  • respondToRequest():回答"是否允许执行"这类审批请求
  • steer():在回合运行中追加用户输入(可选能力)
  • onEvent():订阅统一事件流

引擎的差异全部被隔离在各自的 driver 文件里,互不干扰。

三大协议流:同一份契约,三种实现

1️⃣ Claude 流:stream-json 双向管道

Claude 驱动(server/drivers/claude.ts)为每一轮启动一个 CLI 进程,通过 stdin 写入提示词,用 stream-json 双向通信;跨轮次对话靠--resume游标续接。它还会把 Bot 的集成(云电脑、Composio 连接应用、手机工具)转成 MCP server 挂到 CLI 上,让 Claude 能直接调用。

2️⃣ Codex 流:自读 config.toml

Codex 驱动(server/drivers/codex.ts)有自己的目录解析(server/drivers/codex-catalog.ts)、设备授权流(server/drivers/codex-device-auth.ts)和身份模型。它直接读取用户本地的config.toml,harness 不重复注入 MCP 配置,只负责把统一事件转发出去。

3️⃣ Grok 流:CLI + ACP 双通道

Grok 有两条路径:原生 CLI 驱动(server/drivers/grok.ts),以及走 ACP 协议的 agent 版(server/drivers/acp/grok.ts)。ACP 是 Agent Client Protocol,OpenMausBot 把 Gemini、Kimi、Cursor、Qwen 等 10 余种引擎也统一挂在这套 ACP 桥接下(见 server/drivers/acp/ 目录)。

所有内置驱动在一个静态数组中注册(server/drivers/builtIn.ts)——注释里写得直白:"添加一个驱动 = 写一个drivers/<x>.ts,然后追加进数组"。

事件总线:把 N 条协议流合成一条

统一后的事件流由 harness 的 EventBus 负责汇聚:

  1. 每个引擎实例的adapter.onEvent()回调把事件交给总线;
  2. 总线给每个事件盖上providerInstanceId时间戳(事件只能来自自己的驱动,跨驱动事件直接丢弃);
  3. 事件先脱敏(redactSecrets),再落盘到每个线程的canonical NDJSON 日志(<threadId>.ndjson),这就是排查问题时可以整份贴进 issue 的文件;
  4. 最后分发给 SSE 端点和消息存储,UI 实时刷新。

实例的生命周期则由 ProviderRegistry 管理:配置项 → 活实例。设计上有两个亮点值得新手注意:

  • 影子快照(shadow snapshot):未知驱动或配置解析失败不会导致启动崩溃,而是降级为"不可用"快照——旧配置在新版本上能安全降级;
  • 按实例隔离销毁:某个引擎的配置变更只会重建它自己,不影响同机的其他引擎。

从事件到界面:审批与能力门控

统一事件流让"执行前审批"变成一份全局体验:任何引擎想执行危险操作,都走同一张审批卡片,用户点击允许/拒绝后,harness 调用respondToRequest()把决定送回对应引擎。

另一个新手容易忽略的设计是能力门控(capabilities 字段,见 server/contracts.ts):界面"永远不会展示引擎转不动的旋钮"。例如某驱动不支持queueing,输入框就不会开放"中途插话";不支持图片输入,粘贴图片的入口自动消失。这套规则让多引擎混用的 Bot 不会出现"说了有电脑却找不到工具"的尴尬。

想继续深入?推荐阅读路径 📖

目标入口文件
理解统一契约server/contracts.ts
看事件如何汇聚server/harness/bus.ts、server/harness/http.ts
看实例注册与降级server/harness/registry.ts
学习写一个驱动server/drivers/claude.ts(最完整范例)
学习 ACP 桥接server/drivers/acp/
重试与会话空闲策略server/drivers/retry.ts、server/drivers/session-idle.ts
会话恢复与重建server/resume-recovery.ts
多引擎行为验证server/harness/bus.test.ts、server/drivers/codex.test.ts

一句话总结:harness server 用一份契约(contracts)+ 一个总线(bus)+ 一个注册表(registry),把 Claude、Codex、Grok 乃至十余种 ACP 引擎,统一成了同一个可审批、可日志化、可热插拔的事件流——这正是 OpenMausBot 能同时兼容这么多引擎,还能让 Bot 直接使用虚拟机的架构底座。

【免费下载链接】OpenMausBotOpen Source Alternative to Grok Bot with a virtual machine that bots can use项目地址: https://gitcode.com/gh_mirrors/op/OpenMausBot

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/28 20:55:22

企业 Workflow 如何接入 ERP、CRM?从 API 调用到业务契约

企业 Workflow 如何接入 ERP、CRM&#xff1f;从 API 调用到业务契约 AcmeFlow 的运营审核通过后&#xff0c;系统要从 CRM 找到客户与套餐&#xff0c;再向 ERP 创建一条维保服务记录。开发者很容易把这件事写成两次 HTTP 调用&#xff1a;先 GET 客户&#xff0c;再 POST 服务…

作者头像 李华
网站建设 2026/9/28 20:55:21

Spark 选 join 策略靠的是估算值,估错了它只会悄悄降级。

一条 join 落在集群上&#xff0c;可能走四种完全不同的算法&#xff0c;代价差出一个量级甚至更多。 选哪一种的不是你&#xff0c;是 Spark 自己&#xff0c;依据是它手里那份统计信息。 统计信息大概率是估的&#xff0c;估歪了计划不会报错&#xff0c;只会换一条更贵的路走…

作者头像 李华
网站建设 2026/9/28 20:55:19

2026版基于微信小程序的自习室座位预约系统

博主介绍&#xff1a;资深开发工程师&#xff0c;从事互联网行业多年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;开发过上千套设计程序&#xff0c;没有什么华丽的语言&#xff0c;只有实实在在的写点程序。&#x1f345;获取源…

作者头像 李华