OpenHands:Cloud Mac 从「工具集合」到Agent 平台

当 Claude Code 能改一个文件、Runner 能证明一次构建之后,谁负责把「一整条需求」跑完?
系列 Slogan:Claude Code 生产 Diff,GitHub Runner 生产 Fact,OpenHands 生产 Workflow。

Cloud Mac AI Stack · L5 Hub  ·  2026.06.06  ·  约 14 分钟  ·  架构枢纽文 · OpenHands tutorial 见 L5-Q02

Cloud Mac 上 OpenHands 自主 Agent 工作流与多步软件工程任务示意

过去两周,我们在 Stack 连载里把 L1 Runner(Fact)L2 Ollama(Inference)L4 MCP(Context) 一层层立起来。很多读者反馈同一句话:「工具都接上了,但每天还是在手动串流程。」 Claude Code 能改 diff,MCP 能拉 GitHub 上下文,Runner 能在 push 后变绿——可「修完 issue #142 并提 PR」仍要人坐在终端里盯 40 分钟。

这就是 L5 · OpenHands 要回答的问题:不是再买一个 CLI,而是把 Cloud Mac 从工具集合升级成能自主跑完多步工程任务的 Agent 平台。本篇是 L5-Q01 · R1 · 系列 Hub:负责把读者从「编码工具」带到「Agent 平台」认知层——讲清 Workflow 层在 Stack 里的位置、OpenHands vs Claude Code 为何不是替代关系、典型任务与 OpenHands self-hosted on macOS 架构;不含 Docker 安装步骤(那是 L5-Q02 的 SEO 落地页)。

L5
Workflow 层
4
步 Agent loop
24GB
与 Ollama 同机建议内存

Cloud Mac AI Stack · 系列 Slogan(补全第四环)

Claude Code 生产 Diff,GitHub Runner 生产 Fact,OpenHands 生产 Workflow。

MCP 提供 Context;Ollama 提供可选 InferenceWorkflow 消费 Context / Diff / Fact,并在循环中反复调用后两者——不是单向流水线。详见 Stack 语言

「工具集合」陷阱:每个都好用,整条链仍靠人肉

典型一周现场(我们自己在客户仓库里见过多次):

  1. 周一:用 Claude Code 改 API 层,MCP 拉 GitHub issue 列表,会话内一切顺利
  2. 周二:同事用另一台机器 push,Runner 红了——没人把 Agent 的改动与 CI 脚本对齐(若未读 L1 执行引擎,这里会反复踩坑)。
  3. 周三:手动跑测试、改配置、再开 Claude Code 会话补文件。
  4. 周四:终于绿勾,但文档、迁移脚本、示例测试仍缺——因为「改代码」和「交付需求」被当成同一件事。

工具集合的特征是:每一步都有最佳工具,但没有一层对「整条需求」负责。 Agent 平台多出来的,是一个能自己拆任务、自己执行、自己根据失败重试的 Workflow 层——OpenHands 就是 Stack 里承担这一层的开源选项(前身 OpenDevin 生态)。

Stack 语言:Workflow 与 Context / Diff / Fact

全系列统一记法:不用单向箭头把 Workflow 画成 Fact 的下游。Workflow(L5)是编排层,在任务周期内反复消费 Context、产出 Diff、用 Fact 校验,直到判定「需求完成」:

Cloud Mac AI Stack · 产出物关系(非调用顺序)

  Workflow(L5 · OpenHands)
  ├── Context(L4 · MCP)          ← 读 repo / issue / API
  ├── Diff(L3 · Claude Code 等)  ← 改代码 / 写文件
  └── Fact(L1 · Runner / 测试)   ← 跑 test / build / CI 信号

Agent loop(Workflow 内部 · 可多次迭代)
       Diff  ↔  Fact
         ↑       ↓
      Observe → 再 Plan → 再 Execute …

四个产出物并列记忆:Context · Diff · Fact · Workflow(对应 MCP · 编码层 · Runner · OpenHands)。Inference(L2 · Ollama)为可选,不画进上图,避免与 Agent loop 混淆。

组件 产出 回答的问题
L4 MCP Context Agent 看得见什么?
L3 Claude Code Diff 这次改动是什么?
L1 GitHub Runner Fact 组织敢不敢信?
L5 OpenHands Workflow 整条需求跑完了吗?

