Workflow SDK 5 取消支援:長時間 AI 任務需要「中止契約」
長時間 AI 任務的難點不只是等待,而是取消之後還能說清楚什麼仍在跑。使用者取消了,模型呼叫可能繼續;timeout 發生了,upload 仍可能完成;quota 超了,retry 又繼續花成本。
Vercel 在 2026 年 6 月 16 日宣布 Workflow SDK 5 beta 支援 AbortController 和 AbortSignal 跨 workflow 與 step 邊界運作。當 Sandbox 執行時間變長,agent 與 durable job 也需要更精準地停止。
發生了什麼
workflow 可以建立 AbortController,將 signal 傳給 step,並在 timeout、race、hook 或 quota monitor 觸發時呼叫 abort()。文件說明 signal 可跨 suspension、deterministic replay 和不同 invocation 保持 durable。
取消是 cooperative。step 必須把 signal 傳給 fetch 或支援的 API,呼叫 signal.throwIfAborted(),或檢查 signal.aborted。
為什麼重要
OCR、報表產生、瀏覽器自動化、多模型 agent、測試 pipeline 都受益於長執行時間。但沒有取消契約,就會浪費 token、API call,並留下模糊狀態。
社群對 production-ready 與 cancel/cleanup 的問題,顯示真正缺口是營運模型。
營運影響
timeout 可成為產品政策;平行工作可取消輸家;abort error 跳過 retry,有助於區分主動取消與故障。
檢查清單
定義 user cancel、timeout、admin stop、quota exceeded、parent request close。
高成本 step 接收 signal 並傳給支援 API。
區分 run.cancel() 與 AbortSignal。
保存 cancelled_by_user、timed_out、quota_exceeded。
測試 partial upload、外部 job、email 與 webhook 清理。
風險
Workflow SDK 5 仍是 beta/pre-release。關鍵流程要小規模驗證、鎖版本並保留 rollback。
Signal 不能回復遠端 side effect,也不能停止忽略 signal 的程式碼。
現在要做什麼
先畫出取消邊界:哪些 step 花成本,哪些改外部狀態,哪些不能 retry。再決定是否接 SDK。
30 分鐘導入檢查
✓ 取消原因有產品化命名
✓ 高成本 step 接收或檢查 signal
✓ abort 與 retry 策略不衝突
✓ 外部 side effect 有 idempotency key
✓ 監控區分 cancelled 與 failed
const controller = new AbortController();
const result = await Promise.race([
expensiveStep(controller.signal),
sleep("30s").then(() => null),
]);
if (result === null) controller.abort();
來源與參考
- Vercel Changelog: Workflow SDK now supports inflight cancellation
- Workflow SDK v5 docs: Cancellation
- MDN: AbortController
- MDN: AbortSignal.any()
- Vercel Changelog: Vercel Sandbox can now run for up to 24 hours
- Reddit r/vercel: Is Workflow Development Kit production ready?
- Reddit r/vercel: Workflow devkit cleanup/cancel discussion
- Reddit r/vercel: 30 minute Functions and 24 hour Sandbox