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 教學見 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 教學會用的範例池:

任務類型 典型輸入 預期交付 適合度
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

階段 做什麼 消耗哪層產出
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 教學):

# 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 教學跑通第一條自主任務。

查看 Cloud Mac 定價與規格
L5 Agent Stack M4 24GB 起