Workflow 不是「又一个 CI job」,而是跨多步、可中断可恢复的任务状态机:在循环里多次调用 Diff 与 Fact,直到 PR 可交付。Claude Code 擅长单轮 Diff;OpenHands 擅长无人值守地跑完整个 loop——前提是你已铺好 Context 与 Fact。

OpenHands 一分钟定位(不是百科)

OpenHands 是开源的自主软件工程 Agent 平台:在沙盒环境(常见为 Docker)里接收自然语言目标,自动完成规划 → 写代码/跑命令 → 读输出 → 调试,并可对接 GitHub(issue、PR、CI 状态)。在 Cloud Mac AI Stack 里,它不替代 Claude Code 的结对体验,也不替代 Runner 的客观构建证明,而是在二者之上编排多步交付

和「再装一个 MCP Server」的差别

MCP 扩展上下文边界(读 repo、调 API);OpenHands 扩展任务纵深(自己决定下一步调用什么工具、是否重试)。没有 L4,OpenHands 容易盲改;没有 L1,OpenHands 的「完成」无法被组织验收。

OpenHands vs Claude Code:为什么两者不是竞争关系

搜索 OpenHands vs Claude CodeClaude Code alternative 的人,往往在问:能不能用一个换掉另一个? 在 Cloud Mac AI Stack 里,答案是不能也不该——它们处在不同层,产出物不同:

  • Claude Code(L3) → 生产 Diff:结对编码,你在场。
  • OpenHands(L5) → 生产 Workflow:自主 agent,你定目标。

把 OpenHands 当成「另一个 Claude Code」会立刻踩坑:OpenHands 不擅长对齐你脑子里模糊的产品直觉;Claude Code 也不擅长无人值守跑完 8 步 issue。正确姿势是叠层使用——下午你用 Claude Code 啃硬骨头,夜间让 OpenHands agent 清 issue 队列。

维度 Claude Code(L3 · Diff) OpenHands(L5 · Workflow)
交互模式 人在场、逐步确认 目标驱动、多步自治
典型时长 5–30 分钟会话 30 分钟–数小时任务
擅长 复杂单点重构、对齐你脑子里的意图 脚本化需求、批量小改、模板化 feature
风险 会话结束即停,易留半成品 跑飞、改太多文件、权限过大
产出物 Diff Workflow(含 PR、日志、步骤轨迹)
是否 OpenHands alternative ❌ 不是 ❌ 不是 Claude Code 替代品

经验法则(非合同):你在 PR 里能一句话说清改动意图 → 用 Claude Code;你要说的是「把 issue 做完」→ 考虑 OpenHands。 大仓库里若已用 CodeGraph 建索引,结对层往往仍用 Claude Code;OpenHands 更适合接已模板化的后端任务。两者共享 MCP Context 层,但不共享职责

OpenHands 能做什么任务?(搜索用户的第一问)

很多人搜 OpenHands agentOpenHands github,真正想问的是:丢给它什么活靠谱? 下面是我们建议在有测试 + 有 CI 前提下优先尝试的任务类型——也是 L5-Q02 tutorial 会用的示例池:

任务类型 典型输入 预期交付 适合度
Fix bug GitHub issue + 复现步骤 补丁 + 测试 + PR ⭐⭐⭐⭐
Dependency upgrade 「升级 React 18→19」 lockfile + 修复破坏性变更 ⭐⭐⭐⭐
Lint cleanup ESLint / SwiftLint 报告 批量修 warning、不改行为 ⭐⭐⭐⭐⭐
Generate tests 未覆盖模块列表 单元测试 PR ⭐⭐⭐
Documentation sync API 变更 diff README / OpenAPI 同步 ⭐⭐⭐⭐
Scaffold / boilerplate 「加 REST endpoint」模板 路由 + 测试骨架 ⭐⭐⭐⭐

不适合作为第一条 OpenHands 任务:无测试的大重构、UX 大改、需要业务审批的 schema 迁移、直接触达生产密钥。这些仍应留在 Claude Code 结对会话里,由人把关后再交给 Runner 出 Fact。

OpenHands 的工作原理(How OpenHands Works)

How OpenHands worksOpenHands architectureOpenHands agent loop 的人,想搞清的不是 Docker 命令,而是:自主 agent 怎么把一句话变成可 merge 的 PR? OpenHands 的核心是四步循环——业界也常写作 Plan → Execute → Observe → Debug(与下文案例里的 Debug 同义,强调「根据观察再改」):

