Inngest Sandboxes 開放受限測試:代理程式如何接上可追蹤的執行步驟?

Inngest Sandboxes 將微型虛擬機接進持久工作流程,TypeScript API 目前為受限測試。解析預熱、可重播步驟、暫停與快照的差別,以及清理、秘密與網路限制。

Share
Inngest 沙箱架構文章官方封面,含作者 Tony Holdstock-Brown 肖像及文章標題
Inngest 執行長 Tony Holdstock-Brown 撰寫的 Sandboxes 架構文章官方封面;現行 API 文件將可用範圍列為受限測試。 圖片來源:官方原文。

AI 代理寫好程式後,還需要一個地方真正跑起來。若執行環境和工作流程分屬兩套服務,出錯時就得把啟動、測試、等待與重試紀錄重新拼在一起。

Inngest 在 2026 年 10 月 21 日介紹 Sandboxes,把隔離的程式執行環境接進原有持久工作流程,讓沙箱操作與其他步驟出現在同一份追蹤紀錄。

依 10 月 27 日查閱的官方文件,目前開放的是需要取得存取資格的 TypeScript 測試版,供程式呼叫的 API 介面仍可能改變,也不適合正式工作負載或無法重建的資料。

它的重點不只是啟動快。建立沙箱、下指令與銷毀環境都能接成有紀錄的步驟,但已完成步驟的結果可重播,不代表虛擬機裡的程序與檔案永遠不會遺失。

我會先看一個測試任務能否留下結果、在失敗後找到環境並完成清理,再比較啟動延遲。否則代理跑得更快,也可能只是更快留下無人管理的執行環境。

要把這些操作放進同一條可接續流程,先得區分持久函式負責協調什麼,以及微型虛擬機實際負責執行什麼。

Inngest Sandboxes 把哪一段工作隔離?

持久函式協調任務,沙箱則用獨立 Linux 微型虛擬機執行生成程式或專案測試。前者記住流程走到哪裡,後者提供真正能跑程式的作業系統。

例如代理準備測試一個專案,流程要先取得原始碼、建立環境、執行測試,再把結果交回。這些操作有先後關係,也可能在等待外部服務時中斷。

官方介紹要處理的,是讓沙箱操作和其他步驟出現在同一條追蹤紀錄,而不是讓開發者再去另一套平台找執行紀錄。

微型虛擬機有自己的檔案系統、程序、環境變數與資源限制。把代理產生的程式放進這裡,能與負責協調的工作程序分開,兩邊不必使用同一個系統環境。

能用的版本,仍受測試資格限制

依當日產品文件,目前支援的是 TypeScript v4 的實驗性介面,需要取得存取資格。Python 與 Go 支援仍在規畫中。

這會影響團隊怎麼安排測試。已有其他語言流程的人,不能因為服務名稱相同,就假設能直接套用範例。測試版介面也可能改動,必須保留調整空間。

我會把可重新取得的原始碼與可重跑的測試放進第一批評估,而不把唯一一份重要資料留在沙箱。這與官方不建議用於正式負載及無法重建資料的限制一致。

兩種角色分開之後,啟動環境的等待時間就成為下一個需要處理的成本。

Inngest 沙箱架構文章官方封面,含作者 Tony Holdstock-Brown 肖像及文章標題
Inngest 執行長 Tony Holdstock-Brown 撰寫的 Sandboxes 架構文章官方封面;現行 API 文件將可用範圍列為受限測試。 圖片來源:官方原文。

先預熱再分配,如何縮短啟動等待?

Inngest 先準備尚未綁定客戶工作的虛擬機,再在分配時接上所需的資源與檔案。這和接到要求後才從頭準備整套環境的順序不同。

Inngest 把它稱為通用預熱池。池裡的環境還不知道下一項工作屬於誰,分配時再接上該工作需要的處理器、網路與檔案,減少使用者眼前的等待。

