Vercel durable-harness 是什麼?程式代理雲端當機後如何接著做

Vercel durable-harness 把 Pi、OpenCode、Codex、Claude Code 的對話與工具呼叫寫進日誌,函式逾時或當機後能從中斷處繼續。本文整理運作方式、Sandbox 限制、自架選項、費用項目與導入前檢查,並說明它為何仍標示 beta。

Share
Vercel 官方部落格 Making every harness durable 封面,右側列出 Pi、fx、OpenCode、Claude Code 與 Codex 的標誌
Vercel 官方部落格《Making every harness durable》的封面圖,列出 Pi、fx、OpenCode、Claude Code 與 Codex,非本站拍攝/實測。 圖片來源:官方原文。

durable-harness 要解決的是這種情境:昨晚把一個要跑好幾個小時的任務交給程式代理,今天早上卻發現它在凌晨兩點因為函式逾時停住了。前面讀過的檔案、寫好的頁面、已經開出的 pull request,全都得重來。

這種事在自己的電腦上比較少見,因為代理框架就守在同一台機器上,檔案和對話紀錄都在同一顆硬碟。搬到雲端以後,租一台虛擬機再掛上硬碟,並不會替你記下哪些呼叫已經完成,當機後也不會自動續跑。

Vercel 在 2026 年 10 月 19 日的官方部落格介紹了這個套件,官方 X 帳號則在台灣時間 10 月 21 日清晨 5 點多貼出消息,我在同一天早上查詢時,貼文約有 550 個讚。

社群關注度只是線索,功能細節要回到官方文件與 GitHub 倉庫確認。它是一組開源的轉接程式,授權為 Apache-2.0,把 Pi、OpenCode、Codex、Claude Code 這幾種現成的代理框架,接到一份持久日誌上。

做法是每次呼叫模型或工具之前,先記下意圖,做完再記下結果,函式中途死掉時,由新的函式讀日誌接手。

這件事對一般使用者影響不大,對想在雲端替很多人跑代理的團隊卻很實際。因為官方說代理任務常常要跑幾分鐘到幾小時,只要有一個步驟逾時,使用者看到的就是整段工作白費,成本也跟著重複計算。

我的判斷是,要讓使用者在網頁上派工給代理、任務又會超過單一函式時限的團隊,值得現在就試。個人在筆電上用 Claude Code 的人用不到它,而且官方文件把整個區塊標為 beta,GitHub 說明則寫 experimental,現階段只適合試用。

要判斷值不值得接,得先弄清楚「harness」與「持久」各指什麼。

durable-harness 是什麼?harness 與持久執行的意思

durable-harness 是一組轉接工具,讓你已經在用的代理框架把工作階段存進可恢復的日誌,而且不用改動框架本身。

官方文件把 harness 定義成包住模型的那個迴圈,內容包括提示詞、工具,以及怎麼管理上下文。上下文就是模型這一輪作答時看得到的資料。

所以你選 Claude Code 還是 Codex,其實就是在選這個迴圈的設計取捨。

問題出在大多數 harness 把「這一輪做到哪裡」放在執行它的程序記憶體裡。程序一死,這一輪就跟著消失。

Vercel 的部落格舉了一個例子:代理要替既有網站加一個定價頁,讀頁面、寫新頁、開 pull request,再等 CI(自動化測試流程)跑完才回報。

如果等 CI 的時候函式逾時,沒有持久化的版本只能停在原地,等人手動重啟,而且做完的步驟會被重做一次。

持久化以後,新的函式會從日誌讀出已完成的結果,直接從中斷處接著做。瀏覽器斷線也一樣,代理繼續跑,重新連線時從日誌補上漏掉的內容。

日誌放在哪裡,由一個叫 World 的儲存介面決定,它來自 Vercel 的開源 Workflow SDK。

在 Vercel 上用的是 Vercel World,開發時用本機檔案,自架則可以換成 Postgres 這類資料庫。

所以 durable-harness 做的事情很單純,把「記住進度」這件事從各家框架手上拿走,統一交給日誌處理。

至於日誌到底記了什麼、當機後又怎麼判斷哪些工作要重做,是下一節的重點。

Vercel 官方部落格 Making every harness durable 封面,右側列出 Pi、fx、OpenCode、Claude Code 與 Codex 的標誌
Vercel 官方部落格《Making every harness durable》的封面圖,列出 Pi、fx、OpenCode、Claude Code 與 Codex,非本站拍攝/實測。 圖片來源:官方原文。

一個回合當機後怎麼接著做?日誌、佇列與重試規則

當機後能不能接著做,取決於日誌在呼叫前後各記了什麼,以及哪些呼叫允許重來。

