Workflow SDK 5: uzun AI işleri için açık bir iptal sözleşmesi gerekiyor

Tech

Uzun AI işlerinde sorun sadece beklemek değildir. Asıl sorun iptalden sonra neyin çalışmaya devam ettiğini açıklayamamaktır. Model çağrısı sürebilir, upload timeout sonrası bitebilir, retry kota sonrası daha fazla maliyet yaratabilir.

Vercel 16 Haziran 2026’da Workflow SDK 5 beta’nın workflow ve step sınırları arasında AbortController ve AbortSignal desteklediğini duyurdu. Daha uzun sandbox süreleriyle birlikte mesaj net: agent işleri daha uzun koşar, ama daha iyi durmalıdır.

Workflow SDK çalışmasının AbortController sinyalini adımlara ilettiğini ve timeout, kullanıcı iptali veya kota ile durduğunu gösteren diyagram
Asıl yenilik iptal düğmesi değil; hangi adımın hangi sinyali dinlediğini ve nasıl temizlik yaptığını belirleyen sözleşmedir.

Ne değişti

Workflow AbortController oluşturur, signal’ı step’lere geçirir ve timeout, race, hook veya kota kuralı ile abort() çağırır. Doküman signal’ın suspension, deterministic replay ve ayrı invocation boyunca durable olduğunu söyler.

İptal cooperative’tir: step signal’ı fetch/API’ye vermeli, throwIfAborted çağırmalı veya aborted kontrol etmelidir.

Neden önemli

OCR, rapor, browser automation, multi-model agent ve test pipeline uzun runtime ister. İptal sözleşmesi yoksa token, API, kilitli kaynak ve belirsiz durum maliyeti artar.

Toplulukta production-ready ve cleanup soruları operasyonel boşluğu gösteriyor.

Operasyon etkisi

Timeout ürün politikası olur. Paralel işler kaybedenleri iptal eder. Abort error retry edilmediğinde olay analizi netleşir.

Checklist

User, timeout, admin, kota, parent request nedenlerini ayırın.

Her pahalı step’e signal verin.

run.cancel() ile AbortSignal farkını koruyun.

cancelled_by_user, timed_out, quota_exceeded saklayın.

Harici cleanup test edin.

Riskler

SDK 5 beta/pre-release; küçük başlayın ve rollback tutun.

Signal uzak side effect’i geri almaz ve signal’ı görmeyen kodu durdurmaz.

Şimdi

İptal sınırlarını önce çizin: maliyet, dış state değişimi ve idempotent olmayan işlem.

30 dakikalık kontrol

İptal nedenleri isimlendirildi

Pahalı adımlar signal alıyor veya kontrol ediyor

Abort ve retry çakışmıyor

Dış etkilerde idempotency key var

Gözlemlenebilirlik cancelled ve failed ayırıyor

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

Kaynaklar