Workflow SDK 5: pekerjaan AI panjang butuh kontrak pembatalan

Tech

Masalah pekerjaan AI yang panjang bukan hanya durasi. Masalahnya muncul saat tim tidak tahu apa yang masih berjalan setelah cancel. Model masih dipanggil, upload masih selesai, atau retry tetap menghabiskan biaya.

Pada 16 Juni 2026 Vercel mengumumkan Workflow SDK 5 beta mendukung AbortController dan AbortSignal lintas workflow dan step. Ketika sandbox juga bisa berjalan lebih lama, workflow agentik perlu cara berhenti yang lebih presisi.

Diagram alur Workflow SDK yang meneruskan sinyal AbortController ke beberapa step dan berhenti karena timeout, pembatalan pengguna, atau kuota
Nilai utamanya adalah kontrak operasional: step mana menerima sinyal apa, berhenti bagaimana, dan cleanup apa yang terlihat.

Apa yang berubah

Workflow dapat membuat AbortController, mengirim signal ke step, lalu memanggil abort() saat timeout, race, hook pengguna, atau monitor kuota menang. Dokumentasi menyebut signal ini durable lintas suspension, replay, dan invocation terpisah.

Cancellation bersifat cooperative. Step harus mengoper signal ke fetch/API yang mendukung, memanggil signal.throwIfAborted(), atau memeriksa signal.aborted.

Mengapa penting

OCR, report generation, browser automation, agent multi-model, dan test pipeline butuh runtime panjang. Tanpa kontrak pembatalan, biaya token, API call, resource lock, dan status ambigu meningkat.

Diskusi komunitas soal production-ready dan cleanup menunjukkan kebutuhan model operasi, bukan sekadar contoh kode.

Dampak operasi

Timeout menjadi kebijakan produk. Parallel work bisa membatalkan yang kalah. Abort error yang tidak diretry membantu membedakan cancel sengaja dari failure.

Checklist

Tentukan sumber cancel: user, timeout, admin, kuota, parent request.

Pastikan step mahal menerima signal.

Bedakan run.cancel() dan AbortSignal.

Simpan status cancelled_by_user, timed_out, quota_exceeded.

Uji cleanup upload, job eksternal, email, webhook.

Risiko

SDK 5 masih beta/pre-release; mulai dari workflow internal dan siapkan rollback.

Signal tidak membatalkan side effect jarak jauh secara ajaib.

Langkah sekarang

Petakan boundary cancel sebelum menambahkan tombol: biaya, mutasi eksternal, dan operasi non-idempotent.

Cek 30 menit

Alasan pembatalan diberi nama jelas

Setiap step mahal menerima atau memeriksa signal

Abort dan retry tidak bertabrakan

Side effect eksternal punya idempotency key

Observability memisahkan cancelled dan failed

const controller = new AbortController();
const result = await Promise.race([
  expensiveStep(controller.signal),
  sleep("30s").then(() => null),
]);
if (result === null) controller.abort();

Sumber dan bacaan