依官方說明,每次模型呼叫或工具呼叫之前,系統先寫下「準備做這件事」,呼叫結束再寫下結果。

整個回合另外有一則佇列訊息當後盾,也就是排隊等函式來領取的待辦通知。函式如果出錯結束,佇列會把這個回合交給新的函式。

新函式讀完日誌,就知道哪些完成、哪些正在跑、哪些根本還沒開始。

已完成的呼叫不會再跑,結果直接從日誌讀回來。官方因此說,已經完成的模型呼叫不會重複計費。

這是廠商的設計說明,我沒有看到獨立測試數據,實際省多少,要看你的任務裡有多少步驟在當機前已經寫入日誌。

文件裡還有一個容易漏看的細節:剛好在當機前完成、但結果還沒寫進日誌的呼叫,會被當成「正在執行」,所以它仍可能被重跑。

因此「不會重複」的承諾,只適用於已經有紀錄的步驟。

被打斷的工具呼叫怎麼處理,由每個工具自己宣告的重播規則決定。

標成 safe 的工具,例如查詢訂單,可以重跑。Pi 會直接再執行,Claude Code、Codex 與 OpenCode 則是告訴模型「重複執行是安全的」。

標成 never 的工具,例如退款,絕不會跑第二次。模型只會被告知「這個呼叫可能已經執行過」,由它決定先查一查再說。

這個設計把風險明確交給開發者。如果你把會寄信或扣款的工具誤標成 safe,當機重來時就會重複寄信、重複扣款。官方安全頁明確寫,會改動東西的工具要用 never。

官方安全頁還建議,這類工具除了標 never,也要把冪等鍵傳給對方系統,也就是讓重複請求只生效一次的識別碼。

至於 Claude Code 的對話紀錄、Codex 的 rollout 檔案和 OpenCode 的事件資料庫,官方說每一筆都會被鏡射進日誌。

所以換了新的函式或新的 Sandbox,也能從日誌重建這些檔案。

了解了恢復機制,下一個問題是這四種框架實際上跑在哪裡。

Pi、OpenCode、Codex、Claude Code 各自跑在哪裡?

四種框架的差別在於誰有權限碰到檔案系統,Pi 與 OpenCode 可以跑在函式裡,Claude Code 與 Codex 一律關進沙盒。

沙盒是和你的伺服器隔開的虛擬機環境,裡面執行的指令碰不到你的函式。

Vercel 文件說明,Pi、fx 和 OpenCode 本來就是為「一個程序服務多個工作階段」設計的函式庫,所以可以放在函式裡。

Claude Code 與 Codex 則是為單一使用者寫的命令列工具,會把狀態存在磁碟上。

文件的說法是,現在的版本可以被隔開,但它們更新很頻繁,沒有人保證下一版不會把一位使用者的狀態留給另一位。所以 durable-harness 只允許它們在 Vercel Sandbox 裡執行,每個工作階段一個。

框架 套件 執行位置 文件標示
Pi durable-harness/pi-durable 或 /pi 你的函式,檔案在虛擬工作區或 Sandbox 無個別標示,隨區塊為 beta
OpenCode durable-harness/opencode 你的函式,檔案在虛擬工作區或 Sandbox 無個別標示,隨區塊為 beta
Claude Code durable-harness/claude-code 只能在 Vercel Sandbox experimental
Codex durable-harness/codex 只能在 Vercel Sandbox experimental

表格最後一欄來自 Vercel 文件側欄的標示:整個 Agent Harnesses 區塊標 beta,只有 Claude Code 與 Codex 另外標 experimental。

fx 與 eve 是 Vercel 自家的框架,本來就內建持久化,不需要轉接層,這裡就不展開。

檔案要放哪裡,官方給了三種選擇,成本與用途都不同。

工作區 檔案放哪裡 當機後 適合
virtual() 工作階段日誌 被打斷的呼叫不留痕跡,會重跑 短任務、小專案
virtual({ durable: false }) 記憶體 每回合結束就清空 單回合暫存
sandbox() Sandbox 加 Drive 儲存 檔案保留,被打斷的指令可能已部分執行 真正的專案與長時間工作

虛擬工作區用的是一個相容 bash 的模擬殼層,只能做檔案與文字處理,沒有網路,也沒有 node 或 python 這類真正的程式。

官方還提到一個工作區約能放 500 個檔案,每次寫入都是日誌裡的一筆事件,所以不適合大型專案。

如果要安裝套件或建置專案,就得用 Sandbox。它的檔案放在一顆叫 Drive 的磁碟上,壽命比任何一個 Sandbox 和任何一個函式都長,所以換了新的 Sandbox,檔案和對話都還在。