但預先啟動不是唯一條件。若每次分配仍要逐一建立耗時的主機網路元件,瓶頸就會從開機移到網路設定,表面上準備好了,程式仍不能開始。

因此,團隊選擇支援所需資源動態接入的虛擬化工具,並調整主機與虛擬機之間的網路路徑。這些選擇服務於「把已準備環境快速交出去」的同一個目的。

啟動數字要和量測範圍一起讀

文章談到毫秒級等待與低於 250 毫秒的設計需求,產品文件則使用不到一秒的啟動描述。兩種說法都來自官方,本文未在不同負載下獨立實測。

對專案測試而言,啟動後還可能需要安裝相依套件、取回資料及跑測試。即使環境很快交付,整項工作仍會被後續的下載、運算與外部服務影響。

所以比較時應把環境交付與工作完成分開記錄。前者改善代理等待的第一段,後者才對應使用者拿到可用結果的時間,不能只用最短的一個數字代表整條流程。

環境準備好只是開始,命令如何記錄與重試,才決定任務中斷後能否繼續。

持久步驟如何處理重試與不確定結果?

每個沙箱操作用穩定步驟識別碼保存結果,讓函式恢復時不必把已完成操作再做一次。識別碼的用途,是讓系統辨認這次遇到的是哪一個步驟。

例如建立沙箱已成功,後面的模型呼叫卻暫時失敗,恢復時可以取回建立步驟的既有結果,避免為同一工作又開一個環境。這是編排紀錄帶來的價值。

但紀錄仍指向外部的執行環境。它不等於替虛擬機裡每個程序都提供永久保存,也不保證底層環境遺失後,檔案與執行中的程式仍然存在。

沒收到結果,不一定代表沒執行

生命週期文件另區分可安全重試的失敗,以及結果不確定的操作。後者會出現 operation_ambiguous,也就是操作可能已發生,系統卻沒能確認回應。

假設命令會把資料寫到外部服務,連線中斷後立刻重送,就可能寫入兩次。此時要先查外部狀態或工作識別紀錄,不能只看到錯誤就當作什麼都沒做。

這也說明持久步驟不等於任何命令都「恰好一次」。它能保存已確認的結果、安排安全重試,但外部副作用仍需要任務自己設計辨識與查證方式。

另外,直接使用沙箱用戶端會立即呼叫服務,並不自動取得相同的步驟重播語意。若選這條路,就要自行負責重試、生命週期與清理,不能把兩種介面混著理解。

即使編排層記得做過什麼,執行環境本身如何保存狀態,仍是另一件事。

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

暫停、恢復、快照與複製差在哪?

暫停與恢復接續同一個沙箱,快照與複製則保存一份狀態,再建立另一個環境。兩組操作都和保存有關,處理的工作卻不同。

暫停會保留記憶體與檔案系統,恢復時沿用相同識別碼。若工作正在等待下一項輸入,這比丟棄環境後重新安裝工具更能接續原有進度。

Inngest 測試版目前以一小時的實際運作時間為限,暫停期間不計入這段時間。這不是無限執行額度,而是把等待和真正運作的時間分開處理。

快照則是另一份可供重建的狀態,涵蓋記憶體、磁碟、環境設定與資源配置。建立快照時,來源沙箱可以繼續運作。之後複製出的環境有新的識別碼。

保存完成,也有自己的等待狀態

提出快照要求後,還要等它準備完成才能使用。等待逾時不代表服務已取消建立,應查狀態再決定後續動作,否則可能誤把尚在處理當成完全失敗。

快照也要和測試成果分開。保存環境可以重建運作起點,卻不等於已替報告安排長期儲存與閱讀權限。若同事只需要查看失敗原因,交付必要的紀錄通常比分享整個環境更直接,也能減少不必要的資料副本。

這適合把準備好的測試環境作為另一項工作的起點,但不等於每個命令都自動留存可倒帶的版本。官方文章把逐命令復原與分支列為後續發展方向。

