@rajistics: 代币成本正在攀升。如何避免被单一供应商的 harness 锁定?做了一个演示,展示 @OpenH…
摘要
一个演示,展示 OpenHands 如何作为控制平面,跨多个 agent harness(如 Claude Code、Gemini CLI 和 OpenHands 自身)工作,使得无需重写编排即可交换模型或供应商。
查看缓存全文
缓存时间: 2026/05/15 04:59
Token costs are climbing. How do you avoid being locked into a single vendor’s harness? Built a demo showing how @OpenHands acts as a control plane across agent harnesses. Manage multiple harnesses from one place, swap models or vendors without rewriting your orchestration. https://github.com/rajshah4/openhands-multi-agent-demo…
rajshah4/openhands-multi-agent-demo
来源:https://github.com/rajshah4/openhands-multi-agent-demo
OpenHands 如何编排多个智能体
OpenHands 让你自主选择智能体之间如何共享状态、如何隔离、以及如何编排工作流。
OpenHands 作为多个智能体 harness 的控制平面
上图展示了控制平面视角:OpenHands 协调工作流,而不同的 harness 和运行时模型位于其下层。
为什么需要多智能体编排?
智能体 harness(Agent Harness) 将模型与工具、上下文和执行封装在一起 —— Claude Code、Gemini CLI 和 OpenHands 都是 harness。每个 harness 各有优势:Claude Code 适合实现代码,Gemini CLI 适合快速生成测试,OpenHands 凭借其智能体框架适合代码审查。
本仓库将 OpenHands 视为编排层(即控制平面),围绕这些 harness 进行编排。核心思想是:工作流与运行时分离 —— 同样的实现→测试→审查流水线,可以搭配不同的 harness、不同的状态共享模型、不同的隔离策略来运行。
关键不在于你必须使用三家供应商,而在于你可以组合异构的智能体系统,同时保持工作流本身稳定。
流水线
本仓库中的每个演示都运行相同的三阶段流水线:
| 阶段 | 默认 Harness | 功能 |
|---|---|---|
| 实现 | Claude Code (Anthropic) | 根据规格编写代码 |
| 测试 | Gemini CLI (Google) | 读取代码并添加 pytest 覆盖 |
| 审查 | OpenHands | 审查所有内容,按严重程度报告发现 |
你可以在流水线内切换 harness,例如用 OpenHands 完成所有阶段,或者将相同的工作流迁移到共享工作区、隔离的本地克隆以及托管的云沙箱之间。
多智能体编排的三种模式
本仓库演示了运行多个智能体的三种架构模式。它们产生相同的输出,但在隔离性、复杂性和基础设施方面有所不同。
同一多智能体工作流的三种编排模式
📖 阅读完整模式指南 → 获取详细的架构解释、决策树和迁移路径。
模式对比
| 模式 1:简易 | 模式 2:隔离本地 | 模式 3:企业级 | |
|---|---|---|---|
| 脚本 | shared_workspace.py | multi_server_isolation.py | cloud_conversations.py |
| 沙箱 | 1 个共享 | N 个隔离(手动) | N 个隔离(自动) |
| 本地运行形态 | 1 个共享工作区 | N 个隔离克隆 | 企业托管 |
| 协调方式 | 文件系统 | Git(你协调) | Git(企业协调) |
| 代码复杂度 | 低 | 高 | 中 |
| 基础设施 | 无 | 手动服务器管理 | 自动预配置 |
| 可观测性 | 终端日志 | 终端日志 | 每个智能体 Web 界面 |
各模式的适用场景
模式 1(简易) —— 智能体共享工作区,代码简单
- ✅ 快速本地开发
- ✅ 智能体协作处理相同文件
- ✅ 最小基础设施
- ❌ 智能体之间无隔离
模式 2(隔离本地) —— 完全隔离,手动编排
- ✅ 无需云端的完全隔离
- ✅ 气隙环境
- ✅ 使用 pytest 进行真实的本地验证
- ❌ 你需要管理 Git 协调和重试逻辑
- ❌ 编排代码更复杂
模式 3(企业级) —— 完全隔离,自动编排
- ✅ 隔离 + 简单代码
- ✅ 自动沙箱预配置
- ✅ 每个智能体对应 Web 界面
- ❌ 需要互联网和企业 API 密钥
模式 1:简易 —— 单一智能体服务器(shared_workspace.py)
所有智能体在一个共享工作区中运行,使用 OpenHands SDK(https://docs.openhands.dev/sdk/overview)。Claude Code 和 Gemini CLI 通过 ACP(智能体客户端协议,https://docs.agentclientprotocol.com/)作为子进程连接。
`` shared_workspace.py (你的笔记本) │ └─► 单一智能体服务器(一个工作区) ├─ 智能体 1 [Claude Code] → 编写 shortener.py ├─ 智能体 2 [Gemini CLI] → 编写 test_shortener.py └─ 智能体 3 [OpenHands] → 审查所有文件
所有智能体共享 /workspace/project ✅
``
架构: 一个沙箱,智能体通过共享文件系统协调。
最佳场景: 快速本地开发、紧密协作、最小基础设施。
设置与运行
``bash git clone https://github.com/rajshah4/openhands-multi-agent-demo.git cd openhands-multi-agent-demo
pip install openhands-sdk openhands-tools export LLM_API_KEY=“your-key” export ANTHROPIC_API_KEY=“your-key” export GEMINI_API_KEY=“your-key”
python shared_workspace.py # 三个 harness 的 ACP 流水线 python shared_workspace.py –no-claude # 纯 OpenHands 智能体委派 python shared_workspace.py –cloud # 在云基础设施上运行(仍为单一沙箱) ``
使用 --no-claude 运行时,SDK 会使用 DelegateTool 生成 OpenHands 子智能体 —— 由 LLM 决定流程,而非硬编码脚本。
模式 2:隔离本地 —— 多个工作区(multi_server_isolation.py)
每个阶段在各自独立的 Git 克隆中运行,位于不同的临时目录下。脚本在每个阶段都使用 OpenHands SDK,变更通过 Git push/pull 在工作区之间传递。
multi_server_isolation.py (你的笔记本) │ ├─► 智能体 1 [OpenHands SDK + Anthropic LLM] → /tmp/workspace_claude/ │ └─ 实现代码 → git push │ ├─► 智能体 2 [OpenHands SDK + Gemini LLM] → /tmp/workspace_gemini/ │ └─ git pull → 编写测试 → pytest → 可选修复 → git push │ └─► 智能体 3 [OpenHands SDK 审查器] → /tmp/workspace_reviewer/ └─ git pull → 审查代码
架构: 多个隔离的工作区,手动 Git 协调,使用本地裸仓库作为共享源。每个阶段拥有自己的克隆,编排器在审查前运行本地 pytest 验证。
最佳场景: 气隙环境、自定义编排、学习如何构建多智能体系统。
权衡: 完全隔离,但本地编排器需要管理仓库镜像、分支移交、验证和修复重试。
设置与运行
``bash
前提条件:与模式 1 相同(ANTHROPIC_API_KEY, GEMINI_API_KEY)
pip install openhands-ai pytest
python multi_server_isolation.py # 运行完整流水线 python multi_server_isolation.py –no-claude # 仅使用 OpenHands python multi_server_isolation.py –task csv-tool # 不同任务 ``
注意:
multi_server_isolation.py会从你的本地检出创建一个临时裸 Git 源,然后从该源克隆隔离的工作区。- 实现阶段默认使用 Anthropic Sonnet,测试阶段默认使用 Gemini,审查器会遍历已配置的 LLM 密钥。
- 测试工作区会通过本地
pytest验证;如果失败,脚本会进行一次修复并重试。
模式 3:企业级 —— 自动多沙箱(cloud_conversations.py)
每个智能体在 OpenHands Cloud 或企业版(自托管)的自己沙箱中运行。平台自动预配置沙箱、处理 Git 协调,并为每个智能体提供 Web 界面。
cloud_conversations.py (你的笔记本) │ ├─► ☁️ 会话 1 [Claude Code / Anthropic] │ └─ 平台预配置沙箱,实现代码,推送到仓库 │ ├─► ☁️ 会话 2 [Gemini CLI / Google] │ └─ 平台预配置沙箱,拉取代码,测试,推送 │ └─► ☁️ 会话 3 [OpenHands] └─ 平台预配置沙箱,拉取代码,审查
架构: 企业托管的沙箱,自动编排。你只需编写高层工作流,平台负责基础设施。
最佳场景: 生产工作流、可观测性、可审计性、团队部署。
设置与运行
``bash
前提条件:在平台中配置 ANTHROPIC_API_KEY 和 GEMINI_API_KEY
从 https://app.all-hands.dev → 设置 → API 密钥(Cloud)获取 API 密钥
或从自托管的企业实例获取
pip install requests export OPENHANDS_CLOUD_API_KEY=“your-cloud-api-key”
python cloud_conversations.py # 默认:url-shortener python cloud_conversations.py –task csv-tool # CSV 转 JSON 转换器 python cloud_conversations.py –task custom –custom-task “Build a rate limiter” python cloud_conversations.py –repo youruser/yourrepo # 你自己的仓库 python cloud_conversations.py –no-claude # 所有步骤使用 OpenHands ``
你会看到三个会话 URL —— 点击每个链接即可在 Cloud UI(https://app.all-hands.dev)中实时观看智能体工作。
价值: 隔离目标与模式 2 相同,但 Cloud 替你处理了沙箱预配置、清理和可观测性。
文件
| 文件 | 功能 |
|---|---|
cloud_conversations.py | 模式 3 —— 通过 API 的企业级会话(自动多沙箱) |
shared_workspace.py | 模式 1 —— 带 ACP 的 SDK(单一共享工作区) |
multi_server_isolation.py | 模式 2 —— 隔离工作区,手动 Git 编排 |
shortener.py | 示例输出 —— 由流水线生成的 URL 缩短器 |
.agents/agents/code-reviewer.md | 基于文件的审查器智能体定义 |
架构洞察
为什么是三种模式?
每种模式代表了不同的隔离性与复杂性权衡:
模式 1 是本地开发的“金发姑娘”:
- ✅ 简单(约 10 行代码)
- ✅ 快速(无网络调用)
- ✅ 所有 SDK 功能(DelegateTool、ACP、基于文件的智能体)
- ❌ 无隔离(智能体共享文件系统)
模式 2 提供本地隔离,但操作复杂度更高:
- ✅ 完全隔离(独立工作区和 Git 克隆)
- ✅ 气隙能力
- ❌ 复杂的本地编排
- ❌ 手动 Git 移交、验证和重试管理
模式 3 是生产环境的“金发姑娘”:
- ✅ 完全隔离(Cloud 预配置沙箱)
- ✅ 精简的本地编排脚本
- ✅ 可观测性(每个智能体 Web 界面)
- ✅ 自动编排
- ❌ 需要云连接
关键洞察
云会话(模式 3) = 隔离(模式 2) + 简易(模式 1)
你获得了模式 2 的完整沙箱隔离,却无需编排复杂性。Cloud 处理:
- ✅ 沙箱预配置和清理
- ✅ 端口管理
- ✅ Git 集成
- ✅ 可观测性(Web 界面)
- ✅ 错误恢复
这就是为什么 cloud_conversations.py 保持相对精简,而 multi_server_isolation.py 直接承担了本地编排的负担。
企业价值
- 多供应商灵活性 —— Anthropic 实现、Google 测试、OpenHands 审查
- 可观测工作流 —— 每个智能体拥有独立会话,完全可审计
- 分布式架构 —— 智能体通过工件(Git)通信,而非紧耦合
- 供应商无关 —— 无需更改流水线即可替换任意智能体
- 可扩展 —— 通过向
HARNESS_INSTRUCTIONS添加条目来增加新 harness - 模式灵活性 —— 从本地起步(模式 1),扩展到云(模式 3)
链接
- OpenHands Cloud (https://app.all-hands.dev) —— 运行并观察智能体会话
- OpenHands SDK 文档 (https://docs.openhands.dev/sdk/overview) —— 用 Python 构建智能体流水线
- 智能体客户端协议 (ACP) (https://docs.agentclientprotocol.com/) —— 连接 harness 的协议
- 子智能体的兴起 (https://www.philschmid.de/the-rise-of-subagents) —— 为什么将任务拆解到专注的智能体能够提高可靠性
相似文章
@omarsar0: // Scaling Laws for Agent Harnesses // 如果你构建代理框架,这篇文章值得一看。(收藏)大多数 harness…
关于代理框架缩放定律的新研究显示,大多数字令和工具调用次数并不重要;该研究引入了一种有效的方法。
@ClementDelangue:令牌成本决定了不会有SaaS末日——优秀的开发工具是代理的缓存智能!流行的观…
Hugging Face的hf CLI被证明远比手写原始API调用更高效、更成功,AI代理使用后基准测试显示令牌消耗减少多达6倍,任务成功率从84%提升至94%,这表明良好的抽象是代理的缓存智能。
@dair_ai: // 状态外部化框架 // 关于如何有效构建代理和框架的一种新范式正在兴起。如果……
Harness-1 引入了一种状态外部化框架,将常规记账与搜索代理中的策略决策分离,使一个 20B 模型在多个基准测试中超越更大的前沿搜索器。
@omarsar0: // 自我束具:能自我改进的束具 // (收藏这个)我们今天依赖的大多数智能体框架…
本文介绍了自我束具(Self-Harness),一种新的范式,其中基于LLM的智能体能够迭代地改进自身的操作束具——包括提示、工具和控制流程——无需人类工程师或更强大的外部智能体,在多个模型上取得了显著的性能提升。
@mfpiccolo: https://x.com/mfpiccolo/status/2060069083878408689
文章认为,当前像 LangChain 和 CrewAI 这样的智能体编排框架将独立关注点捆绑成一个整体模块,导致缺乏灵活性。文章介绍了 iii 引擎,其中每个职责都是一个独立的、可替换的工作单元,通过共享总线和单一触发原语连接,使开发者能够通过替换工作单元而非分叉框架来组合自己的编排方案。