接著要問的是,自己的伺服器能不能跑。

延伸閱讀:Cloudflare 加速 AI 代理沙盒:啟動、快照與恢復,決定任務能否接著做

durable-harness 能自架嗎?本機檔案與 Postgres 的選擇

能,但官方明確把自架路線定位在實驗階段,而且 Claude Code 與 Codex 在自己的伺服器上仍然要連回 Vercel Sandbox。

自架時的 World 有三種來源。在 Vercel 上自動使用 Vercel World,其他地方預設把工作階段存成本機檔案,放在 .workflow-data 資料夾。

這適合開發,也適合單台、磁碟會保留資料的伺服器。想要多台伺服器共用,或把工作階段放進自己的資料庫,就改用 Postgres World。

做法是安裝 @workflow/world-postgres,建立資料表,再設定兩個環境變數,一個指定使用 Postgres World,一個填資料庫連線位址。

官方要求 Node.js 22 以上與 Postgres 資料庫,所以這條路需要自己維運資料庫。

官方在限制欄位寫得很直白:Postgres World 是參考實作,路由沒有身分驗證、資料不加密,也沒有針對規模調校。文件另外要求用反向代理或防火牆擋住佇列路由,不要讓外部直接打進來。

它的佇列工作程序需要長時間運行,所以不能放在 Vercel Functions 裡。

同一個資料庫上可以跑多台伺服器,但一個工作階段同一時間只讓一台驅動。第二台接手時,第一台的下一次寫入會被拒絕而停止。

另外,每個應用應該有自己的資料庫或資料夾。因為伺服器啟動時會續跑它找到的所有未完成工作階段,兩個應用共用的話,會用各自的代理去執行對方的工作階段。

Claude Code 與 Codex 在自架環境的處境更特別:你的伺服器負責驅動回合與寫日誌,CLI 本身仍然在 Vercel Sandbox 裡跑。

所以需要提供 Vercel 的存取權杖,以及 Sandbox 所屬的團隊和專案。換句話說,不碰 Sandbox 的自架,目前只適用 Pi、OpenCode 與 fx。

模型呼叫也值得提醒。文件的各篇指南預設都透過 Vercel 的 AI Gateway 呼叫模型,在 Vercel 以外執行時,要自己建立一把 AI Gateway 金鑰。

所以「自架」指的是日誌與工作程序放在自己手上,並不代表整條鏈路都離開 Vercel。

有了這些條件,就能討論誰適合現在導入。

適合誰、不適合誰與導入前檢查

適合的是要在雲端替多位使用者長時間跑代理、又不想自己寫恢復機制的團隊,不適合只在個人電腦上用 Claude Code 的人。

如果你的任務一般在幾分鐘內完成、失敗了重跑也沒有成本,那麼加一層日誌只會增加複雜度。

反過來說,任務要碰外部系統,例如開 pull request、寄通知、處理訂單,重複執行的代價就高,這時 never 規則和冪等鍵才有價值。

決定試用之前,我會先檢查這幾件事。工具的重播規則要逐一標好,會改動外部世界的一律標 never。

對外開放的聊天路由要有身分驗證。官方說明,正式環境裡沒有 authorize 的路由一律回 401。

要開放給任何人,得填 authorize: 'public'。只要代理會啟動 Sandbox,還必須同時設定 allowPublicSandbox 和有上限的 sessionUsd 預算,否則程式在建立路由時就會丟出錯誤。

不過文件特別註明,sessionUsd 只計算 Claude Code 與 Codex 的模型花費。Pi 與 OpenCode 的模型呼叫在你的函式裡跑,要另外用 vmSeconds 限制 Sandbox 時間,並靠 authorize 或 AI Gateway 預算控管模型費用。

Sandbox 的網路預設允許所有對外連線,所以被提示詞注入的模型可以把工作階段的檔案送出去。

因此要把 network 設成 deny-all,或只放行需要的網域。Claude Code 在這種封網設定下仍可運作,因為模型呼叫是由你的函式送出的。

費用則分成幾條線。

查詢日 2026 年 10 月 21 日,Vercel Sandbox 定價頁列出 Pro 方案的 Active CPU 每小時 0.128 美元、佈建記憶體每 GB 小時 0.0212 美元、Drive 儲存每 GB 月 0.05 美元。

Hobby 方案有每月 5 小時的 Active CPU 額度,單一 Sandbox 的最長工作階段是 45 分鐘,Pro 為 24 小時。

Workflow 的事件每千筆 0.02 美元,Hobby 每月含 5 萬筆。模型呼叫走 AI Gateway,依官方說法會用掉你的 AI Gateway 額度。