因此,選擇時可以從工作目的出發:等待後繼續原任務,用暫停與恢復。想從保存狀態建立另一個實驗環境,才考慮快照與複製。

因為狀態會連同環境與記憶體被保存,秘密與資料的存放方式也必須一起檢查。

隔離環境裡,秘密與網路仍有哪些界線?

虛擬機隔開程序,卻不會讓放進環境變數的秘密對沙箱內程式隱形。若程式需要讀取某個服務金鑰,執行它的環境也就接觸得到該金鑰。

隔離與安全文件說明,開發者可以依名稱選擇工作區秘密,注入沙箱的環境變數。沙箱裡的程式可以讀取這些值,包含代理產生的程式。

所以要給的是完成這項任務所需的權限,而不是整個團隊所有服務的通用金鑰。隔離限制了程式所在的位置,不會替一組高權限憑證縮小可操作的資料範圍。

輸出、檔案與快照也不會自動把秘密遮蔽。若測試把金鑰印到紀錄,或程式將它寫進檔案,後續保存與分享結果時就得處理這些副本。

換了金鑰,舊環境不會自動忘記

快照與複製可能帶著原來的環境值。即使外部秘密已輪替,運作中或暫停中的沙箱也可能保有先前拿到的內容,不能只改設定就假設舊副本消失。

網路同樣有目前版本的邊界。測試版使用預設的對外連線網路,沒有公開的進入連線。自訂私有網路、SSH 連線等能力不能從規畫直接寫成已提供。

例如等待外部服務回呼的測試,連線方向會直接決定流程能否成立。工作能主動呼叫網站,不代表網站也能主動找到這個環境。這兩種路徑需要分開確認。

這會影響需要外部系統主動連進來的測試,以及必須放在企業特定網路裡的負載。團隊應按當前可用的連線方向設計,不把未來功能當成今天的相依條件。

知道哪些資料會跟著環境走之後,任務結束或永久失敗時的清理就不能留給運氣。

測試版任務完成後,如何留下結果並清理?

低階 API 要由函式安排銷毀與永久失敗後的清理,重要產物應在環境消失前存到外部。這裡的完成,不只是測試指令回傳成功。

銷毀會移除沙箱的程序、檔案與輸出,因此測試報告、產生的檔案與需要人工查看的錯誤證據,都要先放到適當的外部儲存位置。

清理還可能進入處理中的狀態,並非提出要求的同一瞬間就全部結束。紀錄應能對回沙箱識別碼,讓後續處理知道要查哪一個環境。

成功路徑之外,也要有失敗接手方式

若流程只在最後一步銷毀,前面永久失敗就可能走不到那裡。Inngest 因此說明,可透過獨立的失敗處理函式,使用已保存的沙箱識別碼完成清理。

這和一般程式的 finally 區段不同。持久函式可能在別的時機恢復,主函式裡的結尾程式碼不能取代永久失敗後獨立執行的清理工作。

直接用戶端則需要自行安排相應的結束處理。兩種方式的責任不同,但都要留下能辨認資源與處理結果的紀錄,而不是假設服務會替每一條應用路徑自動收尾。

Inngest 這次讓隔離執行與工作追蹤更靠近,卻仍把重試、產物與資源生命週期留作明確設計。先把可重建測試接通,才看得出便利是否真的減少了排錯負擔。

當測試、產物與清理都有可核對的終點,把沙箱接進持久流程才有實際的管理價值。

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

常見問題

Inngest Sandboxes 現在適合正式服務嗎?

依查閱當日文件,這是需要存取資格的 TypeScript 測試版,不建議用於正式負載或無法重建的資料,介面仍可能改變。

工作流程能恢復,代表沙箱永遠不會消失嗎?

不代表。持久步驟保存操作結果與流程進度,不保證底層虛擬機、程序及檔案在所有失敗情況下都能保留。

快照會自動移除秘密嗎?

不會。環境變數、記憶體與檔案可能包含先前使用的秘密,複製與後續分享都要另外管理。

資料來源