ClaudeCloudflare Developer PlatformMay 1, 2026, 12:00 AM

Workflows, Workers - Run Workflows inside Dynamic Workers with the @cloudflare/dynamic-workflows library

A condensed section focused on the key takeaways first.

Original Post

Quick Digest

Summary

A condensed section focused on the key takeaways first.

claudeenmodel: claude-haiku-4-5

Run Workflows inside Dynamic Workers with @cloudflare/dynamic-workflows

Key Points

  • Dynamic Workflows now run durably inside Dynamic Workers loaded at runtime
  • Automatic Worker reloading ensures Workflows resume with correct code after long sleeps
  • Perfect for multi-tenant SaaS and AI agent frameworks with dynamic execution

Summary

Cloudflare has released the @cloudflare/dynamic-workflows library, enabling durable Workflow execution within Dynamic Workers. This solves the challenge of maintaining durability when Worker code is loaded at runtime, as the original code may no longer be in memory when a Workflow resumes after sleeping for extended periods.

Key Points

  • Automatic Worker Reloading: The library tags each Workflow instance with metadata (e.g., tenant ID) and automatically reloads the matching Dynamic Worker when the Workflow awakens
  • No Pre-registration Required: Dynamic Workers are created on-demand; you don't need to register Workflows upfront or manage them individually
  • Transparent Execution: Workflow code behaves normally while the Workflows engine handles persistence and retries behind the scenes
  • Multi-tenant Support: Ideal for SaaS platforms where each tenant defines custom automation (onboarding sequences, approval chains, billing logic)
  • AI Agent Frameworks: Supports agents that generate and execute multi-step plans at runtime, surviving restarts and waiting for human approval
  • Job Systems: Enables multi-tenant job processing where each customer submits logic and every step persists progress with automatic retries

Full Translation

Translations

A translation section that keeps the flow of the original article.

claudejamodel: claude-haiku-4-5

@cloudflare/dynamic-workflows ライブラリを使用して Dynamic Workers 内で Workflows を実行

@cloudflare/dynamic-workflows ライブラリを使用して Dynamic Workers 内で Workflows を実行

2026年5月1日

@cloudflare/dynamic-workflows ↗ を使用して、Dynamic Worker 内で Workflow を実行できるようになりました。これにより、実行時に読み込まれるコードの耐久性のある実行が保証されます。

概要

Worker Loader は Dynamic Workers をオンデマンドで読み込みますが、これまでは耐久性が課題でした。Dynamic Worker 内でも、Workflow は複数のステップ間で数時間から数日間スリープする可能性があり、再開時には元の Dynamic Worker コードはメモリに存在しなくなります。

このライブラリは、各 Workflow インスタンスにメタデータでタグを付けることで、どの Dynamic Worker を読み込むかを識別し(例:テナント ID)、Workflow が再開するたびに Worker Loader を通じて一致する Dynamic Worker を再読み込みすることで、この問題を解決します。

主な特徴

  • Dynamic Workers はオンデマンドで作成されるため、各 Workflow を事前に登録したり、個別に管理したりする必要がありません
  • 必要な時点で Dynamic Worker に Workflow コードを読み込むと、Workflows エンジンが背後で永続性と再試行を処理します
  • Workflow コード自体はルーティングの影響を受けず、通常通り動作します

ユースケース

これにより、Workflow コード自体が動的なパターンが可能になります。以下の場合に特に有用です:

  • SaaS プラットフォーム:各テナントが独自のオートメーション(オンボーディング シーケンス、承認チェーン、請求再試行ロジックなど)を定義する場合
  • AI エージェント フレームワーク:エージェントが実行時にマルチステップ プランを生成・実行し、再起動後も存続し、ツール呼び出し間で人間の承認を待つ場合
  • マルチテナント ジョブ システム:各顧客が独自の処理ロジックを送信し、すべてのステップが進捗を永続化し、失敗時に再試行する場合

実装例

import {
  createDynamicWorkflowEntrypoint,
  DynamicWorkflowBinding,
  wrapWorkflowBinding,
  type WorkflowRunner,
} from "@cloudflare/dynamic-workflows";

export { DynamicWorkflowBinding };

interface Env {
  WORKFLOWS: Workflow;
  LOADER: WorkerLoader;
}

function loadTenant(env: Env, tenantId: string) {
  return env.LOADER.get(tenantId, async () => ({
    compatibilityDate: "2026-01-01",
    mainModule: "index.js",
    modules: {
      "index.js": await fetchTenantCode(tenantId),
    },
    // Dynamic Worker は実際の Workflow バインディングと同じように使用します。
    // すべての create() は自動的に { tenantId } でタグ付けされます。
    env: {
      WORKFLOWS: wrapWorkflowBinding({ tenantId }),
    },
  }));
}

// エントリポイント名は、Wrangler 設定ファイルの workflows バインディング内の `class_name` と一致する必要があります。
export const DynamicWorkflow = createDynamicWorkflowEntrypoint<Env>(
  async ({ env, metadata }) => {
    const stub = loadTenant(env, metadata.tenantId as string);
    return stub.getEntrypoint("TenantWorkflow") as unknown as WorkflowRunner;
  },
);

export default {
  fetch(request: Request, env: Env) {
    const tenantId = request.headers.get("x-tenant-id")!;
    return loadTenant(env, tenantId).getEntrypoint().fetch(request);
  },
};

詳細情報

詳細なウォークスルーについては、Dynamic Workflows ガイドを参照してください。