OpenHands 1.33 教學:MCP 連線選擇與 Automation 驗收
OpenHands 的 MCP 可以安裝,卻連到錯誤的服務;Automation 看得到儲存庫,執行時卻 clone 失敗。這類問題要分開核對連線方式、Git provider/host 與實際執行結果。1.32.0補上 MCP 選項與多 provider 清單,1.33.0修正執行階段顯示及 Secret 輸入遮罩。
本文於 2026-10-24 檢閱官方 release、PR 與程式差異,沒有啟動 OpenHands 或傳送憑證。下面的驗收流程供部署後操作;1.31 登入排錯、1.29 profile 與歷史問題仍各自標示適用版本。
1.32/1.33:先驗收選到的連線與儲存庫
MCP 的同一個名稱,可以有不同安裝路徑
PR #18836讓具有兩個以上可安裝選項的 Library 項目顯示 Connection method。預設仍選第一個;切換後,URL/命令、欄位與 Install 動作改用新選項,輸入欄位從空白開始。只有一個選項時不會出現多選介面;是否看得到特定服務的選項,也取決於部署帶入的 catalog。
例如該 PR 的 Sentry 案例,託管 OAuth 與帶 personal token、可指定 SENTRY_HOST 的 stdio 是不同路徑。自架服務不能只確認「裝了 Sentry」,還要核對 host 與驗證方式;不要把託管站的授權結果當成自架站已連通。
用測試帳號操作時,先記下選項的目標 URL 或 command,切換一次確認舊欄位沒有被沿用,再填入新選項所需資料。安裝後要求一個最小唯讀工具呼叫,檢查回傳資料確實來自預期環境。選項可見、安裝成功與工具打到正確服務要分別通過;重新安裝同名項目無法代替最後一項。
Automation 清單還要看 backend 的 provider 能力
PR #18821依 Automation service 的 GET /v1/capabilities 中 repoProviders 決定可選 provider;欄位缺省時沿用 GitHub、GitLab、Bitbucket。Azure DevOps 等其他 provider 要等服務明確列出,不能只因帳號已連接就推定可 clone。
GitLab/Forgejo 若 backend 沒回報連線 host,清單會停用相關選擇,避免把自架儲存庫誤指向公開服務。自架 URL 還須攜帶對應 provider,讓服務選用正確 token;貼一個看似正確的 URL,不能取代這層資訊。
部署後以可拋棄的測試儲存庫完成一次小型驗收:
- 核對目前 backend、已連接 provider、回報 host 與
repoProviders,先定位是能力缺少還是 host 未回報。 - 在 picker 選取儲存庫,保存後關閉再重開,確認 URL、branch 與自架 provider 未遺失;不要在紀錄中保存 token。
- 手動啟動測試 Automation,檢查 clone 的實際遠端與 branch,以及預先放入的辨識檔。清單有列出不代表 token、網路與 repository 權限已通過。
1.31 的 repoUpdate 仍決定既有 Automation 能否編輯 repos;新 picker 不會自動賦予後端原本沒有的更新能力。
current_phase 是執行線索,不能當完成判定
1.33 的 PR #17122改為讀取服務已提供的 current_phase 字串,顯示在活動紀錄並帶入匯出。階段文字可與 Failed 同時存在:它記錄任務走到哪裡,不保證該階段完成,也不代表測試通過。
若任務停住,先以同一個 run ID 對照 status、current_phase、錯誤與產物。缺少階段文字時,檢查該次回應是否有欄位及 Canvas 版本;不要直接重跑可能已產生外部動作的任務。
同版的 PR #18870把 Settings 與 request Secret 的共用欄位改為預設遮罩的單行 password input,顯示鈕只切換當下輸入值,切換 Secret 後回復隱藏。這是介面變更,沒有改動 API 或保存方式;遮罩不能證明憑證已輪替,也不能當成儲存加密的證據。先用假值驗收顯示/隱藏、取消與保存,不要把真實金鑰放進截圖。
1.31:先確認 MCP 停在哪個階段
1.31.0 於 2026-10-22 16<09>09> UTC 發布,台灣時間為 10 月 23 日 00<09>09>。升級後仍應核對實際部署的 Canvas 與 backend;只更新其中一個元件,不能直接宣稱整套能力已就緒。
PR #18780修正 Library 中只有 OAuth 選項的遠端 MCP 安裝。沒有其他可安裝選項時,改走 MCP 伺服器自己的 OAuth discovery 與動態 client registration;有其他可用選項的項目仍沿用原選項。這不表示任何 OAuth 服務都能自動註冊成功,伺服器仍須支援相應流程。完全沒有可用選項時,介面應顯示原因並停用 Install,而非留下無反應的按鈕。
PR #18816則將已取得授權 URL、卻沒有完成登入的失敗歸類為 authorization,提醒完成彈出視窗的登入。尚未進入授權流程的後端逾時仍保留 timeout;不能只看到新版訊息,就認定網路與 callback 一定正常。
在測試用 MCP 和最小權限帳號驗收時,依序保留這些結果:
- Library 是否出現可用選項,Install 是否開啟預期服務的授權頁;沒有開啟時先查選項與彈出視窗阻擋,不要直接改 URL。
- 刻意關閉未完成的授權視窗,確認回報「登入未完成」,沒有被當成安裝成功;再從安裝流程重新開始授權。
- 完成授權後關閉並重開 MCP 頁面,確認伺服器仍列出,再以受控的唯讀工具呼叫驗證可用性。列在清單中與工具真正可用,需分別記錄。
OAuth 完成也不會自動改掉某個命名 Agent profile 的 MCP 選擇;若只有某份 profile 找不到工具,接著核對下方的 scope 與啟用清單。
編輯 Automation repository,要看後端能力再保存
PR #18776指出,舊表單讀取錯誤的 repository 欄位,且更新時沒有送出 repository 清單。修正後可從保存的 preset metadata 讀回多個 repository,保留既有 branch 與 provider。
能顯示既有 repository,不代表這個部署能修改它。 只有服務宣告 repoUpdate,且 Automation 屬於支援的 prompt 或 plugin preset 時,表單才允許原址修改。其他情況應顯示唯讀清單;不要為了讓按鈕出現就重建正式排程或刪掉舊設定。PR 也明確指出 repository 更新依賴 Automation service 的配套變更,不能只看 Canvas 1.31 的版本字串。
用停用的測試 Automation 保存前,記下每個 URL、branch 與 provider。只改一項後保存,關閉 editor,從詳細頁重新打開,再從列表重新進入一次,比對兩條路徑都讀回同一份清單;這能找出保存後仍使用舊快取的情況。若少了一個 repository,先保留原紀錄與回應,不要用空清單再次保存。最後才在受控環境執行一次任務,確認 checkout 的來源與 ref;本文未執行這些步驟,表單讀回也不能代替實際 clone 驗收。
1.29:default 和命名 profile 的設定來源不同
1.29.0 的實際發布時間是 2026-10-20 22<22>22> UTC,台灣時間為 10 月 21 日 06<22>22>。PR #18720在前面幾個 profile 編輯 PR 後合併,改掉早期 PR 截圖裡「default 請到全域頁面修改」的部分限制;讀新版行為時要以最後實作為準。
本機 OpenHands default 與部分全域頁面共用設定來源:Skills 頁面編輯它的 skills;它使用目前 active LLM profile,載入 MCP Servers 頁面已啟用的伺服器,並可使用所有 Secrets。其 Secrets 沒有逐項選擇器。ACP default 仍保留自己的 Secret 與 MCP scope,不能從名稱相同推論權限也相同。
命名 profile 則保存自己的行為與模型參照。新增 profile 會從 default 複製多項初始行為,複製不代表後續持續同步。Home 的 profile 與 LLM pill 可協助確認下一次啟動的組合;選了命名 profile 時,不應只看全域 active model 就認定會用那個模型。
Condenser/Verification 編輯 PR #18679、Model Router PR #18685及 Skills PR #18686提供 profile 層級控制。critic API key 仍是全域資料,不能因為每份 profile 能開關 verification,就推論每份都有自己的 critic key。Skills 的完整清單亦受 server catalog 與 backend 支援影響,Cloud 不應直接套用本機 Skills/Router 操作。
升級後用 A、B 兩份測試 profile 讀回
- 升級前記下 backend、目前 active profile、模型與預期 skills,保留可復原的設定備份。第一次載入會把舊全域行為遷到本機 OpenHands
default;遷移失敗時應查錯誤,不要刪掉 default 讓它重新播種。 - 在隔離的測試環境建立命名 profile A,改一個可辨識的 condenser 或 verification 值,保存後關閉並重開 editor,確認值已讀回。再切到 B 或 default,確認沒有誤改它們。
- 改 default 的 Skills,再重開 A,確認 A 仍保有自己的選擇。若測 MCP,先記住 default 的開關會影響 MCP Servers 頁面及其他使用那些伺服器的 profile;不要拿正式工具做隨意開關測試。
- 在 Home 選 A,對照 profile 與 LLM pill,再建立無敏感內容的新 conversation,核對實際模型和最小任務。保存 editor 成功只完成第一層,不能代表既有 conversation 已換模型。
上述是依 v1.29.0 launch 原始碼及 migration 原始碼設計的讀者驗收流程,本文沒有執行。遷移只做一次,失敗會阻止使用未完成遷移的 default 啟動;不要用反覆新增 conversation 取代設定診斷。Cloud 保留自己的啟動路徑,不應推論也做同一項本機遷移。
1.28 對話內 Secrets:先確認儲存與附加結果
Secrets 請求 PR #18408建立 request_secret(name, reason),讓 Agent 指出缺少的憑證與用途;後續 PR #18575把原先 modal 改成對話中的 inline card。兩項都列在 1.28.0 release,不應照最初 PR 把正式介面描述成一定彈出視窗。
這條 client tool 的初始適用範圍是本機 OpenHands-agent conversation,不能推論 ACP、Cloud 或任意第三方 harness 都有同一張卡片。設計會透過既有 Secrets 路徑保存與附加參照;回報給 Agent 的狀態可為 saved、not_saved 或 error,工具回報不包含原始憑證值。
可以用短效、低權限的測試憑證分開驗收:
- 核對目前 backend、conversation、要求的 Secret 名稱與用途,透過 Secrets 表單輸入,不把值貼進聊天或問題回報。
- 先測取消,確認 Agent 不會把缺少憑證的步驟宣告完成;不需要該憑證的工作可以另外進行。
- 再測保存,區分「設定已保存」和「已附加到目前 conversation」。保存成功但附加失敗仍可能回報 error,不能只從 Settings 裡有項目就認定 session 已可使用。
- 在預期的服務入口做一個無副作用的最小驗證,保留狀態與錯誤類型,避免保存或分享含 token 的完整 request/response。
如果同名 Secret 已存在,原始設計也允許直接附加,不一定再次詢問。想驗證取消路徑,應在隔離的測試範圍使用未存在的名稱;不要為了重現卡片刪除正式憑證。上述是依 PR 契約設計的驗收,本文沒有執行,亦不把「值不在回報訊息」解讀成工作中的 Agent 完全不能使用憑證。
切換 backend 後先讀回設定,再按保存
PR #18401處理 Application settings 沿用另一個 backend 的快取表單值,進而可能把舊 Git 身分寫到目前 backend 的問題。這比模型選單看起來沒刷新更直接影響設定內容。
升級後先用測試 backend 做 A → B → A 切換,確認頁面顯示各自的 Git 身分;若有未儲存修改,也要確認沒有跟到另一個 backend。需要保存時,核對畫面標示的 backend/組織,成功後重新載入讀回,才能確認值落在正確位置。不要在混淆來源時反覆按 Save。
PR #18490另外調整設定請求的重試:一般 4xx 不再重送,408、429、5xx 與沒有 HTTP status 的網路錯誤仍有不同處理。遇到 422 應先修正輸入與讀取服務端錯誤,不要把「只送一次」當成連線故障,也不要自行把所有失敗都加成無限重試。
Automation 改排程:歷史測試通過不代表現在可保存
既有 custom-script Automation 若曾上傳 bundle,編輯排程卻被要求補 setup script path,PR #18649修正的是編輯草稿遺失既有 bundle 資訊。這個修正不等於所有新建 Automation 都能省略原本必要的設定。
驗收時保留 Automation ID、原排程與既有 bundle 記錄,先只改一個排程欄位,確認保存請求成功,再重新開啟同一個 ID,讀回排程與 bundle。若 UI 阻擋、根本沒有送出 request,和 backend 收到請求後拒絕,是兩條不同的排錯路徑;不應先重建或刪除整個 Automation。
PR #18617則讓目前保存草稿的驗證錯誤優先於歷史測試狀態。之前的 Test passed 仍屬於當時輸入;改了 cron、workspace 或其他設定後,要重新確認目前有效性。對排程本身,還要分開查時區、下次執行時間與測試產物,不能從一枚綠色狀態推論整條流程都成立。
1.27.0 Docker 重啟迴圈:先比對缺少模組的錯誤
官方修正 PR #18343記錄,1.27.0 的 static-server.mjs 需要 MARS web bridge,但 Dockerfile 漏了它及相依模組。只補一個 mars-web-bridge.mjs 仍會缺少其他本機模組與 ws 套件;v1.27.1 Dockerfile已加入相關 COPY。
這個已知問題以 ghcr.io/openhands/agent-canvas:1.27.0 為範圍,不代表所有 OpenHands launcher、Local GUI 或 Docker 啟動失敗都出自同一原因。先在原本管理 container 的主機檢查,將 YOUR_CONTAINER 換成自己的 container 名稱:
docker inspect --format '{{.Config.Image}} {{.Image}} {{.State.Status}} {{.RestartCount}}' YOUR_CONTAINERdocker logs --tail 100 YOUR_CONTAINER這兩行是供讀者執行的唯讀診斷,本文未對實際 container 執行。第一行同時保留建立 container 時的 image 名稱與實際 image ID;latest 是浮動標籤,不能單靠這個字判斷正在跑哪個 build。第二行要比對模組路徑,分享 log 前先移除敏感資料。
確認符合此症狀後,先保存原本的掛載、啟動參數與資料備份,再透過既有部署方式換到已修正的 1.27.1 image。不要把手動複製單一模組當成完整修復,也不要刪除持久化資料來消除重啟紀錄。
新 container 啟動後,核對三層結果:
- 實際 image ID 已變更,log 沒有相同缺檔錯誤,RestartCount 不再持續增加。
- 在自己的映射位址檢查
/health與 Canvas 介面;官方 smoke test使用 health 回應及持續存活檢查,單次 container 顯示 Running 不夠。 - 用無敏感資料的 workspace 執行一個可核對產物的任務,再確認原有 Automation。health 通過只驗證服務入口,不能代替模型、Secrets 或任務驗收。
這是依官方修正設計的驗收流程;PR 裡的 Docker 結果是維護者提供的證據,不是本文的本機測試。
ACP 顯示 Agent default 時,檢查實際模型來源
1.27.0 的模型探索修正 PR #18131讓 ACP 清單來自 agent,而非 Canvas 自己硬編碼。Agent default 儲存的是 acp_model: null,表示讓 agent 決定模型,不是固定的通用 model ID。
本機 backend 可在開始 conversation 前探索模型;清單與 backend、Secret scope 有關。舊 agent-server、探索失敗或 Cloud 路徑可能使用先前記住的清單,因此「選單列得到」仍不等於目前帳號能成功呼叫。現有 conversation 應以它回報的模型為準,不能拿全域 Settings 的模型欄位當作執行證據。
驗收時先記錄 backend 與 profile 允許的 Secrets,等待探索結果,再開一個新 conversation,核對該 session 回報的模型及一次簡單任務結果。如果更換登入或 Secret scope 後選單不同,先查來源與登入錯誤,不要直接手填別的供應商 model ID。
OpenCode/Pi preset PR #17758另有 local-only 邊界:1.27.0 的內建入口限本機 backend,不能推論 OpenHands Cloud 也支援相同 harness。Pi 的模型依 credential 決定;OpenCode 的 credential 欄位可略過,也不表示付費模型已取得使用資格。若問題是 OpenCode Go 本身的訂閱與 provider,可對照 OpenCode Go 的模型與呼叫檢查,並另外核對 OpenHands 的 ACP session。
1.26 的 Successful 要搭配任務結果看
Automation 狀態修正 PR #17682調整完成 run 的顯示規則:缺少 task outcome 的 status 時,以成功標章顯示,仍保留 outcome_summary;明確提供但無法辨識的 status 字串,繼續顯示 Needs review。這是在減少舊版或不完整 finish response 的誤報,沒有替任務產物增加驗證。
升級後用一個無敏感資料、能明確檢查結果的測試任務驗收,例如要求 Agent 列出指定範例檔的三個欄位:
- 記錄 backend、Automation ID、run ID 與執行時間,確認看到的是本次 run。
- 對照執行狀態與 outcome summary;摘要說「完成」仍要打開產物,核對三個欄位是否存在且正確。
- 遇到 Needs review,先讀明確的 outcome 與錯誤內容;遇到 Successful 卻沒有產物,保留該 run 的 log 再查任務流程,不能只改通知設定。
這三項是供讀者執行的驗收流程,本文未派送 Automation。官方 PR 也指出,其當時的 live SDK 要求 finish response 有 status,因此 summary-only 相容案例是在前端測試邊界驗證;不能據此要求目前 backend 發出同樣的省略欄位 payload。
本機 View logs 空白,先核對查詢的層級
PR #18022處理本機 Automation 已執行且有 stdout,Output 卻顯示 (no output) 的問題。本機 run 的 bash 輸出位於 server 層;修正後查詢 /api/bash/bash_events/search,不會因 run 建立了 conversation 就轉去 conversation 範圍查詢。Cloud backend 的 runtime 路由仍另行處理。
若使用升級後的本機 backend,可在自己的瀏覽器 Network 記錄中重開同一個 run 的 View logs,確認 bash events 查詢沒有落到 /api/conversations/<id>/bash/bash_events/search,再核對 Output 與 System error。請求路徑正確只是 log 查詢的證據;空輸出仍須查 run ID、狀態、回應與任務產物,不能一律認定已遇到這個 bug。分享 log 前去除 API Key、session key 與私有檔案內容。
1.21 到 1.29:先確認自己使用哪一種執行路徑
| 版本 | 官方 release 記錄 | 對讀者的判斷 |
|---|---|---|
| 1.21.0 | 支援向 Docker server 要求 Docker execution workspace | 這是遠端 Docker server 的 workspace 路徑;不要直接把它當成下面的本機 serve —mount-cwd 指令 |
| 1.22.0 | cloud backend 可經 app server 測試 remote MCP server;Git Sync 開放給 cloud backend 的 org admin | 使用雲端 backend 的團隊才需要檢查這兩項權限與連線 |
| 1.23.0 | macOS universal DMG 內含各架構 runtime;新增 Light+ 與 Solarized Light theme | macOS 使用者可檢查最新 DMG;CLI 使用者不必為主題更新切換安裝路徑 |
| 1.24.0 | 雲端 Automation conversation 可唯讀分享;OpenAI 訂閱狀態與模型清單快取依 backend/組織區分;分組 workspace 可整批展開或收合 | 分別驗證雲端成員的閱讀範圍、backend/組織切換後的模型資料,以及目前分組中可見的資料夾 |
| 1.25.0 | 批次新增模型 profile、可綁定 provider connection,新增首次訊息 Router 控制 | 分別驗證 profile 憑證來源、首次建立 router 後的開關,以及新 conversation 的模型切換 |
| 1.26.0 | 縮小 Needs review 的觸發範圍,修正本機 Automation log 查詢 | 對照 run、任務摘要與產物,另查本機 Output 是否讀到正確層級 |
| 1.27.0/1.27.1 | ACP 模型探索、本機 OpenCode/Pi;修正 1.27.0 Docker 缺檔 | 分別核對實際 image、backend、Secret scope 與 session 回報模型 |
| 1.28.0/1.28.1 | 對話內 Secrets、backend 表單及 Automation 草稿保存修正;agent-server 相依更新 | 核對目前 session 的憑證附加狀態、正確 backend 的讀回值,以及最新草稿驗證結果 |
v1.25 批次新增 profile,先核對 connection
批次模型 PR 提供一次新增多個 LLM profile 的入口;後續 connection PR 讓新增的 profile 可以綁定 provider connection。這兩條路徑需要不同驗收:
- 選擇匹配的 connection:確認它屬於預期的供應商、帳號與 Base URL,再新增少量模型。建立後先做無敏感資料的最小呼叫,確認帳務與連線來源正確。
- 選擇
No connection (keyless):新增的是沒有 connection 綁定的 profile,後續仍須補齊憑證或可用的連線設定。不要把「建立成功」解讀成「可以呼叫模型」。 - 從某個 connection 的選單開啟批次新增:官方 PR 描述這條入口會預選載入的模型;送出前應取消不需要的項目。從一般 provider 選擇器進入時則不預選,避免直接碰到帳號 profile 數量限制。
先建立一個模型、測完再增加,比一次選整份目錄容易確認問題屬於 profile、憑證或服務端限制。若批次過程有失敗,回到 profile 清單確認哪些已建立,不要直接重送全批造成重複名稱。
第一個 Router 建立後,檢查首次訊息開關
Router 開關 PR 新增 Run on first message,需有 active router 才有作用。後續 PR 在 router 數量從零變成一時自動開啟;之後新增 router 不會再覆寫開關。不能只從最初 PR 的「預設關閉」推論第一次建立後仍維持關閉。
如果你希望固定模型,建立 router 後先關閉該選項;希望自動選模型,則用新 conversation 驗證第一則訊息的事件與實際切換結果。建議記下:
- 執行 backend、active router 與開關狀態,重新載入設定頁確認有保存。
- 路由選到的 profile,以及它綁定的 connection;不要只看聊天標題或預設模型名稱。
- 用同一個無副作用任務比較開關開啟與關閉後的兩個新 conversation。
官方開關 PR 指出 Cloud GUI 的設定欄位與預載資料尚有適用限制;本文沒有驗證 v1.25 在每個 cloud 部署的行為。雲端使用者應確認當前 backend 的支援與事件結果,不能將本機設定頁存在當成所有 launch 路徑都會路由的證據。
v1.24 升級時要驗證的三個邊界
Release note 只列出功能名稱,升級後仍應確認它套用在哪個 backend,以及實際使用者能看到什麼:
- 切換 backend 或組織後重新看訂閱狀態與模型清單:v1.24 將 OpenAI 訂閱狀態與模型查詢的快取 key 加上 backend ID 和組織 ID。若你同時使用本機與雲端 backend,分別切換兩邊,再確認顯示的帳號和模型目錄沒有沿用前一個選擇的快取資料。這是用來驗證前端顯示,不代表 API 金鑰或訂閱已在兩個 backend 間共用。
- 從 Automation 活動紀錄打開分享對話:官方 PR 描述的是已登入的同一組織成員透過 cloud backend 開啟唯讀 conversation;畫面沒有輸入框。用 Automation owner 和同組織另一位已登入成員確認檢視方式,再檢查對話是否可讀。唯讀檢視描述的是 conversation 頁面,不應推論成 Automation 執行本身沒有寫入權限。
- 確認分組資料夾整批切換只影響目前可見項目:在 Conversations 使用 workspace 分組時,標題可收合或展開所有可見資料夾;篩選掉的資料夾保留原本狀態。切到時間排序或沒有資料夾的畫面時,標題仍是一般標籤,不是整批操作按鈕。
這三項查核把「畫面已更新」拆成資料快取、雲端讀取權限和側欄狀態,避免把某一個 UI 結果誤當成另一個 backend 的設定或權限證明。
Release notes 列出功能名稱,沒有替每個部署環境提供可通用的 Docker server 設定值。若你要設定遠端 workspace 或 cloud MCP,請先確認所用 backend 的管理文件和實際權限,不要直接複製本機 GUI 的 Docker 指令。
Agent profile、Secrets 與 Automation 的 1.20 更新
| 1.20 變更 | 對工作流的意義 | 升級後先檢查什麼 |
|---|---|---|
| Agent profile 可選擇該 profile 可用的 Secrets | 不同任務可以使用不同的憑證範圍,不必把所有 Secret 暴露給每個 Agent | profile 的 Secret allow-list、實際執行身份、失敗時的拒絕行為 |
| Docker conversation runtime settings 可被傳遞 | 對話建立的 container 可以沿用預期的 runtime 設定,減少手動啟動與對話狀態不一致 | image、workspace mount、環境變數、資源限制與網路邊界 |
| Automation 可選擇已儲存的 Agent profile | 排程工作可以固定模型、工具與憑證邊界,而不是依賴建立者目前畫面上的設定 | automation owner、選用 profile、workspace、Secret 與實際 task outcome |
| Mock-LLM profile 與 ambient Secrets 隔離 | 測試 profile 不應因背景環境存在 Secrets 就意外取得它們 | 測試環境是否真的沒有把環境變數或共用 Secret 帶入 |
這些變更不是「建立 profile 後就自動安全」。profile、Docker、automation 和 workspace 是四個互相影響但不能互相代替的邊界;要用小任務逐一驗證。
用 Agent profile、Secrets 與 Automation 的驗證順序
不要先把所有既有 automation 切到新版本。建議依序做:
- 記錄目前 OpenHands、CLI launcher、agent-server、automation 與 Docker image 版本。
- 列出現有 LLM profile、可用 Secrets、MCP server、workspace mount 與 automation owner。
- 建立一個只含測試資料的 workspace,先執行不修改檔案的任務。
- 建立或複製一個低權限 Agent profile,只選取該任務需要的 Secret。
- 在新的 conversation 檢查 Docker runtime 設定與實際 workspace path,再測試最小寫入任務。
- 最後才讓一個可停用的 automation 使用已儲存 profile,確認 task outcome、權限錯誤與執行身份。
如果舊 conversation 還像在使用舊模型或舊設定,不要只看 profile 名稱;重新啟動 conversation,並從事件、設定頁與實際模型呼叫確認。這篇文章的版本資訊是 release 與文件查核,不是本機執行紀錄。
安裝 CLI launcher 與啟動 GUI
官方目前的本機 launcher 流程需要 Python 3.12 以上、uv 與可用的 Docker 環境。先依 uv 安裝文件 完成 uv,再安裝 OpenHands:
uv tool install openhands --python 3.12進入準備交給 Agent 的專案目錄,從該目錄啟動並掛載目前 workspace:
cd /path/to/your-projectopenhands serve --mount-cwd完成後開啟:
http://localhost:3000第一次只想確認介面與 Docker 是否可用,可以在不含敏感檔案的測試目錄執行 openhands serve。不要為了方便把整個家目錄掛載給 Agent;--mount-cwd 不是唯讀模式,掛載範圍內的檔案可能被讀取或修改。
這個指令啟動本機 GUI server,並把目前目錄掛載給 Docker conversation;它和新版 CLI 的互動式 terminal mode 是不同路徑。若要固定 Docker image、agent-server tag 或啟動參數,請依目前的 OpenHands Local setup 文件 為準。舊教學中的 all-hands-ai image 路徑或單一 image tag 不一定能和目前 launcher 組合。
建立 LLM profile,先限制 Secrets 再談模型
開啟 OpenHands 後到 Settings → LLM 設定 provider、model、Base URL 與 API Key。實際可用模型、名稱與費用會隨供應商和方案變動,請以目前設定頁與 provider 文件為準,不要把文章中的 model id 當成永久答案。
建議 profile 以任務或權限命名,例如:
docs-readonlyrepo-test-with-registryrelease-maintainer建立 profile 時用「這個任務真的需要什麼」反推 Secret 範圍:
- 只讀文件任務不應取得 repository write token、production credential 或發布金鑰。
- 需要安裝相依套件的任務,先判斷是否真的需要 registry token;能用公開套件就不要附帶私有憑證。
- 需要 Git push 或部署的任務,將它分成另一個明確 profile,並讓執行者知道該 profile 有外部副作用。
- 測試 profile 要檢查 ambient environment 是否被意外帶入,不要只在設定頁看到 Secret 名稱就判定隔離成功。
儲存後,在新的 conversation 以最小任務驗證:
先讀取 README 與套件腳本,不要修改檔案。回報目前 workspace 的絕對路徑、使用的 Agent profile、可用工具與你沒有取得的權限。如果 profile 有 MCP server 範圍,也要逐一確認只連到任務需要的 server。profile 能限制 Secret,不代表 MCP server 或掛載的檔案會自動變成最小權限。
Docker conversation runtime 要檢查哪些設定
1.20 的 Docker conversation runtime settings forwarding 對可重現性有幫助,但「設定能被傳遞」不等於設定內容適合所有任務。建立 conversation 後檢查:
- Image 與版本:記錄實際 image、agent-server 與 launcher 版本,避免只看 UI 顯示的產品版本。
- Workspace mount:確認 container 內的專案路徑對應到預期的 host workspace,沒有意外掛載上層目錄。
- 環境變數與 Secrets:區分一般設定、短期 token 與高敏感憑證;不要把 Secret 用明文寫進 prompt、Dockerfile 或 repository。
- 網路與資源:任務若不需要外網,先關閉或限制;檢查 CPU、記憶體與 timeout,避免失敗只顯示成模型無回應。
- 可回復性:先在 branch 或 worktree 執行,再以外部終端機查看
git status --short與 diff。
若你需要同時讓多個 coding agent 工作,可以先看 Git worktree 管理多個 AI coding agent。分開 worktree 不能取代 Secret 或 container 權限檢查,但能降低互相覆蓋檔案的機會。
Automation 如何使用已儲存 profile
升級後不要假設 automation 會自動沿用你最近一次手動對話的 profile。建立或編輯 automation 時,明確選擇已儲存的 Agent profile,再檢查:
- automation 的 owner、view/manage/edit/re-enable 權限。
- 實際選用的 model、Agent profile、MCP server 與 Secret allow-list。
- automation 執行時的 workspace、branch、container image 與 Docker runtime。
- 成功、失敗、取消、停用與重新啟用的 task outcome 是否清楚。
- 失敗後誰可以重新啟用,是否會把停用原因或敏感錯誤暴露給不需要的人。
第一次測試用可刪除或可停用的 automation,內容只做唯讀盤點:
列出目前 workspace 的 README、套件管理器與可執行測試。不要修改檔案、不要安裝套件、不要連線到外部服務。回報使用的 profile、workspace 路徑與 task outcome。確認結果後,再增加一個能由 Git diff 驗證的小修改。不要用 production deploy、刪檔或旋轉憑證當第一個排程測試。
Workspace 與 Agent 權限的基本邊界
在把 repository 交給 OpenHands 前,先在自己的終端機執行:
git status --shortgit branch --show-currentdocker ps接著確認目前目錄沒有不想被讀取的 .env、SSH key、cloud credential 或未提交的敏感 diff。第一個 task 先要求唯讀。第二個 task 之前確認 hello-openhands.txt 不存在,檔名已有資料就換成你確認可用的新名稱;保留原始 git status --short,再要求建立可回復的小檔案:
建立 hello-openhands.txt,內容只有 OpenHands is ready。完成後讀回檔案,執行 git status --short -- hello-openhands.txt,且不要修改其他檔案。最後回到外部終端機驗證:
git status --shortgit status --short -- hello-openhands.txtcat -- hello-openhands.txt若 hello-openhands.txt 是新的 untracked 檔案,普通 git diff -- hello-openhands.txt 可能沒有輸出;這不表示 Agent 沒有寫入。Git diff 文件 的一般工作區 diff 比較 tracked 檔案與 index,尚未加入 index 的新檔必須另外讀回。
驗收時應看到 ?? hello-openhands.txt,讀回內容也必須符合要求;若沒有出現在 status,先用 git check-ignore -v -- hello-openhands.txt 檢查 ignore 規則。整份 status 還要與開始前比較,確認沒有額外變更。
已追蹤檔案的未 stage 修改則用 git diff -- <檔案>;已 stage 的內容用 git diff --cached -- <檔案>。這項驗收不要求為了看 diff 先 stage,也不要把 workspace 原本的修改一起納入 Agent 成果。這裡的 Git 行為已在獨立暫存 repository 驗證;OpenHands runtime 與模型工具呼叫沒有在本次執行。
這個流程能分別確認 Agent 看到的目錄、模型工具呼叫、檔案寫入與實際內容。看到「任務完成」不等於檔案、branch 與 profile 都符合預期。
常見故障排除
Launch docker client failed
先執行 docker ps。如果 Docker daemon 本身失敗,先處理 Docker Desktop、socket、WSL 2 engine 或 Linux service,再重新啟動 OpenHands。不要先重裝 launcher,否則會把環境問題和版本變更混在一起。
啟動後顯示 Permission Denied
先檢查狀態目錄與 workspace 擁有者:
ls -ld ~/.openhandsls -ld /path/to/your-project只在確認路徑無誤後修正該目錄的 owner,不要把整個家目錄開成所有人可寫。修改前也要確認 container 內的使用者和 host mount 權限一致。
Windows 能開介面,但掛載路徑異常
確認 uv、openhands 與 Docker 相關命令都從同一個 WSL distribution 執行,再到 Docker Desktop 檢查 WSL 2 engine 與該 distribution 的 integration。若 Files view 路徑不對,先停止服務,回到正確的 WSL workspace 重新執行 openhands serve --mount-cwd。
Agent 像聊天機器人,不會操作檔案
依序檢查:
- 是否以
--mount-cwd啟動,且啟動時所在路徑正確。 - Files view 的 workspace path 是否就是目標 repository。
- host 與 container 內的使用者是否有必要權限。
- conversation 使用的 profile 是否已儲存,且 Secret、MCP 與 model 都指向預期環境。
- Docker、provider 與 API Key 是否正常;不要把工具格式錯誤直接歸因於 workspace。
如果 Apple Silicon 搭配 Colima 出現 SIGILL、container exit 132 或 Disconnected,請改看 OpenHands + Colima 的 SIGILL 排錯流程,不要和一般 API Key 或 mount 問題混在一起。
常見問題
Q: 1.20 的 Agent profile 選了 Secret,就代表任務只能看到這些 Secret 嗎?
A: profile 的 Secret 選擇是重要的限制邊界,但仍要檢查 container 環境變數、MCP server、workspace 檔案與宿主機權限。用一個不含敏感資料的測試 workspace 驗證實際可見範圍,不要只看設定畫面。
Q: Automation 會自動使用我手動對話最近選的 profile 嗎?
A: 不要這樣假設。1.20 提供 automation 選取已儲存 Agent profile 的路徑;編輯 automation 時要明確選擇,再以唯讀 task 驗證 model、Secret、workspace 與執行身份。
Q: OpenHands 一定要使用 Docker 嗎?
A: 依執行模式而定。互動式 CLI、透過 Docker 建立 workspace 的本機 GUI server、cloud backend 與遠端 Docker server 是不同路徑。請依選用的 backend 文件驗證,不要把三種模式混成一組啟動參數。
Q: 新增 LLM profile 後,舊 conversation 為什麼還像在用舊模型?
A: 設定通常會套用到新的 conversation,舊 conversation 可能需要重新啟動或明確切換 profile。先確認設定頁、profile 名稱與下一次 LLM call,再判斷是否是 backend 或權限問題。
參考資料:
OpenHands:OAuth-only MCP 安裝 PR #18780
OpenHands:OAuth 未完成訊息 PR #18816
OpenHands:Automation repository 保存 PR #18776
OpenHands:default profile 設定與啟動 PR #18720
OpenHands v1.28.0 release notes
OpenHands v1.28.1 release notes
OpenHands:對話內 Secrets 卡片 #18575
OpenHands:保留 Automation bundle #18649
OpenHands v1.27.1 release notes
OpenHands v1.27.0 release notes
OpenHands:Docker image 缺少 MARS 模組修正
OpenHands:v1.27.1 Docker smoke test
OpenHands:ACP 模型探索與 Agent default
OpenHands:本機 OpenCode/Pi preset
OpenHands v1.26.0 release notes
OpenHands:Automation outcome 顯示規則 PR #17682
OpenHands:本機 Automation log 查詢 PR #18022
OpenHands v1.25.0 release notes
OpenHands:provider connection 綁定與 keyless 路徑
OpenHands:首次訊息 Router 的 backend 邊界
OpenHands v1.23.0 release notes
OpenHands v1.24.0 release notes
OpenHands PR:依 backend 與組織區分 OpenAI 訂閱快取
OpenHands PR:雲端 Automation 對話的唯讀分享
OpenHands PR:Conversations 標題整批展開或收合資料夾
OpenHands v1.21.0 release notes
OpenHands v1.32.0 release notes
OpenHands v1.33.0 release notes
OpenHands:MCP 連線方式選擇 PR #18836
OpenHands:Automation provider/host PR #18821