阶段 做什么 消耗哪层产出
Plan 读 issue / 拆子任务 / 定文件清单 Context(MCP、GitHub、仓库树)
Execute 写补丁、跑 shell、调工具 产出 Diff
Observe 读测试输出、lint、构建日志 消费 Fact(本地 test 或 Runner 信号)
Debug 根据 Observe 结果改计划或改代码 回到 Execute;未达标则继续 loop
OpenHands agent loop(概念 · 非单次流水线)

        ┌──────────┐
        │   Plan   │  ← Context
        └────┬─────┘
             ▼
        ┌──────────┐
        │ Execute  │  → Diff
        └────┬─────┘
             ▼
        ┌──────────┐
        │ Observe  │  ← Fact(test / build / CI)
        └────┬─────┘
             │
      未通过 │ 通过
             ▼
        ┌──────────┐        ┌─────────────┐
        │  Debug   │ ──────▶│ Workflow 完成│ → PR / 交付
        └────┬─────┘        └─────────────┘
             │
             └──── 回到 Plan 或 Execute(下一轮)

这与「装一个更强的 Chat」完全不同:OpenHands architecture 的关键是有状态的任务机——每一步的 Observe 结果都会写进轨迹(trajectory),供下一轮 Plan 使用。上表里的 Fix bug、Lint cleanup 等任务,本质都是同一 loop 的不同入口;差别只在 Plan 阶段的目标句不同。下一步 真实任务回放 用一条 issue 把四步跑满一轮;Docker 与 UI 配置见 L5-Q02。

先叠 L0–L4,再谈 L5:否则 Agent 在沙盒里自嗨

我们反对「第一天就装 OpenHands」的堆工具路线。推荐顺序与 L1 篇接入顺序一致,并在 MCP 之后加 L5:

  1. L0 — Cloud Mac 常驻 macOS 节点。
  2. L1 — Runner:push → 绿/红 可重复。
  3. L2–L3 — 可选 Ollama + Claude Code,在 Fact 之上编码。
  4. L4 — MCP Hub + 权限模型:Agent 读什么、写什么可审计。
  5. L5 — OpenHands:多步 Workflow。

缺 L1 时,OpenHands 可以技术上跑通并开 PR,但团队无法判断 merge 风险——这和「Claude Code SSH 全绿、Actions 全红」是同一类组织事故。缺 L4 权限层时,自主 Agent 的 token 暴露面会放大,见 MCP 安全 spec。

真实任务回放:Plan → Execute → Observe → Debug 跑满一轮

下面是我们用 OpenHands 在沙盒 fork上回放的一类任务(数字为示意)。可对照 工作原理 里的 agent loop 逐步匹配:

目标:修复 issue #218「导出 CSV 缺 UTF-8 BOM」

  ① 读 issue + 相关 src/export/*.ts     ~2 min · Context(MCP/Git)
  ② 生成 6 步计划                       ~1 min · Plan
  ③ 改 4 个文件 + 新增 1 个测试         ~8 min · Execute
  ④ 跑 pnpm test → 失败(快照不匹配)   ~3 min · Observe · Fact
  ⑤ 读日志 → 再改 2 个文件              ~5 min · Debug → 再 Execute
  ⑥ 再跑测试 → 绿                       ~3 min
  ⑦ 开 PR,链 issue                     ~1 min · Workflow 交付

合计约 23 分钟 wall time · 人工仅:批准目标 + 最终 merge review

注意第 ④ 步(Observe):测试失败不是灾难,而是 agent loop 的输入。 结对工具里你往往当场改;OpenHands 要靠 Observe → Debug 把 Fact 喂回下一轮 Execute。若仓库没有稳定测试命令(L1 未固化),Observe 无信号,loop 容易空转——这又是先 Runner、后 OpenHands 的原因。

触发侧的概念配置(非安装教程,仅说明与 GitHub 的衔接方式):

# 概念:issue 标签触发自主任务(伪代码 · 实际以 OpenHands 集成配置为准)
on:
  issues:
    types: [labeled]
if: github.event.label.name == 'agent:openhands'
run: |
  openhands run \
    --repo "${{ github.repository }}" \
    --issue "${{ github.event.issue.number }}" \
    --max-iterations 40 \
    --sandbox docker

Runner · OpenClaw · OpenHands:三个名字,三种脚

这是 L5 篇被问得最多的三角关系:

组件 Stack 层 比喻 典型动作
GitHub Runner L1 · Fact 双脚 xcodebuildpnpm test、归档
OpenClaw 编排(非 Stack 主层) 调度台 触发顺序、回执、审计、ACK
OpenHands L5 · Workflow 自主工程师 读需求、改代码、迭代至 PR

OpenClaw 不会替你做架构决策——它回答「何时跑、跑完怎么通知」;OpenHands 不会替 Runner 签名 iOS 包——它产出的是可 review 的 PR 与步骤日志。三者可叠在同一台 Cloud Mac 上,但职责不要写进同一篇 runbook

OpenHands 在 Cloud Mac 上的典型架构(self-hosted · Docker · macOS)

OpenHands MacOpenHands macOSOpenHands self-hostedOpenHands Docker 的工程师,通常要一张可落地的拓扑——不是安装步骤,而是「组件放哪」。我们在 Apple Silicon Cloud Mac 上推荐的最小生产形态如下:

OpenHands self-hosted on macOS(Cloud Mac · L0 底座)

  GitHub(issues / webhooks / PR)
           │
           ▼
  ┌─────────────────────────────────────┐
  │  Cloud Mac · macOS · Apple Silicon   │
  │  ┌─────────────┐  ┌───────────────┐  │
  │  │ OpenHands   │  │ Claude Code   │  │  L5 Workflow + L3 Diff(可同机)
  │  │ (Docker)    │  │ (SSH/终端)    │  │
  │  └──────┬──────┘  └───────────────┘  │
  │         │ sandbox workspace           │
  │         ▼                             │
  │  ┌─────────────┐  ┌───────────────┐  │
  │  │ MCP Servers │  │ Ollama (可选) │  │  L4 Context · L2 Inference
  │  └─────────────┘  └───────────────┘  │
  │         │ git push                    │
  │         ▼                             │
  │  ┌─────────────────────────────────┐  │
  │  │ GitHub Runner (self-hosted)     │  │  L1 Fact
  │  └─────────────────────────────────┘  │
  └─────────────────────────────────────┘

为什么 Workflow 层放在 Cloud Mac,而不是笔记本?

  • 时长 — OpenHands agent 任务常跑 30–90 分钟;笔记本合盖即断。
  • OpenHands Docker — 沙盒依赖稳定 daemon;Cloud Mac 24/7 常驻更合适。
  • 与 Runner 同栈 — Agent 改完 → 同一 macOS 节点 Runner 验证,减少「SSH 绿、Actions 红」。
  • ABI 一致 — iOS / macOS 目标仓库在 Apple Silicon 上跑沙盒与 CI,比 Linux VPS 上硬套 Docker 更少惊喜。

最小 OpenHands Docker 启动形态(概念片段,完整 docker compose 与 env 见 L5-Q02 tutorial):

# Cloud Mac 上 · OpenHands self-hosted(示意)
docker pull docker.all-hands.dev/all-hands-ai/openhands:0.9
docker run -d --name openhands \
  -e SANDBOX_USER_ID=$(id -u) \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v $HOME/.openhands:/.openhands \
  -p 3000:3000 \
  docker.all-hands.dev/all-hands-ai/openhands:0.9

独享节点 ≠ 自动安全

Cloud Mac 解决算力与 macOS ABI;OpenHands 仍要仓库级权限最小化(bot 分支、无 prod secret)。未来 L6 Agent Ops / Governance 层将专门讲 audit、policy 与人工 gate——本篇先立 Workflow,治理下一环见系列排期。

L5 Agent Stack 推荐规格:从 Workflow 到该租哪台 Cloud Mac

读完架构,下一个自然问题是:Workflow 层该配什么机器? 下面是我们按真实叠载给出的选型表(非合同 SLA,用于缩短决策时间):

场景 建议配置 说明
OpenHands Only(轻量 issue、无本地推理) M4 · 16GB Docker 沙盒 + API LLM;适合先试 agent 工作流
OpenHands + Claude Code(同机结对 + 自主) M4 · 24GB 日间 Diff、夜间 Workflow;避免与 CI 抢内存
OpenHands + Ollama 7B M4 · 24GB 私有 Inference + Agent;见 错峰调度
OpenHands + Ollama 14B + Runner M4 Pro · 48GB 14B 常驻 + 沙盒 + 日更 macOS CI;Swap 风险最低
iOS 团队(OpenHands 清 issue + xcodebuild CI) M4 · 24GB+ Agent 与 Runner 同机;archive 峰值预留 8GB+

这条链路就是商业叙事里的 Workflow → Cloud Mac → 规格:先确认你要的是 L5 能力,再选能稳住 Docker +(可选)Ollama + Runner 的节点,而不是反过来先租机器再堆工具。

适用与不适用:说清边界比吹 Agent 更重要

更适合 OpenHands(L5) 不适合 / 慎用
内部工具、脚手架、文档站、测试补全 受监管金融 / 医疗核心路径无人工 gate
issue 模板清晰、测试覆盖尚可的 repo 无测试、无 CI 的「先跑起来再说」仓库
重复性迁移(依赖升级、lint 批量修) 需要强产品直觉的 UX 大改
已有 L1 Runner + L4 MCP 权限策略 secret 散落在仓库、无 token 轮换
团队接受「Agent PR + 人 merge」 要求 Agent 直接推 main / 自动发布 prod

脚本与小服务:是;强合规生产写入:否。 这与 blog 战略里对 OpenHands 的定位一致——它是工程加速器,不是免责的「自动 DevOps」。

决策:你的 Cloud Mac 该升级为 Agent 平台吗?

做完下面自检,命中左列 ≥3 条再投入 L5;否则先把 L1/L4 补齐更划算。

可以上 OpenHands 先别上
每周 ≥5 个「小而完整」的 issue 排队 主要痛点是「没有 macOS CI」
Runner 已绿,仍花大量时间手工串步骤 Claude Code 会话都还不稳定
MCP 权限与 bot 账号已分级 GitHub PAT 全仓库 admin
愿意维护沙盒与任务日志 无人做 merge review
Cloud Mac 24GB 或已做 Ollama 错峰 16GB 上同时跑 14B + Agent + Xcode

结论(决策,不是总结): OpenHands 的价值不在于「更聪明的 Chat」,而在于 Cloud Mac 从工具集合变成对需求负责的平台——但前提是 Fact(Runner)与 Context/权限(MCP)已立住。否则你只是把手动串流程,换成自动串流程,组织仍不敢 merge

L5 专题连载:从决策到第一条自主任务

篇目 qid 主题 状态
· 本篇 L5-Q01 从工具集合到 Agent 平台(决策 R1) 已发布
L5-Q02 Cloud Mac 安装 OpenHands + 第一条自主任务 下一篇
L5-Q03 OpenHands vs OpenClaw 分工详解 计划中
L5-Q04 Runner + OpenHands:CI 失败后自动提 PR? 计划中
· L6 延伸 L6-Q05 Agent Ops / Governance(Context→Workflow→治理) 📅 6/16

接 L6 闭环前,建议至少完成 ②:没有可复制的 OpenHands tutorial,Hub 仍缺落地页。全栈地图在 L6-Q01;系列将从「AI Tool Stack」演进为「AI Engineering Platform」,L6-Q05 Agent Governance 补最后一环。

常见问题

How OpenHands works / agent loop 是什么?
Plan → Execute → Observe → Debug 四步循环,消费 Context、产出 Diff、用 Fact 校验;见 工作原理

OpenHands vs Claude Code — 选哪个?
不是二选一。Diff 用 Claude Code,多步 issue 用 OpenHands;见 OpenHands vs Claude Code

OpenHands tutorial / 怎么安装?
本篇是 Hub,不含逐步安装。Docker + 第一条 issue→PR 见 L5-Q02(计划 6/14 发布)。

OpenHands 能在 Mac 上 self-hosted 吗?
可以。推荐 Cloud Mac 常驻 macOS + Docker 沙盒;架构见 典型架构

没有 Runner 可以直接上 OpenHands 吗?
能跑,不建议。先 立 L1

和 OpenClaw 呢?
编排 vs 自主工程;见 三角分工OpenClaw 手记

该租什么规格?
L5 Agent Stack 推荐规格;仅 OpenHands 可 M4 16GB,叠 Claude Code 或 Ollama 7B 建议 24GB。

L5 Agent Stack · 选型

按你的工作负载选 Cloud Mac 规格

OpenHands Only → M4 16GB · + Claude Code → M4 24GB · + Ollama 14B + Runner → M4 Pro 48GB。先在 Hub 理清 Workflow 层,再用 L5-Q02 tutorial 跑通第一条自主任务。

查看 Cloud Mac 定价与规格
L5 Agent Stack M4 24GB 起