這些數字相加後的總額,我沒有替任何任務算過,因為它取決於 Sandbox 開多久、寫多少事件,實際用量要自己在試用期量。

延伸閱讀:同一個 AI 模型,帳單為何差很多?從 Harness tax 看懂程式代理的成本

限制與風險:beta 版本與沙盒之外的缺口

目前最大的風險是它還在變動,其次是官方自己列出幾個隔離做不到的地方。

套件版本在 0.0.x,我 10 月 21 日查詢 npm 時最新為 0.0.1-beta.6,首次發布是 10 月 15 日,GitHub 說明也寫明介面可能在版本之間改變。

Claude Code 的支援還要求固定某個 Agent SDK 版本,沒有照版本號安裝時,回合會失敗並提示該裝哪一版。

隔離方面,官方列了幾項「這些控制沒有涵蓋」的情況。Codex 在 Sandbox 裡如果無法啟動自己的沙盒,指令會以完整權限執行。

雖然 Sandbox 裡沒有機密,但模型的指令可以直接用你的 AI Gateway 額度呼叫模型,只受你設定的預算限制。

供應商代為執行的工具,例如網路搜尋,會從供應商端連網,不受 Sandbox 的網路設定約束。

使用者介面如果顯示模型輸出的遠端圖片,瀏覽器會在沒人點擊時就去請求模型挑的網址。交給 Sandbox 的環境變數也要小心,模型的指令都讀得到,所以不要放任何機密。

還有一個目前的技術限制:Pi 與 OpenCode 的回合先在聊天路由的請求裡跑最多 60 秒,才由佇列接手。

這時還在執行的長指令會被停掉而不是重跑,例如安裝或建置。官方說這是 Vercel Queues 的現況、修正中,在那之前可以改成 drive: 'queue'。

Drive 也不是交易式儲存,被當機打斷的指令可能做了一半。模型會被告知這件事,但是否要清理殘局,還是得由工具或人決定。

至於官方 X 貼文裡「跑數小時、數天甚至數個月」的說法,我不會當成保證,部落格正文並沒有這樣寫。依文件,持久的是日誌與工作階段,單一 Sandbox 的預設預算是 4 小時。

Sandbox 定價頁另外列出每個 Sandbox 的最長工作階段,Hobby 是 45 分鐘、Pro 是 24 小時。

文件說快超過上限時,durable-harness 會在兩個回合之間換一個新 Sandbox 並保留 Drive,所以日誌與檔案能延續。但實際能撐多久,還是得看方案與預算設定。

durable-harness 常見問題

一定要用 Vercel 才能用 durable-harness 嗎?

不一定。開發時可以用本機檔案,正式環境可以改用 Postgres,Pi 與 OpenCode 都能這樣跑,但官方把這條自架路線列為實驗階段。

Claude Code 與 Codex 例外,它們一定要在 Vercel Sandbox 裡執行,所以自架時仍要連回 Vercel。

當機後模型費用會重複收嗎?

已經寫進日誌的完成呼叫不會重跑,所以不重複計費,這是官方的設計說明。

當機當下正在跑、或剛完成卻還沒寫入日誌的呼叫會重跑,那一次仍會產生費用。

它會不會改變 Claude Code 或 Codex 的行為?

官方說 durable-harness 從外部加上持久性,不改動框架本身。

行為上有一個預設值要知道:Claude Code、Codex 與 OpenCode 預設是 strict 模式,每次呼叫前都等日誌確認寫入。

確認自己的工具都能安全重播之後,可以改成 durability: 'on',讓可重播的呼叫先跑,durable-harness/pi 的預設就是這種做法。

個人電腦上的 Claude Code 需要它嗎?

多半不需要。它解決的是函式逾時、程序消失這類雲端問題。

官方部落格雖然提到可以讓本機的流程也變持久,但 Claude Code 與 Codex 即使在本機驅動,CLI 仍然跑在 Vercel Sandbox 裡,所以只在筆電上用它們的人沒有什麼好處。

先確認任務值得持久化,再決定要不要接日誌

durable-harness 的價值在於把「做到哪裡」存成日誌,讓雲端的代理任務不再因為一次逾時就整段重來。

如果你的團隊正準備把代理放進產品,建議先挑一個會碰外部系統的小任務,標好每個工具的重播規則,鎖住 Sandbox 的網路,再故意中斷一次。

看新函式能不能正確接手,通過這個測試,再談擴大規模。

想持續追蹤代理工作環境與開發工具的更新,可以免費訂閱 AI 郵報,並回頭核對官方文件的版本標示。

資料來源