<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Cloudflare changelogs | Developer platform</title><description>Cloudflare changelogs for Developer platform products</description><link>https://developers.cloudflare.com/changelog/</link><item><title>AI Gateway - Automatically retry on upstream provider failures on AI Gateway</title><link>https://developers.cloudflare.com/changelog/post/2026-04-02-auto-retry-upstream-failures/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-02-auto-retry-upstream-failures/</guid><description>&lt;p&gt;AI Gateway now supports automatic retries at the gateway level. When an upstream provider returns an error, your gateway retries the request based on the retry policy you configure, without requiring any client-side changes.&lt;/p&gt;
&lt;p&gt;You can configure the retry count (up to 5 attempts), the delay between retries (from 100ms to 5 seconds), and the backoff strategy (Constant, Linear, or Exponential). These defaults apply to all requests through the gateway, and per-request headers can override them.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/auto-retry-changelog.DoCXZnDy_bIipL.webp&quot; alt=&quot;Retry Requests settings in the AI Gateway dashboard&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;This is particularly useful when you do not control the client making the request and cannot implement retry logic on the caller side. For more complex failover scenarios — such as failing across different providers — use &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/features/dynamic-routing/&quot;&gt;Dynamic Routing&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/configuration/manage-gateway/#retry-requests&quot;&gt;Manage gateways&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 02 Apr 2026 00:00:00 GMT</pubDate><product>AI Gateway</product><category>AI Gateway</category></item><item><title>Workflows, Workers - All Wrangler commands for Workflows now support local development</title><link>https://developers.cloudflare.com/changelog/post/2026-04-01-wrangler-workflows-local/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-01-wrangler-workflows-local/</guid><description>&lt;p&gt;All &lt;code&gt;wrangler workflows&lt;/code&gt; commands now accept a &lt;code&gt;--local&lt;/code&gt; flag to target a Workflow running in a local &lt;code&gt;wrangler dev&lt;/code&gt; session instead of the production API.&lt;/p&gt;
&lt;p&gt;You can now manage the full Workflow lifecycle locally, including triggering Workflows, listing instances, pausing, resuming, restarting, terminating, and sending events:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;workflows&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;list&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--local&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;workflows&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;trigger&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-workflow&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--local&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;workflows&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;instances&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;list&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-workflow&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--local&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;workflows&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;instances&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pause&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-workflow&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;#x3C;INSTANCE_ID&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--local&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;workflows&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;instances&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;send-event&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-workflow&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;#x3C;INSTANCE_ID&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--type&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-event&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--local&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;All commands also accept &lt;code&gt;--port&lt;/code&gt; to target a specific &lt;code&gt;wrangler dev&lt;/code&gt; session (defaults to &lt;code&gt;8787&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/workflows/build/local-development/&quot;&gt;Workflows local development&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 01 Apr 2026 12:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category><category>Workers</category></item><item><title>AI Search - Create, manage, search AI Search instances with Wrangler CLI</title><link>https://developers.cloudflare.com/changelog/post/2026-04-01-ai-search-wrangler-commands/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-01-ai-search-wrangler-commands/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-search/&quot;&gt;AI Search&lt;/a&gt; supports a &lt;code&gt;wrangler ai-search&lt;/code&gt; command namespace. Use it to manage instances from the command line.&lt;/p&gt;
&lt;p&gt;The following commands are available:&lt;/p&gt;





































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Command&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;wrangler ai-search create&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Create a new instance with an interactive wizard&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;wrangler ai-search list&lt;/code&gt;&lt;/td&gt;&lt;td&gt;List all instances in your account&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;wrangler ai-search get&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Get details of a specific instance&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;wrangler ai-search update&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Update the configuration of an instance&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;wrangler ai-search delete&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Delete an instance&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;wrangler ai-search search&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Run a search query against an instance&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;wrangler ai-search stats&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Get usage statistics for an instance&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The &lt;code&gt;create&lt;/code&gt; command guides you through setup, choosing a name, source type (&lt;code&gt;r2&lt;/code&gt; or &lt;code&gt;web&lt;/code&gt;), and data source. You can also pass all options as flags for non-interactive use:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ai-search&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-instance&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--type&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;r2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--source&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-bucket&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Use &lt;code&gt;wrangler ai-search search&lt;/code&gt; to query an instance directly from the CLI:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ai-search&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;search&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-instance&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--query&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;how do I configure caching?&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;All commands support &lt;code&gt;--json&lt;/code&gt; for structured output that scripts and AI agents can parse directly.&lt;/p&gt;
&lt;p&gt;For full usage details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/ai-search/wrangler-commands/&quot;&gt;Wrangler commands documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 01 Apr 2026 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>Workers - Deploy Hooks are now available for Workers Builds</title><link>https://developers.cloudflare.com/changelog/post/2026-04-01-deploy-hooks/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-01-deploy-hooks/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/&quot;&gt;Workers Builds&lt;/a&gt; now supports Deploy Hooks — trigger builds from your headless CMS, a Cron Trigger, a Slack bot, or any system that can send an HTTP request.&lt;/p&gt;
&lt;p&gt;Each Deploy Hook is a unique URL tied to a specific branch. Send it a &lt;code&gt;POST&lt;/code&gt; and your Worker builds and deploys.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-X&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;POST&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;https://api.cloudflare.com/client/v4/workers/builds/deploy_hooks/&amp;#x3C;DEPLOY_HOOK_ID&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;To create one, go to &lt;strong&gt;Workers &amp;#x26; Pages&lt;/strong&gt; &gt; your Worker &gt; &lt;strong&gt;Settings&lt;/strong&gt; &gt; &lt;strong&gt;Builds&lt;/strong&gt; &gt; &lt;strong&gt;Deploy Hooks&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Since a Deploy Hook is a URL, you can also call it from another Worker. For example, a Worker with a &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/cron-triggers/&quot;&gt;Cron Trigger&lt;/a&gt; can rebuild your project on a schedule:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;scheduled&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;waitUntil&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DEPLOY_HOOK_URL&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; method&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;POST&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;scheduled&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ScheduledEvent&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Env&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ExecutionContext&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Promise&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;waitUntil&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DEPLOY_HOOK_URL&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; method&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;POST&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;satisfies&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ExportedHandler&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Env&lt;/span&gt;&lt;span&gt;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;You can also use Deploy Hooks to &lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/deploy-hooks/#cms-integration&quot;&gt;rebuild when your CMS publishes new content&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/deploy-hooks/#deploy-from-a-slack-slash-command&quot;&gt;deploy from a Slack slash command&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Built-in optimizations&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Automatic deduplication&lt;/strong&gt;: If a Deploy Hook fires multiple times before the first build starts running, redundant builds are automatically skipped. This keeps your build queue clean when webhooks retry or CMS events arrive in bursts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Last triggered&lt;/strong&gt;: The dashboard shows when each hook was last triggered.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build source&lt;/strong&gt;: Your Worker&apos;s build history shows which Deploy Hook started each build by name.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Deploy Hooks are rate limited to 10 builds per minute per Worker and 100 builds per minute per account. For all limits, see &lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/limits-and-pricing/&quot;&gt;Limits &amp;#x26; pricing&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To get started, read the &lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/deploy-hooks/&quot;&gt;Deploy Hooks documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 01 Apr 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - New L4 transport telemetry fields in Workers</title><link>https://developers.cloudflare.com/changelog/post/2026-04-01-l4-transport-telemetry-fields/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-01-l4-transport-telemetry-fields/</guid><description>&lt;p&gt;Three new properties are now available on &lt;code&gt;request.cf&lt;/code&gt; in Workers that expose Layer 4 transport telemetry from the client connection. These properties let your Worker make decisions based on real-time connection quality signals — such as round-trip time and data delivery rate — without requiring any client-side changes.&lt;/p&gt;
&lt;p&gt;Previously, this telemetry was only available via the &lt;code&gt;Server-Timing: cfL4&lt;/code&gt; response header. These new properties surface the same data directly in the Workers runtime, so you can use it for routing, logging, or response customization.&lt;/p&gt;
&lt;h4&gt;New properties&lt;/h4&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Property&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;clientTcpRtt&lt;/code&gt;&lt;/td&gt;&lt;td&gt;number | undefined&lt;/td&gt;&lt;td&gt;The smoothed TCP round-trip time (RTT) between Cloudflare and the client in milliseconds. Only present for TCP connections (HTTP/1, HTTP/2). For example, &lt;code&gt;22&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;clientQuicRtt&lt;/code&gt;&lt;/td&gt;&lt;td&gt;number | undefined&lt;/td&gt;&lt;td&gt;The smoothed QUIC round-trip time (RTT) between Cloudflare and the client in milliseconds. Only present for QUIC connections (HTTP/3). For example, &lt;code&gt;42&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;edgeL4&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Object | undefined&lt;/td&gt;&lt;td&gt;Layer 4 transport statistics. Contains &lt;code&gt;deliveryRate&lt;/code&gt; (number) — the most recent data delivery rate estimate for the connection, in bytes per second. For example, &lt;code&gt;123456&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h4&gt;Example: Log connection quality metrics&lt;/h4&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cf&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;cf&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rtt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cf&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;clientTcpRtt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;??&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cf&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;clientQuicRtt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;??&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;deliveryRate&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cf&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;edgeL4&lt;/span&gt;&lt;span&gt;?.&lt;/span&gt;&lt;span&gt;deliveryRate&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;??&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;transport&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cf&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;clientTcpRtt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;TCP&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;QUIC&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`Transport: &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;transport&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;, RTT: &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;rtt&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;ms, Delivery rate: &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;deliveryRate&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; B/s`&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Headers&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;set&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;X-Client-RTT&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;rtt&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;set&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;X-Delivery-Rate&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;deliveryRate&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Request&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/request/&quot;&gt;Workers Runtime APIs: Request&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 01 Apr 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - New RFC 9440 mTLS certificate fields in Workers</title><link>https://developers.cloudflare.com/changelog/post/2026-03-27-rfc9440-mtls-fields/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-27-rfc9440-mtls-fields/</guid><description>&lt;p&gt;Four new fields are now available on &lt;code&gt;request.cf.tlsClientAuth&lt;/code&gt; in Workers for requests that include a mutual TLS (mTLS) client certificate. These fields encode the client certificate and its intermediate chain in &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc9440&quot; target=&quot;_blank&quot;&gt;RFC 9440&lt;/a&gt; format — the same standard format used by the &lt;code&gt;Client-Cert&lt;/code&gt; and &lt;code&gt;Client-Cert-Chain&lt;/code&gt; HTTP headers — so your Worker can forward them directly to your origin without any custom parsing or encoding logic.&lt;/p&gt;
&lt;h4&gt;New fields&lt;/h4&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Field&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;certRFC9440&lt;/code&gt;&lt;/td&gt;&lt;td&gt;String&lt;/td&gt;&lt;td&gt;The client leaf certificate in RFC 9440 format (&lt;code&gt;:base64-DER:&lt;/code&gt;). Empty if no client certificate was presented.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;certRFC9440TooLarge&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Boolean&lt;/td&gt;&lt;td&gt;&lt;code&gt;true&lt;/code&gt; if the leaf certificate exceeded 10 KB and was omitted from &lt;code&gt;certRFC9440&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;certChainRFC9440&lt;/code&gt;&lt;/td&gt;&lt;td&gt;String&lt;/td&gt;&lt;td&gt;The intermediate certificate chain in RFC 9440 format as a comma-separated list. Empty if no intermediates were sent or if the chain exceeded 16 KB.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;certChainRFC9440TooLarge&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Boolean&lt;/td&gt;&lt;td&gt;&lt;code&gt;true&lt;/code&gt; if the intermediate chain exceeded 16 KB and was omitted from &lt;code&gt;certChainRFC9440&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h4&gt;Example: forwarding client certificate headers to your origin&lt;/h4&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tls&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;cf&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;tlsClientAuth&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Only forward if cert was verified and chain is complete&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;tls&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;tls&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;certVerified&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tls&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;certRevoked&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tls&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;certChainRFC9440TooLarge&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Unauthorized&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; status&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;401&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Headers&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;set&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Client-Cert&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tls&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;certRFC9440&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;set&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Client-Cert-Chain&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tls&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;certChainRFC9440&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Request&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/ssl/client-certificates/client-certificate-variables/#workers-variables&quot;&gt;Client certificate variables&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/service-credentials/mutual-tls-authentication/&quot;&gt;Mutual TLS authentication&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 27 Mar 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Containers - Easily connect Containers and Sandboxes to Workers</title><link>https://developers.cloudflare.com/changelog/post/2026-03-26-outbound-workers/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-26-outbound-workers/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/containers/&quot;&gt;Containers&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/sandbox/&quot;&gt;Sandboxes&lt;/a&gt; now support connecting directly to Workers over HTTP. This allows you to call Workers
functions and &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/bindings/&quot;&gt;bindings&lt;/a&gt;, like &lt;a href=&quot;https://developers.cloudflare.com/kv&quot;&gt;KV&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/r2/&quot;&gt;R2&lt;/a&gt;, from within the container at specific hostnames.&lt;/p&gt;
&lt;h4&gt;Run Worker code&lt;/h4&gt;
&lt;p&gt;Define an &lt;code&gt;outbound&lt;/code&gt; handler to capture any HTTP request or use &lt;code&gt;outboundByHost&lt;/code&gt; to capture requests to individual hostnames and IPs.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyApp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Sandbox&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;MyApp&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;outbound&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// you can run arbitrary functions defined in your Worker on any HTTP request&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;someWorkersFunction&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;MyApp&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;outboundByHost&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;my.worker&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;anotherFunction&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;In this example, requests from the container to &lt;code&gt;http://my.worker&lt;/code&gt; will run the function defined within &lt;code&gt;outboundByHost&lt;/code&gt;,
and any other HTTP requests will run the &lt;code&gt;outbound&lt;/code&gt; handler. These handlers run entirely inside the Workers runtime,
outside of the container sandbox.&lt;/p&gt;
&lt;aside&gt;&lt;p&gt;TLS support coming soon&lt;/p&gt;&lt;div&gt;&lt;p&gt;Containers and Sandboxes currently only intercept HTTP traffic. HTTPS interception is coming soon. This will enable using Workers as a transparent proxy for credential injection.&lt;/p&gt;&lt;p&gt;Even though this is just using HTTP, traffic to Workers is secure and runs on the same machine as the container.
If needed, you can also upgrade requests to TLS from the Worker itself.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;h4&gt;Access Workers bindings&lt;/h4&gt;
&lt;p&gt;Each handler has access to &lt;code&gt;env&lt;/code&gt;, so it can call any binding set in &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/configuration/#bindings&quot;&gt;Wrangler config&lt;/a&gt;.
Code inside the container makes a standard HTTP request to that hostname and the outbound Worker translates it into a binding call.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyApp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Sandbox&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;MyApp&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;outboundByHost&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;my.kv&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;URL&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pathname&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;slice&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;KV&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;??&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; status&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;200&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;404&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;my.r2&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;URL&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pathname&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;slice&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;object&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;BUCKET&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;object&lt;/span&gt;&lt;span&gt;?.&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;??&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; status&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;object&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;200&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;404&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Now, from inside the container sandbox, &lt;code&gt;curl http://my.kv/some-key&lt;/code&gt; will access &lt;a href=&quot;https://developers.cloudflare.com/kv&quot;&gt;Workers KV&lt;/a&gt; and &lt;code&gt;curl http://my.r2/some-object&lt;/code&gt; will access &lt;a href=&quot;https://developers.cloudflare.com/r2/&quot;&gt;R2&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Access Durable Object state&lt;/h4&gt;
&lt;p&gt;Use &lt;code&gt;ctx.containerId&lt;/code&gt; to reference the container&apos;s automatically provisioned &lt;a href=&quot;https://developers.cloudflare.com/durable-objects&quot;&gt;Durable Object&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyContainer&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Container&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;MyContainer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;outboundByHost&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;get-state.do&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;MY_CONTAINER&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;idFromString&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;containerId&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stub&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;MY_CONTAINER&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stub&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getStateForKey&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;This provides an easy way to associate state with any container instance, and includes a &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/get-started/#2-write-a-durable-object-class-using-sql-api&quot;&gt;built-in SQLite database&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Get Started Today&lt;/h4&gt;
&lt;p&gt;Upgrade to &lt;code&gt;@cloudflare/containers&lt;/code&gt; version 0.2.0 or later, or &lt;code&gt;@cloudflare/sandbox&lt;/code&gt; version 0.8.0 or later to use outbound Workers.&lt;/p&gt;
&lt;p&gt;Refer to &lt;a href=&quot;https://developers.cloudflare.com/containers/platform-details/outbound-traffic/&quot;&gt;Containers outbound traffic&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/sandbox/guides/outbound-traffic/&quot;&gt;Sandboxes outbound traffic&lt;/a&gt; for more details and examples.&lt;/p&gt;</description><pubDate>Thu, 26 Mar 2026 00:00:00 GMT</pubDate><product>Containers</product><category>Containers</category></item><item><title>Workers - Declare required secrets in your Wrangler configuration</title><link>https://developers.cloudflare.com/changelog/post/2026-03-24-secrets-config-property/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-24-secrets-config-property/</guid><description>&lt;p&gt;The new &lt;code&gt;secrets&lt;/code&gt; configuration property lets you declare the secret names your Worker requires in your Wrangler configuration file. Required secrets are validated during local development and deploy, and used as the source of truth for type generation.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;wrangler.jsonc&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;jsonc&quot;&gt;&lt;code class=&quot;language-jsonc&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;secrets&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;required&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&quot;API_KEY&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;DB_PASSWORD&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;wrangler.toml&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;toml&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;secrets&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;required&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;API_KEY&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;DB_PASSWORD&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;h4&gt;Local development&lt;/h4&gt;
&lt;p&gt;When &lt;code&gt;secrets&lt;/code&gt; is defined, &lt;code&gt;wrangler dev&lt;/code&gt; and &lt;code&gt;vite dev&lt;/code&gt; load only the keys listed in &lt;code&gt;secrets.required&lt;/code&gt; from &lt;code&gt;.dev.vars&lt;/code&gt; or &lt;code&gt;.env&lt;/code&gt;/&lt;code&gt;process.env&lt;/code&gt;. Additional keys in those files are excluded. If any required secrets are missing, a warning is logged listing the missing names.&lt;/p&gt;
&lt;h4&gt;Type generation&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;wrangler types&lt;/code&gt; generates typed bindings from &lt;code&gt;secrets.required&lt;/code&gt; instead of inferring names from &lt;code&gt;.dev.vars&lt;/code&gt; or &lt;code&gt;.env&lt;/code&gt;. This lets you run type generation in CI or other environments where those files are not present. Per-environment secrets are supported — the aggregated &lt;code&gt;Env&lt;/code&gt; type marks secrets that only appear in some environments as optional.&lt;/p&gt;
&lt;h4&gt;Deploy&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;wrangler deploy&lt;/code&gt; and &lt;code&gt;wrangler versions upload&lt;/code&gt; validate that all secrets in &lt;code&gt;secrets.required&lt;/code&gt; are configured on the Worker before the operation succeeds. If any required secrets are missing, the command fails with an error listing which secrets need to be set.&lt;/p&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/configuration/#secrets-configuration-property&quot;&gt;&lt;code&gt;secrets&lt;/code&gt; configuration property&lt;/a&gt; reference.&lt;/p&gt;</description><pubDate>Wed, 25 Mar 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Containers - Use Docker Hub images with Containers</title><link>https://developers.cloudflare.com/changelog/post/2026-03-24-docker-hub-images/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-24-docker-hub-images/</guid><description>&lt;p&gt;Containers now support &lt;a href=&quot;https://hub.docker.com/&quot; target=&quot;_blank&quot;&gt;Docker Hub&lt;/a&gt; images. You can use a fully qualified Docker Hub image reference in your &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/configuration/#containers&quot; target=&quot;_blank&quot;&gt;Wrangler configuration&lt;/a&gt; instead of first pushing the image to Cloudflare Registry.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;wrangler.jsonc&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;jsonc&quot;&gt;&lt;code class=&quot;language-jsonc&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;containers&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// Example: docker.io/cloudflare/sandbox:0.7.18&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;docker.io/&amp;#x3C;NAMESPACE&gt;/&amp;#x3C;REPOSITORY&gt;:&amp;#x3C;TAG&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;wrangler.toml&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;toml&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[[&lt;/span&gt;&lt;span&gt;containers&lt;/span&gt;&lt;span&gt;]]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;docker.io/&amp;#x3C;NAMESPACE&gt;/&amp;#x3C;REPOSITORY&gt;:&amp;#x3C;TAG&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;Containers also support private Docker Hub images. To configure credentials, refer to &lt;a href=&quot;https://developers.cloudflare.com/containers/platform-details/image-management/#use-private-docker-hub-images&quot;&gt;Use private Docker Hub images&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/containers/platform-details/image-management/&quot;&gt;Image management&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate><product>Containers</product><category>Containers</category></item><item><title>Workers - Dynamic Workers, now in open beta</title><link>https://developers.cloudflare.com/changelog/post/2026-03-24-dynamic-workers-open-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-24-dynamic-workers-open-beta/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/dynamic-workers/&quot;&gt;Dynamic Workers&lt;/a&gt; are now in &lt;a href=&quot;https://blog.cloudflare.com/dynamic-workers/&quot; target=&quot;_blank&quot;&gt;open beta&lt;/a&gt; for all paid Workers users. You can now have a Worker spin up other Workers, called Dynamic Workers, at runtime to execute code on-demand in a secure, sandboxed environment. Dynamic Workers start in milliseconds, making them well suited for fast, secure code execution at scale.&lt;/p&gt;
&lt;h4&gt;Use Dynamic Workers for&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/agents/api-reference/codemode/&quot;&gt;Code Mode&lt;/a&gt;&lt;/strong&gt;: LLMs are trained to write code. Run tool-calling logic written in code instead of stepping through many tool calls, which can save up to 80% in inference tokens and cost.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI agents executing code&lt;/strong&gt;: Run code for tasks like data analysis, file transformation, API calls, and chained actions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Running AI-generated code&lt;/strong&gt;: Run generated code for prototypes, projects, and automations in a secure, isolated sandboxed environment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fast development and previews&lt;/strong&gt;: Load prototypes, previews, and playgrounds in milliseconds.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom automations&lt;/strong&gt;: Create custom tools on the fly that execute a task, call an integration, or automate a workflow.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Executing Dynamic Workers&lt;/h4&gt;
&lt;p&gt;Dynamic Workers support two loading modes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;load(code)&lt;/code&gt; — for one-time code execution (equivalent to calling &lt;code&gt;get()&lt;/code&gt; with a null ID).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;get(id, callback)&lt;/code&gt; — caches a Dynamic Worker by ID so it can stay warm across requests. Use this when the same code will receive subsequent requests.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;worker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;LOADER&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;load&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;compatibilityDate&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;2026-01-01&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;mainModule&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;src/index.js&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;modules&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;src/index.js&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;export default {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fetch() {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return new Response(&quot;Hello from a dynamic Worker&quot;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// Block all outbound network access from the Dynamic Worker.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;globalOutbound&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; null&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;worker&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getEntrypoint&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Env&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Promise&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;worker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;LOADER&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;load&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;compatibilityDate&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;2026-01-01&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;mainModule&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;src/index.js&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;modules&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;src/index.js&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;export default {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fetch() {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return new Response(&quot;Hello from a dynamic Worker&quot;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// Block all outbound network access from the Dynamic Worker.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;globalOutbound&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; null&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;worker&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getEntrypoint&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;h4&gt;Helper libraries for Dynamic Workers&lt;/h4&gt;
&lt;p&gt;Here are 3 new libraries to help you build with Dynamic Workers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.npmjs.com/package/@cloudflare/codemode&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;@cloudflare/codemode&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt;: Replace individual tool calls with a single &lt;code&gt;code()&lt;/code&gt; tool, so LLMs write and execute TypeScript that orchestrates multiple API calls in one pass.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.npmjs.com/package/@cloudflare/worker-bundler&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;@cloudflare/worker-bundler&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt;: Resolve npm dependencies and bundle source files into ready-to-load modules for Dynamic Workers, all at runtime.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.npmjs.com/package/@cloudflare/shell&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;@cloudflare/shell&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt;: Give your agent a virtual filesystem inside a Dynamic Worker with persistent storage backed by SQLite and R2.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Try it out&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Dynamic Workers Starter&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://deploy.workers.cloudflare.com/?url=https://github.com/cloudflare/agents/tree/main/examples/dynamic-workers&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://deploy.workers.cloudflare.com/button&quot; alt=&quot;Deploy to Workers&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Use this &lt;a href=&quot;https://github.com/cloudflare/agents/tree/main/examples/dynamic-workers&quot; target=&quot;_blank&quot;&gt;starter&lt;/a&gt; to deploy a Worker that can load and execute Dynamic Workers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dynamic Workers Playground&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://deploy.workers.cloudflare.com/?url=https://github.com/cloudflare/agents/tree/main/examples/dynamic-workers-playground&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://deploy.workers.cloudflare.com/button&quot; alt=&quot;Deploy to Workers&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Deploy the &lt;a href=&quot;https://github.com/cloudflare/agents/tree/main/examples/dynamic-workers-playground&quot; target=&quot;_blank&quot;&gt;Dynamic Workers Playground&lt;/a&gt; to write or import code, bundle it at runtime with &lt;code&gt;@cloudflare/worker-bundler&lt;/code&gt;, execute it through a Dynamic Worker, and see real-time responses and execution logs.&lt;/p&gt;
&lt;p&gt;For the full API reference and configuration options, refer to the &lt;a href=&quot;https://developers.cloudflare.com/dynamic-workers/&quot;&gt;Dynamic Workers documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Pricing&lt;/h4&gt;
&lt;p&gt;Dynamic Workers &lt;a href=&quot;https://developers.cloudflare.com/dynamic-workers/pricing/&quot;&gt;pricing&lt;/a&gt; is based on three dimensions: Dynamic Workers created daily, requests, and CPU time.&lt;/p&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;Included&lt;/th&gt;&lt;th&gt;Additional usage&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Dynamic Workers created daily&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;1,000 unique Dynamic Workers per month&lt;/td&gt;&lt;td&gt;+$0.002 per Dynamic Worker per day&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Requests&lt;/strong&gt; ¹&lt;/td&gt;&lt;td&gt;10 million per month&lt;/td&gt;&lt;td&gt;+$0.30 per million requests&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;CPU time&lt;/strong&gt; ¹&lt;/td&gt;&lt;td&gt;30 million CPU milliseconds per month&lt;/td&gt;&lt;td&gt;+$0.02 per million CPU milliseconds&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;¹ Uses &lt;a href=&quot;https://developers.cloudflare.com/workers/platform/pricing/#workers&quot;&gt;Workers Standard rates&lt;/a&gt; and will appear as part of your existing Workers bill, not as separate Dynamic Workers charges.&lt;/p&gt;
&lt;p&gt;Note: Dynamic Workers requests and CPU time are already billed as part of your Workers plan and will count toward your Workers requests and CPU usage. The Dynamic Workers created daily charge is not yet active — you will not be billed for the number of Dynamic Workers created at this time. Pricing information is shared in advance so you can estimate future costs.&lt;/p&gt;</description><pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workflows, Workers - Workflow instances now support pause(), resume(), restart(), and terminate() methods in local development</title><link>https://developers.cloudflare.com/changelog/post/2026-03-23-local-dev-instance-methods/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-23-local-dev-instance-methods/</guid><description>&lt;p&gt;Workflow instance methods &lt;code&gt;pause()&lt;/code&gt;, &lt;code&gt;resume()&lt;/code&gt;, &lt;code&gt;restart()&lt;/code&gt;, and &lt;code&gt;terminate()&lt;/code&gt; are now available in local development when using &lt;code&gt;wrangler dev&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You can now test the full Workflow instance lifecycle locally:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;instance&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;MY_WORKFLOW&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-instance-id&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;instance&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pause&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// pauses a running workflow instance&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;instance&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;resume&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// resumes a paused instance&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;instance&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;restart&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// restarts the instance from the beginning&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;instance&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;terminate&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// terminates the instance immediately&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;</description><pubDate>Mon, 23 Mar 2026 12:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category><category>Workers</category></item><item><title>Agents, Workers - Agents SDK v0.8.0: readable state, idempotent schedules, typed AgentClient, and Zod 4</title><link>https://developers.cloudflare.com/changelog/post/2026-03-23-agents-sdk-v080/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-23-agents-sdk-v080/</guid><description>&lt;p&gt;The latest release of the &lt;a href=&quot;https://github.com/cloudflare/agents&quot; target=&quot;_blank&quot;&gt;Agents SDK&lt;/a&gt; exposes agent state as a readable property, prevents duplicate schedule rows across Durable Object restarts, brings full TypeScript inference to &lt;code&gt;AgentClient&lt;/code&gt;, and migrates to Zod 4.&lt;/p&gt;
&lt;h4&gt;Readable &lt;code&gt;state&lt;/code&gt; on &lt;code&gt;useAgent&lt;/code&gt; and &lt;code&gt;AgentClient&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Both &lt;code&gt;useAgent&lt;/code&gt; (React) and &lt;code&gt;AgentClient&lt;/code&gt; (vanilla JS) now expose a &lt;code&gt;state&lt;/code&gt; property that reflects the current agent state. Previously, reading state required manually tracking it through the &lt;code&gt;onStateUpdate&lt;/code&gt; callback.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;React (&lt;code&gt;useAgent&lt;/code&gt;)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;agent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;useAgent&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;agent&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;game-agent&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;room-123&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Read state directly — no separate useState + onStateUpdate needed&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&gt;Score: {&lt;/span&gt;&lt;span&gt;agent&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;state&lt;/span&gt;&lt;span&gt;?.&lt;/span&gt;&lt;span&gt;score&lt;/span&gt;&lt;span&gt;}&amp;#x3C;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Spread for partial updates&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;agent&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setState&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;agent&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;state&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; score&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;agent&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;state&lt;/span&gt;&lt;span&gt;?.&lt;/span&gt;&lt;span&gt;score&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;??&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;agent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;useAgent&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;GameAgent&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GameState&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;agent&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;game-agent&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;room-123&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Read state directly — no separate useState + onStateUpdate needed&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &amp;#x3C;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;Score&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;agent.state?.&lt;/span&gt;&lt;span&gt;score&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Spread for partial updates&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;agent&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setState&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;agent&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;state&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; score&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;agent&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;state&lt;/span&gt;&lt;span&gt;?.&lt;/span&gt;&lt;span&gt;score&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;??&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;&lt;code&gt;agent.state&lt;/code&gt; is reactive — the component re-renders when state changes from either the server or a client-side &lt;code&gt;setState()&lt;/code&gt; call.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vanilla JS (&lt;code&gt;AgentClient&lt;/code&gt;)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AgentClient&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;agent&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;game-agent&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;room-123&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;your-worker.workers.dev&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setState&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; score&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;state&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// { score: 100 }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AgentClient&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;GameAgent&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;agent&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;game-agent&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;room-123&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;your-worker.workers.dev&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setState&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; score&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;state&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// { score: 100 }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;State starts as &lt;code&gt;undefined&lt;/code&gt; and is populated when the server sends the initial state on connect (from &lt;code&gt;initialState&lt;/code&gt;) or when &lt;code&gt;setState()&lt;/code&gt; is called. Use optional chaining (&lt;code&gt;agent.state?.field&lt;/code&gt;) for safe access. The &lt;code&gt;onStateUpdate&lt;/code&gt; callback continues to work as before — the new &lt;code&gt;state&lt;/code&gt; property is additive.&lt;/p&gt;
&lt;h4&gt;Idempotent &lt;code&gt;schedule()&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;schedule()&lt;/code&gt; now supports an &lt;code&gt;idempotent&lt;/code&gt; option that deduplicates by &lt;code&gt;(type, callback, payload)&lt;/code&gt;, preventing duplicate rows from accumulating when called in places that run on every Durable Object restart such as &lt;code&gt;onStart()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cron schedules are idempotent by default.&lt;/strong&gt; Calling &lt;code&gt;schedule(&quot;0 * * * *&quot;, &quot;tick&quot;)&lt;/code&gt; multiple times with the same callback, expression, and payload returns the existing schedule row instead of creating a new one. Pass &lt;code&gt;{ idempotent: false }&lt;/code&gt; to override.&lt;/p&gt;
&lt;p&gt;Delayed and date-scheduled types support opt-in idempotency:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Agent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;agents&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyAgent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Agent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;onStart&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Safe across restarts — only one row is created&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;schedule&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;60&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;maintenance&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;undefined&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; idempotent&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Agent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;agents&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyAgent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Agent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;onStart&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Safe across restarts — only one row is created&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;schedule&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;60&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;maintenance&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;undefined&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; idempotent&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;Two new warnings help catch common foot-guns:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Calling &lt;code&gt;schedule()&lt;/code&gt; inside &lt;code&gt;onStart()&lt;/code&gt; without &lt;code&gt;{ idempotent: true }&lt;/code&gt; emits a &lt;code&gt;console.warn&lt;/code&gt; with actionable guidance (once per callback; skipped for cron and when &lt;code&gt;idempotent&lt;/code&gt; is set explicitly).&lt;/li&gt;
&lt;li&gt;If an alarm cycle processes 10 or more stale one-shot rows for the same callback, the SDK emits a &lt;code&gt;console.warn&lt;/code&gt; and a &lt;code&gt;schedule:duplicate_warning&lt;/code&gt; diagnostics channel event.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Typed &lt;code&gt;AgentClient&lt;/code&gt; with &lt;code&gt;call&lt;/code&gt; inference and &lt;code&gt;stub&lt;/code&gt; proxy&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;AgentClient&lt;/code&gt; now accepts an optional agent type parameter for full type inference on RPC calls, matching the typed experience already available with &lt;code&gt;useAgent&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AgentClient&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;agent&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-agent&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;window&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Typed call — method name autocompletes, args and return type inferred&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;call&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;getValue&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Typed stub — direct RPC-style proxy&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;stub&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getValue&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;stub&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AgentClient&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;MyAgent&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;agent&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-agent&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;window&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Typed call — method name autocompletes, args and return type inferred&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;call&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;getValue&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Typed stub — direct RPC-style proxy&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;stub&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getValue&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;stub&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;State is automatically inferred from the agent type, so &lt;code&gt;onStateUpdate&lt;/code&gt; is also typed:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AgentClient&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;agent&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-agent&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;window&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;onStateUpdate&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;state&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// state is typed as MyAgent&apos;s state type&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AgentClient&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;MyAgent&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;agent&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-agent&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;window&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;onStateUpdate&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;state&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// state is typed as MyAgent&apos;s state type&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;Existing untyped usage continues to work without changes. The RPC type utilities (&lt;code&gt;AgentMethods&lt;/code&gt;, &lt;code&gt;AgentStub&lt;/code&gt;, &lt;code&gt;RPCMethods&lt;/code&gt;) are now exported from &lt;code&gt;agents/client&lt;/code&gt; for advanced typing scenarios.
&lt;code&gt;agents&lt;/code&gt;, &lt;code&gt;@cloudflare/ai-chat&lt;/code&gt;, and &lt;code&gt;@cloudflare/codemode&lt;/code&gt; now require &lt;code&gt;zod ^4.0.0&lt;/code&gt;. Zod v3 is no longer supported.&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;@cloudflare/ai-chat&lt;/code&gt; fixes&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Turn serialization&lt;/strong&gt; — &lt;code&gt;onChatMessage()&lt;/code&gt; and &lt;code&gt;_reply()&lt;/code&gt; work is now queued so user requests, tool continuations, and &lt;code&gt;saveMessages()&lt;/code&gt; never stream concurrently.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Duplicate messages on stop&lt;/strong&gt; — Clicking stop during an active stream no longer splits the assistant message into two entries.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Duplicate messages after tool calls&lt;/strong&gt; — Orphaned client IDs no longer leak into persistent storage.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;&lt;code&gt;keepAlive()&lt;/code&gt; and &lt;code&gt;keepAliveWhile()&lt;/code&gt; are no longer experimental&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;keepAlive()&lt;/code&gt; now uses a lightweight in-memory ref count instead of schedule rows. Multiple concurrent callers share a single alarm cycle. The &lt;code&gt;@experimental&lt;/code&gt; tag has been removed from both &lt;code&gt;keepAlive()&lt;/code&gt; and &lt;code&gt;keepAliveWhile()&lt;/code&gt;.&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;@cloudflare/codemode&lt;/code&gt;: TanStack AI integration&lt;/h4&gt;
&lt;p&gt;A new entry point &lt;code&gt;@cloudflare/codemode/tanstack-ai&lt;/code&gt; adds support for &lt;a href=&quot;https://tanstack.com/ai&quot; target=&quot;_blank&quot;&gt;TanStack AI&apos;s&lt;/a&gt; &lt;code&gt;chat()&lt;/code&gt; as an alternative to the Vercel AI SDK&apos;s &lt;code&gt;streamText()&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;createCodeTool&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tanstackTools&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@cloudflare/codemode/tanstack-ai&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;chat&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@tanstack/ai&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;codeTool&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;createCodeTool&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tools&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;tanstackTools&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;myServerTools&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;executor&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stream&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;chat&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;adapter&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; tools&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;codeTool&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;messages&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;createCodeTool&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tanstackTools&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@cloudflare/codemode/tanstack-ai&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;chat&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@tanstack/ai&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;codeTool&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;createCodeTool&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tools&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;tanstackTools&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;myServerTools&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;executor&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stream&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;chat&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;adapter&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; tools&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;codeTool&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;messages&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;h4&gt;Upgrade&lt;/h4&gt;
&lt;p&gt;To update to the latest version:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;agents@latest&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@cloudflare/ai-chat@latest&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;</description><pubDate>Mon, 23 Mar 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>AI Search - New AI Search REST API endpoints for /search and /chat/completions</title><link>https://developers.cloudflare.com/changelog/post/2026-03-23-ai-search-new-rest-api/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-23-ai-search-new-rest-api/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-search/&quot;&gt;AI Search&lt;/a&gt; now offers new &lt;a href=&quot;https://developers.cloudflare.com/ai-search/usage/rest-api/&quot;&gt;REST API&lt;/a&gt; endpoints for search and chat that use an OpenAI compatible format. This means you can use the familiar &lt;code&gt;messages&lt;/code&gt; array structure that works with existing OpenAI SDKs and tools. The messages array also lets you pass previous messages within a session, so the model can maintain context across multiple turns.&lt;/p&gt;

















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Endpoint&lt;/th&gt;&lt;th&gt;Path&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Chat Completions&lt;/td&gt;&lt;td&gt;&lt;code&gt;POST /accounts/{account_id}/ai-search/instances/{name}/chat/completions&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Search&lt;/td&gt;&lt;td&gt;&lt;code&gt;POST /accounts/{account_id}/ai-search/instances/{name}/search&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Here is an example request to the Chat Completions endpoint using the new &lt;code&gt;messages&lt;/code&gt; array format:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://api.cloudflare.com/client/v4/accounts/{ACCOUNT_ID}/ai-search/instances/{NAME}/chat/completions&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-H&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-H&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Authorization: Bearer {API_TOKEN}&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;messages&quot;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;role&quot;: &quot;system&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;content&quot;: &quot;You are a helpful documentation assistant.&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;role&quot;: &quot;user&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;content&quot;: &quot;How do I get started?&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For more details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/ai-search/usage/rest-api/&quot;&gt;AI Search REST API guide&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Migration from existing AutoRAG API (recommended)&lt;/h4&gt;
&lt;p&gt;If you are using the previous AutoRAG API endpoints (&lt;code&gt;/autorag/rags/&lt;/code&gt;), we recommend migrating to the new endpoints. The previous AutoRAG API endpoints will continue to be fully supported.&lt;/p&gt;
&lt;p&gt;Refer to the &lt;a href=&quot;https://developers.cloudflare.com/ai-search/how-to/migrate-from-autorag-api/&quot;&gt;migration guide&lt;/a&gt; for step-by-step instructions.&lt;/p&gt;</description><pubDate>Mon, 23 Mar 2026 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>AI Search - AI Search UI snippets and MCP support</title><link>https://developers.cloudflare.com/changelog/post/2026-03-23-ai-search-public-endpoint-and-snippets/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-23-ai-search-public-endpoint-and-snippets/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-search/&quot;&gt;AI Search&lt;/a&gt; now supports public endpoints, UI snippets, and MCP, making it easy to add search to your website or connect AI agents.&lt;/p&gt;
&lt;p&gt;Public endpoints allow you to expose AI Search capabilities without requiring API authentication. To enable public endpoints:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;AI Search&lt;/strong&gt; in the Cloudflare dashboard.
&lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/ai/ai-search&quot; target=&quot;_blank&quot;&gt;  Go to &lt;strong&gt;AI Search&lt;/strong&gt;  &lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Select your instance, and turn on &lt;strong&gt;Public Endpoint&lt;/strong&gt; in &lt;strong&gt;Settings&lt;/strong&gt;.
For more details, refer to &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/public-endpoint/&quot;&gt;Public endpoint configuration&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;UI snippets&lt;/h4&gt;
&lt;p&gt;UI snippets are pre-built search and chat components you can embed in your website. Visit &lt;a href=&quot;https://search.ai.cloudflare.com/&quot; target=&quot;_blank&quot;&gt;search.ai.cloudflare.com&lt;/a&gt; to configure and preview components for your AI Search instance.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/ui-snippet-search-modal.tIxR8nl5_2300oN.webp&quot; alt=&quot;Example of the search-modal-snippet component&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;To add a search modal to your page:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;module&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;src&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;https://&amp;#x3C;INSTANCE_ID&gt;.search.ai.cloudflare.com/assets/v0.0.25/search-snippet.es.js&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;search-modal-snippet&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;api-url&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;https://&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;INSTANCE_ID&gt;.search.ai.cloudflare.com/&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;placeholder&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;Search...&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;search-modal-snippet&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For more details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/embed-search-snippets/&quot;&gt;UI snippets documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;MCP&lt;/h4&gt;
&lt;p&gt;The MCP endpoint allows AI agents to search your content via the Model Context Protocol. Connect your MCP client to:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;txt&quot;&gt;&lt;code class=&quot;language-txt&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;https://&amp;#x3C;INSTANCE_ID&gt;.search.ai.cloudflare.com/mcp&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For more details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/ai-search/usage/mcp/&quot;&gt;MCP documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 23 Mar 2026 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>AI Search - Custom metadata filtering for AI Search</title><link>https://developers.cloudflare.com/changelog/post/2026-03-23-custom-metadata-filtering/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-23-custom-metadata-filtering/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-search/&quot;&gt;AI Search&lt;/a&gt; now supports custom metadata filtering, allowing you to define your own metadata fields and filter search results based on attributes like category, version, or any custom field you define.&lt;/p&gt;
&lt;h4&gt;Define a custom metadata schema&lt;/h4&gt;
&lt;p&gt;You can define up to 5 custom metadata fields per AI Search instance. Each field has a name and data type (&lt;code&gt;text&lt;/code&gt;, &lt;code&gt;number&lt;/code&gt;, or &lt;code&gt;boolean&lt;/code&gt;):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-X&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;POST&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://api.cloudflare.com/client/v4/accounts/{ACCOUNT_ID}/ai-search/instances&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-H&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-H&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Authorization: Bearer {API_TOKEN}&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;id&quot;: &quot;my-instance&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;type&quot;: &quot;r2&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;source&quot;: &quot;my-bucket&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;custom_metadata&quot;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ &quot;field_name&quot;: &quot;category&quot;, &quot;data_type&quot;: &quot;text&quot; },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ &quot;field_name&quot;: &quot;version&quot;, &quot;data_type&quot;: &quot;number&quot; },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ &quot;field_name&quot;: &quot;is_public&quot;, &quot;data_type&quot;: &quot;boolean&quot; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Add metadata to your documents&lt;/h4&gt;
&lt;p&gt;How you attach metadata depends on your data source:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;R2 bucket&lt;/strong&gt;: Set metadata using S3-compatible custom headers (&lt;code&gt;x-amz-meta-*&lt;/code&gt;) when uploading objects. Refer to &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/data-source/r2/#custom-metadata&quot;&gt;R2 custom metadata&lt;/a&gt; for examples.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Website&lt;/strong&gt;: Add &lt;code&gt;&amp;#x3C;meta&gt;&lt;/code&gt; tags to your HTML pages. Refer to &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/data-source/website/#custom-metadata&quot;&gt;Website custom metadata&lt;/a&gt; for details.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Filter search results&lt;/h4&gt;
&lt;p&gt;Use custom metadata fields in your search queries alongside built-in attributes like &lt;code&gt;folder&lt;/code&gt; and &lt;code&gt;timestamp&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://api.cloudflare.com/client/v4/accounts/{ACCOUNT_ID}/ai-search/instances/{NAME}/search&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-H&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-H&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Authorization: Bearer {API_TOKEN}&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;messages&quot;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;content&quot;: &quot;How do I configure authentication?&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;role&quot;: &quot;user&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;ai_search_options&quot;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;retrieval&quot;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;filters&quot;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;category&quot;: &quot;documentation&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;version&quot;: { &quot;$gte&quot;: 2.0 }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Learn more in the &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/metadata/&quot;&gt;metadata filtering documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 23 Mar 2026 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>R2 SQL - R2 SQL now supports over 190 new functions, expressions, and complex types</title><link>https://developers.cloudflare.com/changelog/post/2026-03-23-expanded-sql-functions-expressions-complex-types/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-23-expanded-sql-functions-expressions-complex-types/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/r2-sql/&quot;&gt;R2 SQL&lt;/a&gt; now supports an expanded SQL grammar so you can write richer analytical queries without exporting data. This release adds CASE expressions, column aliases, arithmetic in clauses, 163 scalar functions, 33 aggregate functions, EXPLAIN, Common Table Expressions (CTEs),and full struct/array/map access. R2 SQL is Cloudflare&apos;s serverless, distributed, analytics query engine for querying &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot;&gt;Apache Iceberg&lt;/a&gt; tables stored in &lt;a href=&quot;https://developers.cloudflare.com/r2/data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt;. This page documents the supported SQL syntax.&lt;/p&gt;
&lt;h4&gt;Highlights&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Column aliases&lt;/strong&gt; — &lt;code&gt;SELECT col AS alias&lt;/code&gt; now works in all clauses&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CASE expressions&lt;/strong&gt; — conditional logic directly in SQL (searched and simple forms)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scalar functions&lt;/strong&gt; — 163 new functions across math, string, datetime, regex, crypto, encoding, and type inspection categories&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aggregate functions&lt;/strong&gt; — statistical (variance, stddev, correlation, regression), bitwise, boolean, and positional aggregates join the existing basic and approximate functions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Complex types&lt;/strong&gt; — query struct fields with bracket notation, use 46 array functions, and extract map keys/values&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Common table expressions (CTEs)&lt;/strong&gt; — use &lt;code&gt;WITH ... AS&lt;/code&gt; to define named temporary result sets. Chained CTEs are supported. All CTEs must reference the same single table.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Full expression support&lt;/strong&gt; — arithmetic, type casting (&lt;code&gt;CAST&lt;/code&gt;, &lt;code&gt;TRY_CAST&lt;/code&gt;, &lt;code&gt;::&lt;/code&gt; shorthand), and &lt;code&gt;EXTRACT&lt;/code&gt; in SELECT, WHERE, GROUP BY, HAVING, and ORDER BY&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Examples&lt;/h4&gt;
&lt;h4&gt;CASE expressions with statistical aggregates&lt;/h4&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; source,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;CASE&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;WHEN&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AVG&lt;/span&gt;&lt;span&gt;(price) &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;30&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;THEN&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;premium&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;WHEN&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AVG&lt;/span&gt;&lt;span&gt;(price) &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;THEN&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;mid-tier&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;ELSE&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;budget&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;END&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; tier,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;round&lt;/span&gt;&lt;span&gt;(stddev(price), &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; price_volatility,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;approx_percentile_cont&lt;/span&gt;&lt;span&gt;(price, &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;95&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; p95_price&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; my_namespace.sales_data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;GROUP BY&lt;/span&gt;&lt;span&gt; source&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Struct and array access&lt;/h4&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; product_name,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;pricing[&apos;price&apos;] &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; price,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;array_to_string(tags, &lt;/span&gt;&lt;span&gt;&apos;, &apos;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; tag_list&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; my_namespace.products&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; array_has(tags, &lt;/span&gt;&lt;span&gt;&apos;Action&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;ORDER BY&lt;/span&gt;&lt;span&gt; pricing[&apos;price&apos;] &lt;/span&gt;&lt;span&gt;DESC&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;LIMIT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Chained CTEs with time-series analysis&lt;/h4&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;WITH&lt;/span&gt;&lt;span&gt; monthly &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; date_trunc(&lt;/span&gt;&lt;span&gt;&apos;month&apos;&lt;/span&gt;&lt;span&gt;, sale_timestamp) &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;month&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;department,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;COUNT&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; transactions,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;round&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;AVG&lt;/span&gt;&lt;span&gt;(total_amount), &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; avg_amount&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; my_namespace.sales_data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; sale_timestamp &lt;/span&gt;&lt;span&gt;BETWEEN&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;2025-01-01T00:00:00Z&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AND&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;2025-12-31T23:59:59Z&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;GROUP BY&lt;/span&gt;&lt;span&gt; date_trunc(&lt;/span&gt;&lt;span&gt;&apos;month&apos;&lt;/span&gt;&lt;span&gt;, sale_timestamp), department&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;ranked &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;month&lt;/span&gt;&lt;span&gt;, department, transactions, avg_amount,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;CASE&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;WHEN&lt;/span&gt;&lt;span&gt; avg_amount &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1000&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;THEN&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;high-value&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;WHEN&lt;/span&gt;&lt;span&gt; avg_amount &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;500&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;THEN&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;mid-value&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;ELSE&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;standard&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;END&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; tier&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; monthly&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; transactions &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; ranked&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;ORDER BY&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;month&lt;/span&gt;&lt;span&gt;, avg_amount &lt;/span&gt;&lt;span&gt;DESC&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For the full function reference and syntax details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/sql-reference/&quot;&gt;SQL reference&lt;/a&gt;. For limitations and best practices, refer to &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/reference/limitations-best-practices/&quot;&gt;Limitations and best practices&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 23 Mar 2026 00:00:00 GMT</pubDate><product>R2 SQL</product><category>R2 SQL</category></item><item><title>Workers VPC - Observability for Workers VPC Services</title><link>https://developers.cloudflare.com/changelog/post/2026-03-20-metrics-and-settings-dashboard/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-20-metrics-and-settings-dashboard/</guid><description>&lt;p&gt;Each VPC Service now has a &lt;strong&gt;Metrics&lt;/strong&gt; tab so you can monitor connection health and debug failures without leaving the dashboard.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/2026-03-20-metrics-dashboard.6kfnbqQd_1Oc7Ft.webp&quot; alt=&quot;Workers VPC Metrics dashboard showing connections, latency, and errors charts&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Connections&lt;/strong&gt; — See successful and failed connections over time, broken down by what is responsible: your origin (Bad Upstream), your configuration (Client), or Cloudflare (Internal).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Latency&lt;/strong&gt; — Track connection and DNS resolution latency trends.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Errors&lt;/strong&gt; — Drill into specific error codes grouped by category, with filters to isolate upstream, client, or internal failures.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can also view and edit your VPC Service configuration, host details, and port assignments from the &lt;strong&gt;Settings&lt;/strong&gt; tab.&lt;/p&gt;
&lt;p&gt;For a full list of error codes and what they mean, refer to &lt;a href=&quot;https://developers.cloudflare.com/workers-vpc/reference/troubleshooting/&quot;&gt;Troubleshooting&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 20 Mar 2026 00:00:00 GMT</pubDate><product>Workers VPC</product><category>Workers VPC</category></item><item><title>Hyperdrive - Hyperdrive now supports custom TLS/SSL certificates for MySQL</title><link>https://developers.cloudflare.com/changelog/post/2026-03-19-hyperdrive-mysql-custom-certificate-support/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-19-hyperdrive-mysql-custom-certificate-support/</guid><description>&lt;p&gt;Hyperdrive now supports custom TLS/SSL certificates for MySQL databases, bringing the same certificate options previously available for PostgreSQL to MySQL connections.&lt;/p&gt;
&lt;p&gt;You can now configure:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Server certificate verification&lt;/strong&gt; with &lt;code&gt;VERIFY_CA&lt;/code&gt; or &lt;code&gt;VERIFY_IDENTITY&lt;/code&gt; SSL modes to verify that your MySQL database server&apos;s certificate is signed by the expected certificate authority (CA).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Client certificates&lt;/strong&gt; (mTLS) for Hyperdrive to authenticate itself to your MySQL database with credentials beyond username and password.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Create a Hyperdrive configuration with custom certificates for MySQL:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Upload a CA certificate&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cert&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;upload&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;certificate-authority&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--ca-cert&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;your-ca-cert.pem&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;your-custom-ca-name&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Create a Hyperdrive with VERIFY_IDENTITY mode&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;hyperdrive&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;your-hyperdrive-config&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--connection-string=&quot;mysql://user:password@hostname:port/database&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--ca-certificate-id&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;#x3C;CA_CERT_ID&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--sslmode&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;VERIFY_IDENTITY&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/hyperdrive/configuration/tls-ssl-certificates-for-hyperdrive/&quot;&gt;SSL/TLS certificates for Hyperdrive&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/hyperdrive/examples/connect-to-mysql/&quot;&gt;MySQL TLS/SSL modes&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 19 Mar 2026 00:00:00 GMT</pubDate><product>Hyperdrive</product><category>Hyperdrive</category></item><item><title>Cloudflare Tunnel, Workers - Manage Cloudflare Tunnels with Wrangler</title><link>https://developers.cloudflare.com/changelog/post/2026-03-19-wrangler-tunnel-commands/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-19-wrangler-tunnel-commands/</guid><description>&lt;p&gt;You can now manage &lt;a href=&quot;https://developers.cloudflare.com/tunnel/&quot;&gt;Cloudflare Tunnels&lt;/a&gt; directly from &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/&quot;&gt;Wrangler&lt;/a&gt;, the CLI for the Cloudflare Developer Platform. The new &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/tunnel/&quot;&gt;&lt;code&gt;wrangler tunnel&lt;/code&gt;&lt;/a&gt; commands let you create, run, and manage tunnels without leaving your terminal.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/wrangler-tunnel.DOqrtGGg_7EDX0.webp&quot; alt=&quot;Wrangler tunnel commands demo&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;Available commands:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;wrangler tunnel create&lt;/code&gt; — Create a new remotely managed tunnel.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wrangler tunnel list&lt;/code&gt; — List all tunnels in your account.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wrangler tunnel info&lt;/code&gt; — Display details about a specific tunnel.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wrangler tunnel delete&lt;/code&gt; — Delete a tunnel.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wrangler tunnel run&lt;/code&gt; — Run a tunnel using the cloudflared daemon.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wrangler tunnel quick-start&lt;/code&gt; — Start a free, temporary tunnel without an account using &lt;a href=&quot;https://developers.cloudflare.com/tunnel/setup/#quick-tunnels-development&quot;&gt;Quick Tunnels&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wrangler handles downloading and managing the &lt;a href=&quot;https://developers.cloudflare.com/tunnel/downloads/&quot;&gt;cloudflared&lt;/a&gt; binary automatically. On first use, you will be prompted to download &lt;code&gt;cloudflared&lt;/code&gt; to a local cache directory.&lt;/p&gt;
&lt;p&gt;These commands are currently experimental and may change without notice.&lt;/p&gt;
&lt;p&gt;To get started, refer to the &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/tunnel/&quot;&gt;Wrangler tunnel commands documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 19 Mar 2026 00:00:00 GMT</pubDate><product>Cloudflare Tunnel</product><category>Cloudflare Tunnel</category><category>Workers</category></item><item><title>Workers AI - Moonshot AI Kimi K2.5 now available on Workers AI</title><link>https://developers.cloudflare.com/changelog/post/2026-03-19-kimi-k2-5-workers-ai/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-19-kimi-k2-5-workers-ai/</guid><description>&lt;p&gt;Workers AI is officially in the big models game. &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/kimi-k2.5/&quot;&gt;&lt;code&gt;@cf/moonshotai/kimi-k2.5&lt;/code&gt;&lt;/a&gt; is the first frontier-scale open-source model on our AI inference platform — a large model with a full 256k context window, multi-turn tool calling, vision inputs, and structured outputs. By bringing a frontier-scale model directly onto the Cloudflare Developer Platform, you can now run the entire agent lifecycle on a single, unified platform.&lt;/p&gt;
&lt;p&gt;The model has proven to be a fast, efficient alternative to larger proprietary models without sacrificing quality. As AI adoption increases, the volume of inference is skyrocketing — now you can access frontier intelligence at a fraction of the cost.&lt;/p&gt;
&lt;h4&gt;Key capabilities&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;256,000 token context window&lt;/strong&gt; for retaining full conversation history, tool definitions, and entire codebases across long-running agent sessions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-turn tool calling&lt;/strong&gt; for building agents that invoke tools across multiple conversation turns&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vision inputs&lt;/strong&gt; for processing images alongside text&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Structured outputs&lt;/strong&gt; with JSON mode and JSON Schema support for reliable downstream parsing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Function calling&lt;/strong&gt; for integrating external tools and APIs into agent workflows&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Prefix caching and session affinity&lt;/h4&gt;
&lt;p&gt;When an agent sends a new prompt, it resends all previous prompts, tools, and context from the session. The delta between consecutive requests is usually just a few new lines of input. Prefix caching avoids reprocessing the shared context, saving time and compute from the prefill stage. This means faster Time to First Token (TTFT) and higher Tokens Per Second (TPS) throughput.&lt;/p&gt;
&lt;p&gt;Workers AI has done prefix caching, but we are now surfacing cached tokens as a usage metric and offering a discount on cached tokens compared to input tokens (pricing is listed on the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/kimi-k2.5/&quot;&gt;model page&lt;/a&gt;).&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-X&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;POST&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;https://api.cloudflare.com/client/v4/accounts/{account_id}/ai/run/@cf/moonshotai/kimi-k2.5&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-H&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Authorization: Bearer {api_token}&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-H&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-H&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;x-session-affinity: ses_12345678&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;messages&quot;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;role&quot;: &quot;system&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;content&quot;: &quot;You are a helpful assistant.&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;role&quot;: &quot;user&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;content&quot;: &quot;What is prefix caching and why does it matter?&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;max_tokens&quot;: 2400,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;stream&quot;: true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Some clients like &lt;a href=&quot;https://opencode.ai&quot; target=&quot;_blank&quot;&gt;OpenCode&lt;/a&gt; implement session affinity automatically. The &lt;a href=&quot;https://github.com/cloudflare/agents&quot; target=&quot;_blank&quot;&gt;Agents SDK&lt;/a&gt; starter also sets up the wiring for you.&lt;/p&gt;
&lt;h4&gt;Redesigned asynchronous API&lt;/h4&gt;
&lt;p&gt;For volumes of requests that exceed synchronous rate limits, you can submit batches of inferences to be completed asynchronously. We have revamped the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/features/batch-api/&quot;&gt;Asynchronous Batch API&lt;/a&gt; with a pull-based system that processes queued requests as soon as capacity is available. With internal testing, async requests usually execute within 5 minutes, but this depends on live traffic.&lt;/p&gt;
&lt;p&gt;The async API is the best way to avoid capacity errors in durable workflows. It is ideal for use cases that are not real-time, such as code scanning agents or research agents.&lt;/p&gt;
&lt;p&gt;To use the asynchronous API, pass &lt;code&gt;queueRequest: true&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// 1. Push a batch of requests into the queue&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;res&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AI&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;@cf/moonshotai/kimi-k2.5&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;requests&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;messages&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; role&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;user&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; content&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Tell me a joke&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;messages&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; role&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;user&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; content&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Explain the Pythagoras theorem&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; queueRequest&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// 2. Grab the request ID&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;requestId&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;res&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;request_id&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// 3. Poll for the result&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AI&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;@cf/moonshotai/kimi-k2.5&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;request_id&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;requestId&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;status&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;===&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;queued&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;status&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;===&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;running&quot;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Retry by polling again&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;You can also set up &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/platform/event-subscriptions/&quot;&gt;event notifications&lt;/a&gt; to know when inference is complete instead of polling.&lt;/p&gt;
&lt;h4&gt;Get started&lt;/h4&gt;
&lt;p&gt;Use Kimi K2.5 through the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/configuration/bindings/&quot;&gt;Workers AI binding&lt;/a&gt; (&lt;code&gt;env.AI.run()&lt;/code&gt;), the REST API at &lt;code&gt;/run&lt;/code&gt; or &lt;code&gt;/v1/chat/completions&lt;/code&gt;, &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/&quot;&gt;AI Gateway&lt;/a&gt;, or via the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/configuration/open-ai-compatibility/&quot;&gt;OpenAI-compatible endpoint&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/kimi-k2.5/&quot;&gt;Kimi K2.5 model page&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/platform/pricing/&quot;&gt;pricing&lt;/a&gt;, and &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/features/prompt-caching/&quot;&gt;prompt caching&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 19 Mar 2026 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category></item><item><title>Stream - Media Transformations binding for Workers</title><link>https://developers.cloudflare.com/changelog/post/2026-03-18-media-transformations-workers-binding/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-18-media-transformations-workers-binding/</guid><description>&lt;p&gt;You can now use a Workers binding to transform videos with Media Transformations. This allows you to resize, crop, extract frames, and extract audio from videos stored anywhere, even in private locations like R2 buckets.&lt;/p&gt;
&lt;p&gt;The Media Transformations binding is useful when you want to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Transform videos stored in private or protected sources&lt;/li&gt;
&lt;li&gt;Optimize videos and store the output directly back to R2 for re-use&lt;/li&gt;
&lt;li&gt;Extract still frames for classification or description with Workers AI&lt;/li&gt;
&lt;li&gt;Extract audio tracks for transcription using Workers AI&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To get started, add the Media binding to your Wrangler configuration:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;wrangler.jsonc&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;jsonc&quot;&gt;&lt;code class=&quot;language-jsonc&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;$schema&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./node_modules/wrangler/config-schema.json&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;media&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;binding&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;MEDIA&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;wrangler.toml&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;toml&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;media&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;binding&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;MEDIA&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;Then use the binding in your Worker to transform videos:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;video&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;R2_BUCKET&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;input.mp4&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;MEDIA&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;input&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;video&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;transform&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; width&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;480&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; height&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;270&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; mode&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;video&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; duration&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;5s&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;video&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;R2_BUCKET&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;input.mp4&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;MEDIA&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;input&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;video&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;transform&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; width&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;480&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; height&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;270&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; mode&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;video&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; duration&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;5s&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;Output modes include &lt;code&gt;video&lt;/code&gt; for optimized MP4 clips, &lt;code&gt;frame&lt;/code&gt; for still images, &lt;code&gt;spritesheet&lt;/code&gt; for multiple frames, and &lt;code&gt;audio&lt;/code&gt; for M4A extraction.&lt;/p&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/stream/transform-videos/bindings/&quot;&gt;Media Transformations binding documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate><product>Stream</product><category>Stream</category></item><item><title>Agents, Workers - @cloudflare/codemode v0.2.1: MCP barrel export, zero-dependency main entry point, and custom sandbox modules</title><link>https://developers.cloudflare.com/changelog/post/2026-03-17-codemode-sdk-v021/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-17-codemode-sdk-v021/</guid><description>&lt;p&gt;The latest releases of &lt;a href=&quot;https://www.npmjs.com/package/@cloudflare/codemode&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;@cloudflare/codemode&lt;/code&gt;&lt;/a&gt; add a new MCP barrel export, remove &lt;code&gt;ai&lt;/code&gt; and &lt;code&gt;zod&lt;/code&gt; as required peer dependencies from the main entry point, and give you more control over the sandbox.&lt;/p&gt;
&lt;h4&gt;New &lt;code&gt;@cloudflare/codemode/mcp&lt;/code&gt; export&lt;/h4&gt;
&lt;p&gt;A new &lt;code&gt;@cloudflare/codemode/mcp&lt;/code&gt; entry point provides two functions that wrap MCP servers with Code Mode:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;codeMcpServer({ server, executor })&lt;/code&gt;&lt;/strong&gt; — wraps an existing MCP server with a single &lt;code&gt;code&lt;/code&gt; tool where each upstream tool becomes a typed &lt;code&gt;codemode.*&lt;/code&gt; method.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;openApiMcpServer({ spec, executor, request })&lt;/code&gt;&lt;/strong&gt; — creates &lt;code&gt;search&lt;/code&gt; and &lt;code&gt;execute&lt;/code&gt; MCP tools from an OpenAPI spec with host-side request proxying and automatic &lt;code&gt;$ref&lt;/code&gt; resolution.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;codeMcpServer&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@cloudflare/codemode/mcp&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DynamicWorkerExecutor&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@cloudflare/codemode&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;executor&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DynamicWorkerExecutor&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; loader&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;LOADER&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Wrap an existing MCP server — all its tools become&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// typed methods the LLM can call from generated code&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;codeMcpServer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; server&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;upstreamMcp&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;executor&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;codeMcpServer&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@cloudflare/codemode/mcp&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DynamicWorkerExecutor&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@cloudflare/codemode&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;executor&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DynamicWorkerExecutor&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; loader&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;LOADER&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Wrap an existing MCP server — all its tools become&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// typed methods the LLM can call from generated code&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;codeMcpServer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; server&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;upstreamMcp&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;executor&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;h4&gt;Zero-dependency main entry point&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Breaking change in v0.2.0:&lt;/strong&gt; &lt;code&gt;generateTypes&lt;/code&gt; and the &lt;code&gt;ToolDescriptor&lt;/code&gt; / &lt;code&gt;ToolDescriptors&lt;/code&gt; types have moved to &lt;code&gt;@cloudflare/codemode/ai&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Before&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;generateTypes&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@cloudflare/codemode&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// After&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;generateTypes&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@cloudflare/codemode/ai&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Before&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;generateTypes&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@cloudflare/codemode&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// After&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;generateTypes&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@cloudflare/codemode/ai&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;The main entry point (&lt;code&gt;@cloudflare/codemode&lt;/code&gt;) no longer requires the &lt;code&gt;ai&lt;/code&gt; or &lt;code&gt;zod&lt;/code&gt; peer dependencies. It now exports:&lt;/p&gt;

































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Export&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;sanitizeToolName&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Sanitize tool names into valid JS identifiers&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;normalizeCode&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Normalize LLM-generated code into async arrow functions&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;generateTypesFromJsonSchema&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Generate TypeScript type definitions from plain JSON Schema&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;jsonSchemaToType&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Convert a single JSON Schema to a TypeScript type string&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;DynamicWorkerExecutor&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Sandboxed code execution via Dynamic Worker Loader&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;ToolDispatcher&lt;/code&gt;&lt;/td&gt;&lt;td&gt;RPC target for dispatching tool calls from sandbox to host&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The &lt;code&gt;ai&lt;/code&gt; and &lt;code&gt;zod&lt;/code&gt; peer dependencies are now optional — only required when importing from &lt;code&gt;@cloudflare/codemode/ai&lt;/code&gt;.&lt;/p&gt;
&lt;h4&gt;Custom sandbox modules&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;DynamicWorkerExecutor&lt;/code&gt; now accepts an optional &lt;code&gt;modules&lt;/code&gt; option to inject custom ES modules into the sandbox:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;executor&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DynamicWorkerExecutor&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;loader&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;LOADER&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;modules&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;utils.js&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;`export function add(a, b) { return a + b; }`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Sandbox code can then: import { add } from &quot;utils.js&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;executor&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DynamicWorkerExecutor&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;loader&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;LOADER&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;modules&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;utils.js&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;`export function add(a, b) { return a + b; }`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Sandbox code can then: import { add } from &quot;utils.js&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;h4&gt;Internal normalization and sanitization&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;DynamicWorkerExecutor&lt;/code&gt; now normalizes code and sanitizes tool names internally. You no longer need to call &lt;code&gt;normalizeCode()&lt;/code&gt; or &lt;code&gt;sanitizeToolName()&lt;/code&gt; before passing code and functions to &lt;code&gt;execute()&lt;/code&gt;.&lt;/p&gt;
&lt;h4&gt;Upgrade&lt;/h4&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@cloudflare/codemode@latest&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;See the &lt;a href=&quot;https://developers.cloudflare.com/agents/api-reference/codemode/&quot;&gt;Code Mode documentation&lt;/a&gt; for the full API reference.&lt;/p&gt;</description><pubDate>Tue, 17 Mar 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>AI Gateway - Log AI Gateway request metadata without storing payloads</title><link>https://developers.cloudflare.com/changelog/post/2026-03-17-collect-log-payload-header/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-17-collect-log-payload-header/</guid><description>&lt;p&gt;AI Gateway now supports the &lt;code&gt;cf-aig-collect-log-payload&lt;/code&gt; header, which controls whether request and response bodies are stored in logs. By default, this header is set to &lt;code&gt;true&lt;/code&gt; and payloads are stored alongside metadata. Set this header to &lt;code&gt;false&lt;/code&gt; to skip payload storage while still logging metadata such as token counts, model, provider, status code, cost, and duration.&lt;/p&gt;
&lt;p&gt;This is useful when you need usage metrics but do not want to persist sensitive prompt or response data.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://gateway.ai.cloudflare.com/v1/&lt;/span&gt;&lt;span&gt;$ACCOUNT_ID&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;$GATEWAY_ID&lt;/span&gt;&lt;span&gt;/openai/chat/completions&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--header&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Authorization: Bearer &lt;/span&gt;&lt;span&gt;$TOKEN&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--header&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;Content-Type: application/json&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--header&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;cf-aig-collect-log-payload: false&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--data&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;model&quot;: &quot;gpt-4o-mini&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;messages&quot;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;role&quot;: &quot;user&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;content&quot;: &quot;What is the email address and phone number of user123?&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/observability/logging/#collect-log-payload-cf-aig-collect-log-payload&quot;&gt;Logging&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 17 Mar 2026 00:00:00 GMT</pubDate><product>AI Gateway</product><category>AI Gateway</category></item><item><title>Vectorize - Return up to 50 query results with values or metadata</title><link>https://developers.cloudflare.com/changelog/post/2026-03-16-topk-limit-increased-to-50/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-16-topk-limit-increased-to-50/</guid><description>&lt;p&gt;You can now set &lt;code&gt;topK&lt;/code&gt; up to &lt;code&gt;50&lt;/code&gt; when a Vectorize query returns values or full metadata. This raises the previous limit of &lt;code&gt;20&lt;/code&gt; for queries that use &lt;code&gt;returnValues: true&lt;/code&gt; or &lt;code&gt;returnMetadata: &quot;all&quot;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Use the higher limit when you need more matches in a single query response without dropping values or metadata. Refer to the &lt;a href=&quot;https://developers.cloudflare.com/vectorize/reference/client-api/&quot;&gt;Vectorize API reference&lt;/a&gt; for query options and current &lt;code&gt;topK&lt;/code&gt; limits.&lt;/p&gt;</description><pubDate>Mon, 16 Mar 2026 00:00:00 GMT</pubDate><product>Vectorize</product><category>Vectorize</category></item><item><title>Containers - SSH into running Container instances</title><link>https://developers.cloudflare.com/changelog/post/2026-03-12-ssh-support/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-12-ssh-support/</guid><description>&lt;p&gt;You can now SSH into running Container instances using Wrangler. This is useful for debugging, inspecting running processes, or executing one-off commands inside a Container.&lt;/p&gt;
&lt;p&gt;To connect, enable &lt;code&gt;wrangler_ssh&lt;/code&gt; in your Container configuration and add your &lt;code&gt;ssh-ed25519&lt;/code&gt; public key to &lt;code&gt;authorized_keys&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;wrangler.jsonc&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;jsonc&quot;&gt;&lt;code class=&quot;language-jsonc&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;containers&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;wrangler_ssh&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;enabled&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;authorized_keys&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&amp;#x3C;NAME&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;public_key&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&amp;#x3C;YOUR_PUBLIC_KEY_HERE&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;wrangler.toml&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;toml&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[[&lt;/span&gt;&lt;span&gt;containers&lt;/span&gt;&lt;span&gt;]]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;containers&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;wrangler_ssh&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;enabled&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[[&lt;/span&gt;&lt;span&gt;containers&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;authorized_keys&lt;/span&gt;&lt;span&gt;]]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&amp;#x3C;NAME&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;public_key&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&amp;#x3C;YOUR_PUBLIC_KEY_HERE&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;Then connect with:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;containers&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ssh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;#x3C;INSTANCE_ID&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;You can also run a single command without opening an interactive shell:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;containers&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ssh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;#x3C;INSTANCE_ID&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ls&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-al&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Use &lt;code&gt;wrangler containers instances &amp;#x3C;APPLICATION&gt;&lt;/code&gt; to find the instance ID for a running Container.&lt;/p&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/containers/ssh/&quot;&gt;SSH documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 12 Mar 2026 00:00:00 GMT</pubDate><product>Containers</product><category>Containers</category></item><item><title>Containers - List Container instances with `wrangler containers instances`</title><link>https://developers.cloudflare.com/changelog/post/2026-03-12-wrangler-containers-instances/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-12-wrangler-containers-instances/</guid><description>&lt;p&gt;A new &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/containers/#containers-instances&quot;&gt;&lt;code&gt;wrangler containers instances&lt;/code&gt;&lt;/a&gt; command lists all instances for a given Container application. This mirrors the instances view in the Cloudflare dashboard.&lt;/p&gt;
&lt;p&gt;The command displays each instance&apos;s ID, name, state, location, version, and creation time:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;containers&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;instances&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;#x3C;APPLICATION_ID&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Use the &lt;code&gt;--json&lt;/code&gt; flag for machine-readable output, which is also the default format in non-interactive environments such as CI pipelines.&lt;/p&gt;
&lt;p&gt;For the full list of options, refer to the &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/containers/#containers-instances&quot;&gt;&lt;code&gt;containers instances&lt;/code&gt; command reference&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 12 Mar 2026 00:00:00 GMT</pubDate><product>Containers</product><category>Containers</category></item><item><title>Workers AI - NVIDIA Nemotron 3 Super now available on Workers AI</title><link>https://developers.cloudflare.com/changelog/post/2026-03-11-nemotron-3-super-workers-ai/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-11-nemotron-3-super-workers-ai/</guid><description>&lt;p&gt;We&apos;re excited to partner with NVIDIA to bring &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/nemotron-3-120b-a12b/&quot;&gt;&lt;code&gt;@cf/nvidia/nemotron-3-120b-a12b&lt;/code&gt;&lt;/a&gt; to Workers AI. NVIDIA Nemotron 3 Super is a Mixture-of-Experts (MoE) model with a hybrid Mamba-transformer architecture, 120B total parameters, and 12B active parameters per forward pass.&lt;/p&gt;
&lt;p&gt;The model is optimized for running many collaborating agents per application. It delivers high accuracy for reasoning, tool calling, and instruction following across complex multi-step tasks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key capabilities:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hybrid Mamba-transformer architecture&lt;/strong&gt; delivers over 50% higher token generation throughput compared to leading open models, reducing latency for real-world applications&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tool calling&lt;/strong&gt; support for building AI agents that invoke tools across multiple conversation turns&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-Token Prediction (MTP)&lt;/strong&gt; accelerates long-form text generation by predicting several future tokens simultaneously in a single forward pass&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;32,000 token context window&lt;/strong&gt; for retaining conversation history and plan states across multi-step agent workflows&lt;/li&gt;
&lt;/ul&gt;
&lt;aside&gt;&lt;p&gt;Prompt caching&lt;/p&gt;&lt;div&gt;&lt;p&gt;For optimal performance with multi-turn conversations, send the &lt;code&gt;x-session-affinity&lt;/code&gt; header with a unique session identifier to enable prompt caching. This routes requests to the same model instance, reducing latency and inference costs. For details, refer to &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/features/prompt-caching/&quot;&gt;Prompt caching&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;Use Nemotron 3 Super through the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/configuration/bindings/&quot;&gt;Workers AI binding&lt;/a&gt; (&lt;code&gt;env.AI.run()&lt;/code&gt;), the REST API at &lt;code&gt;/run&lt;/code&gt; or &lt;code&gt;/v1/chat/completions&lt;/code&gt;, or the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/configuration/open-ai-compatibility/&quot;&gt;OpenAI-compatible endpoint&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/nemotron-3-120b-a12b/&quot;&gt;Nemotron 3 Super model page&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 11 Mar 2026 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category></item><item><title>Browser Rendering - Crawl entire websites with a single API call using Browser Rendering</title><link>https://developers.cloudflare.com/changelog/post/2026-03-10-br-crawl-endpoint/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-10-br-crawl-endpoint/</guid><description>&lt;p&gt;&lt;em&gt;Edit: this post has been edited to clarify crawling behavior with respect to site guidance.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;You can now crawl an entire website with a single API call using &lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/&quot;&gt;Browser Rendering&lt;/a&gt;&apos;s new &lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/rest-api/crawl-endpoint/&quot;&gt;&lt;code&gt;/crawl&lt;/code&gt; endpoint&lt;/a&gt;, available in open beta. Submit a starting URL, and pages are automatically discovered, rendered in a headless browser, and returned in multiple formats, including HTML, Markdown, and structured JSON. The endpoint is a &lt;a href=&quot;https://developers.cloudflare.com/bots/concepts/bot/signed-agents/&quot; target=&quot;_blank&quot;&gt;signed-agent&lt;/a&gt; that respects robots.txt and &lt;a href=&quot;https://www.cloudflare.com/ai-crawl-control/&quot; target=&quot;_blank&quot;&gt;AI Crawl Control&lt;/a&gt; by default, making it easy for developers to comply with website rules, and making it less likely for crawlers to ignore web-owner guidance. This is great for training models, building RAG pipelines, and researching or monitoring content across a site.&lt;/p&gt;
&lt;p&gt;Crawl jobs run asynchronously. You submit a URL, receive a job ID, and check back for results as pages are processed.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Initiate a crawl&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-X&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;POST&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;https://api.cloudflare.com/client/v4/accounts/{account_id}/browser-rendering/crawl&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-H&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;Authorization: Bearer &amp;#x3C;apiToken&gt;&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-H&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;Content-Type: application/json&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;url&quot;: &quot;https://blog.cloudflare.com/&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Check results&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-X&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GET&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;https://api.cloudflare.com/client/v4/accounts/{account_id}/browser-rendering/crawl/{job_id}&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-H&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;Authorization: Bearer &amp;#x3C;apiToken&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Key features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Multiple output formats&lt;/strong&gt; - Return crawled content as HTML, Markdown, and structured JSON (powered by &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/&quot;&gt;Workers AI&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Crawl scope controls&lt;/strong&gt; - Configure crawl depth, page limits, and wildcard patterns to include or exclude specific URL paths&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automatic page discovery&lt;/strong&gt; - Discovers URLs from sitemaps, page links, or both&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Incremental crawling&lt;/strong&gt; - Use &lt;code&gt;modifiedSince&lt;/code&gt; and &lt;code&gt;maxAge&lt;/code&gt; to skip pages that haven&apos;t changed or were recently fetched, saving time and cost on repeated crawls&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Static mode&lt;/strong&gt; - Set &lt;code&gt;render: false&lt;/code&gt; to fetch static HTML without spinning up a browser, for faster crawling of static sites&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Well-behaved bot&lt;/strong&gt; - Honors &lt;code&gt;robots.txt&lt;/code&gt; directives, including &lt;code&gt;crawl-delay&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Available on both the Workers Free and Paid plans.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: the /crawl endpoint cannot bypass Cloudflare bot detection or captchas, and self-identifies as a bot.&lt;/p&gt;
&lt;p&gt;To get started, refer to the &lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/rest-api/crawl-endpoint/&quot;&gt;crawl endpoint documentation&lt;/a&gt;.
If you are setting up your own site to be crawled, review the &lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/reference/robots-txt/&quot;&gt;robots.txt and sitemaps best practices&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 10 Mar 2026 00:00:00 GMT</pubDate><product>Browser Rendering</product><category>Browser Rendering</category></item><item><title>Workflows, Workers - Workflow steps now expose retry attempt number via step context</title><link>https://developers.cloudflare.com/changelog/post/2026-03-06-step-context-available/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-06-step-context-available/</guid><description>&lt;p&gt;Cloudflare Workflows allows you to configure specific retry logic for each step in your workflow execution. Now, you can access &lt;strong&gt;which&lt;/strong&gt; retry attempt is currently executing for calls to &lt;code&gt;step.do()&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;step&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;do&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;my-step&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// ctx.attempt is 1 on first try, 2 on first retry, etc.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`Attempt &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;attempt&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;You can use the step context for improved logging &amp;#x26; observability, progressive backoff, or conditional logic in your workflow definition.&lt;/p&gt;
&lt;p&gt;Note that the current attempt number is 1-indexed. For more information on retry behavior, refer to &lt;a href=&quot;https://developers.cloudflare.com/workflows/build/sleeping-and-retrying/&quot;&gt;Sleeping and Retrying&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 06 Mar 2026 12:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category><category>Workers</category></item><item><title>Workers AI, Realtime - Real-time transcription in RealtimeKit now supports 10 languages with regional variants</title><link>https://developers.cloudflare.com/changelog/post/2026-03-06-realtimekit-multilingual-transcription/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-06-realtimekit-multilingual-transcription/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/realtime/realtimekit/ai/transcription/&quot;&gt;Real-time transcription&lt;/a&gt; in RealtimeKit now supports 10 languages with regional variants, powered by &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/nova-3/&quot;&gt;Deepgram Nova-3&lt;/a&gt; running on &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/&quot;&gt;Workers AI&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;During a meeting, participant audio is routed through &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/&quot;&gt;AI Gateway&lt;/a&gt; to Nova-3 on Workers AI — so transcription runs on Cloudflare&apos;s network end-to-end, reducing latency compared to routing through external speech-to-text services.&lt;/p&gt;
&lt;p&gt;Set the language when &lt;a href=&quot;https://developers.cloudflare.com/realtime/realtimekit/concepts/meeting/&quot;&gt;creating a meeting&lt;/a&gt; via &lt;code&gt;ai_config.transcription.language&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;ai_config&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;transcription&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;language&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;fr&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Supported languages include English, Spanish, French, German, Hindi, Russian, Portuguese, Japanese, Italian, and Dutch — with regional variants like &lt;code&gt;en-AU&lt;/code&gt;, &lt;code&gt;en-GB&lt;/code&gt;, &lt;code&gt;en-IN&lt;/code&gt;, &lt;code&gt;en-NZ&lt;/code&gt;, &lt;code&gt;es-419&lt;/code&gt;, &lt;code&gt;fr-CA&lt;/code&gt;, &lt;code&gt;de-CH&lt;/code&gt;, &lt;code&gt;pt-BR&lt;/code&gt;, and &lt;code&gt;pt-PT&lt;/code&gt;. Use &lt;code&gt;multi&lt;/code&gt; for automatic multilingual detection.&lt;/p&gt;
&lt;p&gt;If you are building voice agents or real-time translation workflows, your agent can now transcribe in the caller&apos;s language natively — no extra services or routing logic needed.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/realtime/realtimekit/ai/transcription/&quot;&gt;Transcription docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/nova-3/&quot;&gt;Nova-3 model page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/&quot;&gt;Workers AI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/&quot;&gt;AI Gateway&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Fri, 06 Mar 2026 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category><category>Realtime</category></item><item><title>Browser Rendering - Browser Rendering: 3x higher REST API request rate</title><link>https://developers.cloudflare.com/changelog/post/2026-03-04-br-rest-api-limit-increase/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-04-br-rest-api-limit-increase/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/&quot;&gt;Browser Rendering&lt;/a&gt; REST API rate limits for Workers Paid plans have been increased from 3 requests per second (180/min) to &lt;strong&gt;10 requests per second (600/min)&lt;/strong&gt;. No action is needed to benefit from the higher limit.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/rest-api-limit-increase.DJHY7xYF_1U7IJn.webp&quot; alt=&quot;Browser Rendering REST API rate limit increased from 3 to 10 requests per second&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;The &lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/rest-api/&quot;&gt;REST API&lt;/a&gt; lets you perform common browser tasks with a single API call, and you can now do it at a higher rate.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/rest-api/content-endpoint/&quot;&gt;/content - Fetch HTML&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/rest-api/screenshot-endpoint/&quot;&gt;/screenshot - Capture screenshot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/rest-api/pdf-endpoint/&quot;&gt;/pdf - Render PDF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/rest-api/markdown-endpoint/&quot;&gt;/markdown - Extract Markdown from a webpage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/rest-api/snapshot/&quot;&gt;/snapshot - Take a webpage snapshot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/rest-api/scrape-endpoint/&quot;&gt;/scrape - Scrape HTML elements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/rest-api/json-endpoint/&quot;&gt;/json - Capture structured data using AI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/rest-api/links-endpoint/&quot;&gt;/links - Retrieve links from a webpage&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you use the &lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/workers-bindings/&quot;&gt;Workers Bindings&lt;/a&gt; method, increases to concurrent browser and new browser limits are coming soon. Stay tuned.&lt;/p&gt;
&lt;p&gt;For full details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/limits/&quot;&gt;Browser Rendering limits page&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate><product>Browser Rendering</product><category>Browser Rendering</category></item><item><title>Workers AI - New conversion options for Markdown Conversion</title><link>https://developers.cloudflare.com/changelog/post/2026-03-04-new-markdown-conversion-options/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-04-new-markdown-conversion-options/</guid><description>&lt;p&gt;You can now customize how the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/features/markdown-conversion/&quot;&gt;Markdown Conversion&lt;/a&gt; service processes different file types by passing a &lt;code&gt;conversionOptions&lt;/code&gt; object.&lt;/p&gt;
&lt;p&gt;Available options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Images&lt;/strong&gt;: Set the language for AI-generated image descriptions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTML&lt;/strong&gt;: Use CSS selectors to extract specific content, or provide a hostname to resolve relative links&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PDF&lt;/strong&gt;: Exclude metadata from the output&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Use the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/features/markdown-conversion/usage/binding/&quot;&gt;&lt;code&gt;env.AI&lt;/code&gt;&lt;/a&gt; binding:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AI&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toMarkdown&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;page.html&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; blob&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Blob&lt;/span&gt;&lt;span&gt;([&lt;/span&gt;&lt;span&gt;html&lt;/span&gt;&lt;span&gt;]) &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;conversionOptions&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;html&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; cssSelector&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;article.content&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; descriptionLanguage&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;es&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AI&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toMarkdown&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;page.html&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; blob&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Blob&lt;/span&gt;&lt;span&gt;([&lt;/span&gt;&lt;span&gt;html&lt;/span&gt;&lt;span&gt;]) &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;conversionOptions&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;html&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; cssSelector&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;article.content&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; descriptionLanguage&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;es&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;Or call the REST API:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://api.cloudflare.com/client/v4/accounts/{ACCOUNT_ID}/ai/tomarkdown&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-H&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;Authorization: Bearer {API_TOKEN}&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-F&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;files=@index.html&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-F&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;conversionOptions={&quot;html&quot;: {&quot;cssSelector&quot;: &quot;article.content&quot;}}&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For more details, refer to &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/features/markdown-conversion/conversion-options/&quot;&gt;Conversion Options&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category></item><item><title>Workflows, Workers - Workflows step limit increased to 25,000 steps per instance</title><link>https://developers.cloudflare.com/changelog/post/2026-03-03-step-limits-to-25k/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-03-step-limits-to-25k/</guid><description>&lt;p&gt;Each Workflow on Workers Paid now supports 10,000 steps by default, configurable up to 25,000 steps in your &lt;code&gt;wrangler.jsonc&lt;/code&gt; file:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;workflows&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-workflow&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;binding&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;MY_WORKFLOW&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;class_name&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;MyWorkflow&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;limits&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;steps&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;25000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Previously, each instance was limited to 1,024 steps. Now, Workflows can support more complex, long-running executions without the additional complexity of recursive or child workflow calls.&lt;/p&gt;
&lt;p&gt;Note that the maximum persisted state limit per Workflow instance remains &lt;strong&gt;100 MB&lt;/strong&gt; for Workers Free and &lt;strong&gt;1 GB&lt;/strong&gt; for Workers Paid. Refer to &lt;a href=&quot;https://developers.cloudflare.com/workflows/reference/limits/&quot;&gt;Workflows limits&lt;/a&gt; for more information.&lt;/p&gt;</description><pubDate>Tue, 03 Mar 2026 12:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category><category>Workers</category></item><item><title>Agents - Real-time file watching in Sandboxes</title><link>https://developers.cloudflare.com/changelog/post/2026-03-03-sandbox-watch-file-events/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-03-sandbox-watch-file-events/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/sandbox/&quot;&gt;Sandboxes&lt;/a&gt; now support real-time filesystem watching via &lt;code&gt;sandbox.watch()&lt;/code&gt;. The method returns a &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events&quot; target=&quot;_blank&quot;&gt;Server-Sent Events&lt;/a&gt; stream backed by native inotify, so your Worker receives &lt;code&gt;create&lt;/code&gt;, &lt;code&gt;modify&lt;/code&gt;, &lt;code&gt;delete&lt;/code&gt;, and &lt;code&gt;move&lt;/code&gt; events as they happen inside the container.&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;sandbox.watch(path, options)&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Pass a directory path and optional filters. The returned stream is a standard &lt;code&gt;ReadableStream&lt;/code&gt; you can proxy directly to a browser client or consume server-side.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Stream events to a browser client&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stream&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandbox&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;watch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;/workspace/src&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;recursive&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;include&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;*.ts&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;*.js&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;stream&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Content-Type&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;text/event-stream&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Stream events to a browser client&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stream&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandbox&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;watch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;/workspace/src&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;recursive&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;include&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;*.ts&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;*.js&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;stream&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Content-Type&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;text/event-stream&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;h4&gt;Server-side consumption with &lt;code&gt;parseSSEStream&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Use &lt;code&gt;parseSSEStream&lt;/code&gt; to iterate over events inside a Worker without forwarding them to a client.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;parseSSEStream&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@cloudflare/sandbox&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stream&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandbox&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;watch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;/workspace/src&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; recursive&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;of&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;parseSSEStream&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;stream&lt;/span&gt;&lt;span&gt;)) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;parseSSEStream&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@cloudflare/sandbox&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import type &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;FileWatchSSEEvent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@cloudflare/sandbox&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stream&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandbox&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;watch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;/workspace/src&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; recursive&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;of&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;parseSSEStream&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;FileWatchSSEEvent&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;stream&lt;/span&gt;&lt;span&gt;)) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;Each event includes a &lt;code&gt;type&lt;/code&gt; field (&lt;code&gt;create&lt;/code&gt;, &lt;code&gt;modify&lt;/code&gt;, &lt;code&gt;delete&lt;/code&gt;, or &lt;code&gt;move&lt;/code&gt;) and the affected &lt;code&gt;path&lt;/code&gt;. Move events also include a &lt;code&gt;from&lt;/code&gt; field with the original path.&lt;/p&gt;
&lt;h4&gt;Options&lt;/h4&gt;




















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Option&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;recursive&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Watch subdirectories. Defaults to &lt;code&gt;false&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;include&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;string[]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Glob patterns to filter events. Omit to receive all events.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h4&gt;Upgrade&lt;/h4&gt;
&lt;p&gt;To update to the latest version:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@cloudflare/sandbox@latest&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For full API details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/sandbox/api/file-watching/&quot;&gt;Sandbox file watching reference&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 03 Mar 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category></item><item><title>Agents, Workers - Agents SDK v0.7.0: Observability rewrite, keepAlive, and waitForMcpConnections</title><link>https://developers.cloudflare.com/changelog/post/2026-03-02-agents-sdk-v070/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-02-agents-sdk-v070/</guid><description>&lt;p&gt;The latest release of the &lt;a href=&quot;https://github.com/cloudflare/agents&quot; target=&quot;_blank&quot;&gt;Agents SDK&lt;/a&gt; rewrites observability from scratch with &lt;code&gt;diagnostics_channel&lt;/code&gt;, adds &lt;code&gt;keepAlive()&lt;/code&gt; to prevent Durable Object eviction during long-running work, and introduces &lt;code&gt;waitForMcpConnections&lt;/code&gt; so MCP tools are always available when &lt;code&gt;onChatMessage&lt;/code&gt; runs.&lt;/p&gt;
&lt;h4&gt;Observability rewrite&lt;/h4&gt;
&lt;p&gt;The previous observability system used &lt;code&gt;console.log()&lt;/code&gt; with a custom &lt;code&gt;Observability.emit()&lt;/code&gt; interface. v0.7.0 replaces it with structured events published to &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/nodejs/diagnostics-channel/&quot;&gt;diagnostics channels&lt;/a&gt; — silent by default, zero overhead when nobody is listening.&lt;/p&gt;
&lt;p&gt;Every event has a &lt;code&gt;type&lt;/code&gt;, &lt;code&gt;payload&lt;/code&gt;, and &lt;code&gt;timestamp&lt;/code&gt;. Events are routed to seven named channels:&lt;/p&gt;





































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Channel&lt;/th&gt;&lt;th&gt;Event types&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;agents:state&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;state:update&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;agents:rpc&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;rpc&lt;/code&gt;, &lt;code&gt;rpc:error&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;agents:message&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;message:request&lt;/code&gt;, &lt;code&gt;message:response&lt;/code&gt;, &lt;code&gt;message:clear&lt;/code&gt;, &lt;code&gt;message:cancel&lt;/code&gt;, &lt;code&gt;message:error&lt;/code&gt;, &lt;code&gt;tool:result&lt;/code&gt;, &lt;code&gt;tool:approval&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;agents:schedule&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;schedule:create&lt;/code&gt;, &lt;code&gt;schedule:execute&lt;/code&gt;, &lt;code&gt;schedule:cancel&lt;/code&gt;, &lt;code&gt;schedule:retry&lt;/code&gt;, &lt;code&gt;schedule:error&lt;/code&gt;, &lt;code&gt;queue:retry&lt;/code&gt;, &lt;code&gt;queue:error&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;agents:lifecycle&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;connect&lt;/code&gt;, &lt;code&gt;destroy&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;agents:workflow&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;workflow:start&lt;/code&gt;, &lt;code&gt;workflow:event&lt;/code&gt;, &lt;code&gt;workflow:approved&lt;/code&gt;, &lt;code&gt;workflow:rejected&lt;/code&gt;, &lt;code&gt;workflow:terminated&lt;/code&gt;, &lt;code&gt;workflow:paused&lt;/code&gt;, &lt;code&gt;workflow:resumed&lt;/code&gt;, &lt;code&gt;workflow:restarted&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;agents:mcp&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;mcp:client:preconnect&lt;/code&gt;, &lt;code&gt;mcp:client:connect&lt;/code&gt;, &lt;code&gt;mcp:client:authorize&lt;/code&gt;, &lt;code&gt;mcp:client:discover&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Use the typed &lt;code&gt;subscribe()&lt;/code&gt; helper from &lt;code&gt;agents/observability&lt;/code&gt; for type-safe access:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;subscribe&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;agents/observability&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;unsub&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;subscribe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;rpc&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;===&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;rpc&quot;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`RPC call: &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;payload&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;method&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;===&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;rpc:error&quot;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;`RPC failed: &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;payload&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;method&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; — &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;payload&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Clean up when done&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;unsub&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;subscribe&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;agents/observability&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;unsub&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;subscribe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;rpc&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;===&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;rpc&quot;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`RPC call: &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;payload&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;method&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;===&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;rpc:error&quot;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;`RPC failed: &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;payload&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;method&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; — &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;payload&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Clean up when done&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;unsub&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;In production, all diagnostics channel messages are automatically forwarded to &lt;a href=&quot;https://developers.cloudflare.com/workers/observability/logs/tail-workers/&quot;&gt;Tail Workers&lt;/a&gt; — no subscription code needed in the agent itself:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tail&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;events&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;of&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;events&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;msg&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;of&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;diagnosticsChannelEvents&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// msg.channel is &quot;agents:rpc&quot;, &quot;agents:workflow&quot;, etc.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;msg&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;timestamp&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;msg&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;channel&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;msg&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tail&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;events&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;of&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;events&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;msg&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;of&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;diagnosticsChannelEvents&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// msg.channel is &quot;agents:rpc&quot;, &quot;agents:workflow&quot;, etc.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;msg&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;timestamp&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;msg&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;channel&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;msg&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;The custom &lt;code&gt;Observability&lt;/code&gt; override interface is still supported for users who need to filter or forward events to external services.&lt;/p&gt;
&lt;p&gt;For the full event reference, refer to the &lt;a href=&quot;https://developers.cloudflare.com/agents/api-reference/observability/&quot;&gt;Observability documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;keepAlive()&lt;/code&gt; and &lt;code&gt;keepAliveWhile()&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Durable Objects are evicted after a period of inactivity (typically 70-140 seconds with no incoming requests, WebSocket messages, or alarms). During long-running operations — streaming LLM responses, waiting on external APIs, running multi-step computations — the agent can be evicted mid-flight.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;keepAlive()&lt;/code&gt; prevents this by creating a 30-second heartbeat schedule. The alarm firing resets the inactivity timer. Returns a disposer function that cancels the heartbeat when called.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dispose&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;keepAlive&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;try&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;longRunningComputation&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sendResults&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;finally&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;dispose&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dispose&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;keepAlive&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;try&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;longRunningComputation&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sendResults&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;finally&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;dispose&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;&lt;code&gt;keepAliveWhile()&lt;/code&gt; wraps an async function with automatic cleanup — the heartbeat starts before the function runs and stops when it completes:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;keepAliveWhile&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;longRunningComputation&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;keepAliveWhile&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;longRunningComputation&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;Key details:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Multiple concurrent callers&lt;/strong&gt; — Each &lt;code&gt;keepAlive()&lt;/code&gt; call returns an independent disposer. Disposing one does not affect others.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AIChatAgent built-in&lt;/strong&gt; — &lt;code&gt;AIChatAgent&lt;/code&gt; automatically calls &lt;code&gt;keepAlive()&lt;/code&gt; during streaming responses. You do not need to add it yourself.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Uses the scheduling system&lt;/strong&gt; — The heartbeat does not conflict with your own schedules. It shows up in &lt;code&gt;getSchedules()&lt;/code&gt; if you need to inspect it.&lt;/li&gt;
&lt;/ul&gt;
&lt;aside&gt;&lt;p&gt;Note&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;code&gt;keepAlive()&lt;/code&gt; is marked &lt;code&gt;@experimental&lt;/code&gt; and may change between releases.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;For the full API reference and when-to-use guidance, refer to &lt;a href=&quot;https://developers.cloudflare.com/agents/api-reference/schedule-tasks/#keeping-the-agent-alive&quot;&gt;Schedule tasks — Keeping the agent alive&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;waitForMcpConnections&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;AIChatAgent&lt;/code&gt; now waits for MCP server connections to settle before calling &lt;code&gt;onChatMessage&lt;/code&gt;. This ensures &lt;code&gt;this.mcp.getAITools()&lt;/code&gt; returns the full set of tools, especially after Durable Object hibernation when connections are being restored in the background.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ChatAgent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AIChatAgent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Default — waits up to 10 seconds&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// waitForMcpConnections = { timeout: 10_000 };&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Wait forever&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;waitForMcpConnections &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Disable waiting&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;waitForMcpConnections &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ChatAgent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AIChatAgent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Default — waits up to 10 seconds&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// waitForMcpConnections = { timeout: 10_000 };&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Wait forever&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;waitForMcpConnections &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Disable waiting&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;waitForMcpConnections &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Value&lt;/th&gt;&lt;th&gt;Behavior&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;{ timeout: 10_000 }&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Wait up to 10 seconds (default)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;{ timeout: N }&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Wait up to &lt;code&gt;N&lt;/code&gt; milliseconds&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Wait indefinitely until all connections ready&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Do not wait (old behavior before 0.2.0)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;For lower-level control, call &lt;code&gt;this.mcp.waitForConnections()&lt;/code&gt; directly inside &lt;code&gt;onChatMessage&lt;/code&gt; instead.&lt;/p&gt;
&lt;h4&gt;Other improvements&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MCP deduplication by name and URL&lt;/strong&gt; — &lt;code&gt;addMcpServer&lt;/code&gt; with HTTP transport now deduplicates on both server name and URL. Calling it with the same name but a different URL creates a new connection. URLs are normalized before comparison (trailing slashes, default ports, hostname case).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;callbackHost&lt;/code&gt; optional for non-OAuth servers&lt;/strong&gt; — &lt;code&gt;addMcpServer&lt;/code&gt; no longer requires &lt;code&gt;callbackHost&lt;/code&gt; when connecting to MCP servers that do not use OAuth.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MCP URL security&lt;/strong&gt; — Server URLs are validated before connection to prevent SSRF. Private IP ranges, loopback addresses, link-local addresses, and cloud metadata endpoints are blocked.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom denial messages&lt;/strong&gt; — &lt;code&gt;addToolOutput&lt;/code&gt; now supports &lt;code&gt;state: &quot;output-error&quot;&lt;/code&gt; with &lt;code&gt;errorText&lt;/code&gt; for custom denial messages in human-in-the-loop tool approval flows.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;requestId&lt;/code&gt; in chat options&lt;/strong&gt; — &lt;code&gt;onChatMessage&lt;/code&gt; options now include a &lt;code&gt;requestId&lt;/code&gt; for logging and correlating events.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Upgrade&lt;/h4&gt;
&lt;p&gt;To update to the latest version:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;agents@latest&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@cloudflare/ai-chat@latest&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;</description><pubDate>Mon, 02 Mar 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>AI Gateway - Get started with AI Gateway automatically</title><link>https://developers.cloudflare.com/changelog/post/2026-03-02-default-gateway/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-02-default-gateway/</guid><description>&lt;p&gt;You can now start using AI Gateway with a single API call — no setup required. Use &lt;code&gt;default&lt;/code&gt; as your gateway ID, and AI Gateway creates one for you automatically on the first request.&lt;/p&gt;
&lt;p&gt;To try it out, &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/api/get-started/create-token/&quot;&gt;create an API token&lt;/a&gt; with &lt;code&gt;AI Gateway - Read&lt;/code&gt;, &lt;code&gt;AI Gateway - Edit&lt;/code&gt;, and &lt;code&gt;Workers AI - Read&lt;/code&gt; permissions, then run:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-X&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;POST&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://gateway.ai.cloudflare.com/v1/&lt;/span&gt;&lt;span&gt;$CLOUDFLARE_ACCOUNT_ID&lt;/span&gt;&lt;span&gt;/default/compat/chat/completions&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--header&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;cf-aig-authorization: Bearer &lt;/span&gt;&lt;span&gt;$CLOUDFLARE_API_TOKEN&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--header&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;Content-Type: application/json&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--data&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;model&quot;: &quot;workers-ai/@cf/meta/llama-3.3-70b-instruct-fp8-fast&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;messages&quot;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;role&quot;: &quot;user&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;content&quot;: &quot;What is Cloudflare?&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;AI Gateway gives you logging, caching, rate limiting, and access to multiple AI providers through a single endpoint. For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/get-started/&quot;&gt;Get started&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 02 Mar 2026 00:00:00 GMT</pubDate><product>AI Gateway</product><category>AI Gateway</category></item><item><title>Agents, Workers - Agents SDK v0.6.0: RPC transport for MCP, optional OAuth, hardened schema conversion, and @cloudflare/ai-chat fixes</title><link>https://developers.cloudflare.com/changelog/post/2026-02-25-agents-sdk-v060/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-25-agents-sdk-v060/</guid><description>&lt;p&gt;The latest release of the &lt;a href=&quot;https://github.com/cloudflare/agents&quot; target=&quot;_blank&quot;&gt;Agents SDK&lt;/a&gt; lets you define an Agent and an McpAgent in the same Worker and connect them over RPC — no HTTP, no network overhead. It also makes OAuth opt-in for simple MCP connections, hardens the schema converter for production workloads, and ships a batch of &lt;code&gt;@cloudflare/ai-chat&lt;/code&gt; reliability fixes.&lt;/p&gt;
&lt;h4&gt;RPC transport for MCP&lt;/h4&gt;
&lt;p&gt;You can now connect an Agent to an McpAgent in the same Worker using a Durable Object binding instead of an HTTP URL. The connection stays entirely within the Cloudflare runtime — no network round-trips, no serialization overhead.&lt;/p&gt;
&lt;p&gt;Pass the Durable Object namespace directly to &lt;code&gt;addMcpServer&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Agent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;agents&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyAgent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Agent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;onStart&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Connect via DO binding — no HTTP, no network overhead&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;addMcpServer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;counter&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;MY_MCP&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// With props for per-user context&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;addMcpServer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;counter&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;MY_MCP&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;props&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; userId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;user-123&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; role&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;admin&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Agent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;agents&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyAgent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Agent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;onStart&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Connect via DO binding — no HTTP, no network overhead&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;addMcpServer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;counter&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;MY_MCP&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// With props for per-user context&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;addMcpServer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;counter&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;MY_MCP&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;props&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; userId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;user-123&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; role&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;admin&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;The &lt;code&gt;addMcpServer&lt;/code&gt; method now accepts &lt;code&gt;string | DurableObjectNamespace&lt;/code&gt; as the second parameter with full TypeScript overloads, so HTTP and RPC paths are type-safe and cannot be mixed.&lt;/p&gt;
&lt;p&gt;Key capabilities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hibernation support&lt;/strong&gt; — RPC connections survive Durable Object hibernation automatically. The binding name and props are persisted to storage and restored on wake-up, matching the behavior of HTTP MCP connections.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deduplication&lt;/strong&gt; — Calling &lt;code&gt;addMcpServer&lt;/code&gt; with the same server name returns the existing connection instead of creating duplicates. Connection IDs are stable across hibernation restore.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Smaller surface area&lt;/strong&gt; — The RPC transport internals have been rewritten and reduced from 609 lines to 245 lines. &lt;code&gt;RPCServerTransport&lt;/code&gt; now uses &lt;code&gt;JSONRPCMessageSchema&lt;/code&gt; from the MCP SDK for validation instead of hand-written checks.&lt;/li&gt;
&lt;/ul&gt;
&lt;aside&gt;&lt;p&gt;Note&lt;/p&gt;&lt;div&gt;&lt;p&gt;RPC transport is experimental. The API may change based on feedback. Refer to &lt;a href=&quot;https://github.com/cloudflare/agents/issues/565&quot; target=&quot;_blank&quot;&gt;the tracking issue&lt;/a&gt; for updates.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;h4&gt;Optional OAuth for MCP connections&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;addMcpServer()&lt;/code&gt; no longer eagerly creates an OAuth provider for every connection. For servers that do not require authentication, a simple call is all you need:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// No callbackHost, no OAuth config — just works&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;addMcpServer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;my-server&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;https://mcp.example.com&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// No callbackHost, no OAuth config — just works&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;addMcpServer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;my-server&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;https://mcp.example.com&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;If the server responds with a 401, the SDK throws a clear error: &lt;code&gt;&quot;This MCP server requires OAuth authentication. Provide callbackHost in addMcpServer options to enable the OAuth flow.&quot;&lt;/code&gt; The restore-from-storage flow also handles missing callback URLs gracefully, skipping auth provider creation for non-OAuth servers.&lt;/p&gt;
&lt;h4&gt;Hardened JSON Schema to TypeScript converter&lt;/h4&gt;
&lt;p&gt;The schema converter used by &lt;code&gt;generateTypes()&lt;/code&gt; and &lt;code&gt;getAITools()&lt;/code&gt; now handles edge cases that previously caused crashes in production:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Depth and circular reference guards&lt;/strong&gt; — Prevents stack overflows on recursive or deeply nested schemas&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;$ref&lt;/code&gt; resolution&lt;/strong&gt; — Supports internal JSON Pointers (&lt;code&gt;#/definitions/...&lt;/code&gt;, &lt;code&gt;#/$defs/...&lt;/code&gt;, &lt;code&gt;#&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tuple support&lt;/strong&gt; — &lt;code&gt;prefixItems&lt;/code&gt; (JSON Schema 2020-12) and array &lt;code&gt;items&lt;/code&gt; (draft-07)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenAPI 3.0 &lt;code&gt;nullable: true&lt;/code&gt;&lt;/strong&gt; — Supported across all schema branches&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Per-tool error isolation&lt;/strong&gt; — One malformed schema cannot crash the full pipeline in &lt;code&gt;generateTypes()&lt;/code&gt; or &lt;code&gt;getAITools()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Missing &lt;code&gt;inputSchema&lt;/code&gt; fallback&lt;/strong&gt; — &lt;code&gt;getAITools()&lt;/code&gt; falls back to &lt;code&gt;{ type: &quot;object&quot; }&lt;/code&gt; instead of throwing&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;&lt;code&gt;@cloudflare/ai-chat&lt;/code&gt; fixes&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tool denial flow&lt;/strong&gt; — Denied tool approvals (&lt;code&gt;approved: false&lt;/code&gt;) now transition to &lt;code&gt;output-denied&lt;/code&gt; with a &lt;code&gt;tool_result&lt;/code&gt;, fixing Anthropic provider compatibility. Custom denial messages are supported via &lt;code&gt;state: &quot;output-error&quot;&lt;/code&gt; and &lt;code&gt;errorText&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Abort/cancel support&lt;/strong&gt; — Streaming responses now properly cancel the reader loop when the abort signal fires and send a done signal to the client.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Duplicate message persistence&lt;/strong&gt; — &lt;code&gt;persistMessages()&lt;/code&gt; now reconciles assistant messages by content and order, preventing duplicate rows when clients resend full history.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;requestId&lt;/code&gt; in &lt;code&gt;OnChatMessageOptions&lt;/code&gt;&lt;/strong&gt; — Handlers can now send properly-tagged error responses for pre-stream failures.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;redacted_thinking&lt;/code&gt; preservation&lt;/strong&gt; — The message sanitizer no longer strips Anthropic &lt;code&gt;redacted_thinking&lt;/code&gt; blocks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;/get-messages&lt;/code&gt; reliability&lt;/strong&gt; — Endpoint handling moved from a prototype &lt;code&gt;onRequest()&lt;/code&gt; override to a constructor wrapper, so it works even when users override &lt;code&gt;onRequest&lt;/code&gt; without calling &lt;code&gt;super.onRequest()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Client tool APIs undeprecated&lt;/strong&gt; — &lt;code&gt;createToolsFromClientSchemas&lt;/code&gt;, &lt;code&gt;clientTools&lt;/code&gt;, &lt;code&gt;AITool&lt;/code&gt;, &lt;code&gt;extractClientToolSchemas&lt;/code&gt;, and the &lt;code&gt;tools&lt;/code&gt; option on &lt;code&gt;useAgentChat&lt;/code&gt; are restored for SDK use cases where tools are defined dynamically at runtime.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;jsonSchema&lt;/code&gt; initialization&lt;/strong&gt; — Fixed &lt;code&gt;jsonSchema not initialized&lt;/code&gt; error when calling &lt;code&gt;getAITools()&lt;/code&gt; in &lt;code&gt;onChatMessage&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Upgrade&lt;/h4&gt;
&lt;p&gt;To update to the latest version:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;agents@latest&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@cloudflare/ai-chat@latest&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;</description><pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>Containers - Run 15x more Containers with higher resource limits</title><link>https://developers.cloudflare.com/changelog/post/2026-02-25-higher-container-resource-limits/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-25-higher-container-resource-limits/</guid><description>&lt;p&gt;You can now run more &lt;a href=&quot;https://developers.cloudflare.com/containers/&quot;&gt;Containers&lt;/a&gt; concurrently with significantly higher limits on memory, vCPU, and disk.&lt;/p&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Limit&lt;/th&gt;&lt;th&gt;Previous Limit&lt;/th&gt;&lt;th&gt;New Limit&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Memory for concurrent live Container instances&lt;/td&gt;&lt;td&gt;400GiB&lt;/td&gt;&lt;td&gt;6TiB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;vCPU for concurrent live Container instances&lt;/td&gt;&lt;td&gt;100&lt;/td&gt;&lt;td&gt;1,500&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Disk for concurrent live Container instances&lt;/td&gt;&lt;td&gt;2TB&lt;/td&gt;&lt;td&gt;30TB&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;This 15x increase enables larger-scale workloads on Containers. You can now run 15,000 instances of the &lt;code&gt;lite&lt;/code&gt; instance type, 6,000 instances of &lt;code&gt;basic&lt;/code&gt;, over 1,500 instances of &lt;code&gt;standard-1&lt;/code&gt;, or over 1,000 instances of &lt;code&gt;standard-2&lt;/code&gt; concurrently.&lt;/p&gt;
&lt;p&gt;Refer to &lt;a href=&quot;https://developers.cloudflare.com/containers/platform-details/limits/&quot;&gt;Limits&lt;/a&gt; for more details on the available instance types and limits.&lt;/p&gt;</description><pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate><product>Containers</product><category>Containers</category></item><item><title>Workers - Better Windows support for Python Workers</title><link>https://developers.cloudflare.com/changelog/post/2026-02-13-pywrangler-windows-support/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-13-pywrangler-windows-support/</guid><description>&lt;p&gt;&lt;a href=&quot;https://github.com/cloudflare/workers-py?tab=readme-ov-file#pywrangler&quot; target=&quot;_blank&quot;&gt;Pywrangler&lt;/a&gt;, the CLI tool for managing Python Workers and packages,
now supports Windows, allowing you to develop and deploy Python Workers from Windows environments.
Previously, Pywrangler was only available on macOS and Linux.&lt;/p&gt;
&lt;p&gt;You can install and use Pywrangler on Windows the same way you would on other platforms.
&lt;a href=&quot;https://developers.cloudflare.com/workers/languages/python/packages/&quot;&gt;Specify your Worker&apos;s Python dependencies&lt;/a&gt; in your &lt;code&gt;pyproject.toml&lt;/code&gt; file,
then use the following commands to develop and deploy:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;uvx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;workers-py&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pywrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dev&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;uvx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;workers-py&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pywrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;deploy&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;All existing Pywrangler functionality, including package management, local development, and deployment, works on Windows without any additional configuration.&lt;/p&gt;
&lt;h4&gt;Requirements&lt;/h4&gt;
&lt;p&gt;This feature requires the following minimum versions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;wrangler&lt;/code&gt; &gt;= 4.64.0&lt;/li&gt;
&lt;li&gt;&lt;code&gt;workers-py&lt;/code&gt; &gt;= 1.72.0&lt;/li&gt;
&lt;li&gt;&lt;code&gt;uv&lt;/code&gt; &gt;= 0.29.8&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To upgrade &lt;code&gt;workers-py&lt;/code&gt; (which includes Pywrangler) in your project, run:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;uv&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tool&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;upgrade&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;workers-py&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;To upgrade &lt;code&gt;wrangler&lt;/code&gt;, run:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-g&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler@latest&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;To upgrade &lt;code&gt;uv&lt;/code&gt;, run:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;uv&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;To get started with Python Workers on Windows, refer to the &lt;a href=&quot;https://developers.cloudflare.com/workers/languages/python/packages/&quot;&gt;Python packages documentation&lt;/a&gt; for full details on Pywrangler.&lt;/p&gt;</description><pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Write structured queries to filter and search your Workers logs and traces</title><link>https://developers.cloudflare.com/changelog/post/2026-02-24-observability-query-language/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-24-observability-query-language/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/observability/&quot;&gt;Workers Observability&lt;/a&gt; now includes a query language that lets you write structured queries directly in the search bar to filter your logs and traces. The search bar doubles as a free text search box — type any term to search across all metadata and attributes, or write field-level queries for precise filtering.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/2026-02-24-query-language.Ol8UX7m0_ZqdMnt.webp&quot; alt=&quot;Workers Observability search bar with autocomplete suggestions and Query Builder sidebar filters&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;Queries written in the search bar sync with the &lt;a href=&quot;https://developers.cloudflare.com/workers/observability/&quot;&gt;Query Builder&lt;/a&gt; sidebar, so you can write a query by hand and then refine it visually, or build filters in the Query Builder and see the corresponding query syntax. The search bar provides autocomplete suggestions for metadata fields and operators as you type.&lt;/p&gt;
&lt;p&gt;The query language supports:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Free text search&lt;/strong&gt; — search everywhere with a keyword like &lt;code&gt;error&lt;/code&gt;, or match an exact phrase with &lt;code&gt;&quot;exact phrase&quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Field queries&lt;/strong&gt; — filter by specific fields using comparison operators (for example, &lt;code&gt;status = 500&lt;/code&gt; or &lt;code&gt;$workers.wallTimeMs &gt; 100&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operators&lt;/strong&gt; — &lt;code&gt;=&lt;/code&gt;, &lt;code&gt;!=&lt;/code&gt;, &lt;code&gt;&gt;&lt;/code&gt;, &lt;code&gt;&gt;=&lt;/code&gt;, &lt;code&gt;&amp;#x3C;&lt;/code&gt;, &lt;code&gt;&amp;#x3C;=&lt;/code&gt;, and &lt;code&gt;:&lt;/code&gt; (contains)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Functions&lt;/strong&gt; — &lt;code&gt;contains(field, value)&lt;/code&gt;, &lt;code&gt;startsWith(field, prefix)&lt;/code&gt;, &lt;code&gt;regex(field, pattern)&lt;/code&gt;, and &lt;code&gt;exists(field)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Boolean logic&lt;/strong&gt; — add conditions with &lt;code&gt;AND&lt;/code&gt;, &lt;code&gt;OR&lt;/code&gt;, and &lt;code&gt;NOT&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Select the help icon next to the search bar to view the full syntax reference, including all supported operators, functions, and keyboard shortcuts.&lt;/p&gt;
&lt;p&gt;Go to the &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers-and-pages/observability/&quot; target=&quot;_blank&quot;&gt;Workers Observability dashboard&lt;/a&gt; to try the query language.&lt;/p&gt;</description><pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - No config? No problem. Just `wrangler deploy`</title><link>https://developers.cloudflare.com/changelog/post/2026-02-25-wrangler-autoconfig-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-25-wrangler-autoconfig-ga/</guid><description>&lt;p&gt;You can now deploy any existing project to Cloudflare Workers — even without a Wrangler configuration file — and &lt;code&gt;wrangler deploy&lt;/code&gt; will &lt;em&gt;just work&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Starting with Wrangler &lt;strong&gt;4.68.0&lt;/strong&gt;, running &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/general/#deploy&quot;&gt;&lt;code&gt;wrangler deploy&lt;/code&gt;&lt;/a&gt; &lt;a href=&quot;https://developers.cloudflare.com/workers/framework-guides/automatic-configuration/&quot;&gt;automatically configures your project&lt;/a&gt; by detecting your framework, installing required adapters, and deploying it to Cloudflare Workers.&lt;/p&gt;
&lt;h4&gt;Using Wrangler locally&lt;/h4&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;deploy&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;When you run &lt;code&gt;wrangler deploy&lt;/code&gt; in a project without a configuration file, Wrangler:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Detects your framework from &lt;code&gt;package.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Prompts you to confirm the detected settings&lt;/li&gt;
&lt;li&gt;Installs any required adapters&lt;/li&gt;
&lt;li&gt;Generates a &lt;code&gt;wrangler.jsonc&lt;/code&gt; &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/configuration/&quot;&gt;configuration file&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Deploys your project to Cloudflare Workers&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You can also use &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/general/#setup&quot;&gt;&lt;code&gt;wrangler setup&lt;/code&gt;&lt;/a&gt; to configure without deploying, or pass &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/general/#deploy&quot;&gt;&lt;code&gt;--yes&lt;/code&gt;&lt;/a&gt; to skip prompts.&lt;/p&gt;
&lt;h4&gt;Using the Cloudflare dashboard&lt;/h4&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/automatic-pr.CwJG6Bec_1cC506.webp&quot; alt=&quot;Automatic configuration pull request created by Workers Builds&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;When you connect a repository through the &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers-and-pages/create&quot; target=&quot;_blank&quot;&gt;Workers dashboard&lt;/a&gt;, a &lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/automatic-prs/&quot;&gt;pull request is generated&lt;/a&gt; for you with all necessary files, and a &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/previews/&quot;&gt;preview deployment&lt;/a&gt; to check before merging.&lt;/p&gt;
&lt;aside&gt;&lt;p&gt;Note&lt;/p&gt;&lt;div&gt;&lt;p&gt;A pull request is only generated when your deploy command is &lt;code&gt;npx wrangler deploy&lt;/code&gt;. If you use a custom deploy command, automatic configuration still runs but a PR is not created.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;h4&gt;Background&lt;/h4&gt;
&lt;p&gt;In December 2025, we &lt;a href=&quot;https://developers.cloudflare.com/changelog/2025-12-16-wrangler-autoconfig/&quot;&gt;introduced automatic configuration&lt;/a&gt; as an experimental feature. It is now generally available and the default behavior.&lt;/p&gt;
&lt;p&gt;If you have questions or run into issues, join the &lt;a href=&quot;https://github.com/cloudflare/workers-sdk/discussions/11667&quot; target=&quot;_blank&quot;&gt;GitHub discussion&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Durable Objects, Workers - deleteAll() now deletes Durable Object alarm</title><link>https://developers.cloudflare.com/changelog/post/2026-02-24-deleteall-deletes-alarms/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-24-deleteall-deletes-alarms/</guid><description>&lt;p&gt;&lt;code&gt;deleteAll()&lt;/code&gt; now deletes a Durable Object alarm in addition to stored data for Workers with a compatibility date of &lt;code&gt;2026-02-24&lt;/code&gt; or later. This change simplifies clearing a Durable Object&apos;s storage with a single API call.&lt;/p&gt;
&lt;p&gt;Previously, &lt;code&gt;deleteAll()&lt;/code&gt; only deleted user-stored data for an object. Alarm usage stores metadata in an object&apos;s storage, which required a separate &lt;code&gt;deleteAlarm()&lt;/code&gt; call to fully clean up all storage for an object. The &lt;code&gt;deleteAll()&lt;/code&gt; change applies to both KV-backed and SQLite-backed Durable Objects.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Before: two API calls required to clear all storage&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;storage&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;deleteAlarm&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;storage&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;deleteAll&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Now: a single call clears both data and the alarm&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;storage&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;deleteAll&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/api/sqlite-storage-api/#deleteall&quot;&gt;Storage API documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 24 Feb 2026 00:00:00 GMT</pubDate><product>Durable Objects</product><category>Durable Objects</category><category>Workers</category></item><item><title>Pipelines, Workers - Dropped event metrics, typed Pipelines bindings, and improved setup</title><link>https://developers.cloudflare.com/changelog/post/2026-02-24-typed-bindings-setup-improvements-error-metrics/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-24-typed-bindings-setup-improvements-error-metrics/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/pipelines/&quot;&gt;Cloudflare Pipelines&lt;/a&gt; ingests streaming data via &lt;a href=&quot;https://developers.cloudflare.com/workers/&quot;&gt;Workers&lt;/a&gt; or HTTP endpoints, transforms it with SQL, and writes it to &lt;a href=&quot;https://developers.cloudflare.com/r2/&quot;&gt;R2&lt;/a&gt; as Apache Iceberg tables. Today we&apos;re shipping three improvements to help you understand why streaming events get dropped, catch data quality issues early, and set up Pipelines faster.&lt;/p&gt;
&lt;h4&gt;Dropped event metrics&lt;/h4&gt;
&lt;p&gt;When &lt;a href=&quot;https://developers.cloudflare.com/pipelines/streams/&quot;&gt;stream&lt;/a&gt; events don&apos;t match the expected schema, Pipelines accepts them during ingestion but drops them when attempting to deliver them to the &lt;a href=&quot;https://developers.cloudflare.com/pipelines/sinks/&quot;&gt;sink&lt;/a&gt;. To help you identify the root cause of these issues, we are introducing a new dashboard and metrics that surface dropped events with detailed error messages.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/pipelines-error-log-dash.6JIa7r5d_Z1ILPxd.webp&quot; alt=&quot;The Errors tab in the Cloudflare dashboard showing deserialization errors grouped by type with individual error details&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;Dropped events can also be queried programmatically via the new &lt;code&gt;pipelinesUserErrorsAdaptiveGroups&lt;/code&gt; GraphQL dataset. The dataset breaks down failures by specific error type (&lt;code&gt;missing_field&lt;/code&gt;, &lt;code&gt;type_mismatch&lt;/code&gt;, &lt;code&gt;parse_failure&lt;/code&gt;, or &lt;code&gt;null_value&lt;/code&gt;) so you can trace issues back to the source.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;graphql&quot;&gt;&lt;code class=&quot;language-graphql&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;query&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GetPipelineUserErrors&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;$accountTag&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;$pipelineId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;$datetimeStart&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Time&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;$datetimeEnd&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Time&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;viewer &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;accounts(&lt;/span&gt;&lt;span&gt;filter&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;accountTag&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; $accountTag }) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;pipelinesUserErrorsAdaptiveGroups(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;limit&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;filter&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;pipelineId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; $pipelineId&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;datetime_geq&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; $datetimeStart&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;datetime_leq&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; $datetimeEnd&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;orderBy&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;count_DESC&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;dimensions &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;errorFamily&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;errorType&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For the full list of dimensions, error types, and additional query examples, refer to &lt;a href=&quot;https://developers.cloudflare.com/pipelines/observability/metrics/#user-error-metrics&quot;&gt;User error metrics&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Typed Pipelines bindings&lt;/h4&gt;
&lt;p&gt;Sending data to a Pipeline from a Worker previously used a generic &lt;code&gt;Pipeline&amp;#x3C;PipelineRecord&gt;&lt;/code&gt; type, which meant schema mismatches (wrong field names, incorrect types) were only caught at runtime as dropped events.&lt;/p&gt;
&lt;p&gt;Running &lt;code&gt;wrangler types&lt;/code&gt; now generates schema-specific TypeScript types for your &lt;a href=&quot;https://developers.cloudflare.com/pipelines/streams/writing-to-streams/#send-via-workers&quot;&gt;Pipeline bindings&lt;/a&gt;. TypeScript catches missing required fields and incorrect field types at compile time, before your code is deployed.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;declare&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;namespace&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;EcommerceStreamRecord&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;user_id&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;event_type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;product_id&lt;/span&gt;&lt;span&gt;?:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;amount&lt;/span&gt;&lt;span&gt;?:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;number&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;interface&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Env&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;STREAM&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;cloudflare:pipelines&quot;&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;Pipeline&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;EcommerceStreamRecord&lt;/span&gt;&lt;span&gt;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/pipelines/streams/writing-to-streams/#typed-pipeline-bindings&quot;&gt;Typed Pipeline bindings&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Improved Pipelines setup&lt;/h4&gt;
&lt;p&gt;Setting up a new Pipeline previously required multiple manual steps: creating an R2 bucket, enabling R2 Data Catalog, generating an API token, and configuring format, compression, and rolling policies individually.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;wrangler pipelines setup&lt;/code&gt; command now offers a &lt;strong&gt;Simple&lt;/strong&gt; setup mode that applies recommended defaults and automatically creates the &lt;a href=&quot;https://developers.cloudflare.com/r2/buckets/&quot;&gt;R2 bucket&lt;/a&gt; and enables &lt;a href=&quot;https://developers.cloudflare.com/r2/data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt; if they do not already exist. Validation errors during setup prompt you to retry inline rather than restarting the entire process.&lt;/p&gt;
&lt;p&gt;For a full walkthrough, refer to the &lt;a href=&quot;https://developers.cloudflare.com/pipelines/getting-started/&quot;&gt;Getting started guide&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 24 Feb 2026 00:00:00 GMT</pubDate><product>Pipelines</product><category>Pipelines</category><category>Workers</category></item><item><title>Stream - Stream live inputs can now be disabled and enabled</title><link>https://developers.cloudflare.com/changelog/post/2026-02-24-disable-live-inputs/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-24-disable-live-inputs/</guid><description>&lt;p&gt;You can now disable a live input to reject incoming RTMPS and SRT
connections. When a live input is disabled, any broadcast attempts will fail to
connect.&lt;/p&gt;
&lt;p&gt;This gives you more control over your live inputs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Temporarily pause an input without deleting it&lt;/li&gt;
&lt;li&gt;Programmatically end creator broadcasts&lt;/li&gt;
&lt;li&gt;Prevent new broadcasts from starting on a specific input&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To disable a live input via the API, set the &lt;code&gt;enabled&lt;/code&gt; property to &lt;code&gt;false&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--request&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;PUT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;https://api.cloudflare.com/client/v4/accounts/{&lt;/span&gt;&lt;span&gt;account_id}/stream/live_inputs/&lt;/span&gt;&lt;span&gt;{input_id}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;--header &lt;/span&gt;&lt;span&gt;&quot;Authorization: Bearer &amp;#x3C;API_TOKEN&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;--data &lt;/span&gt;&lt;span&gt;&apos;{&quot;enabled&quot;: false}&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;You can also disable or enable a live input from the &lt;strong&gt;Live inputs&lt;/strong&gt; list page
or the live input detail page in the Dashboard.&lt;/p&gt;
&lt;p&gt;All existing live inputs remain enabled by default. For more information, refer
to &lt;a href=&quot;https://developers.cloudflare.com/stream/stream-live/start-stream-live/&quot;&gt;Start a live stream&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 24 Feb 2026 00:00:00 GMT</pubDate><product>Stream</product><category>Stream</category></item><item><title>Agents, R2, Containers - Backup and restore API for Sandbox SDK</title><link>https://developers.cloudflare.com/changelog/post/2026-02-23-sandbox-backup-restore-api/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-23-sandbox-backup-restore-api/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/sandbox/&quot;&gt;Sandboxes&lt;/a&gt; now support &lt;code&gt;createBackup()&lt;/code&gt; and &lt;code&gt;restoreBackup()&lt;/code&gt; methods for creating and restoring point-in-time snapshots of directories.&lt;/p&gt;
&lt;p&gt;This allows you to restore environments quickly. For instance, in order to develop in a sandbox, you may need to include a user&apos;s codebase and run a build step.
Unfortunately &lt;code&gt;git clone&lt;/code&gt; and &lt;code&gt;npm install&lt;/code&gt; can take minutes, and you don&apos;t want to run these steps every time the user starts their sandbox.&lt;/p&gt;
&lt;p&gt;Now, after the initial setup, you can just call &lt;code&gt;createBackup()&lt;/code&gt;, then &lt;code&gt;restoreBackup()&lt;/code&gt; the next time this environment is needed. This makes it practical to pick up exactly
where a user left off, even after days of inactivity, without repeating expensive setup steps.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandbox&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getSandbox&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Sandbox&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-sandbox&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Make non-trivial changes to the file system&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandbox&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gitCheckout&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;endUserRepo&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; targetDir&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;/workspace&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandbox&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;exec&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;npm install&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; cwd&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;/workspace&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Create a point-in-time backup of the directory&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;backup&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandbox&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;createBackup&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; dir&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;/workspace&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Store the handle for later use&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;KV&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;put&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`backup:&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;userId&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;JSON&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;stringify&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;backup&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// ... in a future session...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Restore instead of re-cloning and reinstalling&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandbox&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;restoreBackup&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;backup&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Backups are stored in &lt;a href=&quot;https://developers.cloudflare.com/r2&quot;&gt;R2&lt;/a&gt; and can take advantage of &lt;a href=&quot;https://developers.cloudflare.com/sandbox/guides/backup-restore/#configure-r2-lifecycle-rules-for-automatic-cleanup&quot;&gt;R2 object lifecycle rules&lt;/a&gt; to ensure they do not persist forever.&lt;/p&gt;
&lt;p&gt;Key capabilities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Persist and reuse across sandbox sessions&lt;/strong&gt; — Easily store backup handles in KV, D1, or Durable Object storage for use in subsequent sessions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Usable across multiple instances&lt;/strong&gt; — Fork a backup across many sandboxes for parallel work&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Named backups&lt;/strong&gt; — Provide optional human-readable labels for easier management&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TTLs&lt;/strong&gt; — Set time-to-live durations so backups are automatically removed from storage once they are no longer neeeded&lt;/li&gt;
&lt;/ul&gt;
&lt;aside&gt;&lt;p&gt;Note&lt;/p&gt;&lt;div&gt;&lt;p&gt;Backup and restore currently uses a FUSE overlay. Soon, native snapshotting at a lower level will be added to Containers and Sandboxes, improving speed and ergonomics. The current backup functionality provides a significant speed improvement over manually recreating a file system, but it will be further optimized in the future. The new snapshotting system will use a similar API, so changing to this system will be simple once it is available.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;To get started, refer to the &lt;a href=&quot;https://developers.cloudflare.com/sandbox/guides/backup-restore/&quot;&gt;backup and restore guide&lt;/a&gt; for setup instructions and usage patterns, or the &lt;a href=&quot;https://developers.cloudflare.com/sandbox/api/backups/&quot;&gt;Backups API reference&lt;/a&gt; for full method documentation.&lt;/p&gt;</description><pubDate>Mon, 23 Feb 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>R2</category><category>Containers</category></item><item><title>Hyperdrive - Hyperdrive no longer caches queries using STABLE PostgreSQL functions</title><link>https://developers.cloudflare.com/changelog/post/2026-02-23-hyperdrive-stable-functions-uncacheable/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-23-hyperdrive-stable-functions-uncacheable/</guid><description>&lt;p&gt;Hyperdrive now treats queries containing PostgreSQL &lt;code&gt;STABLE&lt;/code&gt; functions as uncacheable, in addition to &lt;code&gt;VOLATILE&lt;/code&gt; functions.&lt;/p&gt;
&lt;p&gt;Previously, only functions &lt;a href=&quot;https://www.postgresql.org/docs/current/xfunc-volatility.html&quot; target=&quot;_blank&quot;&gt;that PostgreSQL categorizes&lt;/a&gt; as &lt;code&gt;VOLATILE&lt;/code&gt; (for example, &lt;code&gt;RANDOM()&lt;/code&gt;, &lt;code&gt;LASTVAL()&lt;/code&gt;) were detected as uncacheable. &lt;code&gt;STABLE&lt;/code&gt; functions (for example, &lt;code&gt;NOW()&lt;/code&gt;, &lt;code&gt;CURRENT_TIMESTAMP&lt;/code&gt;, &lt;code&gt;CURRENT_DATE&lt;/code&gt;) were incorrectly allowed to be cached.&lt;/p&gt;
&lt;p&gt;Because &lt;code&gt;STABLE&lt;/code&gt; functions can return different results across different SQL statements within the same transaction, caching their results could serve stale or incorrect data. This change aligns Hyperdrive&apos;s caching behavior with PostgreSQL&apos;s function volatility semantics.&lt;/p&gt;
&lt;p&gt;If your queries use &lt;code&gt;STABLE&lt;/code&gt; functions, and you were relying on them being cached, move the function call to your application code and pass the result as a query parameter. For example, instead of &lt;code&gt;WHERE created_at &gt; NOW()&lt;/code&gt;, compute the timestamp in your Worker and pass it as &lt;code&gt;WHERE created_at &gt; $1&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Hyperdrive uses text-based pattern matching to detect uncacheable functions. References to function names like &lt;code&gt;NOW()&lt;/code&gt; in SQL comments also cause the query to be marked as uncacheable.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/hyperdrive/concepts/query-caching/&quot;&gt;Query caching&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/hyperdrive/observability/troubleshooting/&quot;&gt;Troubleshoot and debug&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 23 Feb 2026 00:00:00 GMT</pubDate><product>Hyperdrive</product><category>Hyperdrive</category></item><item><title>Agents, Workers - @cloudflare/codemode v0.1.0: a new runtime agnostic modular architecture</title><link>https://developers.cloudflare.com/changelog/post/2026-02-20-codemode-sdk-rewrite/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-20-codemode-sdk-rewrite/</guid><description>&lt;p&gt;The &lt;a href=&quot;https://www.npmjs.com/package/@cloudflare/codemode&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;@cloudflare/codemode&lt;/code&gt;&lt;/a&gt; package has been rewritten into a modular, runtime-agnostic SDK.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.cloudflare.com/code-mode/&quot; target=&quot;_blank&quot;&gt;Code Mode&lt;/a&gt; enables LLMs to write and execute code that orchestrates your tools, instead of calling them one at a time. This can (and does) yield significant token savings, reduces context window pressure and improves overall model performance on a task.&lt;/p&gt;
&lt;p&gt;The new &lt;code&gt;Executor&lt;/code&gt; interface is runtime agnostic and comes with a prebuilt &lt;code&gt;DynamicWorkerExecutor&lt;/code&gt; to run generated code in a &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/bindings/worker-loader/&quot;&gt;Dynamic Worker Loader&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Breaking changes&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Removed &lt;code&gt;experimental_codemode()&lt;/code&gt; and &lt;code&gt;CodeModeProxy&lt;/code&gt; — the package no longer owns an LLM call or model choice&lt;/li&gt;
&lt;li&gt;New import path: &lt;code&gt;createCodeTool()&lt;/code&gt; is now exported from &lt;code&gt;@cloudflare/codemode/ai&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;New features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;createCodeTool()&lt;/code&gt;&lt;/strong&gt; — Returns a standard AI SDK &lt;code&gt;Tool&lt;/code&gt; to use in your AI agents.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Executor&lt;/code&gt; interface&lt;/strong&gt; — Minimal &lt;code&gt;execute(code, fns)&lt;/code&gt; contract. Implement for any code sandboxing primitive or runtime.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;&lt;code&gt;DynamicWorkerExecutor&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Runs code in a &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/bindings/worker-loader/&quot;&gt;Dynamic Worker&lt;/a&gt;. It comes with the following features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Network isolation&lt;/strong&gt; — &lt;code&gt;fetch()&lt;/code&gt; and &lt;code&gt;connect()&lt;/code&gt; blocked by default (&lt;code&gt;globalOutbound: null&lt;/code&gt;) when using &lt;code&gt;DynamicWorkerExecutor&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Console capture&lt;/strong&gt; — &lt;code&gt;console.log/warn/error&lt;/code&gt; captured and returned in &lt;code&gt;ExecuteResult.logs&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Execution timeout&lt;/strong&gt; — Configurable via &lt;code&gt;timeout&lt;/code&gt; option (default 30s)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Usage&lt;/h4&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;createCodeTool&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@cloudflare/codemode/ai&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DynamicWorkerExecutor&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@cloudflare/codemode&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;streamText&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;ai&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;executor&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DynamicWorkerExecutor&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; loader&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;LOADER&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;codemode&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;createCodeTool&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; tools&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;myTools&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;executor&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;streamText&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tools&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;codemode&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;messages&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;createCodeTool&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@cloudflare/codemode/ai&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DynamicWorkerExecutor&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@cloudflare/codemode&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;streamText&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;ai&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;executor&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DynamicWorkerExecutor&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; loader&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;LOADER&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;codemode&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;createCodeTool&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; tools&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;myTools&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;executor&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;streamText&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tools&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;codemode&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;messages&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;h4&gt;Wrangler configuration&lt;/h4&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;wrangler.jsonc&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;jsonc&quot;&gt;&lt;code class=&quot;language-jsonc&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;worker_loaders&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;binding&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;LOADER&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;wrangler.toml&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;toml&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[[&lt;/span&gt;&lt;span&gt;worker_loaders&lt;/span&gt;&lt;span&gt;]]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;binding&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;LOADER&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;See the &lt;a href=&quot;https://developers.cloudflare.com/agents/api-reference/codemode/&quot;&gt;Code Mode documentation&lt;/a&gt; for full API reference and examples.&lt;/p&gt;
&lt;h4&gt;Upgrade&lt;/h4&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@cloudflare/codemode@latest&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;</description><pubDate>Fri, 20 Feb 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>AI Gateway, Workers AI - AI dashboard experience improvements</title><link>https://developers.cloudflare.com/changelog/post/2026-02-19-ai-dashboard-experience-improvements/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-19-ai-dashboard-experience-improvements/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/&quot;&gt;Workers AI&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/&quot;&gt;AI Gateway&lt;/a&gt; have received a series of dashboard improvements to help you get started faster and manage your AI workloads more easily.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Navigation and discoverability&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;AI now has its own top-level section in the Cloudflare dashboard sidebar, so you can find AI features without digging through menus.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/sidebar-navigation.BQNFBmAk_1GqV9H.webp&quot; alt=&quot;AI sidebar navigation in the Cloudflare dashboard&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;&lt;strong&gt;Onboarding and getting started&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/get-started/&quot;&gt;Getting started&lt;/a&gt; with AI Gateway is now simpler. When you create your first gateway, we now show your gateway&apos;s OpenAI-compatible endpoint and step-by-step guidance to help you configure it. The Playground also includes helpful prompts, and usage pages have clear next steps if you have not made any requests yet.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/onboarding-flow.DZ7aMcHa_Z2hyg1I.webp&quot; alt=&quot;AI Gateway onboarding flow&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;We&apos;ve also combined the previously separate code example sections into one view with dropdown selectors for API type, provider, SDK, and authentication method so you can now customize the exact code snippet you need from one place.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dynamic Routing&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/features/dynamic-routing/&quot;&gt;route builder&lt;/a&gt; is now more performant and responsive.&lt;/li&gt;
&lt;li&gt;You can now copy route names to your clipboard with a single click.&lt;/li&gt;
&lt;li&gt;Code examples use the &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/usage/universal/&quot;&gt;Universal Endpoint&lt;/a&gt; format, making it easier to integrate routes into your application.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Observability and analytics&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Small monetary values now display correctly in &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/observability/costs/&quot;&gt;cost analytics&lt;/a&gt; charts, so you can accurately track spending at any scale.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Accessibility&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improvements to keyboard navigation within the AI Gateway, specifically when exploring usage by &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/usage/providers/&quot;&gt;provider&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Improvements to sorting and filtering components on the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/&quot;&gt;Workers AI&lt;/a&gt; models page.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/&quot;&gt;AI Gateway documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 19 Feb 2026 00:00:00 GMT</pubDate><product>AI Gateway</product><category>AI Gateway</category><category>Workers AI</category></item><item><title>Agents, Workers - Agents SDK v0.5.0: Protocol message control, retry utilities, data parts, and @cloudflare/ai-chat v0.1.0</title><link>https://developers.cloudflare.com/changelog/post/2026-02-17-agents-sdk-v050/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-17-agents-sdk-v050/</guid><description>&lt;p&gt;The latest release of the &lt;a href=&quot;https://github.com/cloudflare/agents&quot; target=&quot;_blank&quot;&gt;Agents SDK&lt;/a&gt; adds built-in retry utilities, per-connection protocol message control, and a fully rewritten &lt;code&gt;@cloudflare/ai-chat&lt;/code&gt; with data parts, tool approval persistence, and zero breaking changes.&lt;/p&gt;
&lt;h4&gt;Retry utilities&lt;/h4&gt;
&lt;p&gt;A new &lt;code&gt;this.retry()&lt;/code&gt; method lets you retry any async operation with exponential backoff and jitter. You can pass an optional &lt;code&gt;shouldRetry&lt;/code&gt; predicate to bail early on non-retryable errors.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyAgent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Agent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;onRequest&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;retry&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;callUnreliableService&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;maxAttempts&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;shouldRetry&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;err&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;err&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;instanceof&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;PermanentError&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyAgent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Agent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;onRequest&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;retry&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;callUnreliableService&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;maxAttempts&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;shouldRetry&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;err&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;err&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;instanceof&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;PermanentError&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;Retry options are also available per-task on &lt;code&gt;queue()&lt;/code&gt;, &lt;code&gt;schedule()&lt;/code&gt;, &lt;code&gt;scheduleEvery()&lt;/code&gt;, and &lt;code&gt;addMcpServer()&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Per-task retry configuration, persisted in SQLite alongside the task&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;schedule&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Date&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;now&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;60_000&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;sendReport&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; userId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;abc&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;retry&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; maxAttempts&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Class-level retry defaults&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyAgent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Agent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; options &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;retry&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; maxAttempts&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Per-task retry configuration, persisted in SQLite alongside the task&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;schedule&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Date&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;now&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;60_000&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;sendReport&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; userId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;abc&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;retry&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; maxAttempts&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Class-level retry defaults&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyAgent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Agent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; options &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;retry&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; maxAttempts&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;Retry options are validated eagerly at enqueue/schedule time, and invalid values throw immediately. Internal retries have also been added for workflow operations (&lt;code&gt;terminateWorkflow&lt;/code&gt;, &lt;code&gt;pauseWorkflow&lt;/code&gt;, and others) with Durable Object-aware error detection.&lt;/p&gt;
&lt;h4&gt;Per-connection protocol message control&lt;/h4&gt;
&lt;p&gt;Agents automatically send JSON text frames (identity, state, MCP server lists) to every WebSocket connection. You can now suppress these per-connection for clients that cannot handle them — binary-only devices, MQTT clients, or lightweight embedded systems.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyAgent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Agent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;shouldSendProtocolMessages&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;connection&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Suppress protocol messages for MQTT clients&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;subprotocol&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Sec-WebSocket-Protocol&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;subprotocol&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;!==&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;mqtt&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyAgent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Agent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;shouldSendProtocolMessages&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;connection&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Connection&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ConnectionContext&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Suppress protocol messages for MQTT clients&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;subprotocol&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Sec-WebSocket-Protocol&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;subprotocol&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;!==&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;mqtt&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;Connections with protocol messages disabled still fully participate in RPC and regular messaging. Use &lt;code&gt;isConnectionProtocolEnabled(connection)&lt;/code&gt; to check a connection&apos;s status at any time. The flag persists across Durable Object hibernation.&lt;/p&gt;
&lt;p&gt;See &lt;a href=&quot;https://developers.cloudflare.com/agents/api-reference/protocol-messages/&quot;&gt;Protocol messages&lt;/a&gt; for full documentation.&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;@cloudflare/ai-chat&lt;/code&gt; v0.1.0&lt;/h4&gt;
&lt;p&gt;The first stable release of &lt;code&gt;@cloudflare/ai-chat&lt;/code&gt; ships alongside this release with a major refactor of &lt;code&gt;AIChatAgent&lt;/code&gt; internals — new &lt;code&gt;ResumableStream&lt;/code&gt; class, WebSocket &lt;code&gt;ChatTransport&lt;/code&gt;, and simplified SSE parsing — with zero breaking changes. Existing code using &lt;code&gt;AIChatAgent&lt;/code&gt; and &lt;code&gt;useAgentChat&lt;/code&gt; works as-is.&lt;/p&gt;
&lt;p&gt;Key new features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Data parts&lt;/strong&gt; — Attach typed JSON blobs (&lt;code&gt;data-*&lt;/code&gt;) to messages alongside text. Supports reconciliation (type+id updates in-place), append, and transient parts (ephemeral via &lt;code&gt;onData&lt;/code&gt; callback). See &lt;a href=&quot;https://developers.cloudflare.com/agents/api-reference/chat-agents/#data-parts&quot;&gt;Data parts&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tool approval persistence&lt;/strong&gt; — The &lt;code&gt;needsApproval&lt;/code&gt; approval UI now survives page refresh and DO hibernation. The streaming message is persisted to SQLite when a tool enters &lt;code&gt;approval-requested&lt;/code&gt; state.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;maxPersistedMessages&lt;/code&gt;&lt;/strong&gt; — Cap SQLite message storage with automatic oldest-message deletion.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;body&lt;/code&gt; option on &lt;code&gt;useAgentChat&lt;/code&gt;&lt;/strong&gt; — Send custom data with every request (static or dynamic).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Incremental persistence&lt;/strong&gt; — Hash-based cache to skip redundant SQL writes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Row size guard&lt;/strong&gt; — Automatic two-pass compaction when messages approach the SQLite 2 MB limit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;autoContinueAfterToolResult&lt;/code&gt; defaults to &lt;code&gt;true&lt;/code&gt;&lt;/strong&gt; — Client-side tool results and tool approvals now automatically trigger a server continuation, matching server-executed tool behavior. Set &lt;code&gt;autoContinueAfterToolResult: false&lt;/code&gt; in &lt;code&gt;useAgentChat&lt;/code&gt; to restore the previous behavior.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Notable bug fixes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Resolved stream resumption race conditions&lt;/li&gt;
&lt;li&gt;Resolved an issue where &lt;code&gt;setMessages&lt;/code&gt; functional updater sent empty arrays&lt;/li&gt;
&lt;li&gt;Resolved an issue where client tool schemas were lost after DO hibernation&lt;/li&gt;
&lt;li&gt;Resolved &lt;code&gt;InvalidPromptError&lt;/code&gt; after tool approval (&lt;code&gt;approval.id&lt;/code&gt; was dropped)&lt;/li&gt;
&lt;li&gt;Resolved an issue where message metadata was not propagated on broadcast/resume paths&lt;/li&gt;
&lt;li&gt;Resolved an issue where &lt;code&gt;clearAll()&lt;/code&gt; did not clear in-memory chunk buffers&lt;/li&gt;
&lt;li&gt;Resolved an issue where &lt;code&gt;reasoning-delta&lt;/code&gt; silently dropped data when &lt;code&gt;reasoning-start&lt;/code&gt; was missed during stream resumption&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Synchronous queue and schedule getters&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;getQueue()&lt;/code&gt;, &lt;code&gt;getQueues()&lt;/code&gt;, &lt;code&gt;getSchedule()&lt;/code&gt;, &lt;code&gt;dequeue()&lt;/code&gt;, &lt;code&gt;dequeueAll()&lt;/code&gt;, and &lt;code&gt;dequeueAllByCallback()&lt;/code&gt; were unnecessarily &lt;code&gt;async&lt;/code&gt; despite only performing synchronous SQL operations. They now return values directly instead of wrapping them in Promises. This is backward compatible — existing code using &lt;code&gt;await&lt;/code&gt; on these methods will continue to work.&lt;/p&gt;
&lt;h4&gt;Other improvements&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fix TypeScript &quot;excessively deep&quot; error&lt;/strong&gt; — A depth counter on &lt;code&gt;CanSerialize&lt;/code&gt; and &lt;code&gt;IsSerializableParam&lt;/code&gt; types bails out to &lt;code&gt;true&lt;/code&gt; after 10 levels of recursion, preventing the &quot;Type instantiation is excessively deep&quot; error with deeply nested types like AI SDK &lt;code&gt;CoreMessage[]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;POST SSE keepalive&lt;/strong&gt; — The POST SSE handler now sends &lt;code&gt;event: ping&lt;/code&gt; every 30 seconds to keep the connection alive, matching the existing GET SSE handler behavior. This prevents POST response streams from being silently dropped by proxies during long-running tool calls.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Widened peer dependency ranges&lt;/strong&gt; — Peer dependency ranges across packages have been widened to prevent cascading major bumps during 0.x minor releases. &lt;code&gt;@cloudflare/ai-chat&lt;/code&gt; and &lt;code&gt;@cloudflare/codemode&lt;/code&gt; are now marked as optional peer dependencies.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Upgrade&lt;/h4&gt;
&lt;p&gt;To update to the latest version:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;agents@latest&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@cloudflare/ai-chat@latest&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;</description><pubDate>Tue, 17 Feb 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>Containers - Docker-in-Docker support added to Containers and Sandboxes</title><link>https://developers.cloudflare.com/changelog/post/2026-02-17-docker-in-docker/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-17-docker-in-docker/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/sandbox/&quot;&gt;Sandboxes&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/containers/&quot;&gt;Containers&lt;/a&gt; now support running Docker for &quot;Docker-in-Docker&quot; setups. This is particularly useful when your end users or &lt;a href=&quot;https://developers.cloudflare.com/agents&quot;&gt;agents&lt;/a&gt; want to run a full sandboxed development environment.&lt;/p&gt;
&lt;p&gt;This allows you to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Develop containerized applications with your Sandbox&lt;/li&gt;
&lt;li&gt;Run isolated test environments for images&lt;/li&gt;
&lt;li&gt;Build container images as part of CI/CD workflows&lt;/li&gt;
&lt;li&gt;Deploy arbitrary images supplied at runtime within a container&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For &lt;a href=&quot;https://developers.cloudflare.com/sandbox/&quot;&gt;Sandbox SDK&lt;/a&gt; users, see the &lt;a href=&quot;https://developers.cloudflare.com/sandbox/guides/docker-in-docker/&quot;&gt;Docker-in-Docker guide&lt;/a&gt; for instructions on combining Docker with the SandboxSDK. For general Containers usage, see the &lt;a href=&quot;https://developers.cloudflare.com/containers/faq/#can-i-run-docker-inside-a-container-docker-in-docker&quot;&gt;Containers FAQ&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 17 Feb 2026 00:00:00 GMT</pubDate><product>Containers</product><category>Containers</category></item><item><title>Workers - Quick Editor devtools replaced with log viewer</title><link>https://developers.cloudflare.com/changelog/post/2026-02-12-quick-editor-dev-tools-deprecation/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-12-quick-editor-dev-tools-deprecation/</guid><description>&lt;p&gt;Cloudflare has deprecated the Workers Quick Editor dev tools inspector and replaced it with a lightweight log viewer.&lt;/p&gt;
&lt;p&gt;This aligns our logging with &lt;code&gt;wrangler tail&lt;/code&gt; and gives us the opportunity to focus our efforts on bringing benefits from the work we have invested in observability, which would not be possible otherwise.&lt;/p&gt;
&lt;p&gt;We have made improvements to this logging viewer based on your feedback such that you can log object and array types, and easily clear the list of logs. This does not include class instances. Limitations are documented in the &lt;a href=&quot;https://developers.cloudflare.com/workers/playground/&quot;&gt;Workers Playground docs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you do need to develop your Worker with a remote inspector, you can still do this using Wrangler locally. Cloning a project from your quick editor to your computer for local development can be done with the &lt;code&gt;wrangler init --from-dash&lt;/code&gt; command. For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/general/#init&quot;&gt;Wrangler commands&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 16 Feb 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - New Best Practices guide for Workers</title><link>https://developers.cloudflare.com/changelog/post/2026-02-15-workers-best-practices/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-15-workers-best-practices/</guid><description>&lt;p&gt;A new &lt;a href=&quot;https://developers.cloudflare.com/workers/best-practices/workers-best-practices/&quot;&gt;Workers Best Practices&lt;/a&gt; guide provides opinionated recommendations for building fast, reliable, observable, and secure Workers. The guide draws on production patterns, Cloudflare internal usage, and best practices observed from developers building on Workers.&lt;/p&gt;
&lt;p&gt;Key guidance includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Keep your compatibility date current and enable &lt;code&gt;nodejs_compat&lt;/code&gt;&lt;/strong&gt; — Ensure you have access to the latest runtime features and Node.js built-in modules.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;wrangler.jsonc&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;jsonc&quot;&gt;&lt;code class=&quot;language-jsonc&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-worker&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;src/index.ts&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Set this to today&apos;s date&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;compatibility_date&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;2026-04-03&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;compatibility_flags&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&quot;nodejs_compat&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;wrangler.toml&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;toml&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-worker&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;src/index.ts&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Set this to today&apos;s date&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;compatibility_date&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;2026-04-03&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;compatibility_flags&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;nodejs_compat&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Generate binding types with &lt;code&gt;wrangler types&lt;/code&gt;&lt;/strong&gt; — Never hand-write your &lt;code&gt;Env&lt;/code&gt; interface. Let Wrangler generate it from your actual configuration to catch mismatches at compile time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stream request and response bodies&lt;/strong&gt; — Avoid buffering large payloads in memory. Use &lt;code&gt;TransformStream&lt;/code&gt; and &lt;code&gt;pipeTo&lt;/code&gt; to stay within the 128 MB memory limit and improve time-to-first-byte.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use bindings, not REST APIs&lt;/strong&gt; — Bindings to KV, R2, D1, Queues, and other Cloudflare services are direct, in-process references with no network hop and no authentication overhead.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use Queues and Workflows for background work&lt;/strong&gt; — Move long-running or retriable tasks out of the critical request path. Use Queues for simple fan-out and buffering, and Workflows for multi-step durable processes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enable Workers Logs and Traces&lt;/strong&gt; — Configure observability before deploying to production so you have data when you need to debug.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Avoid global mutable state&lt;/strong&gt; — Workers reuse isolates across requests. Storing request-scoped data in module-level variables causes cross-request data leaks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Always &lt;code&gt;await&lt;/code&gt; or &lt;code&gt;waitUntil&lt;/code&gt; your Promises&lt;/strong&gt; — Floating promises cause silent bugs and dropped work.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use Web Crypto for secure token generation&lt;/strong&gt; — Never use &lt;code&gt;Math.random()&lt;/code&gt; for security-sensitive operations.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To learn more, refer to &lt;a href=&quot;https://developers.cloudflare.com/workers/best-practices/workers-best-practices/&quot;&gt;Workers Best Practices&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Sun, 15 Feb 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers, Agents, Workers AI - Introducing GLM-4.7-Flash on Workers AI, @cloudflare/tanstack-ai, and workers-ai-provider v3.1.1</title><link>https://developers.cloudflare.com/changelog/post/2026-02-13-glm-47-flash-workers-ai/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-13-glm-47-flash-workers-ai/</guid><description>&lt;p&gt;We&apos;re excited to announce &lt;strong&gt;GLM-4.7-Flash&lt;/strong&gt; on Workers AI, a fast and efficient text generation model optimized for multilingual dialogue and instruction-following tasks, along with the brand-new &lt;a href=&quot;https://www.npmjs.com/package/@cloudflare/tanstack-ai&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;@cloudflare/tanstack-ai&lt;/strong&gt;&lt;/a&gt; package and &lt;a href=&quot;https://www.npmjs.com/package/workers-ai-provider&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;workers-ai-provider v3.1.1&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can now run AI agents entirely on Cloudflare. With GLM-4.7-Flash&apos;s multi-turn tool calling support, plus full compatibility with TanStack AI and the Vercel AI SDK, you have everything you need to build agentic applications that run completely at the edge.&lt;/p&gt;
&lt;h4&gt;GLM-4.7-Flash — Multilingual Text Generation Model&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/glm-4.7-flash/&quot;&gt;&lt;code&gt;@cf/zai-org/glm-4.7-flash&lt;/code&gt;&lt;/a&gt; is a multilingual model with a 131,072 token context window, making it ideal for long-form content generation, complex reasoning tasks, and multilingual applications.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Features and Use Cases:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Multi-turn Tool Calling for Agents&lt;/strong&gt;: Build AI agents that can call functions and tools across multiple conversation turns&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multilingual Support&lt;/strong&gt;: Built to handle content generation in multiple languages effectively&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Large Context Window&lt;/strong&gt;: 131,072 tokens for long-form writing, complex reasoning, and processing long documents&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fast Inference&lt;/strong&gt;: Optimized for low-latency responses in chatbots and virtual assistants&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Instruction Following&lt;/strong&gt;: Excellent at following complex instructions for code generation and structured tasks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Use GLM-4.7-Flash through the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/configuration/bindings/&quot;&gt;Workers AI binding&lt;/a&gt; (&lt;code&gt;env.AI.run()&lt;/code&gt;), the REST API at &lt;code&gt;/run&lt;/code&gt; or &lt;code&gt;/v1/chat/completions&lt;/code&gt;, &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/&quot;&gt;AI Gateway&lt;/a&gt;, or via &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/configuration/ai-sdk/&quot;&gt;workers-ai-provider&lt;/a&gt; for the Vercel AI SDK.&lt;/p&gt;
&lt;p&gt;Pricing is available on the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/glm-4.7-flash/&quot;&gt;model page&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/platform/pricing/&quot;&gt;pricing page&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;@cloudflare/tanstack-ai v0.1.1 — TanStack AI adapters for Workers AI and AI Gateway&lt;/h4&gt;
&lt;p&gt;We&apos;ve released &lt;code&gt;@cloudflare/tanstack-ai&lt;/code&gt;, a new package that brings Workers AI and AI Gateway support to &lt;a href=&quot;https://tanstack.com/ai&quot; target=&quot;_blank&quot;&gt;TanStack AI&lt;/a&gt;. This provides a framework-agnostic alternative for developers who prefer TanStack&apos;s approach to building AI applications.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Workers AI adapters&lt;/strong&gt; support four configuration modes — plain binding (&lt;code&gt;env.AI&lt;/code&gt;), plain REST, AI Gateway binding (&lt;code&gt;env.AI.gateway(id)&lt;/code&gt;), and AI Gateway REST — across all capabilities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Chat&lt;/strong&gt; (&lt;code&gt;createWorkersAiChat&lt;/code&gt;) — Streaming chat completions with tool calling, structured output, and reasoning text streaming.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Image generation&lt;/strong&gt; (&lt;code&gt;createWorkersAiImage&lt;/code&gt;) — Text-to-image models.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Transcription&lt;/strong&gt; (&lt;code&gt;createWorkersAiTranscription&lt;/code&gt;) — Speech-to-text.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Text-to-speech&lt;/strong&gt; (&lt;code&gt;createWorkersAiTts&lt;/code&gt;) — Audio generation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Summarization&lt;/strong&gt; (&lt;code&gt;createWorkersAiSummarize&lt;/code&gt;) — Text summarization.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;AI Gateway adapters&lt;/strong&gt; route requests from third-party providers — OpenAI, Anthropic, Gemini, Grok, and OpenRouter — through Cloudflare AI Gateway for caching, rate limiting, and unified billing.&lt;/p&gt;
&lt;p&gt;To get started:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@cloudflare/tanstack-ai&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@tanstack/ai&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;workers-ai-provider v3.1.1 — transcription, speech, reranking, and reliability&lt;/h4&gt;
&lt;p&gt;The Workers AI provider for the &lt;a href=&quot;https://ai-sdk.dev&quot; target=&quot;_blank&quot;&gt;Vercel AI SDK&lt;/a&gt; now supports three new capabilities beyond chat and image generation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Transcription&lt;/strong&gt; (&lt;code&gt;provider.transcription(model)&lt;/code&gt;) — Speech-to-text with automatic handling of model-specific input formats across binding and REST paths.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Text-to-speech&lt;/strong&gt; (&lt;code&gt;provider.speech(model)&lt;/code&gt;) — Audio generation with support for voice and speed options.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reranking&lt;/strong&gt; (&lt;code&gt;provider.reranking(model)&lt;/code&gt;) — Document reranking for RAG pipelines and search result ordering.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;createWorkersAI&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;workers-ai-provider&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;experimental_transcribe&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;experimental_generateSpeech&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;rerank&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;ai&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;workersai&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;createWorkersAI&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; binding&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AI&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;transcript&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;experimental_transcribe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;workersai&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;transcription&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;@cf/openai/whisper-large-v3-turbo&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;audio&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;audioData&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;mediaType&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;audio/wav&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;speech&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;experimental_generateSpeech&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;workersai&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;speech&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;@cf/deepgram/aura-1&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Hello world&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;voice&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;asteria&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ranked&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rerank&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;workersai&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;reranking&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;@cf/baai/bge-reranker-base&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;query&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;What is machine learning?&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;documents&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;ML is a branch of AI.&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;The weather is sunny.&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;This release also includes a comprehensive reliability overhaul (v3.0.5):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fixed streaming&lt;/strong&gt; — Responses now stream token-by-token instead of buffering all chunks, using a proper &lt;code&gt;TransformStream&lt;/code&gt; pipeline with backpressure.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fixed tool calling&lt;/strong&gt; — Resolved issues with tool call ID sanitization, conversation history preservation, and a heuristic that silently fell back to non-streaming mode when tools were defined.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Premature stream termination detection&lt;/strong&gt; — Streams that end unexpectedly now report &lt;code&gt;finishReason: &quot;error&quot;&lt;/code&gt; instead of silently reporting &lt;code&gt;&quot;stop&quot;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI Search support&lt;/strong&gt; — Added &lt;code&gt;createAISearch&lt;/code&gt; as the canonical export (renamed from AutoRAG). &lt;code&gt;createAutoRAG&lt;/code&gt; still works with a deprecation warning.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To upgrade:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;workers-ai-provider@latest&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ai&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Resources&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/@cloudflare/tanstack-ai&quot; target=&quot;_blank&quot;&gt;@cloudflare/tanstack-ai on npm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/workers-ai-provider&quot; target=&quot;_blank&quot;&gt;workers-ai-provider on npm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/cloudflare/ai&quot; target=&quot;_blank&quot;&gt;GitHub repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Fri, 13 Feb 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category><category>Agents</category><category>Workers AI</category></item><item><title>Workers VPC - Origin CA certificate support for Workers VPC</title><link>https://developers.cloudflare.com/changelog/post/2026-02-13-origin-ca-certificate-support/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-13-origin-ca-certificate-support/</guid><description>&lt;p&gt;Workers VPC now supports &lt;a href=&quot;https://developers.cloudflare.com/ssl/origin-configuration/origin-ca/&quot;&gt;Cloudflare Origin CA certificates&lt;/a&gt; when connecting to your private services over HTTPS. Previously, Workers VPC only trusted certificates issued by publicly trusted certificate authorities (for example, Let&apos;s Encrypt, DigiCert).&lt;/p&gt;
&lt;p&gt;With this change, you can use free Cloudflare Origin CA certificates on your origin servers within private networks and connect to them from Workers VPC using the &lt;code&gt;https&lt;/code&gt; scheme. This is useful for encrypting traffic between the tunnel and your service without needing to provision certificates from a public CA.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/workers-vpc/configuration/vpc-services/#supported-tls-certificates&quot;&gt;Supported TLS certificates&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 13 Feb 2026 00:00:00 GMT</pubDate><product>Workers VPC</product><category>Workers VPC</category></item><item><title>Workers - Workers are no longer limited to 1000 subrequests</title><link>https://developers.cloudflare.com/changelog/post/2026-02-11-subrequests-limit/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-11-subrequests-limit/</guid><description>&lt;p&gt;Workers no longer have a limit of 1000 subrequests per invocation, allowing you to make more &lt;code&gt;fetch()&lt;/code&gt; calls or requests
to Cloudflare services on every incoming request. This is especially important for long-running Workers requests, such as
open websockets on &lt;a href=&quot;https://developers.cloudflare.com/durable-objects&quot;&gt;Durable Objects&lt;/a&gt; or long-running &lt;a href=&quot;https://developers.cloudflare.com/workflows&quot;&gt;Workflows&lt;/a&gt;, as these could often exceed this limit and error.&lt;/p&gt;
&lt;p&gt;By default, Workers on paid plans are now limited to 10,000 subrequests per invocation, but this
limit can be increased up to 10 million by setting the new &lt;code&gt;subrequests&lt;/code&gt; limit in your Wrangler configuration file.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;wrangler.jsonc&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;jsonc&quot;&gt;&lt;code class=&quot;language-jsonc&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;limits&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;subrequests&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;50000&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;wrangler.toml&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;toml&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;limits&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;subrequests&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;50_000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;Workers on the free plan remain limited to 50 external subrequests and 1000 subrequests to Cloudflare services per invocation.&lt;/p&gt;
&lt;p&gt;To protect against runaway code or unexpected costs, you can also set a lower limit for both subrequests and CPU usage.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;wrangler.jsonc&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;jsonc&quot;&gt;&lt;code class=&quot;language-jsonc&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;limits&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;subrequests&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;cpu_ms&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1000&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;wrangler.toml&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;toml&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;limits&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;subrequests&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;cpu_ms&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1_000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/configuration/#limits&quot;&gt;Wrangler configuration documentation for limits&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/workers/platform/limits/#subrequests&quot;&gt;subrequest limits&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Improved React Server Components support in the Cloudflare Vite plugin</title><link>https://developers.cloudflare.com/changelog/post/2026-02-11-vite-plugin-child-environments/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-11-vite-plugin-child-environments/</guid><description>&lt;p&gt;The Cloudflare Vite plugin now integrates seamlessly &lt;a href=&quot;https://github.com/vitejs/vite-plugin-react/tree/main/packages/plugin-rsc&quot; target=&quot;_blank&quot;&gt;@vitejs/plugin-rsc&lt;/a&gt;, the official Vite plugin for &lt;a href=&quot;https://react.dev/reference/rsc/server-components&quot; target=&quot;_blank&quot;&gt;React Server Components&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A &lt;code&gt;childEnvironments&lt;/code&gt; option has been added to the plugin config to enable using multiple environments within a single Worker.
The parent environment can then import modules from a child environment in order to access a separate module graph.
For a typical RSC use case, the plugin might be configured as in the following example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineConfig&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;plugins&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;cloudflare&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;viteEnvironment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;rsc&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;childEnvironments&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;ssr&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;@vitejs/plugin-rsc&lt;/code&gt; provides the lower level functionality that frameworks, such as &lt;a href=&quot;https://reactrouter.com/how-to/react-server-components&quot; target=&quot;_blank&quot;&gt;React Router&lt;/a&gt;, build upon.
The GitHub repository includes a &lt;a href=&quot;https://github.com/vitejs/vite-plugin-react/tree/f066114c3e6bf18f5209ff3d3ef6bf1ab46d3866/packages/plugin-rsc/examples/starter-cf-single&quot; target=&quot;_blank&quot;&gt;basic Cloudflare example&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Agents, Workers - Agents SDK v0.4.0: Readonly connections, MCP security improvements, x402 v2 migration, and custom MCP OAuth providers</title><link>https://developers.cloudflare.com/changelog/post/2026-02-09-agents-sdk-v040/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-09-agents-sdk-v040/</guid><description>&lt;p&gt;The latest release of the &lt;a href=&quot;https://github.com/cloudflare/agents&quot; target=&quot;_blank&quot;&gt;Agents SDK&lt;/a&gt; brings readonly connections, MCP protocol and security improvements, x402 payment protocol v2 migration, and the ability to customize OAuth for MCP server connections.&lt;/p&gt;
&lt;h4&gt;Readonly connections&lt;/h4&gt;
&lt;p&gt;Agents can now restrict WebSocket clients to read-only access, preventing them from modifying agent state. This is useful for dashboards, spectator views, or any scenario where clients should observe but not mutate.&lt;/p&gt;
&lt;p&gt;New hooks: &lt;code&gt;shouldConnectionBeReadonly&lt;/code&gt;, &lt;code&gt;setConnectionReadonly&lt;/code&gt;, &lt;code&gt;isConnectionReadonly&lt;/code&gt;. Readonly connections block both client-side &lt;code&gt;setState()&lt;/code&gt; and mutating &lt;code&gt;@callable()&lt;/code&gt; methods, and the readonly flag survives hibernation.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyAgent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Agent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;shouldConnectionBeReadonly&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;connection&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Make spectators readonly&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;connection&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;includes&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;spectator&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyAgent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Agent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;shouldConnectionBeReadonly&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;connection&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Make spectators readonly&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;connection&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;includes&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;spectator&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;h4&gt;Custom MCP OAuth providers&lt;/h4&gt;
&lt;p&gt;The new &lt;code&gt;createMcpOAuthProvider&lt;/code&gt; method on the &lt;code&gt;Agent&lt;/code&gt; class allows subclasses to override the default OAuth provider used when connecting to MCP servers. This enables custom authentication strategies such as pre-registered client credentials or mTLS, beyond the built-in dynamic client registration.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyAgent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Agent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;createMcpOAuthProvider&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;callbackUrl&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyCustomOAuthProvider&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;storage&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;callbackUrl&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyAgent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Agent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;createMcpOAuthProvider&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;callbackUrl&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AgentMcpOAuthProvider&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyCustomOAuthProvider&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;storage&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;callbackUrl&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;h4&gt;MCP SDK upgrade to 1.26.0&lt;/h4&gt;
&lt;p&gt;Upgraded the MCP SDK to 1.26.0 to prevent cross-client response leakage. Stateless MCP Servers should now create a new &lt;code&gt;McpServer&lt;/code&gt; instance per request instead of sharing a single instance. A guard is added in this version of the MCP SDK which will prevent connection to a Server instance that has already been connected to a transport. Developers will need to modify their code if they declare their &lt;code&gt;McpServer&lt;/code&gt; instance as a global variable.&lt;/p&gt;
&lt;h4&gt;MCP OAuth callback URL security fix&lt;/h4&gt;
&lt;p&gt;Added &lt;code&gt;callbackPath&lt;/code&gt; option to &lt;code&gt;addMcpServer&lt;/code&gt; to prevent instance name leakage in MCP OAuth callback URLs. When &lt;code&gt;sendIdentityOnConnect&lt;/code&gt; is &lt;code&gt;false&lt;/code&gt;, &lt;code&gt;callbackPath&lt;/code&gt; is now required — the default callback URL would expose the instance name, undermining the security intent. Also fixes callback request detection to match via the &lt;code&gt;state&lt;/code&gt; parameter instead of a loose &lt;code&gt;/callback&lt;/code&gt; URL substring check, enabling custom callback paths.&lt;/p&gt;
&lt;h4&gt;Deprecate &lt;code&gt;onStateUpdate&lt;/code&gt; in favor of &lt;code&gt;onStateChanged&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;onStateChanged&lt;/code&gt; is a drop-in rename of &lt;code&gt;onStateUpdate&lt;/code&gt; (same signature, same behavior). &lt;code&gt;onStateUpdate&lt;/code&gt; still works but emits a one-time console warning per class. &lt;code&gt;validateStateChange&lt;/code&gt; rejections now propagate a &lt;code&gt;CF_AGENT_STATE_ERROR&lt;/code&gt; message back to the client.&lt;/p&gt;
&lt;h4&gt;x402 v2 migration&lt;/h4&gt;
&lt;p&gt;Migrated the x402 MCP payment integration from the legacy &lt;code&gt;x402&lt;/code&gt; package to &lt;code&gt;@x402/core&lt;/code&gt; and &lt;code&gt;@x402/evm&lt;/code&gt; v2.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Breaking changes for x402 users:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Peer dependencies changed: replace &lt;code&gt;x402&lt;/code&gt; with &lt;code&gt;@x402/core&lt;/code&gt; and &lt;code&gt;@x402/evm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PaymentRequirements&lt;/code&gt; type now uses v2 fields (e.g. &lt;code&gt;amount&lt;/code&gt; instead of &lt;code&gt;maxAmountRequired&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;X402ClientConfig.account&lt;/code&gt; type changed from &lt;code&gt;viem.Account&lt;/code&gt; to &lt;code&gt;ClientEvmSigner&lt;/code&gt; (structurally compatible with &lt;code&gt;privateKeyToAccount()&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;uninstall&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;x402&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@x402/core&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@x402/evm&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Network identifiers now accept both legacy names and CAIP-2 format:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Legacy name (auto-converted)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;network&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;base-sepolia&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// CAIP-2 format (preferred)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;network&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;eip155:84532&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Other x402 changes:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;X402ClientConfig.network&lt;/code&gt; is now optional — the client auto-selects from available payment requirements&lt;/li&gt;
&lt;li&gt;Server-side lazy initialization: facilitator connection is deferred until the first paid tool invocation&lt;/li&gt;
&lt;li&gt;Payment tokens support both v2 (&lt;code&gt;PAYMENT-SIGNATURE&lt;/code&gt;) and v1 (&lt;code&gt;X-PAYMENT&lt;/code&gt;) HTTP headers&lt;/li&gt;
&lt;li&gt;Added &lt;code&gt;normalizeNetwork&lt;/code&gt; export for converting legacy network names to CAIP-2 format&lt;/li&gt;
&lt;li&gt;Re-exports &lt;code&gt;PaymentRequirements&lt;/code&gt;, &lt;code&gt;PaymentRequired&lt;/code&gt;, &lt;code&gt;Network&lt;/code&gt;, &lt;code&gt;FacilitatorConfig&lt;/code&gt;, and &lt;code&gt;ClientEvmSigner&lt;/code&gt; from &lt;code&gt;agents/x402&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Other improvements&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fix &lt;code&gt;useAgent&lt;/code&gt; and &lt;code&gt;AgentClient&lt;/code&gt; crashing when using &lt;code&gt;basePath&lt;/code&gt; routing&lt;/li&gt;
&lt;li&gt;CORS handling delegated to partyserver&apos;s native support (simpler, more reliable)&lt;/li&gt;
&lt;li&gt;Client-side &lt;code&gt;onStateUpdateError&lt;/code&gt; callback for handling rejected state updates&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Upgrade&lt;/h4&gt;
&lt;p&gt;To update to the latest version:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;agents@latest&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;</description><pubDate>Mon, 09 Feb 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>Agents - Interactive browser terminals in Sandboxes</title><link>https://developers.cloudflare.com/changelog/post/2026-02-09-pty-terminal-support/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-09-pty-terminal-support/</guid><description>&lt;p&gt;The &lt;a href=&quot;https://github.com/cloudflare/sandbox-sdk&quot; target=&quot;_blank&quot;&gt;Sandbox SDK&lt;/a&gt; now supports PTY (pseudo-terminal) passthrough, enabling browser-based terminal UIs to connect to sandbox shells via WebSocket.&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;sandbox.terminal(request)&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;The new &lt;code&gt;terminal()&lt;/code&gt; method proxies a WebSocket upgrade to the container&apos;s PTY endpoint, with output buffering for replay on reconnect.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Worker: proxy WebSocket to container terminal&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandbox&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;terminal&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; cols&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;80&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; rows&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;24&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Worker: proxy WebSocket to container terminal&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandbox&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;terminal&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; cols&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;80&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; rows&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;24&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;h4&gt;Multiple terminals per sandbox&lt;/h4&gt;
&lt;p&gt;Each session can have its own terminal with an isolated working directory and environment, so users can run separate shells side-by-side in the same container.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Multiple isolated terminals in the same sandbox&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dev&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandbox&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getSession&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;dev&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dev&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;terminal&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Multiple isolated terminals in the same sandbox&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dev&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandbox&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getSession&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;dev&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dev&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;terminal&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;h4&gt;xterm.js addon&lt;/h4&gt;
&lt;p&gt;The new &lt;code&gt;@cloudflare/sandbox/xterm&lt;/code&gt; export provides a &lt;code&gt;SandboxAddon&lt;/code&gt; for &lt;a href=&quot;https://xtermjs.org/&quot; target=&quot;_blank&quot;&gt;xterm.js&lt;/a&gt; with automatic reconnection (exponential backoff + jitter), buffered output replay, and resize forwarding.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;SandboxAddon&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@cloudflare/sandbox/xterm&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;addon&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;SandboxAddon&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;getWebSocketUrl&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandboxId&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;origin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;origin&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/ws/terminal?id=&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;sandboxId&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;onStateChange&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;state&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;updateUI&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;state&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;terminal&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;loadAddon&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;addon&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;addon&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;connect&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; sandboxId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-sandbox&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;SandboxAddon&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@cloudflare/sandbox/xterm&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;addon&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;SandboxAddon&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;getWebSocketUrl&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandboxId&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;origin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;origin&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/ws/terminal?id=&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;sandboxId&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;onStateChange&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;state&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;updateUI&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;state&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;terminal&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;loadAddon&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;addon&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;addon&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;connect&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; sandboxId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-sandbox&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;h4&gt;Upgrade&lt;/h4&gt;
&lt;p&gt;To update to the latest version:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@cloudflare/sandbox@latest&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;</description><pubDate>Mon, 09 Feb 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category></item><item><title>AI Search - AI Search now with more granular controls over indexing</title><link>https://developers.cloudflare.com/changelog/post/2026-02-09-indexing-improvements/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-09-indexing-improvements/</guid><description>&lt;p&gt;Get your content updates into &lt;a href=&quot;https://developers.cloudflare.com/ai-search/&quot;&gt;AI Search&lt;/a&gt; faster and avoid a full rescan when you do not need it.&lt;/p&gt;
&lt;h4&gt;Reindex individual files without a full sync&lt;/h4&gt;
&lt;p&gt;Updated a file or need to retry one that errored? When you know exactly which file changed, you can now &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/indexing/#controls&quot;&gt;reindex it directly&lt;/a&gt; instead of rescanning your entire data source.&lt;/p&gt;
&lt;p&gt;Go to &lt;strong&gt;Overview&lt;/strong&gt; &gt; &lt;strong&gt;Indexed Items&lt;/strong&gt; and select the sync icon next to any file to reindex it immediately.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/individual-file-indexing.CQgoIj85_ZIBUBg.webp&quot; alt=&quot;Sync individual files from Indexed Items&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;h4&gt;Crawl only the sitemap you need&lt;/h4&gt;
&lt;p&gt;By default, AI Search crawls all sitemaps listed in your &lt;code&gt;robots.txt&lt;/code&gt;, up to the &lt;a href=&quot;https://developers.cloudflare.com/ai-search/platform/limits-pricing/#limits&quot;&gt;maximum files per index limit&lt;/a&gt;. If your site has multiple sitemaps but you only want to index a specific set, you can now &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/data-source/website/#sitemap&quot;&gt;specify a single sitemap URL&lt;/a&gt; to limit what the crawler visits.&lt;/p&gt;
&lt;p&gt;For example, if your &lt;code&gt;robots.txt&lt;/code&gt; lists both &lt;code&gt;blog-sitemap.xml&lt;/code&gt; and &lt;code&gt;docs-sitemap.xml&lt;/code&gt;, you can specify just &lt;code&gt;https://example.com/docs-sitemap.xml&lt;/code&gt; to index only your documentation.&lt;/p&gt;
&lt;p&gt;Configure your selection anytime in &lt;strong&gt;Settings&lt;/strong&gt; &gt; &lt;strong&gt;Parsing options&lt;/strong&gt; &gt; &lt;strong&gt;Specific sitemaps&lt;/strong&gt;, then trigger a sync to apply the changes.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/specify-sitemap.pLCkwmJ-_2vbphB.webp&quot; alt=&quot;Specify a sitemap in Parsinh options&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/indexing/#controls&quot;&gt;indexing controls&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/data-source/website/#sitemap&quot;&gt;website crawling configuration&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 09 Feb 2026 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>R2 SQL - R2 SQL now supports approximate aggregation functions</title><link>https://developers.cloudflare.com/changelog/post/2026-02-09-approximate-aggregation-functions/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-09-approximate-aggregation-functions/</guid><description>&lt;p&gt;R2 SQL now supports five approximate aggregation functions for fast analysis of large datasets. These functions trade minor precision for improved performance on high-cardinality data.&lt;/p&gt;
&lt;h4&gt;New functions&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;APPROX_PERCENTILE_CONT(column, percentile)&lt;/code&gt; — Returns the approximate value at a given percentile (0.0 to 1.0). Works on integer and decimal columns.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;APPROX_PERCENTILE_CONT_WITH_WEIGHT(column, weight, percentile)&lt;/code&gt; — Weighted percentile calculation where each row contributes proportionally to its weight column value.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;APPROX_MEDIAN(column)&lt;/code&gt; — Returns the approximate median. Equivalent to &lt;code&gt;APPROX_PERCENTILE_CONT(column, 0.5)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;APPROX_DISTINCT(column)&lt;/code&gt; — Returns the approximate number of distinct values. Works on any column type.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;APPROX_TOP_K(column, k)&lt;/code&gt; — Returns the &lt;code&gt;k&lt;/code&gt; most frequent values with their counts as a JSON array.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All functions support &lt;code&gt;WHERE&lt;/code&gt; filters. All except &lt;code&gt;APPROX_TOP_K&lt;/code&gt; support &lt;code&gt;GROUP BY&lt;/code&gt;.&lt;/p&gt;
&lt;h4&gt;Examples&lt;/h4&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;-- Percentile analysis on revenue data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;approx_percentile_cont&lt;/span&gt;&lt;span&gt;(total_amount, &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;25&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;approx_percentile_cont&lt;/span&gt;&lt;span&gt;(total_amount, &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;approx_percentile_cont&lt;/span&gt;&lt;span&gt;(total_amount, &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;75&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; my_namespace.sales_data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;-- Median per department&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; department, approx_median(total_amount)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; my_namespace.sales_data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;GROUP BY&lt;/span&gt;&lt;span&gt; department&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;-- Approximate distinct customers by region&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; region, approx_distinct(customer_id)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; my_namespace.sales_data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;GROUP BY&lt;/span&gt;&lt;span&gt; region&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;-- Top 5 most frequent departments&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; approx_top_k(department, &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; my_namespace.sales_data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;-- Combine approximate and standard aggregations&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;COUNT&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;AVG&lt;/span&gt;&lt;span&gt;(total_amount),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;approx_percentile_cont&lt;/span&gt;&lt;span&gt;(total_amount, &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;approx_distinct(customer_id)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; my_namespace.sales_data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; region &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;North&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For the full syntax and additional examples, refer to the &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/sql-reference/&quot;&gt;SQL reference&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 09 Feb 2026 00:00:00 GMT</pubDate><product>R2 SQL</product><category>R2 SQL</category></item><item><title>Workers - Visualize data, share links, and create exports with the new Workers Observability dashboard</title><link>https://developers.cloudflare.com/changelog/post/2026-02-06-observability-ui-refresh/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-06-observability-ui-refresh/</guid><description>&lt;p&gt;The &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers-and-pages/observability/&quot; target=&quot;_blank&quot;&gt;Workers Observability dashboard&lt;/a&gt; has some major updates to make it easier to debug your application&apos;s issues and share findings with your team.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/2026-01-22-events_share_obs_wobs.BvzY4TNV_eC7Hu.webp&quot; alt=&quot;Workers Observability dashboard showing events view with event details and share options&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;You can now:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Create visualizations&lt;/strong&gt; — Build charts from your Worker data directly in a Worker&apos;s Observability tab&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Export data as JSON or CSV&lt;/strong&gt; — Download logs and traces for offline analysis or to share with teammates&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Share events and traces&lt;/strong&gt; — Generate direct URLs to specific events, invocations, and traces that open standalone pages with full context&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Customize table columns&lt;/strong&gt; — Improved field picker to add, remove, and reorder columns in the events table&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expandable event details&lt;/strong&gt; — Expand events inline to view full details without leaving the table&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keyboard shortcuts&lt;/strong&gt; — Navigate the dashboard with hotkey support&lt;/li&gt;
&lt;/ul&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/2026-01-22-vis_qb_wobs.Bb5eVQNT_at6AT.webp&quot; alt=&quot;Workers Observability dashboard showing a P99 CPU time visualization grouped by outcome&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;These updates are now live in the Cloudflare dashboard, both in a Worker&apos;s Observability tab and in the account-level Observability dashboard for a unified experience. To get started, go to &lt;strong&gt;Workers &amp;#x26; Pages&lt;/strong&gt; &gt; select your Worker &gt; &lt;strong&gt;Observability&lt;/strong&gt;.&lt;/p&gt;</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Queues - Cloudflare Queues now available on Workers Free plan</title><link>https://developers.cloudflare.com/changelog/post/2026-02-04-queues-free-plan/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-04-queues-free-plan/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/queues&quot;&gt;Cloudflare Queues&lt;/a&gt; is now part of the Workers free plan, offering guaranteed message delivery across up to &lt;strong&gt;10,000 queues&lt;/strong&gt; to either &lt;a href=&quot;https://developers.cloudflare.com/workers&quot;&gt;Cloudflare Workers&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/queues/configuration/pull-consumers&quot;&gt;HTTP pull consumers&lt;/a&gt;. Every Cloudflare account now includes &lt;strong&gt;10,000 operations per day&lt;/strong&gt; across reads, writes, and deletes. For more details on how each operation is defined, refer to &lt;a href=&quot;https://developers.cloudflare.com/workers/platform/pricing/#queues&quot; target=&quot;_blank&quot;&gt;Queues pricing&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;All features of the existing Queues functionality are available on the free plan, including unlimited &lt;a href=&quot;https://developers.cloudflare.com/queues/event-subscriptions/&quot;&gt;event subscriptions&lt;/a&gt;. Note that the maximum retention period on the free tier, however, is 24 hours rather than 14 days.&lt;/p&gt;
&lt;p&gt;If you are new to Cloudflare Queues, follow &lt;a href=&quot;https://developers.cloudflare.com/queues/get-started/&quot; target=&quot;_blank&quot;&gt;this guide&lt;/a&gt; or try one of our &lt;a href=&quot;https://developers.cloudflare.com/queues/tutorials/&quot;&gt;tutorials&lt;/a&gt; to get started.&lt;/p&gt;</description><pubDate>Wed, 04 Feb 2026 00:00:00 GMT</pubDate><product>Queues</product><category>Queues</category></item><item><title>Workflows, Workers - Visualize your Workflows in the Cloudflare dashboard</title><link>https://developers.cloudflare.com/changelog/post/2026-02-03-workflows-visualizer/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-03-workflows-visualizer/</guid><description>&lt;p&gt;Cloudflare Workflows now automatically generates visual diagrams from your code&lt;/p&gt;
&lt;p&gt;Your Workflow is parsed to provide a visual map of the Workflow structure, allowing you to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Understand how steps connect and execute&lt;/li&gt;
&lt;li&gt;Visualize loops and nested logic&lt;/li&gt;
&lt;li&gt;Follow branching paths for conditional logic&lt;/li&gt;
&lt;/ul&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/2026-02-03-workflows-diagram.BfQAnWL3_Z203oFd.webp&quot; alt=&quot;Example diagram&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;You can collapse loops and nested logic to see the high-level flow, or expand them to see every step.&lt;/p&gt;
&lt;p&gt;Workflow diagrams are available in beta for all JavaScript and TypeScript Workflows. Find your Workflows in the &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers/workflows&quot; target=&quot;_blank&quot;&gt;Cloudflare dashboard&lt;/a&gt; to see their diagrams.&lt;/p&gt;</description><pubDate>Wed, 04 Feb 2026 00:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category><category>Workers</category></item><item><title>Agents, Workflows - Agents SDK v0.3.7: Workflows integration, synchronous state, and scheduleEvery()</title><link>https://developers.cloudflare.com/changelog/post/2026-02-03-agents-workflows-integration/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-03-agents-workflows-integration/</guid><description>&lt;p&gt;The latest release of the &lt;a href=&quot;https://github.com/cloudflare/agents&quot; target=&quot;_blank&quot;&gt;Agents SDK&lt;/a&gt; brings first-class support for &lt;a href=&quot;https://developers.cloudflare.com/workflows/&quot;&gt;Cloudflare Workflows&lt;/a&gt;, synchronous state management, and new scheduling capabilities.&lt;/p&gt;
&lt;h4&gt;Cloudflare Workflows integration&lt;/h4&gt;
&lt;p&gt;Agents excel at real-time communication and state management. Workflows excel at durable execution. Together, they enable powerful patterns where Agents handle WebSocket connections while Workflows handle long-running tasks, retries, and human-in-the-loop flows.&lt;/p&gt;
&lt;p&gt;Use the new &lt;code&gt;AgentWorkflow&lt;/code&gt; class to define workflows with typed access to your Agent:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AgentWorkflow&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;agents/workflows&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ProcessingWorkflow&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AgentWorkflow&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;step&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Call Agent methods via RPC&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;agent&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;updateStatus&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;payload&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;taskId&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;processing&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Non-durable: progress reporting to clients&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;reportProgress&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; step&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;process&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; percent&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0.5&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;broadcastToClients&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;update&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; taskId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;payload&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;taskId&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Durable via step: idempotent, won&apos;t repeat on retry&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;step&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;mergeAgentState&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; taskProgress&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0.5&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;step&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;do&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;process&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;processData&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;payload&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;step&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;reportComplete&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AgentWorkflow&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;agents/workflows&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import type &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AgentWorkflowEvent&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AgentWorkflowStep&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;agents/workflows&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ProcessingWorkflow&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AgentWorkflow&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;MyAgent&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;TaskParams&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AgentWorkflowEvent&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;TaskParams&lt;/span&gt;&lt;span&gt;&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;step&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AgentWorkflowStep&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Call Agent methods via RPC&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;agent&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;updateStatus&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;payload&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;taskId&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;processing&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Non-durable: progress reporting to clients&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;reportProgress&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; step&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;process&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; percent&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0.5&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;broadcastToClients&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;update&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; taskId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;payload&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;taskId&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Durable via step: idempotent, won&apos;t repeat on retry&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;step&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;mergeAgentState&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; taskProgress&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0.5&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;step&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;do&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;process&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;processData&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;payload&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;step&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;reportComplete&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;Start workflows from your Agent with &lt;code&gt;runWorkflow()&lt;/code&gt; and handle lifecycle events:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyAgent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Agent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;startTask&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;taskId&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;instanceId&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;runWorkflow&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;PROCESSING_WORKFLOW&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;taskId&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;instanceId&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;onWorkflowProgress&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;workflowName&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;instanceId&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;progress&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;broadcast&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;JSON&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;stringify&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;progress&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;progress&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;onWorkflowComplete&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;workflowName&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;instanceId&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`Workflow &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;instanceId&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; completed`&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;onWorkflowError&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;workflowName&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;instanceId&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`Workflow &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;instanceId&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; failed:`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyAgent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Agent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;startTask&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;taskId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;instanceId&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;runWorkflow&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;PROCESSING_WORKFLOW&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;taskId&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;instanceId&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;onWorkflowProgress&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;workflowName&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;instanceId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;progress&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;unknown&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;broadcast&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;JSON&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;stringify&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;progress&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;progress&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;onWorkflowComplete&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;workflowName&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;instanceId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;?:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;unknown&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`Workflow &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;instanceId&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; completed`&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;onWorkflowError&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;workflowName&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;instanceId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;unknown&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`Workflow &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;instanceId&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; failed:`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;Key workflow methods on your Agent:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;runWorkflow(workflowName, params, options?)&lt;/code&gt; — Start a workflow with optional metadata&lt;/li&gt;
&lt;li&gt;&lt;code&gt;getWorkflow(workflowId)&lt;/code&gt; / &lt;code&gt;getWorkflows(criteria?)&lt;/code&gt; — Query workflows with cursor-based pagination&lt;/li&gt;
&lt;li&gt;&lt;code&gt;approveWorkflow(workflowId)&lt;/code&gt; / &lt;code&gt;rejectWorkflow(workflowId)&lt;/code&gt; — Human-in-the-loop approval flows&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pauseWorkflow()&lt;/code&gt;, &lt;code&gt;resumeWorkflow()&lt;/code&gt;, &lt;code&gt;terminateWorkflow()&lt;/code&gt; — Workflow control&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Synchronous setState()&lt;/h4&gt;
&lt;p&gt;State updates are now synchronous with a new &lt;code&gt;validateStateChange()&lt;/code&gt; validation hook:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyAgent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Agent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;validateStateChange&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;oldState&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;newState&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Return false to reject the change&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;newState&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Return modified state to transform&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;newState&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; lastUpdated&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Date&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;now&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyAgent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Agent&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Env&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;State&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;validateStateChange&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;oldState&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;State&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;newState&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;State&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;State&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Return false to reject the change&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;newState&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Return modified state to transform&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;newState&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; lastUpdated&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Date&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;now&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;h4&gt;scheduleEvery() for recurring tasks&lt;/h4&gt;
&lt;p&gt;The new &lt;code&gt;scheduleEvery()&lt;/code&gt; method enables fixed-interval recurring tasks with built-in overlap prevention:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Run every 5 minutes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;scheduleEvery&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;syncData&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;60&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1000&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; source&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;api&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Run every 5 minutes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;scheduleEvery&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;syncData&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;60&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1000&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; source&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;api&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;h4&gt;Callable system improvements&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Client-side RPC timeout&lt;/strong&gt; — Set timeouts on callable method invocations&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;StreamingResponse.error(message)&lt;/code&gt;&lt;/strong&gt; — Graceful stream error signaling&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;getCallableMethods()&lt;/code&gt;&lt;/strong&gt; — Introspection API for discovering callable methods&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Connection close handling&lt;/strong&gt; — Pending calls are automatically rejected on disconnect&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;agent&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;call&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;method&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;args&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;timeout&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;5000&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;stream&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;onChunk&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;onDone&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;onError&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;agent&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;call&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;method&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;args&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;timeout&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;5000&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;stream&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;onChunk&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;onDone&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;onError&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;h4&gt;Email and routing enhancements&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Secure email reply routing&lt;/strong&gt; — Email replies are now secured with HMAC-SHA256 signed headers, preventing unauthorized routing of emails to agent instances.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Routing improvements:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;basePath&lt;/code&gt; option to bypass default URL construction for custom routing&lt;/li&gt;
&lt;li&gt;Server-sent identity — Agents send &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;agent&lt;/code&gt; type on connect&lt;/li&gt;
&lt;li&gt;New &lt;code&gt;onIdentity&lt;/code&gt; and &lt;code&gt;onIdentityChange&lt;/code&gt; callbacks on the client&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;agent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;useAgent&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;basePath&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;user&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;onIdentity&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;agentType&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`Connected to &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;agent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;useAgent&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;basePath&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;user&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;onIdentity&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;agentType&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`Connected to &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;h4&gt;Upgrade&lt;/h4&gt;
&lt;p&gt;To update to the latest version:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;agents@latest&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For the complete Workflows API reference and patterns, see &lt;a href=&quot;https://developers.cloudflare.com/agents/api-reference/run-workflows/&quot;&gt;Run Workflows&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 03 Feb 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workflows</category></item><item><title>R2 - Improve Global Upload Performance with R2 Local Uploads - Now in Open Beta</title><link>https://developers.cloudflare.com/changelog/post/2026-02-03-r2-local-uploads/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-03-r2-local-uploads/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/r2/buckets/local-uploads/&quot;&gt;Local Uploads&lt;/a&gt; is now available in open beta. Enable it on your &lt;a href=&quot;https://developers.cloudflare.com/r2/&quot;&gt;R2&lt;/a&gt; bucket to improve upload performance when clients upload data from a different region than your bucket. With Local Uploads enabled, object data is written to storage infrastructure near the client, then asynchronously replicated to your bucket. The object is immediately accessible and remains strongly consistent throughout. Refer to &lt;a href=&quot;https://developers.cloudflare.com/r2/how-r2-works/&quot;&gt;How R2 works&lt;/a&gt; for details on how data is written to your bucket.&lt;/p&gt;
&lt;p&gt;In our tests, we observed &lt;strong&gt;up to 75% reduction in Time to Last Byte (TTLB)&lt;/strong&gt; for upload requests when Local Uploads is enabled.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/local-uploads-latency.R4pUgVuI_2cwpHU.webp&quot; alt=&quot;Local Uploads latency comparison showing p50 TTLB dropping from around 2 seconds to 500ms after enabling Local Uploads&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;This feature is ideal when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Your users are globally distributed&lt;/li&gt;
&lt;li&gt;Upload performance and reliability is critical to your application&lt;/li&gt;
&lt;li&gt;You want to optimize write performance without changing your bucket&apos;s primary location&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To enable Local Uploads on your bucket, find &lt;strong&gt;Local Uploads&lt;/strong&gt; in your bucket settings in the &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/r2/overview&quot; target=&quot;_blank&quot;&gt;Cloudflare Dashboard&lt;/a&gt;, or run:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;r2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bucket&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;local-uploads&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;enable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;#x3C;BUCKET_NAME&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Enabling Local Uploads on a bucket is seamless: existing uploads will complete as expected and there’s no interruption to traffic. There is no additional cost to enable Local Uploads. Upload requests incur the standard &lt;a href=&quot;https://developers.cloudflare.com/r2/pricing/&quot;&gt;Class A operation costs&lt;/a&gt; same as upload requests made without Local Uploads.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/r2/buckets/local-uploads/&quot;&gt;Local Uploads&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 03 Feb 2026 00:00:00 GMT</pubDate><product>R2</product><category>R2</category></item><item><title>KV - Reduced minimum cache TTL for Workers KV to 30 seconds</title><link>https://developers.cloudflare.com/changelog/post/2026-01-30-kv-reduced-minimum-cachettl/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-30-kv-reduced-minimum-cachettl/</guid><description>&lt;p&gt;The minimum &lt;code&gt;cacheTtl&lt;/code&gt; parameter for Workers KV has been reduced from 60 seconds to 30 seconds. This change applies to both &lt;code&gt;get()&lt;/code&gt; and &lt;code&gt;getWithMetadata()&lt;/code&gt; methods.&lt;/p&gt;
&lt;p&gt;This reduction allows you to maintain more up-to-date cached data and have finer-grained control over cache behavior. Applications requiring faster data refresh rates can now configure cache durations as low as 30 seconds instead of the previous 60-second minimum.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;cacheTtl&lt;/code&gt; parameter defines how long a KV result is cached at the global network location it is accessed from:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Read with custom cache TTL&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;NAMESPACE&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;my-key&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cacheTtl&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;30&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// Cache for minimum 30 seconds (previously 60)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// getWithMetadata also supports the reduced cache TTL&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;valueWithMetadata&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;NAMESPACE&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getWithMetadata&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;my-key&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cacheTtl&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;30&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// Cache for minimum 30 seconds&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The default cache TTL remains unchanged at 60 seconds. Upgrade to the latest version of Wrangler to be able to use 30 seconds &lt;code&gt;cacheTtl&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This change affects all KV read operations using the binding API. For more information, consult the &lt;a href=&quot;https://developers.cloudflare.com/kv/api/read-key-value-pairs/#cachettl-parameter&quot;&gt;Workers KV cache TTL documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 30 Jan 2026 12:00:00 GMT</pubDate><product>KV</product><category>KV</category></item><item><title>Workers AI - Launching FLUX.2 [klein] 9B on Workers AI</title><link>https://developers.cloudflare.com/changelog/post/2026-01-28-flux-2-klein-9b-workers-ai/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-28-flux-2-klein-9b-workers-ai/</guid><description>&lt;p&gt;We have partnered with Black Forest Labs (BFL) again to bring their optimized FLUX.2 [klein] 9B model to Workers AI. This distilled model offers enhanced quality compared to the 4B variant, while maintaining cost-effective pricing. With a fixed 4-step inference process, Klein 9B is ideal for rapid prototyping and real-time applications where both speed and quality matter.&lt;/p&gt;
&lt;p&gt;Read the &lt;a href=&quot;https://bfl.ai/blog&quot; target=&quot;_blank&quot;&gt;BFL blog&lt;/a&gt; to learn more about the model itself, or try it out yourself on our &lt;a href=&quot;https://multi-modal.ai.cloudflare.com/&quot; target=&quot;_blank&quot;&gt;multi modal playground&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pricing documentation is available on the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/flux-2-klein-9b/&quot;&gt;model page&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/platform/pricing/&quot;&gt;pricing page&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Workers AI platform specifics&lt;/h4&gt;
&lt;p&gt;The model hosted on Workers AI is optimized for speed with a &lt;strong&gt;fixed 4-step inference process&lt;/strong&gt; and supports up to 4 image inputs. Since this is a distilled model, the &lt;code&gt;steps&lt;/code&gt; parameter is fixed at 4 and cannot be adjusted. Like FLUX.2 [dev] and FLUX.2 [klein] 4B, this image model uses multipart form data inputs, even if you just have a prompt.&lt;/p&gt;
&lt;p&gt;With the REST API, the multipart form data input looks like this:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--request&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;POST&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--url&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;https://api.cloudflare.com/client/v4/accounts/{ACCOUNT}/ai/run/@cf/black-forest-labs/flux-2-klein-9b&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--header&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;Authorization: Bearer {TOKEN}&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--header&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;Content-Type: multipart/form-data&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--form&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;prompt=a sunset at the alps&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--form&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;width=&lt;/span&gt;&lt;span&gt;1024&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--form&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;height=&lt;/span&gt;&lt;span&gt;1024&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;With the Workers AI binding, you can use it as such:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;form&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;FormData&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;form&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;append&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;prompt&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;a sunset with a dog&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;form&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;append&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;width&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;1024&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;form&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;append&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;height&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;1024&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// FormData doesn&apos;t expose its serialized body or boundary. Passing it to a&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Request (or Response) constructor serializes it and generates the Content-Type&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// header with the boundary, which is required for the server to parse the multipart fields.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formResponse&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;form&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formStream&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formContentType&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;content-type&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;resp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AI&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;@cf/black-forest-labs/flux-2-klein-9b&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;multipart&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formStream&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;contentType&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formContentType&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The parameters you can send to the model are detailed here:&lt;/p&gt;
&lt;details&gt;&lt;p&gt;&lt;/p&gt;&lt;summary&gt;JSON Schema for Model&lt;/summary&gt;
&lt;strong&gt;Required Parameters&lt;/strong&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;prompt&lt;/code&gt; (string) - Text description of the image to generate&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Optional Parameters&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;input_image_0&lt;/code&gt; (string) - Binary image&lt;/li&gt;
&lt;li&gt;&lt;code&gt;input_image_1&lt;/code&gt; (string) - Binary image&lt;/li&gt;
&lt;li&gt;&lt;code&gt;input_image_2&lt;/code&gt; (string) - Binary image&lt;/li&gt;
&lt;li&gt;&lt;code&gt;input_image_3&lt;/code&gt; (string) - Binary image&lt;/li&gt;
&lt;li&gt;&lt;code&gt;guidance&lt;/code&gt; (float) - Guidance scale for generation. Higher values follow the prompt more closely&lt;/li&gt;
&lt;li&gt;&lt;code&gt;width&lt;/code&gt; (integer) - Width of the image, default &lt;code&gt;1024&lt;/code&gt; Range: 256-1920&lt;/li&gt;
&lt;li&gt;&lt;code&gt;height&lt;/code&gt; (integer) - Height of the image, default &lt;code&gt;768&lt;/code&gt; Range: 256-1920&lt;/li&gt;
&lt;li&gt;&lt;code&gt;seed&lt;/code&gt; (integer) - Seed for reproducibility&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Since this is a distilled model, the &lt;code&gt;steps&lt;/code&gt; parameter is fixed at 4 and cannot be adjusted.&lt;/p&gt;&lt;/details&gt;
&lt;h4&gt;Multi-reference images&lt;/h4&gt;
&lt;p&gt;The FLUX.2 klein-9b model supports generating images based on reference images, just like FLUX.2 [dev] and FLUX.2 [klein] 4B. You can use this feature to apply the style of one image to another, add a new character to an image, or iterate on past generated images. You would use it with the same multipart form data structure, with the input images in binary. The model supports up to 4 input images.&lt;/p&gt;
&lt;p&gt;For the prompt, you can reference the images based on the index, like &lt;code&gt;take the subject of image 1 and style it like image 0&lt;/code&gt; or even use natural language like &lt;code&gt;place the dog beside the woman&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You must name the input parameter as &lt;code&gt;input_image_0&lt;/code&gt;, &lt;code&gt;input_image_1&lt;/code&gt;, &lt;code&gt;input_image_2&lt;/code&gt;, &lt;code&gt;input_image_3&lt;/code&gt; for it to work correctly. All input images must be smaller than 512x512.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--request&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;POST&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--url&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;https://api.cloudflare.com/client/v4/accounts/{ACCOUNT}/ai/run/@cf/black-forest-labs/flux-2-klein-9b&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--header&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;Authorization: Bearer {TOKEN}&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--header&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;Content-Type: multipart/form-data&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--form&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;prompt=take the subject of image 1 and style it like image 0&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--form&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;input_image_0=@/Users/johndoe/Desktop/icedoutkeanu.png&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--form&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;input_image_1=@/Users/johndoe/Desktop/me.png&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--form&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;width=&lt;/span&gt;&lt;span&gt;1024&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--form&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;height=&lt;/span&gt;&lt;span&gt;1024&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Through Workers AI Binding:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;//helper function to convert ReadableStream to Blob&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;streamToBlob&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;stream&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ReadableStream&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;contentType&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Promise&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Blob&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;reader&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stream&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getReader&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;chunks&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; []&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;while&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;done&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;reader&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;read&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;done&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;break&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;chunks&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;push&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Blob&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;chunks&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;contentType&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;image0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;http://image-url&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;image1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;http://image-url&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;form&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;FormData&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;image_blob0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;streamToBlob&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;image0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;image/png&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;image_blob1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;streamToBlob&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;image1&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;image/png&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;form&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;append&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;input_image_0&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;image_blob0&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;form&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;append&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;input_image_1&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;image_blob1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;form&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;append&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;prompt&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;take the subject of image 1 and style it like image 0&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// FormData doesn&apos;t expose its serialized body or boundary. Passing it to a&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Request (or Response) constructor serializes it and generates the Content-Type&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// header with the boundary, which is required for the server to parse the multipart fields.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formResponse&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;form&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formStream&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formContentType&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;content-type&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;resp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AI&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;@cf/black-forest-labs/flux-2-klein-9b&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;multipart&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formStream&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;contentType&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formContentType&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;</description><pubDate>Wed, 28 Jan 2026 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category></item><item><title>Pages - Increased Pages file limit to 100,000 for paid plans</title><link>https://developers.cloudflare.com/changelog/post/2026-01-23-pages-file-limit-increase/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-23-pages-file-limit-increase/</guid><description>&lt;p&gt;Paid plans can now have up to 100,000 files per Pages site, increased from the previous limit of 20,000 files.&lt;/p&gt;
&lt;p&gt;To enable this increased limit, set the environment variable &lt;code&gt;PAGES_WRANGLER_MAJOR_VERSION=4&lt;/code&gt; in your Pages project settings.&lt;/p&gt;
&lt;p&gt;The Free plan remains at 20,000 files per site.&lt;/p&gt;
&lt;p&gt;For more details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/pages/platform/limits/#files&quot;&gt;Pages limits documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 23 Jan 2026 00:00:00 GMT</pubDate><product>Pages</product><category>Pages</category></item><item><title>Vectorize - Vectorize indexes now support up to 10 million vectors</title><link>https://developers.cloudflare.com/changelog/post/2026-01-23-increased-index-capacity/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-23-increased-index-capacity/</guid><description>&lt;p&gt;You can now store up to 10 million vectors in a single Vectorize index, doubling the previous limit of 5 million vectors. This enables larger-scale semantic search, recommendation systems, and retrieval-augmented generation (RAG) applications without splitting data across multiple indexes.&lt;/p&gt;
&lt;p&gt;Vectorize continues to support indexes with up to 1,536 dimensions per vector at 32-bit precision. Refer to the &lt;a href=&quot;https://developers.cloudflare.com/vectorize/platform/limits/&quot;&gt;Vectorize limits documentation&lt;/a&gt; for complete details.&lt;/p&gt;</description><pubDate>Fri, 23 Jan 2026 00:00:00 GMT</pubDate><product>Vectorize</product><category>Vectorize</category></item><item><title>Workers - New Placement Hints for Workers</title><link>https://developers.cloudflare.com/changelog/post/2026-01-22-explicit-placement-hints/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-22-explicit-placement-hints/</guid><description>&lt;p&gt;You can now configure Workers to run close to infrastructure in legacy cloud regions to minimize latency to existing services and databases. This is most useful when your Worker makes multiple round trips.&lt;/p&gt;
&lt;p&gt;To &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/placement/#configure-explicit-placement-hints&quot;&gt;set a placement hint&lt;/a&gt;, set the &lt;code&gt;placement.region&lt;/code&gt; property in your Wrangler configuration file:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;wrangler.jsonc&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;jsonc&quot;&gt;&lt;code class=&quot;language-jsonc&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;placement&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;region&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;aws:us-east-1&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;wrangler.toml&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;toml&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;placement&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;region&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;aws:us-east-1&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;Placement hints support Amazon Web Services (AWS), Google Cloud Platform (GCP), and Microsoft Azure region identifiers. Workers run in the &lt;a href=&quot;https://www.cloudflare.com/network/&quot; target=&quot;_blank&quot;&gt;Cloudflare data center&lt;/a&gt; with the lowest latency to the specified cloud region.&lt;/p&gt;
&lt;p&gt;If your existing infrastructure is not in these cloud providers, expose it to placement probes with &lt;code&gt;placement.host&lt;/code&gt; for layer 4 checks or &lt;code&gt;placement.hostname&lt;/code&gt; for layer 7 checks. These probes are designed to locate single-homed infrastructure and are not suitable for anycasted or multicasted resources.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;wrangler.jsonc&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;jsonc&quot;&gt;&lt;code class=&quot;language-jsonc&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;placement&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my_database_host.com:5432&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;wrangler.toml&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;toml&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;placement&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;host&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my_database_host.com:5432&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;ul&gt;&lt;li&gt;&lt;p&gt;wrangler.jsonc&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;jsonc&quot;&gt;&lt;code class=&quot;language-jsonc&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;placement&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;hostname&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my_api_server.com&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;wrangler.toml&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;toml&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;placement&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;hostname&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my_api_server.com&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;This is an extension of &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/placement/#enable-smart-placement&quot;&gt;Smart Placement&lt;/a&gt;, which automatically places your Workers closer to back-end APIs based on measured latency. When you do not know the location of your back-end APIs or have multiple back-end APIs, set &lt;code&gt;mode: &quot;smart&quot;&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;wrangler.jsonc&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;jsonc&quot;&gt;&lt;code class=&quot;language-jsonc&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;placement&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;mode&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;smart&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;wrangler.toml&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;toml&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;placement&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mode&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;smart&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;</description><pubDate>Thu, 22 Jan 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>AI Search - AI Search path filtering for website and R2 data sources</title><link>https://developers.cloudflare.com/changelog/post/2026-01-20-ai-search-path-filtering/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-20-ai-search-path-filtering/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-search/&quot;&gt;AI Search&lt;/a&gt; now includes &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/path-filtering/&quot;&gt;path filtering&lt;/a&gt; for both &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/data-source/website/#path-filtering&quot;&gt;website&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/data-source/r2/#path-filtering&quot;&gt;R2&lt;/a&gt; data sources. You can now control which content gets indexed by defining include and exclude rules for paths.&lt;/p&gt;
&lt;p&gt;By controlling what gets indexed, you can improve the relevance and quality of your search results. You can also use path filtering to split a single data source across multiple AI Search instances for specialized search experiences.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/path-filtering.BCH7HN-Q_vEVaf.webp&quot; alt=&quot;Path filtering configuration in AI Search&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;Path filtering uses &lt;a href=&quot;https://github.com/micromatch/micromatch&quot; target=&quot;_blank&quot;&gt;micromatch&lt;/a&gt; patterns, so you can use &lt;code&gt;*&lt;/code&gt; to match within a directory and &lt;code&gt;**&lt;/code&gt; to match across directories.&lt;/p&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Use case&lt;/th&gt;&lt;th&gt;Include&lt;/th&gt;&lt;th&gt;Exclude&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Index docs but skip drafts&lt;/td&gt;&lt;td&gt;&lt;code&gt;**/docs/**&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;**/docs/drafts/**&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Keep admin pages out of results&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;&lt;code&gt;**/admin/**&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Index only English content&lt;/td&gt;&lt;td&gt;&lt;code&gt;**/en/**&lt;/code&gt;&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Configure path filters when creating a new instance or update them anytime from &lt;strong&gt;Settings&lt;/strong&gt;. Check out &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/path-filtering/&quot;&gt;path filtering&lt;/a&gt; to learn more.&lt;/p&gt;</description><pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>AI Search - Create AI Search instances programmatically via REST API</title><link>https://developers.cloudflare.com/changelog/post/2026-01-20-ai-search-simplified-api/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-20-ai-search-simplified-api/</guid><description>&lt;p&gt;You can now create &lt;a href=&quot;https://developers.cloudflare.com/ai-search/&quot;&gt;AI Search&lt;/a&gt; instances programmatically using the &lt;a href=&quot;https://developers.cloudflare.com/ai-search/get-started/api/&quot;&gt;API&lt;/a&gt;. For example, use the API to create instances for each customer in a multi-tenant application or manage AI Search alongside your other infrastructure.&lt;/p&gt;
&lt;p&gt;If you have created an AI Search instance via the &lt;a href=&quot;https://developers.cloudflare.com/ai-search/get-started/dashboard/&quot;&gt;dashboard&lt;/a&gt; before, you already have a &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/service-api-token/&quot;&gt;service API token&lt;/a&gt; registered and can start creating instances programmatically right away. If not, follow the &lt;a href=&quot;https://developers.cloudflare.com/ai-search/get-started/api/&quot;&gt;API guide&lt;/a&gt; to set up your first instance.&lt;/p&gt;
&lt;p&gt;For example, you can now create separate search instances for each language on your website:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;lang&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;en&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fr&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;es&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;de&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;do&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-X&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;POST&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;https://api.cloudflare.com/client/v4/accounts/&lt;/span&gt;&lt;span&gt;$ACCOUNT_ID&lt;/span&gt;&lt;span&gt;/ai-search/instances&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;-H&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Authorization: Bearer &lt;/span&gt;&lt;span&gt;$API_TOKEN&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;-H&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;--data&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;id&quot;: &quot;docs-&apos;&quot;&lt;/span&gt;&lt;span&gt;$lang&lt;/span&gt;&lt;span&gt;&quot;&apos;&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;type&quot;: &quot;web-crawler&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;source&quot;: &quot;example.com&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;source_params&quot;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;path_include&quot;: [&quot;**/&apos;&quot;&lt;/span&gt;&lt;span&gt;$lang&lt;/span&gt;&lt;span&gt;&quot;&apos;/**&quot;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;done&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Refer to the &lt;a href=&quot;https://developers.cloudflare.com/api/resources/ai_search/subresources/instances/methods/create/&quot;&gt;REST API reference&lt;/a&gt; for additional configuration options.&lt;/p&gt;</description><pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>KV - New Workers KV Dashboard UI</title><link>https://developers.cloudflare.com/changelog/post/2026-01-20-kv-dash-ui-homepage/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-20-kv-dash-ui-homepage/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/kv/&quot;&gt;Workers KV&lt;/a&gt; has an updated dashboard UI with new dashboard styling that makes it easier to navigate and see analytics and settings for a KV namespace.&lt;/p&gt;
&lt;p&gt;The new dashboard features a &lt;strong&gt;streamlined homepage&lt;/strong&gt; for easy access to your namespaces and key operations, with consistent design with the rest of the dashboard UI updates. It also provides an &lt;strong&gt;improved analytics view&lt;/strong&gt;.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/kv-dash-ui-homepage.BT5hNntj_1OgUmv.webp&quot; alt=&quot;New KV Dashboard Homepage&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;The updated dashboard is now available for all Workers KV users. Log in to the &lt;a href=&quot;https://dash.cloudflare.com/&quot; target=&quot;_blank&quot;&gt;Cloudflare Dashboard&lt;/a&gt; to start exploring the new interface.&lt;/p&gt;</description><pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate><product>KV</product><category>KV</category></item><item><title>Workers - Use auxiliary Workers alongside full-stack frameworks</title><link>https://developers.cloudflare.com/changelog/post/2026-01-20-auxiliary-workers/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-20-auxiliary-workers/</guid><description>&lt;p&gt;Auxiliary Workers are now fully supported when using full-stack frameworks, such as &lt;a href=&quot;https://developers.cloudflare.com/workers/framework-guides/web-apps/react-router/&quot;&gt;React Router&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/workers/framework-guides/web-apps/tanstack-start/&quot;&gt;TanStack Start&lt;/a&gt;, that integrate with the &lt;a href=&quot;https://developers.cloudflare.com/workers/vite-plugin/reference/api/&quot;&gt;Cloudflare Vite plugin&lt;/a&gt;.
They are included alongside the framework&apos;s build output in the build output directory.
Note that this feature requires Vite 7 or above.&lt;/p&gt;
&lt;p&gt;Auxiliary Workers are additional Workers that can be called via &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings/&quot;&gt;service bindings&lt;/a&gt; from your main (entry) Worker.
They are defined in the plugin config, as in the example below:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineConfig&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;vite&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tanstackStart&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@tanstack/react-start/plugin/vite&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cloudflare&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@cloudflare/vite-plugin&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineConfig&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;plugins&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;tanstackStart&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;cloudflare&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;viteEnvironment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;ssr&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;auxiliaryWorkers&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; configPath&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./wrangler.aux.jsonc&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;See the Vite plugin &lt;a href=&quot;https://developers.cloudflare.com/workers/vite-plugin/reference/api/&quot;&gt;API docs&lt;/a&gt; for more info.&lt;/p&gt;</description><pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Import SQL files as additional modules by default</title><link>https://developers.cloudflare.com/changelog/post/2026-01-20-sql-module-rule/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-20-sql-module-rule/</guid><description>&lt;p&gt;The &lt;code&gt;.sql&lt;/code&gt; file extension is now automatically configured to be importable in your Worker code when using &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/bundling/#including-non-javascript-modules&quot;&gt;Wrangler&lt;/a&gt; or the &lt;a href=&quot;https://developers.cloudflare.com/workers/vite-plugin/reference/non-javascript-modules/&quot;&gt;Cloudflare Vite plugin&lt;/a&gt;.
This is particular useful for importing migrations in Durable Objects and means you no longer need to configure custom rules when using &lt;a href=&quot;https://orm.drizzle.team/docs/connect-cloudflare-do&quot; target=&quot;_blank&quot;&gt;Drizzle&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;SQL files are imported as JavaScript strings:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// `example` will be a JavaScript string&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;example&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;./example.sql&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;</description><pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers AI - Launching FLUX.2 [klein] 4B on Workers AI</title><link>https://developers.cloudflare.com/changelog/post/2026-01-15-flux-2-klein-4b-workers-ai/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-15-flux-2-klein-4b-workers-ai/</guid><description>&lt;p&gt;We&apos;ve partnered with Black Forest Labs (BFL) again to bring their optimized FLUX.2 [klein] 4B model to Workers AI! This distilled model offers faster generation and cost-effective pricing, while maintaining great output quality. With a fixed 4-step inference process, Klein 4B is ideal for rapid prototyping and real-time applications where speed matters.&lt;/p&gt;
&lt;p&gt;Read the &lt;a href=&quot;https://bfl.ai/blog&quot; target=&quot;_blank&quot;&gt;BFL blog&lt;/a&gt; to learn more about the model itself, or try it out yourself on our &lt;a href=&quot;https://multi-modal.ai.cloudflare.com/&quot; target=&quot;_blank&quot;&gt;multi modal playground&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pricing documentation is available on the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/flux-2-klein-4b/&quot;&gt;model page&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/platform/pricing/&quot;&gt;pricing page&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Workers AI Platform specifics&lt;/h4&gt;
&lt;p&gt;The model hosted on Workers AI is optimized for speed with a &lt;strong&gt;fixed 4-step inference process&lt;/strong&gt; and supports up to 4 image inputs. Since this is a distilled model, the &lt;code&gt;steps&lt;/code&gt; parameter is fixed at 4 and cannot be adjusted. Like FLUX.2 [dev], this image model uses multipart form data inputs, even if you just have a prompt.&lt;/p&gt;
&lt;p&gt;With the REST API, the multipart form data input looks like this:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--request&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;POST&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--url&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;https://api.cloudflare.com/client/v4/accounts/{ACCOUNT}/ai/run/@cf/black-forest-labs/flux-2-klein-4b&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--header&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;Authorization: Bearer {TOKEN}&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--header&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;Content-Type: multipart/form-data&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--form&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;prompt=a sunset at the alps&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--form&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;width=&lt;/span&gt;&lt;span&gt;1024&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--form&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;height=&lt;/span&gt;&lt;span&gt;1024&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;With the Workers AI binding, you can use it as such:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;form&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;FormData&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;form&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;append&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;prompt&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;a sunset with a dog&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;form&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;append&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;width&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;1024&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;form&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;append&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;height&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;1024&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// FormData doesn&apos;t expose its serialized body or boundary. Passing it to a&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Request (or Response) constructor serializes it and generates the Content-Type&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// header with the boundary, which is required for the server to parse the multipart fields.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formResponse&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;form&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formStream&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formContentType&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;content-type&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;resp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AI&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;@cf/black-forest-labs/flux-2-klein-4b&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;multipart&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formStream&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;contentType&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formContentType&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The parameters you can send to the model are detailed here:&lt;/p&gt;
&lt;details&gt;&lt;p&gt;&lt;/p&gt;&lt;summary&gt;JSON Schema for Model&lt;/summary&gt;
&lt;strong&gt;Required Parameters&lt;/strong&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;prompt&lt;/code&gt; (string) - Text description of the image to generate&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Optional Parameters&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;input_image_0&lt;/code&gt; (string) - Binary image&lt;/li&gt;
&lt;li&gt;&lt;code&gt;input_image_1&lt;/code&gt; (string) - Binary image&lt;/li&gt;
&lt;li&gt;&lt;code&gt;input_image_2&lt;/code&gt; (string) - Binary image&lt;/li&gt;
&lt;li&gt;&lt;code&gt;input_image_3&lt;/code&gt; (string) - Binary image&lt;/li&gt;
&lt;li&gt;&lt;code&gt;guidance&lt;/code&gt; (float) - Guidance scale for generation. Higher values follow the prompt more closely&lt;/li&gt;
&lt;li&gt;&lt;code&gt;width&lt;/code&gt; (integer) - Width of the image, default &lt;code&gt;1024&lt;/code&gt; Range: 256-1920&lt;/li&gt;
&lt;li&gt;&lt;code&gt;height&lt;/code&gt; (integer) - Height of the image, default &lt;code&gt;768&lt;/code&gt; Range: 256-1920&lt;/li&gt;
&lt;li&gt;&lt;code&gt;seed&lt;/code&gt; (integer) - Seed for reproducibility&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Since this is a distilled model, the &lt;code&gt;steps&lt;/code&gt; parameter is fixed at 4 and cannot be adjusted.&lt;/p&gt;&lt;/details&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;plaintext&quot;&gt;&lt;code class=&quot;language-plaintext&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;## Multi-Reference Images&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;The FLUX.2 klein-4b model supports generating images based on reference images, just like FLUX.2 [dev]. You can use this feature to apply the style of one image to another, add a new character to an image, or iterate on past generated images. You would use it with the same multipart form data structure, with the input images in binary. The model supports up to 4 input images.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;For the prompt, you can reference the images based on the index, like `take the subject of image 1 and style it like image 0` or even use natural language like `place the dog beside the woman`.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Note: you have to name the input parameter as `input_image_0`, `input_image_1`, `input_image_2`, `input_image_3` for it to work correctly. All input images must be smaller than 512x512.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;```bash&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl --request POST \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--url &apos;https://api.cloudflare.com/client/v4/accounts/{ACCOUNT}/ai/run/@cf/black-forest-labs/flux-2-klein-4b&apos; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--header &apos;Authorization: Bearer {TOKEN}&apos; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--header &apos;Content-Type: multipart/form-data&apos; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--form &apos;prompt=take the subject of image 1 and style it like image 0&apos; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--form input_image_0=@/Users/johndoe/Desktop/icedoutkeanu.png \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--form input_image_1=@/Users/johndoe/Desktop/me.png \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--form width=1024 \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--form height=1024&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Through Workers AI Binding:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;//helper function to convert ReadableStream to Blob&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;streamToBlob&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;stream&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ReadableStream&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;contentType&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Promise&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Blob&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;reader&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stream&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getReader&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;chunks&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; []&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;while&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;done&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;reader&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;read&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;done&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;break&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;chunks&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;push&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Blob&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;chunks&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;contentType&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;image0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;http://image-url&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;image1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;http://image-url&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;form&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;FormData&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;image_blob0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;streamToBlob&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;image0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;image/png&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;image_blob1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;streamToBlob&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;image1&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;image/png&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;form&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;append&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;input_image_0&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;image_blob0&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;form&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;append&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;input_image_1&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;image_blob1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;form&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;append&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;prompt&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;take the subject of image 1 and style it like image 0&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// FormData doesn&apos;t expose its serialized body or boundary. Passing it to a&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Request (or Response) constructor serializes it and generates the Content-Type&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// header with the boundary, which is required for the server to parse the multipart fields.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formResponse&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;form&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formStream&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formContentType&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;content-type&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;resp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AI&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;@cf/black-forest-labs/flux-2-klein-4b&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;multipart&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formStream&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;contentType&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formContentType&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;</description><pubDate>Thu, 15 Jan 2026 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category></item><item><title>Workers - `wrangler types` now generates types for all environments</title><link>https://developers.cloudflare.com/changelog/post/2026-01-13-wrangler-types-multi-environment/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-13-wrangler-types-multi-environment/</guid><description>&lt;p&gt;The &lt;code&gt;wrangler types&lt;/code&gt; command now generates TypeScript types for bindings from &lt;strong&gt;all environments&lt;/strong&gt; defined in your Wrangler configuration file by default.&lt;/p&gt;
&lt;p&gt;Previously, &lt;code&gt;wrangler types&lt;/code&gt; only generated types for bindings in the top-level configuration (or a single environment when using the &lt;code&gt;--env&lt;/code&gt; flag). This meant that if you had environment-specific bindings — for example, a KV namespace only in production or an R2 bucket only in staging — those bindings would be missing from your generated types, causing TypeScript errors when accessing them.&lt;/p&gt;
&lt;p&gt;Now, running &lt;code&gt;wrangler types&lt;/code&gt; collects bindings from all environments and includes them in the generated &lt;code&gt;Env&lt;/code&gt; type. This ensures your types are complete regardless of which environment you deploy to.&lt;/p&gt;
&lt;h4&gt;Generating types for a specific environment&lt;/h4&gt;
&lt;p&gt;If you want the previous behavior of generating types for only a specific environment, you can use the &lt;code&gt;--env&lt;/code&gt; flag:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;types&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--env&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;production&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/general/#types&quot;&gt;generating types for your Worker&lt;/a&gt; in the Wrangler documentation.&lt;/p&gt;</description><pubDate>Tue, 13 Jan 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Validate your generated types with `wrangler types --check`</title><link>https://developers.cloudflare.com/changelog/post/2026-01-11-wrangler-types-check/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-11-wrangler-types-check/</guid><description>&lt;p&gt;Wrangler now supports a &lt;code&gt;--check&lt;/code&gt; flag for the &lt;code&gt;wrangler types&lt;/code&gt; command. This flag validates that your generated types are up to date without writing any changes to disk.&lt;/p&gt;
&lt;p&gt;This is useful in CI/CD pipelines where you want to ensure that developers have regenerated their types after making changes to their Wrangler configuration. If the types are out of date, the command will exit with a non-zero status code.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;types&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--check&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;If your types are up to date, the command will succeed silently. If they are out of date, you&apos;ll see an error message indicating which files need to be regenerated.&lt;/p&gt;
&lt;p&gt;For more information, see the &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/general/#types&quot;&gt;Wrangler types documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 12 Jan 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers, Queues - Get notified when your Workers builds succeed or fail</title><link>https://developers.cloudflare.com/changelog/post/2025-12-11-builds-event-subscriptions/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-11-builds-event-subscriptions/</guid><description>&lt;p&gt;You can now receive notifications when your Workers&apos; builds start, succeed, fail, or get cancelled using &lt;a href=&quot;https://developers.cloudflare.com/queues/event-subscriptions/&quot;&gt;Event Subscriptions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/&quot;&gt;Workers Builds&lt;/a&gt; publishes events to a &lt;a href=&quot;https://developers.cloudflare.com/queues/&quot;&gt;Queue&lt;/a&gt; that your Worker can read messages from, and then send notifications wherever you need — Slack, Discord, email, or any webhook endpoint.&lt;/p&gt;
&lt;p&gt;You can deploy &lt;a href=&quot;https://github.com/cloudflare/templates/tree/main/workers-builds-notifications-template&quot; target=&quot;_blank&quot;&gt;this Worker&lt;/a&gt; to your own Cloudflare account to send build notifications to Slack:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://deploy.workers.cloudflare.com/?url=https://github.com/cloudflare/templates/tree/main/workers-builds-notifications-template&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://deploy.workers.cloudflare.com/button&quot; alt=&quot;Deploy to Cloudflare&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The template includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Build status with Preview/Live URLs for successful deployments&lt;/li&gt;
&lt;li&gt;Inline error messages for failed builds&lt;/li&gt;
&lt;li&gt;Branch, commit hash, and author name&lt;/li&gt;
&lt;/ul&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/builds-notifications-slack.rcRiU95L_169ufw.webp&quot; alt=&quot;Slack notifications showing build events&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;For setup instructions, refer to the &lt;a href=&quot;https://github.com/cloudflare/templates/tree/main/workers-builds-notifications-template#readme&quot; target=&quot;_blank&quot;&gt;template README&lt;/a&gt; or the &lt;a href=&quot;https://developers.cloudflare.com/queues/event-subscriptions/manage-event-subscriptions/&quot;&gt;Event Subscriptions documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 09 Jan 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category><category>Queues</category></item><item><title>Workers - Shell tab completions for Wrangler CLI</title><link>https://developers.cloudflare.com/changelog/post/2026-01-09-wrangler-tab-completion/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-09-wrangler-tab-completion/</guid><description>&lt;p&gt;Wrangler now includes built-in shell tab completion support, making it faster and easier to navigate commands without memorizing every option. Press Tab as you type to autocomplete commands, subcommands, flags, and even option values like log levels.&lt;/p&gt;
&lt;p&gt;Tab completions are supported for Bash, Zsh, Fish, and PowerShell.&lt;/p&gt;
&lt;h4&gt;Setup&lt;/h4&gt;
&lt;p&gt;Generate the completion script for your shell and add it to your configuration file:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Bash&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;complete&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bash&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/.bashrc&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Zsh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;complete&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;zsh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/.zshrc&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Fish&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;complete&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fish&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/.config/fish/config.fish&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# PowerShell&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;complete&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;powershell&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$PROFILE&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;After adding the script, restart your terminal or source your configuration file for the changes to take effect. Then you can simply press Tab to see available completions:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;d&amp;#x3C;TAB&gt;&lt;/span&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;# completes to &apos;deploy&apos;, &apos;dev&apos;, &apos;d1&apos;, etc.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;kv&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;#x3C;TAB&gt;&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# shows subcommands: namespace, key, bulk&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Tab completions are dynamically generated from Wrangler&apos;s command registry, so they stay up-to-date as new commands and options are added. This feature is powered by &lt;a href=&quot;https://github.com/bombshell-dev/tab/&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;@bomb.sh/tab&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;See the &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/general/#complete&quot;&gt;&lt;code&gt;wrangler complete&lt;/code&gt; documentation&lt;/a&gt; for more details.&lt;/p&gt;</description><pubDate>Fri, 09 Jan 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers Analytics Engine, Workers - Workers Analytics Engine SQL now supports filtering using HAVING and LIKE</title><link>https://developers.cloudflare.com/changelog/post/2026-01-07-analytics-engine-support-for-like-and-having/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-07-analytics-engine-support-for-like-and-having/</guid><description>&lt;p&gt;You can now use the &lt;code&gt;HAVING&lt;/code&gt; clause and &lt;code&gt;LIKE&lt;/code&gt; pattern matching operators in &lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/&quot; target=&quot;_blank&quot;&gt;Workers Analytics Engine&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Workers Analytics Engine allows you to ingest and store high-cardinality data at scale and query your data through a simple SQL API.&lt;/p&gt;
&lt;h4&gt;Filtering using &lt;code&gt;HAVING&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;The &lt;code&gt;HAVING&lt;/code&gt; clause complements the &lt;code&gt;WHERE&lt;/code&gt; clause by enabling you to filter groups based on aggregate values. While &lt;code&gt;WHERE&lt;/code&gt; filters rows before aggregation, &lt;code&gt;HAVING&lt;/code&gt; filters groups after aggregation is complete.&lt;/p&gt;
&lt;p&gt;You can use &lt;code&gt;HAVING&lt;/code&gt; to filter groups where the average exceeds a threshold:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;blob1 &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; probe_name,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;avg&lt;/span&gt;&lt;span&gt;(double1) &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; average_temp&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; temperature_readings&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;GROUP BY&lt;/span&gt;&lt;span&gt; probe_name&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;HAVING&lt;/span&gt;&lt;span&gt; average_temp &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;You can also filter groups based on aggregates such as the number of items in the group:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;blob1 &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; probe_name,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; num_readings&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; temperature_readings&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;GROUP BY&lt;/span&gt;&lt;span&gt; probe_name&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;HAVING&lt;/span&gt;&lt;span&gt; num_readings &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Pattern matching using &lt;code&gt;LIKE&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;The new pattern matching operators enable you to search for strings that match specific patterns using wildcard characters:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;LIKE&lt;/code&gt; - case-sensitive pattern matching&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NOT LIKE&lt;/code&gt; - case-sensitive pattern exclusion&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ILIKE&lt;/code&gt; - case-insensitive pattern matching&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NOT ILIKE&lt;/code&gt; - case-insensitive pattern exclusion&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pattern matching supports two wildcard characters: &lt;code&gt;%&lt;/code&gt; (matches zero or more characters) and &lt;code&gt;_&lt;/code&gt; (matches exactly one character).&lt;/p&gt;
&lt;p&gt;You can match strings starting with a prefix:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; logs&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; blob1 &lt;/span&gt;&lt;span&gt;LIKE&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;error%&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;You can also match file extensions (case-insensitive):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; requests&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; blob2 ILIKE &lt;/span&gt;&lt;span&gt;&apos;%.jpg&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Another example is excluding strings containing specific text:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; events&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; blob3 &lt;/span&gt;&lt;span&gt;NOT&lt;/span&gt;&lt;span&gt; ILIKE &lt;/span&gt;&lt;span&gt;&apos;%debug%&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Ready to get started?&lt;/h4&gt;
&lt;p&gt;Learn more about the &lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/sql-reference/statements/#having-clause&quot;&gt;&lt;code&gt;HAVING&lt;/code&gt; clause&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/sql-reference/operators/#pattern-matching-operators&quot;&gt;pattern matching operators&lt;/a&gt; in the Workers Analytics Engine SQL reference documentation.&lt;/p&gt;</description><pubDate>Wed, 07 Jan 2026 00:00:00 GMT</pubDate><product>Workers Analytics Engine</product><category>Workers Analytics Engine</category><category>Workers</category></item><item><title>Containers - Custom container instance types now available for all users</title><link>https://developers.cloudflare.com/changelog/post/2026-01-05-custom-instance-types/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-05-custom-instance-types/</guid><description>&lt;p&gt;Custom instance types are now enabled for all &lt;a href=&quot;https://developers.cloudflare.com/containers&quot;&gt;Cloudflare Containers&lt;/a&gt; users. You can now specify specific vCPU, memory, and disk amounts, rather than being limited to pre-defined &lt;a href=&quot;https://developers.cloudflare.com/containers/platform-details/limits/#instance-types&quot;&gt;instance types&lt;/a&gt;. Previously, only select Enterprise customers were able to customize their instance type.&lt;/p&gt;
&lt;p&gt;To use a custom instance type, specify the &lt;code&gt;instance_type&lt;/code&gt; property as an object with &lt;code&gt;vcpu&lt;/code&gt;, &lt;code&gt;memory_mib&lt;/code&gt;, and &lt;code&gt;disk_mb&lt;/code&gt; fields in your Wrangler configuration:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;toml&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[[&lt;/span&gt;&lt;span&gt;containers&lt;/span&gt;&lt;span&gt;]]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./Dockerfile&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;instance_type&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;vcpu&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;memory_mib&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;6144&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;disk_mb&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;12000&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Individual limits for custom instance types are based on the &lt;code&gt;standard-4&lt;/code&gt; instance type (4 vCPU, 12 GiB memory, 20 GB disk). You must allocate at least 1 vCPU for custom instance types. For workloads requiring less than 1 vCPU, use the predefined instance types like &lt;code&gt;lite&lt;/code&gt; or &lt;code&gt;basic&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;See the &lt;a href=&quot;https://developers.cloudflare.com/containers/platform-details/limits/#custom-instance-types&quot;&gt;limits documentation&lt;/a&gt; for the full list of constraints on custom instance types.
See the &lt;a href=&quot;https://developers.cloudflare.com/containers/get-started/&quot;&gt;getting started guide&lt;/a&gt; to deploy your first Container,&lt;/p&gt;</description><pubDate>Mon, 05 Jan 2026 00:00:00 GMT</pubDate><product>Containers</product><category>Containers</category></item><item><title>Workers - Build microfrontend applications on Workers</title><link>https://developers.cloudflare.com/changelog/post/2026-01-01-microfrontends/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-01-microfrontends/</guid><description>&lt;p&gt;You can now deploy microfrontends to Cloudflare, splitting a single application into smaller, independently deployable units that render as one cohesive application. This lets different teams using different frameworks develop, test, and deploy each microfrontend without coordinating releases.&lt;/p&gt;
&lt;p&gt;Microfrontends solve several challenges for large-scale applications:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Independent deployments&lt;/strong&gt;: Teams deploy updates on their own schedule without redeploying the entire application&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Framework flexibility&lt;/strong&gt;: Build multi-framework applications (for example, Astro, Remix, and Next.js in one app)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gradual migration&lt;/strong&gt;: Migrate from a monolith to a distributed architecture incrementally&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Create a microfrontend project:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers-and-pages/create?type=vmfe&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://deploy.workers.cloudflare.com/button&quot; alt=&quot;Deploy to Cloudflare&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This template automatically creates a router worker with pre-configured routing logic, and lets you configure &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings/&quot;&gt;Service bindings&lt;/a&gt; to Workers you have already deployed to your Cloudflare account. The router Worker analyzes incoming requests, matches them against configured routes, and forwards requests to the appropriate microfrontend via service bindings. The router automatically rewrites HTML, CSS, and headers to ensure assets load correctly from each microfrontend&apos;s mount path. The router includes advanced features like preloading for faster navigation between microfrontends, smooth page transitions using the View Transitions API, and automatic path rewriting for assets, redirects, and cookies.&lt;/p&gt;
&lt;p&gt;Each microfrontend can be a full-framework application, a static site with Workers Static Assets, or any other Worker-based application.&lt;/p&gt;
&lt;p&gt;Get started with the &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers-and-pages/create?type=vmfe&quot; target=&quot;_blank&quot;&gt;microfrontends template&lt;/a&gt;, or read the &lt;a href=&quot;https://developers.cloudflare.com/workers/framework-guides/web-apps/microfrontends/&quot;&gt;microfrontends documentation&lt;/a&gt; for implementation details.&lt;/p&gt;</description><pubDate>Thu, 01 Jan 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Agents, Workers - Agents SDK v0.3.0, workers-ai-provider v3.0.0, and ai-gateway-provider v3.0.0 with AI SDK v6 support</title><link>https://developers.cloudflare.com/changelog/post/2025-12-22-agents-sdk-ai-sdk-v6/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-22-agents-sdk-ai-sdk-v6/</guid><description>&lt;p&gt;We&apos;ve shipped a new release for the &lt;a href=&quot;https://github.com/cloudflare/agents&quot; target=&quot;_blank&quot;&gt;Agents SDK&lt;/a&gt; v0.3.0 bringing full compatibility with &lt;a href=&quot;https://ai-sdk.dev/docs/introduction&quot; target=&quot;_blank&quot;&gt;AI SDK v6&lt;/a&gt; and introducing the unified tool pattern, dynamic tool approval, and enhanced React hooks with improved tool handling.&lt;/p&gt;
&lt;p&gt;This release includes improved streaming and tool support, dynamic tool approval (for &quot;human in the loop&quot; systems), enhanced React hooks with &lt;code&gt;onToolCall&lt;/code&gt; callback, improved error handling for streaming responses, and seamless migration from v5 patterns.&lt;/p&gt;
&lt;p&gt;This makes it ideal for building production AI chat interfaces with Cloudflare Workers AI models, agent workflows, human-in-the-loop systems, or any application requiring reliable tool execution and approval workflows.&lt;/p&gt;
&lt;p&gt;Additionally, we&apos;ve updated &lt;strong&gt;workers-ai-provider v3.0.0&lt;/strong&gt;, the official provider for Cloudflare Workers AI models, and &lt;strong&gt;ai-gateway-provider v3.0.0&lt;/strong&gt;, the provider for Cloudflare AI Gateway, to be compatible with AI SDK v6.&lt;/p&gt;
&lt;h4&gt;Agents SDK v0.3.0&lt;/h4&gt;
&lt;h4&gt;Unified Tool Pattern&lt;/h4&gt;
&lt;p&gt;AI SDK v6 introduces a unified tool pattern where all tools are defined on the server using the &lt;code&gt;tool()&lt;/code&gt; function. This replaces the previous client-side &lt;code&gt;AITool&lt;/code&gt; pattern.&lt;/p&gt;
&lt;h4&gt;Server-Side Tool Definition&lt;/h4&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tool&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;ai&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;zod&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Server: Define ALL tools on the server&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tools&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Server-executed tool&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;getWeather&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tool&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Get weather for a city&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;inputSchema&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;object&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; city&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;execute&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;city&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetchWeather&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;city&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Client-executed tool (no execute = client handles via onToolCall)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;getLocation&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tool&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Get user location from browser&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;inputSchema&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;object&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// No execute function&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Tool requiring approval (dynamic based on input)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;processPayment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tool&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Process a payment&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;inputSchema&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;object&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; amount&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;number&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;needsApproval&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;amount&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;amount&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;execute&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;amount&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;charge&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;amount&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Client-Side Tool Handling&lt;/h4&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Client: Handle client-side tools via onToolCall callback&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;useAgentChat&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;agents/ai-react&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;messages&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sendMessage&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;addToolOutput&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;useAgentChat&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;agent&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;onToolCall&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;toolCall&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;addToolOutput&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;toolCall&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toolName&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;===&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;getLocation&quot;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;position&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Promise&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;resolve&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;reject&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;navigator&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;geolocation&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getCurrentPosition&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;resolve&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;reject&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;addToolOutput&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;toolCallId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;toolCall&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toolCallId&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;lat&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;position&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;coords&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;latitude&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;lng&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;position&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;coords&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;longitude&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Key benefits of the unified tool pattern:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Server-defined tools&lt;/strong&gt;: All tools are defined in one place on the server&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dynamic approval&lt;/strong&gt;: Use &lt;code&gt;needsApproval&lt;/code&gt; to conditionally require user confirmation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cleaner client code&lt;/strong&gt;: Use &lt;code&gt;onToolCall&lt;/code&gt; callback instead of managing tool configs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Type safety&lt;/strong&gt;: Full TypeScript support with proper tool typing&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;useAgentChat(options)&lt;/h4&gt;
&lt;p&gt;Creates a new chat interface with enhanced v6 capabilities.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Basic chat setup with onToolCall&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;messages&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sendMessage&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;addToolOutput&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;useAgentChat&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;agent&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;onToolCall&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;toolCall&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;addToolOutput&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Handle client-side tool execution&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;addToolOutput&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;toolCallId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;toolCall&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toolCallId&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;success&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Dynamic Tool Approval&lt;/h4&gt;
&lt;p&gt;Use &lt;code&gt;needsApproval&lt;/code&gt; on server tools to conditionally require user confirmation:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;paymentTool&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tool&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Process a payment&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;inputSchema&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;object&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;amount&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;number&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;recipient&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;needsApproval&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;amount&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;amount&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1000&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;execute&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;amount&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;recipient&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;processPayment&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;amount&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;recipient&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Tool Confirmation Detection&lt;/h4&gt;
&lt;p&gt;The &lt;code&gt;isToolUIPart&lt;/code&gt; and &lt;code&gt;getToolName&lt;/code&gt; functions now check both static and dynamic tool parts:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;isToolUIPart&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getToolName&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;ai&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pendingToolCallConfirmation&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;messages&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;some&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;parts&lt;/span&gt;&lt;span&gt;?.&lt;/span&gt;&lt;span&gt;some&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;part&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;isToolUIPart&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;part&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;&amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;part&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;state&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;===&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;input-available&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Handle tool confirmation&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;pendingToolCallConfirmation&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;addToolOutput&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;toolCallId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;part&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toolCallId&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;User approved the action&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;If you need the v5 behavior (static-only checks), use the new functions:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;isStaticToolUIPart&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getStaticToolName&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;ai&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;convertToModelMessages() is now async&lt;/h4&gt;
&lt;p&gt;The &lt;code&gt;convertToModelMessages()&lt;/code&gt; function is now asynchronous. Update all calls to await the result:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;convertToModelMessages&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;ai&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;streamText&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;messages&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;convertToModelMessages&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;messages&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;openai&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;gpt-4o&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;ModelMessage type&lt;/h4&gt;
&lt;p&gt;The &lt;code&gt;CoreMessage&lt;/code&gt; type has been removed. Use &lt;code&gt;ModelMessage&lt;/code&gt; instead:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;convertToModelMessages&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt; type &lt;/span&gt;&lt;span&gt;ModelMessage&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;ai&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;modelMessages&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModelMessage&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;convertToModelMessages&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;messages&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;generateObject mode option removed&lt;/h4&gt;
&lt;p&gt;The &lt;code&gt;mode&lt;/code&gt; option for &lt;code&gt;generateObject&lt;/code&gt; has been removed:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Before (v5)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;generateObject&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;mode&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;json&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;schema&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;prompt&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// After (v6)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;generateObject&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;schema&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;prompt&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Structured Output with generateText&lt;/h4&gt;
&lt;p&gt;While &lt;code&gt;generateObject&lt;/code&gt; and &lt;code&gt;streamObject&lt;/code&gt; are still functional, the recommended approach is to use &lt;code&gt;generateText&lt;/code&gt;/&lt;code&gt;streamText&lt;/code&gt; with the &lt;code&gt;Output.object()&lt;/code&gt; helper:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;generateText&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Output&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stepCountIs&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;ai&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;generateText&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;openai&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;gpt-4&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Output&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;object&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;schema&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;object&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;stopWhen&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stepCountIs&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;prompt&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Generate a name&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: When using structured output with &lt;code&gt;generateText&lt;/code&gt;, you must configure multiple steps with &lt;code&gt;stopWhen&lt;/code&gt; because generating the structured output is itself a step.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;workers-ai-provider v3.0.0&lt;/h4&gt;
&lt;p&gt;Seamless integration with Cloudflare Workers AI models through the updated workers-ai-provider v3.0.0 with AI SDK v6 support.&lt;/p&gt;
&lt;h4&gt;Model Setup with Workers AI&lt;/h4&gt;
&lt;p&gt;Use Cloudflare Workers AI models directly in your agent workflows:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;createWorkersAI&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;workers-ai-provider&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;useAgentChat&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;agents/ai-react&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Create Workers AI model (v3.0.0 - enhanced v6 internals)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;createWorkersAI&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;binding&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AI&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)(&lt;/span&gt;&lt;span&gt;&quot;@cf/meta/llama-3.2-3b-instruct&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Enhanced File and Image Support&lt;/h4&gt;
&lt;p&gt;Workers AI models now support v6 file handling with automatic conversion:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Send images and files to Workers AI models&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sendMessage&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;role&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;user&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;parts&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;text&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; text&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Analyze this image:&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;file&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;imageBuffer&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;mediaType&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;image/jpeg&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Workers AI provider automatically converts to proper format&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Streaming with Workers AI&lt;/h4&gt;
&lt;p&gt;Enhanced streaming support with automatic warning detection:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Streaming with Workers AI models&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;streamText&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;createWorkersAI&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; binding&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AI&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)(&lt;/span&gt;&lt;span&gt;&quot;@cf/meta/llama-3.2-3b-instruct&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;messages&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;convertToModelMessages&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;messages&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;onChunk&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;chunk&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Enhanced streaming with warning handling&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;chunk&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;ai-gateway-provider v3.0.0&lt;/h4&gt;
&lt;p&gt;The ai-gateway-provider v3.0.0 now supports AI SDK v6, enabling you to use Cloudflare AI Gateway with multiple AI providers including Anthropic, Azure, AWS Bedrock, Google Vertex, and Perplexity.&lt;/p&gt;
&lt;h4&gt;AI Gateway Setup&lt;/h4&gt;
&lt;p&gt;Use Cloudflare AI Gateway to add analytics, caching, and rate limiting to your AI applications:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;createAIGateway&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;ai-gateway-provider&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Create AI Gateway provider (v3.0.0 - enhanced v6 internals)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;createAIGateway&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;gatewayUrl&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;https://gateway.ai.cloudflare.com/v1/your-account-id/gateway&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;Authorization&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;`Bearer &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AI_GATEWAY_TOKEN&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;provider&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;openai&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;gpt-4o&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Migration from v5&lt;/h4&gt;
&lt;h4&gt;Deprecated APIs&lt;/h4&gt;
&lt;p&gt;The following APIs are deprecated in favor of the unified tool pattern:&lt;/p&gt;





































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Deprecated&lt;/th&gt;&lt;th&gt;Replacement&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;AITool&lt;/code&gt; type&lt;/td&gt;&lt;td&gt;Use AI SDK&apos;s &lt;code&gt;tool()&lt;/code&gt; function on server&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;extractClientToolSchemas()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Define tools on server, no client schemas needed&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;createToolsFromClientSchemas()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Define tools on server with &lt;code&gt;tool()&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;toolsRequiringConfirmation&lt;/code&gt; option&lt;/td&gt;&lt;td&gt;Use &lt;code&gt;needsApproval&lt;/code&gt; on server tools&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;experimental_automaticToolResolution&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Use &lt;code&gt;onToolCall&lt;/code&gt; callback&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;tools&lt;/code&gt; option in &lt;code&gt;useAgentChat&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Use &lt;code&gt;onToolCall&lt;/code&gt; for client-side execution&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;addToolResult()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Use &lt;code&gt;addToolOutput()&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h4&gt;Breaking Changes Summary&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Unified Tool Pattern&lt;/strong&gt;: All tools must be defined on the server using &lt;code&gt;tool()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;convertToModelMessages()&lt;/code&gt; is async&lt;/strong&gt;: Add &lt;code&gt;await&lt;/code&gt; to all calls&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;CoreMessage&lt;/code&gt; removed&lt;/strong&gt;: Use &lt;code&gt;ModelMessage&lt;/code&gt; instead&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;generateObject&lt;/code&gt; mode removed&lt;/strong&gt;: Remove &lt;code&gt;mode&lt;/code&gt; option&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;isToolUIPart&lt;/code&gt; behavior changed&lt;/strong&gt;: Now checks both static and dynamic tool parts&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Installation&lt;/h4&gt;
&lt;p&gt;Update your dependencies to use the latest versions:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;agents@^0.3.0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;workers-ai-provider@^3.0.0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ai-gateway-provider@^3.0.0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ai@^6.0.0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@ai-sdk/react@^3.0.0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@ai-sdk/openai@^3.0.0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Resources&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/cloudflare/agents/blob/main/docs/migration-to-ai-sdk-v6.md&quot; target=&quot;_blank&quot;&gt;Migration Guide&lt;/a&gt; - Comprehensive migration documentation from v5 to v6&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ai-sdk.dev/docs/migration-guides/migration-guide-6-0&quot; target=&quot;_blank&quot;&gt;AI SDK v6 Documentation&lt;/a&gt; - Official AI SDK migration guide&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://vercel.com/blog/ai-sdk-6&quot; target=&quot;_blank&quot;&gt;AI SDK v6 Announcement&lt;/a&gt; - Learn about new features in v6&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sdk.vercel.ai/docs&quot; target=&quot;_blank&quot;&gt;AI SDK Documentation&lt;/a&gt; - Complete AI SDK reference&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/cloudflare/agents/issues&quot; target=&quot;_blank&quot;&gt;GitHub Issues&lt;/a&gt; - Report bugs or request features&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Feedback Welcome&lt;/h4&gt;
&lt;p&gt;We&apos;d love your feedback! We&apos;re particularly interested in feedback on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Migration experience&lt;/strong&gt; - How smooth was the upgrade from v5 to v6?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unified tool pattern&lt;/strong&gt; - How does the new server-defined tool pattern work for you?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dynamic tool approval&lt;/strong&gt; - Does the &lt;code&gt;needsApproval&lt;/code&gt; feature meet your needs?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI Gateway integration&lt;/strong&gt; - How well does the new provider work with your setup?&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Mon, 22 Dec 2025 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>Workers - Static prerendering support for TanStack Start</title><link>https://developers.cloudflare.com/changelog/post/2025-12-19-tanstack-start-prerendering/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-19-tanstack-start-prerendering/</guid><description>&lt;p&gt;&lt;a href=&quot;https://tanstack.com/start/&quot; target=&quot;_blank&quot;&gt;TanStack Start&lt;/a&gt; apps can now prerender routes to static HTML at build time with access to build time environment variables
and bindings,  and serve them as &lt;a href=&quot;https://developers.cloudflare.com/workers/static-assets/&quot;&gt;static assets&lt;/a&gt;. To enable prerendering, configure the &lt;code&gt;prerender&lt;/code&gt; option of the TanStack Start plugin in your Vite config:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineConfig&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;vite&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cloudflare&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@cloudflare/vite-plugin&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tanstackStart&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@tanstack/react-start/plugin/vite&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineConfig&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;plugins&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;cloudflare&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; viteEnvironment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;ssr&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;tanstackStart&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;prerender&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;enabled&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;This feature requires &lt;code&gt;@tanstack/react-start&lt;/code&gt; v1.138.0 or later. See the &lt;a href=&quot;https://developers.cloudflare.com/workers/framework-guides/web-apps/tanstack-start/#static-prerendering&quot;&gt;TanStack Start framework guide&lt;/a&gt; for more details.&lt;/p&gt;</description><pubDate>Fri, 19 Dec 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>R2 - R2 Data Catalog now supports automatic snapshot expiration</title><link>https://developers.cloudflare.com/changelog/post/2025-12-18-r2-data-catalog-snapshot-expiration/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-18-r2-data-catalog-snapshot-expiration/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/r2/data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt; now supports automatic snapshot expiration for Apache Iceberg tables.&lt;/p&gt;
&lt;p&gt;In Apache Iceberg, a snapshot is metadata that represents the state of a table at a given point in time. Every mutation creates a new snapshot which enable powerful features like time travel queries and rollback capabilities but will accumulate over time.&lt;/p&gt;
&lt;p&gt;Without regular cleanup, these accumulated snapshots can lead to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Metadata overhead&lt;/li&gt;
&lt;li&gt;Slower table operations&lt;/li&gt;
&lt;li&gt;Increased storage costs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Snapshot expiration in R2 Data Catalog automatically removes old table snapshots based on your configured retention policy, improving performance and storage costs.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Enable catalog-level snapshot expiration&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Expire snapshots older than 7 days, always retain at least 10 recent snapshots&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;r2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bucket&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;catalog&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;snapshot-expiration&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;enable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-bucket&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--older-than-days&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;7&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--retain-last&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Snapshot expiration uses two parameters to determine which snapshots to remove:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--older-than-days&lt;/code&gt;: age threshold in days&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--retain-last&lt;/code&gt;: minimum snapshot count to retain&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both conditions must be met before a snapshot is expired, ensuring you always retain recent snapshots even if they exceed the age threshold.&lt;/p&gt;
&lt;p&gt;This feature complements &lt;a href=&quot;https://developers.cloudflare.com/r2/data-catalog/table-maintenance/&quot;&gt;automatic compaction&lt;/a&gt;, which optimizes query performance by combining small data files into larger ones. Together, these automatic maintenance operations keep your Iceberg tables performant and cost-efficient without manual intervention.&lt;/p&gt;
&lt;p&gt;To learn more about snapshot expiration and how to configure it, visit our &lt;a href=&quot;https://developers.cloudflare.com/r2/data-catalog/table-maintenance/&quot;&gt;table maintenance documentation&lt;/a&gt; or see &lt;a href=&quot;https://developers.cloudflare.com/r2/data-catalog/manage-catalogs/&quot;&gt;how to manage catalogs&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 18 Dec 2025 00:00:00 GMT</pubDate><product>R2</product><category>R2</category></item><item><title>Workers for Platforms - Workers for Platforms - Dashboard Improvements</title><link>https://developers.cloudflare.com/changelog/post/2025-12-18-dashboard-improvements/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-18-dashboard-improvements/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-for-platforms/workers-for-platforms/&quot;&gt;Workers for Platforms&lt;/a&gt; lets you build multi-tenant platforms on &lt;a href=&quot;https://developers.cloudflare.com/workers/&quot;&gt;Cloudflare Workers&lt;/a&gt;, allowing your end users to deploy and run their own code on your platform. It&apos;s designed for anyone building an AI vibe coding platform, e-commerce platform, website builder, or any product that needs to securely execute user-generated code at scale.&lt;/p&gt;
&lt;p&gt;Previously, setting up Workers for Platforms required using the API. Now, the Workers for Platforms UI supports namespace creation, dispatch worker templates, and tag management, making it easier for Workers for Platforms customers to build and manage multi-tenant platforms directly from the Cloudflare dashboard.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/dashboard-improvements.ChVWUo88_ZNokyq.webp&quot; alt=&quot;Workers for Platforms Dashboard Improvements&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;h4&gt;Key improvements&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Namespace Management:&lt;/strong&gt; You can now create and configure &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-for-platforms/workers-for-platforms/how-workers-for-platforms-works/#dispatch-namespace&quot;&gt;dispatch namespaces&lt;/a&gt; directly within the dashboard to start a new platform setup.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dispatch Worker Templates:&lt;/strong&gt; New Dispatch Worker templates allow you to quickly define how traffic is routed to individual Workers within your namespace. Refer to the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-for-platforms/workers-for-platforms/configuration/dynamic-dispatch/&quot;&gt;Dynamic Dispatch documentation&lt;/a&gt; for more examples.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tag Management:&lt;/strong&gt; You can now set and update &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-for-platforms/workers-for-platforms/configuration/tags/&quot;&gt;tags&lt;/a&gt; on User Workers, making it easier to group and manage your Workers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Binding Visibility:&lt;/strong&gt; &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-for-platforms/workers-for-platforms/configuration/bindings/&quot;&gt;Bindings&lt;/a&gt; attached to User Workers are now visible directly within the User Worker view.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deploy Vibe Coding Platform in one-click:&lt;/strong&gt; Deploy a &lt;a href=&quot;https://developers.cloudflare.com/reference-architecture/diagrams/ai/ai-vibe-coding-platform/&quot;&gt;reference implementation&lt;/a&gt; of an AI vibe coding platform directly from the dashboard. Powered by the Cloudflare&apos;s &lt;a href=&quot;https://github.com/cloudflare/vibesdk&quot; target=&quot;_blank&quot;&gt;VibeSDK&lt;/a&gt;, this starter kit integrates with Workers for Platforms to handle the deployment of AI-generated projects at scale.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To get started, go to &lt;strong&gt;Workers for Platforms&lt;/strong&gt; under &lt;strong&gt;Compute &amp;#x26; AI&lt;/strong&gt; in the &lt;a href=&quot;https://dash.cloudflare.com/&quot; target=&quot;_blank&quot;&gt;Cloudflare dashboard&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 18 Dec 2025 00:00:00 GMT</pubDate><product>Workers for Platforms</product><category>Workers for Platforms</category></item><item><title>Workers - Build image policies for Workers Builds and Cloudflare Pages</title><link>https://developers.cloudflare.com/changelog/post/2025-12-01-build-image-policies-dev-plat/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-01-build-image-policies-dev-plat/</guid><description>&lt;p&gt;We&apos;ve published build image policies for &lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/build-image/#build-image-policy&quot;&gt;Workers Builds&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/pages/configuration/build-image/#build-image-policy&quot;&gt;Cloudflare Pages&lt;/a&gt;, which establish:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Minor version updates&lt;/strong&gt;: We typically update preinstalled software to the latest available minor version without notice. For tools that don&apos;t follow semantic versioning (e.g., Bun or Hugo), we provide 3 months’ notice.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Major version updates&lt;/strong&gt;: Before preinstalled software reaches end-of-life, we update to the next stable LTS version with 3 months’ notice.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build image version deprecation (Pages only)&lt;/strong&gt;: We provide 6 months’ notice before deprecation. Projects on v1 or v2 will be automatically moved to v3 on their specified deprecation dates.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To prepare for updates, monitor the &lt;a href=&quot;https://developers.cloudflare.com/changelog/&quot; target=&quot;_blank&quot;&gt;Cloudflare Changelog&lt;/a&gt;, dashboard notifications, and email. You can also &lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/build-image/#overriding-default-versions&quot;&gt;override default versions&lt;/a&gt; to maintain specific versions.&lt;/p&gt;</description><pubDate>Thu, 18 Dec 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Retrieve your authentication token with `wrangler auth token`</title><link>https://developers.cloudflare.com/changelog/post/2025-12-18-wrangler-auth-token/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-18-wrangler-auth-token/</guid><description>&lt;p&gt;Wrangler now includes a new &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/general/#auth-token&quot;&gt;&lt;code&gt;wrangler auth token&lt;/code&gt;&lt;/a&gt; command that retrieves your current authentication token or credentials for use with other tools and scripts.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;auth&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;token&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The command returns whichever authentication method is currently configured, in priority order: API token from &lt;code&gt;CLOUDFLARE_API_TOKEN&lt;/code&gt;, or OAuth token from &lt;code&gt;wrangler login&lt;/code&gt; (automatically refreshed if expired).&lt;/p&gt;
&lt;p&gt;Use the &lt;code&gt;--json&lt;/code&gt; flag to get structured output including the token type:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;auth&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;token&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The JSON output includes the authentication type:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;jsonc&quot;&gt;&lt;code class=&quot;language-jsonc&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// API token&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;api_token&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;token&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;...&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// OAuth token&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;oauth&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;token&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;...&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// API key/email (only available with --json)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;api_key&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;...&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;email&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;...&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;API key/email credentials from &lt;code&gt;CLOUDFLARE_API_KEY&lt;/code&gt; and &lt;code&gt;CLOUDFLARE_EMAIL&lt;/code&gt; require the &lt;code&gt;--json&lt;/code&gt; flag since this method uses two values instead of a single token.&lt;/p&gt;</description><pubDate>Thu, 18 Dec 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Support for ctx.exports in @cloudflare/vitest-pool-workers</title><link>https://developers.cloudflare.com/changelog/post/2025-12-16-vitest-ctx-exports-support/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-16-vitest-ctx-exports-support/</guid><description>&lt;p&gt;The &lt;a href=&quot;https://developers.cloudflare.com/workers/testing/vitest-integration/&quot;&gt;&lt;code&gt;@cloudflare/vitest-pool-workers&lt;/code&gt;&lt;/a&gt; package now supports the &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/context/#exports&quot;&gt;&lt;code&gt;ctx.exports&lt;/code&gt; API&lt;/a&gt;, allowing you to access your Worker&apos;s top-level exports during tests.&lt;/p&gt;
&lt;p&gt;You can access &lt;code&gt;ctx.exports&lt;/code&gt; in unit tests by calling &lt;code&gt;createExecutionContext()&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;createExecutionContext&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;cloudflare:test&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;it&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;expect&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;vitest&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;it&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;can access ctx.exports&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;createExecutionContext&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;exports&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;MyEntryPoint&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;myMethod&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;expect&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toBe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;expected value&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Alternatively, you can import &lt;code&gt;exports&lt;/code&gt; directly from &lt;code&gt;cloudflare:workers&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;exports&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;cloudflare:workers&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;it&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;expect&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;vitest&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;it&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;can access imported exports&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;exports&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;MyEntryPoint&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;myMethod&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;expect&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toBe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;expected value&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;See the &lt;a href=&quot;https://github.com/cloudflare/workers-sdk/tree/main/fixtures/vitest-pool-workers-examples/context-exports&quot; target=&quot;_blank&quot;&gt;context-exports fixture&lt;/a&gt; for a complete example.&lt;/p&gt;</description><pubDate>Tue, 16 Dec 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Configure your framework for Cloudflare automatically</title><link>https://developers.cloudflare.com/changelog/post/2025-12-16-wrangler-autoconfig/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-16-wrangler-autoconfig/</guid><description>&lt;p&gt;Wrangler now supports automatic configuration for popular web frameworks in experimental mode, making it even easier to deploy to Cloudflare Workers.&lt;/p&gt;
&lt;p&gt;Previously, if you wanted to deploy an application using a popular web framework like Next.js or Astro, you had to follow tutorials to set up your application for deployment to Cloudflare Workers. This usually involved creating a Wrangler file, installing adapters, or changing configuration options.&lt;/p&gt;
&lt;p&gt;Now &lt;code&gt;wrangler deploy&lt;/code&gt; does this for you. Starting with Wrangler 4.55, you can use &lt;code&gt;npx wrangler deploy --x-autoconfig&lt;/code&gt; in the directory of any web application using one of the supported frameworks. Wrangler will then proceed to configure and deploy it to your Cloudflare account.&lt;/p&gt;
&lt;p&gt;You can also configure your application without deploying it by using the new &lt;code&gt;npx wrangler setup&lt;/code&gt; command. This enables you to easily review what changes we are making so your application is ready for Cloudflare Workers.&lt;/p&gt;
&lt;p&gt;The following application frameworks are supported starting today:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Next.js&lt;/li&gt;
&lt;li&gt;Astro&lt;/li&gt;
&lt;li&gt;Nuxt&lt;/li&gt;
&lt;li&gt;TanStack Start&lt;/li&gt;
&lt;li&gt;SolidStart&lt;/li&gt;
&lt;li&gt;React Router&lt;/li&gt;
&lt;li&gt;SvelteKit&lt;/li&gt;
&lt;li&gt;Docusaurus&lt;/li&gt;
&lt;li&gt;Qwik&lt;/li&gt;
&lt;li&gt;Analog&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Automatic configuration also supports static sites by detecting the assets directory and build command. From a single index.html file to the output of a generator like Jekyll or Hugo, you can just run &lt;code&gt;npx wrangler deploy --x-autoconfig&lt;/code&gt; to upload to Cloudflare.&lt;/p&gt;
&lt;p&gt;We&apos;re really excited to bring you automatic configuration so you can do more with Workers. Please let us know if you run into challenges using this experimentally. We’ve opened a &lt;a href=&quot;https://github.com/cloudflare/workers-sdk/discussions/11667&quot; target=&quot;_blank&quot;&gt;GitHub discussion&lt;/a&gt; and would love to hear your feedback.&lt;/p&gt;</description><pubDate>Tue, 16 Dec 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Durable Objects, Workers - New Best Practices guide for Durable Objects</title><link>https://developers.cloudflare.com/changelog/post/2025-12-15-rules-of-durable-objects/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-15-rules-of-durable-objects/</guid><description>&lt;p&gt;A new &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/best-practices/rules-of-durable-objects/&quot;&gt;Rules of Durable Objects&lt;/a&gt; guide is now available, providing opinionated best practices for building effective Durable Objects applications. This guide covers design patterns, storage strategies, concurrency, and common anti-patterns to avoid.&lt;/p&gt;
&lt;p&gt;Key guidance includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Design around your &quot;atom&quot; of coordination&lt;/strong&gt; — Create one Durable Object per logical unit (chat room, game session, user) instead of a global singleton that becomes a bottleneck.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use SQLite storage with RPC methods&lt;/strong&gt; — SQLite-backed Durable Objects with typed RPC methods provide the best developer experience and performance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Understand input and output gates&lt;/strong&gt; — Learn how Cloudflare&apos;s runtime prevents data races by default, how write coalescing works, and when to use &lt;code&gt;blockConcurrencyWhile()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Leverage Hibernatable WebSockets&lt;/strong&gt; — Reduce costs for real-time applications by allowing Durable Objects to sleep while maintaining WebSocket connections.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/examples/testing-with-durable-objects/&quot;&gt;testing documentation&lt;/a&gt; has also been updated with modern patterns using &lt;code&gt;@cloudflare/vitest-pool-workers&lt;/code&gt;, including examples for testing SQLite storage, alarms, and direct instance access:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;runDurableObjectAlarm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;cloudflare:test&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;it&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;expect&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;vitest&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;it&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;can test Durable Objects with isolated storage&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stub&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;COUNTER&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getByName&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;test&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Call RPC methods directly on the stub&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stub&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;increment&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;expect&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stub&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getCount&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toBe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Trigger alarms immediately without waiting&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;runDurableObjectAlarm&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;stub&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;runDurableObjectAlarm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;cloudflare:test&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;it&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;expect&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;vitest&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;it&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;can test Durable Objects with isolated storage&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stub&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;COUNTER&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getByName&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;test&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Call RPC methods directly on the stub&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stub&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;increment&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;expect&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stub&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getCount&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toBe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Trigger alarms immediately without waiting&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;runDurableObjectAlarm&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;stub&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;</description><pubDate>Mon, 15 Dec 2025 00:00:00 GMT</pubDate><product>Durable Objects</product><category>Durable Objects</category><category>Workers</category></item><item><title>Durable Objects, Workers - Billing for SQLite Storage</title><link>https://developers.cloudflare.com/changelog/post/2025-12-12-durable-objects-sqlite-storage-billing/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-12-durable-objects-sqlite-storage-billing/</guid><description>&lt;p&gt;Storage billing for SQLite-backed Durable Objects will be enabled in January 2026, with a target date of January 7, 2026 (no earlier).&lt;/p&gt;
&lt;p&gt;To view your SQLite storage usage, go to the &lt;strong&gt;Durable Objects&lt;/strong&gt; page&lt;/p&gt;
&lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers/durable-objects&quot; target=&quot;_blank&quot;&gt;  Go to &lt;strong&gt;Durable Objects&lt;/strong&gt;  &lt;/a&gt;
&lt;p&gt;If you do not want to incur costs, please take action such as optimizing queries or deleting unnecessary stored data in order to reduce your SQLite storage usage ahead of the January 7th target. Only usage on and after the billing target date will incur charges.&lt;/p&gt;
&lt;p&gt;Developers on the Workers Paid plan with Durable Object&apos;s SQLite storage usage beyond included limits will incur charges according to &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/platform/pricing/#sqlite-storage-backend&quot;&gt;SQLite storage pricing&lt;/a&gt; announced in September 2024 with the &lt;a href=&quot;https://blog.cloudflare.com/sqlite-in-durable-objects/&quot; target=&quot;_blank&quot;&gt;public beta&lt;/a&gt;. Developers on the Workers Free plan will not be charged.&lt;/p&gt;
&lt;p&gt;Compute billing for SQLite-backed Durable Objects has been enabled since the initial public beta. SQLite-backed Durable Objects currently incur &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/platform/pricing/#compute-billing&quot;&gt;charges for requests and duration&lt;/a&gt;, and no changes are being made to compute billing.&lt;/p&gt;
&lt;p&gt;For more information about SQLite storage pricing and limits, refer to the &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/platform/pricing/#sqlite-storage-backend&quot;&gt;Durable Objects pricing documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 12 Dec 2025 00:00:00 GMT</pubDate><product>Durable Objects</product><category>Durable Objects</category><category>Workers</category></item><item><title>R2 SQL - R2 SQL now supports aggregations and schema discovery</title><link>https://developers.cloudflare.com/changelog/post/2025-12-12-aggregation-support-and-more/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-12-aggregation-support-and-more/</guid><description>&lt;p&gt;R2 SQL now supports aggregation functions, &lt;code&gt;GROUP BY&lt;/code&gt;, &lt;code&gt;HAVING&lt;/code&gt;, along with schema discovery commands to make it easy to explore your data catalog.&lt;/p&gt;
&lt;h4&gt;Aggregation Functions&lt;/h4&gt;
&lt;p&gt;You can now perform aggregations on Apache Iceberg tables in &lt;a href=&quot;https://developers.cloudflare.com/r2/data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt; using standard SQL functions including &lt;code&gt;COUNT(*)&lt;/code&gt;, &lt;code&gt;SUM()&lt;/code&gt;, &lt;code&gt;AVG()&lt;/code&gt;, &lt;code&gt;MIN()&lt;/code&gt;, and &lt;code&gt;MAX()&lt;/code&gt;. Combine these with &lt;code&gt;GROUP BY&lt;/code&gt; to analyze data across dimensions, and use &lt;code&gt;HAVING&lt;/code&gt; to filter aggregated results.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;-- Calculate average transaction amounts by department&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; department, &lt;/span&gt;&lt;span&gt;COUNT&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;), &lt;/span&gt;&lt;span&gt;AVG&lt;/span&gt;&lt;span&gt;(total_amount)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; my_namespace.sales_data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; region &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;North&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;GROUP BY&lt;/span&gt;&lt;span&gt; department&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;HAVING&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;COUNT&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;50&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;ORDER BY&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AVG&lt;/span&gt;&lt;span&gt;(total_amount) &lt;/span&gt;&lt;span&gt;DESC&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;-- Find high-value departments&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; department, &lt;/span&gt;&lt;span&gt;SUM&lt;/span&gt;&lt;span&gt;(total_amount)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; my_namespace.sales_data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;GROUP BY&lt;/span&gt;&lt;span&gt; department&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;HAVING&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;SUM&lt;/span&gt;&lt;span&gt;(total_amount) &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;50000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Schema Discovery&lt;/h4&gt;
&lt;p&gt;New metadata commands make it easy to explore your data catalog and understand table structures:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SHOW DATABASES&lt;/code&gt; or &lt;code&gt;SHOW NAMESPACES&lt;/code&gt; - List all available namespaces&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SHOW TABLES IN namespace_name&lt;/code&gt; - List tables within a namespace&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DESCRIBE namespace_name.table_name&lt;/code&gt; - View table schema and column types&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;❯&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;r2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sql&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;query&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;{ACCOUNT_ID}_{BUCKET_NAME}&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;DESCRIBE default.sales_data;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;⛅️&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;4.54.0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;─────────────────────────────────────────────&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;┌──────────────────┬────────────────┬──────────┬─────────────────┬───────────────┬───────────────────────────────────────────────────────────────────────────────────────────────────┐&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;column_name&lt;/span&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;           &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;required&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;initial_default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;write_default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;doc&lt;/span&gt;&lt;span&gt;                                                                                               &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sale_id&lt;/span&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;BIGINT&lt;/span&gt;&lt;span&gt;         &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;               &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Unique&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;identifier&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;each&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sales&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;transaction&lt;/span&gt;&lt;span&gt;                                                      &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sale_timestamp&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;TIMESTAMPTZ&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;               &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Exact&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;and&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;time&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;when&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sale&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;occurred&lt;/span&gt;&lt;span&gt; (used &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;partitioning&lt;/span&gt;&lt;span&gt;)                                │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;department&lt;/span&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;TEXT&lt;/span&gt;&lt;span&gt;           &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;               &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Product&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;department&lt;/span&gt;&lt;span&gt; (8 &lt;/span&gt;&lt;span&gt;categories:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Electronics,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Beauty,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Home,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Toys,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Sports,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Food,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Clothing,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Books&lt;/span&gt;&lt;span&gt;) │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;category&lt;/span&gt;&lt;span&gt;         &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;TEXT&lt;/span&gt;&lt;span&gt;           &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;               &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Product&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;category&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;grouping&lt;/span&gt;&lt;span&gt; (4 &lt;/span&gt;&lt;span&gt;categories:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Premium,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Standard,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Budget,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Clearance&lt;/span&gt;&lt;span&gt;)                    │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;region&lt;/span&gt;&lt;span&gt;           &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;TEXT&lt;/span&gt;&lt;span&gt;           &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;               &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Geographic&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sales&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;region&lt;/span&gt;&lt;span&gt; (5 &lt;/span&gt;&lt;span&gt;regions:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;North,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;South,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;East,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;West,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Central&lt;/span&gt;&lt;span&gt;)                            │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;product_id&lt;/span&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;INT&lt;/span&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;               &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Unique&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;identifier&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;product&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sold&lt;/span&gt;&lt;span&gt;                                                            &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;quantity&lt;/span&gt;&lt;span&gt;         &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;INT&lt;/span&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;               &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Number&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;of&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;units&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sold&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;transaction&lt;/span&gt;&lt;span&gt; (range: &lt;/span&gt;&lt;span&gt;1-50&lt;/span&gt;&lt;span&gt;)                                            │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;unit_price&lt;/span&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DECIMAL&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;10,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;               &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Price&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;per&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;unit&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dollars&lt;/span&gt;&lt;span&gt; (range: &lt;/span&gt;&lt;span&gt;$5&lt;/span&gt;&lt;span&gt;.00-&lt;/span&gt;&lt;span&gt;$500&lt;/span&gt;&lt;span&gt;.00&lt;/span&gt;&lt;span&gt;)                                                  │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;total_amount&lt;/span&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DECIMAL&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;10,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;               &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Total&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sale&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;amount&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;before&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tax&lt;/span&gt;&lt;span&gt; (quantity &lt;/span&gt;&lt;span&gt;×&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;unit_price&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;with&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;discounts&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;applied&lt;/span&gt;&lt;span&gt;)                       │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;discount_percent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;INT&lt;/span&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;               &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Discount&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;percentage&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;applied&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sale&lt;/span&gt;&lt;span&gt; (0-50%)                                                  │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tax_amount&lt;/span&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DECIMAL&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;10,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;               &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Tax&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;amount&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;collected&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;on&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sale&lt;/span&gt;&lt;span&gt;                                                                 &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;profit_margin&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DECIMAL&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;10,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;               &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Profit&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;margin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;on&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sale&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;decimal&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;percentage&lt;/span&gt;&lt;span&gt;                                                &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;customer_id&lt;/span&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;INT&lt;/span&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;               &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Unique&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;identifier&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;customer&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;who&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;made&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;purchase&lt;/span&gt;&lt;span&gt;                                          &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;is_online_sale&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;BOOLEAN&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;               &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Boolean&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;flag&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;indicating&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sale&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;was&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;made&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;online&lt;/span&gt;&lt;span&gt; (true) or in-store (&lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;)                        │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sale_date&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DATE&lt;/span&gt;&lt;span&gt;           &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt;               &lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Calendar&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;of&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sale&lt;/span&gt;&lt;span&gt; (extracted &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sale_timestamp&lt;/span&gt;&lt;span&gt;)                                         │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;└──────────────────┴────────────────┴──────────┴─────────────────┴───────────────┴───────────────────────────────────────────────────────────────────────────────────────────────────┘&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Read&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;across&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;files&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;R2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;On&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;average,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;To learn more about the new aggregation capabilities and schema discovery commands, check out the &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/sql-reference/&quot;&gt;SQL reference&lt;/a&gt;. If you&apos;re new to R2 SQL, visit our &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/get-started/&quot;&gt;getting started guide&lt;/a&gt; to begin querying your data.&lt;/p&gt;</description><pubDate>Fri, 12 Dec 2025 00:00:00 GMT</pubDate><product>R2 SQL</product><category>R2 SQL</category></item><item><title>Workers - Python cold start improvements</title><link>https://developers.cloudflare.com/changelog/post/2025-12-08-python-cold-start-improvements/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-08-python-cold-start-improvements/</guid><description>&lt;p&gt;Python Workers now feature improved cold start performance, reducing initialization time for new Worker instances.
This improvement is particularly noticeable for Workers with larger dependency sets or complex initialization logic.&lt;/p&gt;
&lt;p&gt;Every time you deploy a Python Worker, a memory snapshot is captured after the top level of the Worker is executed.
This snapshot captures all imports, including package imports that are often costly to load. The memory snapshot is loaded
when the Worker is first started, avoiding the need to reload the Python runtime and all dependencies on each cold start.&lt;/p&gt;
&lt;p&gt;We set up a benchmark that imports common packages (&lt;a href=&quot;https://www.python-httpx.org/&quot; target=&quot;_blank&quot;&gt;httpx&lt;/a&gt;,
&lt;a href=&quot;https://fastapi.tiangolo.com/&quot; target=&quot;_blank&quot;&gt;fastapi&lt;/a&gt; and &lt;a href=&quot;https://docs.pydantic.dev/latest/&quot; target=&quot;_blank&quot;&gt;pydantic&lt;/a&gt;)
to see how Python Workers stack up against other platforms:&lt;/p&gt;





















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Platform&lt;/th&gt;&lt;th&gt;Mean Cold Start (ms)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Python Workers&lt;/td&gt;&lt;td&gt;1027&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;AWS Lambda&lt;/td&gt;&lt;td&gt;2502&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Google Cloud Run&lt;/td&gt;&lt;td&gt;3069&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;These benchmarks run continuously. You can view the results and the methodology on our &lt;a href=&quot;https://cold.edgeworker.net&quot; target=&quot;_blank&quot;&gt;benchmark page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In additional testing, we have found that without any memory snapshot, the cold start for this benchmark takes around 10 seconds, so this change improves cold start performance by roughly a factor of 10.&lt;/p&gt;
&lt;p&gt;To get started with Python Workers, check out our &lt;a href=&quot;https://developers.cloudflare.com/workers/languages/python/&quot;&gt;Python Workers overview&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 08 Dec 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Easy Python package management with Pywrangler</title><link>https://developers.cloudflare.com/changelog/post/2025-12-08-python-pywrangler/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-08-python-pywrangler/</guid><description>&lt;p&gt;We are introducing a brand new tool called Pywrangler, which simplifies package management in Python Workers by
automatically installing Workers-compatible Python packages into your project.&lt;/p&gt;
&lt;p&gt;With Pywrangler, you specify your Worker&apos;s Python dependencies in your &lt;code&gt;pyproject.toml&lt;/code&gt; file:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;toml&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;project&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;python-beautifulsoup-worker&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;0.1.0&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;A simple Worker using beautifulsoup4&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;requires-python&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&gt;=3.12&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;dependencies&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;beautifulsoup4&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;dependency-groups&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;dev&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;workers-py&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;workers-runtime-sdk&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;You can then develop and deploy your Worker using the following commands:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;uv&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pywrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dev&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;uv&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pywrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;deploy&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Pywrangler automatically downloads and vendors the necessary packages for your Worker, and these packages are bundled with the Worker when you deploy.&lt;/p&gt;
&lt;p&gt;Consult the &lt;a href=&quot;https://developers.cloudflare.com/workers/languages/python/packages/&quot;&gt;Python packages documentation&lt;/a&gt; for full details on Pywrangler and Python package management in Workers.&lt;/p&gt;</description><pubDate>Mon, 08 Dec 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Wrangler config is optional when using Vite plugin</title><link>https://developers.cloudflare.com/changelog/post/2025-12-08-vite-optional-config/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-08-vite-optional-config/</guid><description>&lt;p&gt;When using the &lt;a href=&quot;https://developers.cloudflare.com/workers/vite-plugin/&quot;&gt;Cloudflare Vite plugin&lt;/a&gt; to build and deploy Workers, a Wrangler configuration file is now optional for assets-only (static) sites. If no &lt;code&gt;wrangler.toml&lt;/code&gt;, &lt;code&gt;wrangler.json&lt;/code&gt;, or &lt;code&gt;wrangler.jsonc&lt;/code&gt; file is found, the plugin generates sensible defaults for an assets-only site. The &lt;code&gt;name&lt;/code&gt; is based on the &lt;code&gt;package.json&lt;/code&gt; or the project directory name, and the &lt;code&gt;compatibility_date&lt;/code&gt; uses the latest date supported by your installed Miniflare version.&lt;/p&gt;
&lt;p&gt;This allows easier setup for static sites using Vite. Note that SPAs will still need to &lt;a href=&quot;https://developers.cloudflare.com/workers/static-assets/routing/single-page-application/&quot; target=&quot;_blank&quot;&gt;set &lt;code&gt;assets.not_found_handling&lt;/code&gt; to &lt;code&gt;single-page-application&lt;/code&gt;&lt;/a&gt; in order to function correctly.&lt;/p&gt;</description><pubDate>Mon, 08 Dec 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Configure Workers programmatically using the Vite plugin</title><link>https://developers.cloudflare.com/changelog/post/2025-12-08-vite-programmatic-config/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-08-vite-programmatic-config/</guid><description>&lt;p&gt;The &lt;a href=&quot;https://developers.cloudflare.com/workers/vite-plugin/&quot;&gt;Cloudflare Vite plugin&lt;/a&gt; now supports programmatic configuration of Workers without a Wrangler configuration file. You can use the &lt;code&gt;config&lt;/code&gt; option to define Worker settings directly in your Vite configuration, or to modify existing configuration loaded from a Wrangler config file. This is particularly useful when integrating with other build tools or frameworks, as it allows them to control Worker configuration without needing users to manage a separate config file.&lt;/p&gt;
&lt;h4&gt;The &lt;code&gt;config&lt;/code&gt; option&lt;/h4&gt;
&lt;p&gt;The Vite plugin&apos;s new &lt;code&gt;config&lt;/code&gt; option accepts either a partial configuration object or a function that receives the current configuration and returns overrides. This option is applied after any config file is loaded, allowing the plugin to override specific values or define Worker configuration entirely in code.&lt;/p&gt;
&lt;h4&gt;Example usage&lt;/h4&gt;
&lt;p&gt;Setting &lt;code&gt;config&lt;/code&gt; to an object to provide configuration values that merge with defaults and config file settings:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineConfig&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;vite&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cloudflare&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@cloudflare/vite-plugin&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineConfig&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;plugins&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;cloudflare&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;config&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-worker&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;compatibility_flags&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;nodejs_compat&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;send_email&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;EMAIL&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Use a function to modify the existing configuration:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineConfig&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;vite&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cloudflare&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@cloudflare/vite-plugin&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineConfig&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;plugins&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;cloudflare&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;config&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;userConfig&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;delete&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;userConfig&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;compatibility_flags&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Return an object with values to merge:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineConfig&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;vite&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cloudflare&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@cloudflare/vite-plugin&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineConfig&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;plugins&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;cloudflare&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;config&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;userConfig&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;userConfig&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;compatibility_flags&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;includes&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;no_nodejs_compat&quot;&lt;/span&gt;&lt;span&gt;)) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; compatibility_flags&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;nodejs_compat&quot;&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Auxiliary Workers&lt;/h4&gt;
&lt;p&gt;Auxiliary Workers also support the &lt;code&gt;config&lt;/code&gt; option, enabling multi-Worker architectures without config files.&lt;/p&gt;
&lt;p&gt;Define auxiliary Workers without config files using &lt;code&gt;config&lt;/code&gt; inside the &lt;code&gt;auxiliaryWorkers&lt;/code&gt; array:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineConfig&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;vite&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cloudflare&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@cloudflare/vite-plugin&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineConfig&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;plugins&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;cloudflare&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;config&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;entry-worker&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./src/entry.ts&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; binding&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;API&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; service&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;api-worker&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;auxiliaryWorkers&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;config&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;api-worker&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./src/api.ts&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For more details and examples, see &lt;a href=&quot;https://developers.cloudflare.com/workers/vite-plugin/reference/programmatic-configuration/&quot;&gt;Programmatic configuration&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 08 Dec 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Hyperdrive - Connect to remote databases during local development with wrangler dev</title><link>https://developers.cloudflare.com/changelog/post/2025-12-04-hyperdrive-remote-database-local-dev/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-04-hyperdrive-remote-database-local-dev/</guid><description>&lt;p&gt;You can now connect directly to remote databases and databases requiring TLS with &lt;code&gt;wrangler dev&lt;/code&gt;.
This lets you run your Worker code locally while connecting to remote databases, without needing to use &lt;code&gt;wrangler dev --remote&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;localConnectionString&lt;/code&gt; field and &lt;code&gt;CLOUDFLARE_HYPERDRIVE_LOCAL_CONNECTION_STRING_&amp;#x3C;BINDING_NAME&gt;&lt;/code&gt; environment variable can be used to configure the connection string used by &lt;code&gt;wrangler dev&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;jsonc&quot;&gt;&lt;code class=&quot;language-jsonc&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;hyperdrive&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;binding&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;HYPERDRIVE&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;your-hyperdrive-id&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;localConnectionString&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;postgres://user:password@remote-host.example.com:5432/database?sslmode=require&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://developers.cloudflare.com/hyperdrive/configuration/local-development/&quot;&gt;local development with Hyperdrive&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 04 Dec 2025 00:00:00 GMT</pubDate><product>Hyperdrive</product><category>Hyperdrive</category></item><item><title>Workers - One-click Access protection for Workers now creates reusable Cloudflare Access policies</title><link>https://developers.cloudflare.com/changelog/post/2025-12-03-reusable-access-policies/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-03-reusable-access-policies/</guid><description>&lt;p&gt;Workers applications now use reusable &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/policies/&quot;&gt;Cloudflare Access policies&lt;/a&gt; to reduce duplication and simplify access management across multiple Workers.&lt;/p&gt;
&lt;p&gt;Previously, enabling Cloudflare Access on a Worker created per-application policies, unique to each application. Now, we create reusable policies that can be shared across applications:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Preview URLs&lt;/strong&gt;: All Workers preview URLs share a single &quot;Cloudflare Workers Preview URLs&quot; policy across your account. This policy is automatically created the first time you enable Access on any preview URL. By sharing a single policy across all preview URLs, you can configure access rules once and have them apply company-wide to all Workers which protect preview URLs. This makes it much easier to manage who can access preview environments without having to update individual policies for each Worker.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Production workers.dev URLs&lt;/strong&gt;: When enabled, each Worker gets its own reusable policy (named &lt;code&gt;&amp;#x3C;worker-name&gt; - Production&lt;/code&gt;) by default. We recognize production services often have different access requirements and having individual policies here makes it easier to configure service-to-service authentication or protect internal dashboards or applications with specific user groups. Keeping these policies separate gives you the flexibility to configure exactly the right access rules for each production service. When you disable Access on a production Worker, the associated policy is automatically cleaned up if it&apos;s not being used by other applications.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This change reduces policy duplication, simplifies cross-company access management for preview environments, and provides the flexibility needed for production services. You can still customize access rules by editing the reusable policies in the Zero Trust dashboard.&lt;/p&gt;
&lt;p&gt;To enable Cloudflare Access on your Worker:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the Cloudflare dashboard, go to &lt;strong&gt;Workers &amp;#x26; Pages&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select your Worker.&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Settings&lt;/strong&gt; &gt; &lt;strong&gt;Domains &amp;#x26; Routes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;For &lt;code&gt;workers.dev&lt;/code&gt; or Preview URLs, click &lt;strong&gt;Enable Cloudflare Access&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Optionally, click &lt;strong&gt;Manage Cloudflare Access&lt;/strong&gt; to customize the policy.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For more information on configuring Cloudflare Access for Workers, refer to the &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/routing/workers-dev/#manage-access-to-workersdev&quot;&gt;Workers Access documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 04 Dec 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Agents, Workers - Agents SDK v0.2.24 with resumable streaming, MCP improvements, and schedule fixes</title><link>https://developers.cloudflare.com/changelog/post/2025-11-26-agents-resumable-streaming/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-26-agents-resumable-streaming/</guid><description>&lt;p&gt;The latest release of &lt;a href=&quot;https://github.com/cloudflare/agents&quot; target=&quot;_blank&quot;&gt;@cloudflare/agents&lt;/a&gt; brings resumable streaming, significant MCP client improvements, and critical fixes for schedules and Durable Object lifecycle management.&lt;/p&gt;
&lt;h4&gt;Resumable streaming&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;AIChatAgent&lt;/code&gt; now supports resumable streaming, allowing clients to reconnect and continue receiving streamed responses without losing data. This is useful for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Long-running AI responses&lt;/li&gt;
&lt;li&gt;Users on unreliable networks&lt;/li&gt;
&lt;li&gt;Users switching between devices mid-conversation&lt;/li&gt;
&lt;li&gt;Background tasks where users navigate away and return&lt;/li&gt;
&lt;li&gt;Real-time collaboration where multiple clients need to stay in sync&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Streams are maintained across page refreshes, broken connections, and syncing across open tabs and devices.&lt;/p&gt;
&lt;h4&gt;Other improvements&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Default JSON schema validator added to MCP client&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/agents/api-reference/schedule-tasks/&quot; target=&quot;_blank&quot;&gt;Schedules&lt;/a&gt; can now safely destroy the agent&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;MCP client API improvements&lt;/h4&gt;
&lt;p&gt;The &lt;code&gt;MCPClientManager&lt;/code&gt; API has been redesigned for better clarity and control:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;New &lt;code&gt;registerServer()&lt;/code&gt; method&lt;/strong&gt;: Register MCP servers without immediately connecting&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New &lt;code&gt;connectToServer()&lt;/code&gt; method&lt;/strong&gt;: Establish connections to registered servers&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Improved reconnect logic&lt;/strong&gt;: &lt;code&gt;restoreConnectionsFromStorage()&lt;/code&gt; now properly handles failed connections&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Register a server to Agent&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;mcp&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;registerServer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-server&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;https://my-mcp-server.example.com&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Connect when ready&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;mcp&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;connectToServer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Discover tools, prompts and resources&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;mcp&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;discoverIfConnected&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The SDK now includes a formalized &lt;code&gt;MCPConnectionState&lt;/code&gt; enum with states: &lt;code&gt;idle&lt;/code&gt;, &lt;code&gt;connecting&lt;/code&gt;, &lt;code&gt;authenticating&lt;/code&gt;, &lt;code&gt;connected&lt;/code&gt;, &lt;code&gt;discovering&lt;/code&gt;, and &lt;code&gt;ready&lt;/code&gt;.&lt;/p&gt;
&lt;h4&gt;Enhanced MCP discovery&lt;/h4&gt;
&lt;p&gt;MCP discovery fetches the available tools, prompts, and resources from an MCP server so your agent knows what capabilities are available. The &lt;code&gt;MCPClientConnection&lt;/code&gt; class now includes a dedicated &lt;code&gt;discover()&lt;/code&gt; method with improved reliability:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Supports cancellation via AbortController&lt;/li&gt;
&lt;li&gt;Configurable timeout (default 15s)&lt;/li&gt;
&lt;li&gt;Discovery failures now throw errors immediately instead of silently continuing&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Bug fixes&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed a bug where &lt;a href=&quot;https://developers.cloudflare.com/agents/api-reference/schedule-tasks/&quot; target=&quot;_blank&quot;&gt;schedules&lt;/a&gt; meant to fire immediately with this.schedule(0, ...) or &lt;code&gt;this.schedule(new Date(), ...)&lt;/code&gt; would not fire&lt;/li&gt;
&lt;li&gt;Fixed an issue where schedules that took longer than 30 seconds would occasionally time out&lt;/li&gt;
&lt;li&gt;Fixed SSE transport now properly forwards session IDs and request headers&lt;/li&gt;
&lt;li&gt;Fixed AI SDK stream events convertion to UIMessageStreamPart&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Upgrade&lt;/h4&gt;
&lt;p&gt;To update to the latest version:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;agents@latest&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;</description><pubDate>Wed, 26 Nov 2025 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>Workers AI - Launching FLUX.2 [dev] on Workers AI</title><link>https://developers.cloudflare.com/changelog/post/2025-11-25-flux-2-dev-workers-ai/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-25-flux-2-dev-workers-ai/</guid><description>&lt;p&gt;We&apos;ve partnered with Black Forest Labs (BFL) to bring their latest FLUX.2 [dev] model to Workers AI! This model excels in generating high-fidelity images with physical world grounding, multi-language support, and digital asset creation. You can also create specific super images with granular controls like JSON prompting.&lt;/p&gt;
&lt;p&gt;Read the &lt;a href=&quot;https://bfl.ai/flux2&quot; target=&quot;_blank&quot;&gt;BFL blog&lt;/a&gt; to learn more about the model itself. Read our &lt;a href=&quot;https://blog.cloudflare.com/flux-2-workers-ai&quot; target=&quot;_blank&quot;&gt;Cloudflare blog&lt;/a&gt; to see the model in action, or try it out yourself on our &lt;a href=&quot;https://multi-modal.ai.cloudflare.com/&quot; target=&quot;_blank&quot;&gt;multi modal playground&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pricing documentation is available on the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/flux-2-dev/&quot;&gt;model page&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/platform/pricing/&quot;&gt;pricing page&lt;/a&gt;. Note, we expect to drop pricing in the next few days after iterating on the model performance.&lt;/p&gt;
&lt;h4&gt;Workers AI Platform specifics&lt;/h4&gt;
&lt;p&gt;The model hosted on Workers AI is able to support up to 4 image inputs (512x512 per input image). Note, this image model is one of the most powerful in the catalog and is expected to be slower than the other image models we currently support. One catch to look out for is that this model takes multipart form data inputs, even if you just have a prompt.&lt;/p&gt;
&lt;p&gt;With the REST API, the multipart form data input looks like this:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--request&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;POST&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--url&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;https://api.cloudflare.com/client/v4/accounts/{ACCOUNT}/ai/run/@cf/black-forest-labs/flux-2-dev&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--header&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;Authorization: Bearer {TOKEN}&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--header&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;Content-Type: multipart/form-data&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--form&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;prompt=a sunset at the alps&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--form&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;steps=&lt;/span&gt;&lt;span&gt;25&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--form&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;width=&lt;/span&gt;&lt;span&gt;1024&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--form&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;height=&lt;/span&gt;&lt;span&gt;1024&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;With the Workers AI binding, you can use it as such:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;form&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;FormData&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;form&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;append&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;prompt&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;a sunset with a dog&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;form&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;append&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;width&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;1024&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;form&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;append&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;height&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;1024&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;//this dummy request is temporary hack&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;//we&apos;re pushing a change to address this soon&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formRequest&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Request&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;http://dummy&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;method&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;POST&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;form&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formStream&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formRequest&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formContentType&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formRequest&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;content-type&apos;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;multipart/form-data&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;resp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AI&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;@cf/black-forest-labs/flux-2-dev&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;multipart&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formStream&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;contentType&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formContentType&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The parameters you can send to the model are detailed here:&lt;/p&gt;
&lt;details&gt;&lt;p&gt;&lt;/p&gt;&lt;summary&gt;JSON Schema for Model&lt;/summary&gt;
&lt;strong&gt;Required Parameters&lt;/strong&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;prompt&lt;/code&gt; (string) - Text description of the image to generate&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Optional Parameters&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;input_image_0&lt;/code&gt; (string) - Binary image&lt;/li&gt;
&lt;li&gt;&lt;code&gt;input_image_1&lt;/code&gt; (string) - Binary image&lt;/li&gt;
&lt;li&gt;&lt;code&gt;input_image_2&lt;/code&gt; (string) - Binary image&lt;/li&gt;
&lt;li&gt;&lt;code&gt;input_image_3&lt;/code&gt; (string) - Binary image&lt;/li&gt;
&lt;li&gt;&lt;code&gt;steps&lt;/code&gt; (integer) - Number of inference steps. Higher values may improve quality but increase generation time&lt;/li&gt;
&lt;li&gt;&lt;code&gt;guidance&lt;/code&gt; (float) - Guidance scale for generation. Higher values follow the prompt more closely&lt;/li&gt;
&lt;li&gt;&lt;code&gt;width&lt;/code&gt; (integer) - Width of the image, default &lt;code&gt;1024&lt;/code&gt; Range: 256-1920&lt;/li&gt;
&lt;li&gt;&lt;code&gt;height&lt;/code&gt; (integer) - Height of the image, default &lt;code&gt;768&lt;/code&gt; Range: 256-1920&lt;/li&gt;
&lt;li&gt;&lt;code&gt;seed&lt;/code&gt; (integer) - Seed for reproducibility&lt;/li&gt;
&lt;/ul&gt;&lt;/details&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;plaintext&quot;&gt;&lt;code class=&quot;language-plaintext&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;## Multi-Reference Images&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;The FLUX.2 model is great at generating images based on reference images. You can use this feature to apply the style of one image to another, add a new character to an image, or iterate on past generate images. You would use it with the same multipart form data structure, with the input images in binary.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;For the prompt, you can reference the images based on the index, like `take the subject of image 1 and style it like image 0` or even use natural language like `place the dog beside the woman`.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Note: you have to name the input parameter as `input_image_0`, `input_image_1`, `input_image_2` for it to work correctly. All input images must be smaller than 512x512.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;```bash&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl --request POST \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--url &apos;https://api.cloudflare.com/client/v4/accounts/{ACCOUNT}/ai/run/@cf/black-forest-labs/flux-2-dev&apos; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--header &apos;Authorization: Bearer {TOKEN}&apos; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--header &apos;Content-Type: multipart/form-data&apos; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--form &apos;prompt=take the subject of image 1 and style it like image 0&apos; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--form input_image_0=@/Users/johndoe/Desktop/icedoutkeanu.png \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--form input_image_1=@/Users/johndoe/Desktop/me.png \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--form steps=25&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--form width=1024&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--form height=1024&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Through Workers AI Binding:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;//helper function to convert ReadableStream to Blob&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;streamToBlob&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;stream&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ReadableStream&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;contentType&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Promise&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Blob&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;reader&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stream&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getReader&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;chunks&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; []&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;while&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;done&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;reader&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;read&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;done&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;break&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;chunks&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;push&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Blob&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;chunks&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;contentType&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;image0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;http://image-url&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;image1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;http://image-url&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;form&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;FormData&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;image_blob0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;streamToBlob&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;image0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;image/png&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;image_blob1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;streamToBlob&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;image1&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;image/png&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;form&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;append&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;input_image_0&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;image_blob0&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;form&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;append&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;input_image_1&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;image_blob1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;form&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;append&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;prompt&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;take the subject of image 1and style it like image 0&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;//this dummy request is temporary hack&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;//we&apos;re pushing a change to address this soon&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formRequest&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Request&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;http://dummy&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;method&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;POST&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;form&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formStream&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formRequest&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formContentType&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formRequest&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;content-type&apos;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;multipart/form-data&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;resp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AI&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;@cf/black-forest-labs/flux-2-dev&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;multipart&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;form&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;contentType&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;multipart/form-data&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;JSON Prompting&lt;/h4&gt;
&lt;p&gt;The model supports prompting in JSON to get more granular control over images. You would pass the JSON as the value of the &apos;prompt&apos; field in the multipart form data. See the JSON schema below on the base parameters you can pass to the model.&lt;/p&gt;
&lt;details&gt;&lt;summary&gt;JSON Prompting Schema&lt;/summary&gt;&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;object&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;properties&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;scene&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;string&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Overall scene setting or location&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;subjects&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;array&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;items&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;object&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;properties&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;string&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Type of subject (e.g., desert nomad, blacksmith, DJ, falcon)&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;string&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Physical attributes, clothing, accessories&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;pose&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;string&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Action or stance&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;position&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;string&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;enum&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&quot;foreground&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;midground&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;background&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Depth placement in scene&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;required&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&quot;type&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;description&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;pose&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;position&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;style&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;string&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Artistic rendering style (e.g., digital painting, photorealistic, pixel art, noir sci-fi, lifestyle photo, wabi-sabi photo)&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;color_palette&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;array&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;items&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;string&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;minItems&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;maxItems&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Exactly 3 main colors for the scene (e.g., [&apos;navy&apos;, &apos;neon yellow&apos;, &apos;magenta&apos;])&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;lighting&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;string&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Lighting condition and direction (e.g., fog-filtered sun, moonlight with star glints, dappled sunlight)&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;mood&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;string&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Emotional atmosphere (e.g., harsh and determined, playful and modern, peaceful and dreamy)&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;background&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;string&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Background environment details&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;composition&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;string&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;enum&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;rule of thirds&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;circular arrangement&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;framed by foreground&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;minimalist negative space&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;S-curve&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;vanishing point center&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;dynamic off-center&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;leading leads&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;golden spiral&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;diagonal energy&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;strong verticals&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;triangular arrangement&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Compositional technique&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;camera&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;object&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;properties&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;angle&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;string&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;enum&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&quot;eye level&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;low angle&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;slightly low&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;bird&apos;s-eye&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;worm&apos;s-eye&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;over-the-shoulder&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;isometric&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Camera perspective&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;distance&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;string&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;enum&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&quot;close-up&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;medium close-up&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;medium shot&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;medium wide&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;wide shot&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;extreme wide&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Framing distance&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;focus&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;string&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;enum&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&quot;deep focus&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;macro focus&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;selective focus&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;sharp on subject&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;soft background&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Focus type&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;lens&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;string&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;enum&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&quot;14mm&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;24mm&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;35mm&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;50mm&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;70mm&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;85mm&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Focal length (wide to telephoto)&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;f-number&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;string&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Aperture (e.g., f/2.8, the smaller the number the more blurry the background)&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;ISO&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;number&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Light sensitivity value (comfortable range between 100 &amp;#x26; 6400, lower = less sensitivity)&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;effects&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;array&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;items&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;string&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Post-processing effects (e.g., &apos;lens flare small&apos;, &apos;subtle film grain&apos;, &apos;soft bloom&apos;, &apos;god rays&apos;, &apos;chromatic aberration mild&apos;)&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;required&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&quot;scene&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;subjects&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/details&gt;
&lt;h4&gt;Other features to try&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;The model also supports the most common latin and non-latin character languages&lt;/li&gt;
&lt;li&gt;You can prompt the model with specific hex codes like &lt;code&gt;#2ECC71&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Try creating digital assets like landing pages, comic strips, infographics too!&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Tue, 25 Nov 2025 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category></item><item><title>Containers, R2 - Mount R2 buckets in Containers</title><link>https://developers.cloudflare.com/changelog/post/2025-11-21-fuse-support-in-containers/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-21-fuse-support-in-containers/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/containers/&quot;&gt;Containers&lt;/a&gt; now support mounting R2 buckets as FUSE (Filesystem in Userspace) volumes, allowing applications to interact with &lt;a href=&quot;https://developers.cloudflare.com/r2/&quot;&gt;R2&lt;/a&gt; using standard filesystem operations.&lt;/p&gt;
&lt;p&gt;Common use cases include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bootstrapping containers with datasets, models, or dependencies for &lt;a href=&quot;https://developers.cloudflare.com/sandbox/&quot;&gt;sandboxes&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/agents/&quot;&gt;agent&lt;/a&gt; environments&lt;/li&gt;
&lt;li&gt;Persisting user configuration or application state without managing downloads&lt;/li&gt;
&lt;li&gt;Accessing large static files without bloating container images or downloading at startup&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;FUSE adapters like &lt;a href=&quot;https://github.com/tigrisdata/tigrisfs&quot; target=&quot;_blank&quot;&gt;tigrisfs&lt;/a&gt;, &lt;a href=&quot;https://github.com/s3fs-fuse/s3fs-fuse&quot; target=&quot;_blank&quot;&gt;s3fs&lt;/a&gt;, and &lt;a href=&quot;https://github.com/GoogleCloudPlatform/gcsfuse&quot; target=&quot;_blank&quot;&gt;gcsfuse&lt;/a&gt; can be installed in your container image and configured to mount buckets at startup.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;dockerfile&quot;&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; alpine:3.20&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Install FUSE and dependencies&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;RUN&lt;/span&gt;&lt;span&gt; apk update &amp;#x26;&amp;#x26; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;apk add --no-cache ca-certificates fuse curl bash&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Install tigrisfs&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;RUN&lt;/span&gt;&lt;span&gt; ARCH=$(uname -m) &amp;#x26;&amp;#x26; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;if [ &lt;/span&gt;&lt;span&gt;&quot;$ARCH&quot;&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;&quot;x86_64&quot;&lt;/span&gt;&lt;span&gt; ]; then ARCH=&lt;/span&gt;&lt;span&gt;&quot;amd64&quot;&lt;/span&gt;&lt;span&gt;; fi &amp;#x26;&amp;#x26; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;if [ &lt;/span&gt;&lt;span&gt;&quot;$ARCH&quot;&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;&quot;aarch64&quot;&lt;/span&gt;&lt;span&gt; ]; then ARCH=&lt;/span&gt;&lt;span&gt;&quot;arm64&quot;&lt;/span&gt;&lt;span&gt;; fi &amp;#x26;&amp;#x26; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;VERSION=$(curl -s https://api.github.com/repos/tigrisdata/tigrisfs/releases/latest | grep -o &lt;/span&gt;&lt;span&gt;&apos;&quot;tag_name&quot;: &quot;[^&quot;]*&apos;&lt;/span&gt;&lt;span&gt; | cut -d&lt;/span&gt;&lt;span&gt;&apos;&quot;&apos;&lt;/span&gt;&lt;span&gt; -f4) &amp;#x26;&amp;#x26; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;curl -L &lt;/span&gt;&lt;span&gt;&quot;https://github.com/tigrisdata/tigrisfs/releases/download/${VERSION}/tigrisfs_${VERSION#v}_linux_${ARCH}.tar.gz&quot;&lt;/span&gt;&lt;span&gt; -o /tmp/tigrisfs.tar.gz &amp;#x26;&amp;#x26; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tar -xzf /tmp/tigrisfs.tar.gz -C /usr/local/bin/ &amp;#x26;&amp;#x26; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;rm /tmp/tigrisfs.tar.gz &amp;#x26;&amp;#x26; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;chmod +x /usr/local/bin/tigrisfs&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Create startup script that mounts bucket&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;RUN&lt;/span&gt;&lt;span&gt; printf &lt;/span&gt;&lt;span&gt;&apos;#!/bin/sh&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;set -e&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;mkdir -p /mnt/r2&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;R2_ENDPOINT=&quot;https://${R2_ACCOUNT_ID}.r2.cloudflarestorage.com&quot;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;/usr/local/bin/tigrisfs --endpoint &quot;${R2_ENDPOINT}&quot; -f &quot;${BUCKET_NAME}&quot; /mnt/r2 &amp;#x26;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;sleep 3&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ls -lah /mnt/r2&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; &gt; /startup.sh &amp;#x26;&amp;#x26; chmod +x /startup.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;CMD&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;/startup.sh&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;See the &lt;a href=&quot;https://developers.cloudflare.com/containers/examples/r2-fuse-mount/&quot;&gt;Mount R2 buckets with FUSE&lt;/a&gt; example for a complete guide on mounting R2 buckets and/or other S3-compatible storage buckets within your containers.&lt;/p&gt;</description><pubDate>Fri, 21 Nov 2025 00:00:00 GMT</pubDate><product>Containers</product><category>Containers</category><category>R2</category></item><item><title>Containers - New CPU Pricing for Containers and Sandboxes</title><link>https://developers.cloudflare.com/changelog/post/2025-11-21-new-cpu-pricing/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-21-new-cpu-pricing/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/containers/&quot;&gt;Containers&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/sandbox/&quot;&gt;Sandboxes&lt;/a&gt; pricing for CPU time is now based on active usage only, instead of provisioned resources.&lt;/p&gt;
&lt;p&gt;This means that you now pay less for Containers and Sandboxes.&lt;/p&gt;
&lt;h4&gt;An Example Before and After&lt;/h4&gt;
&lt;p&gt;Imagine running the &lt;code&gt;standard-2&lt;/code&gt; instance type for one hour, which can use up to 1 vCPU,
but on average you use only 20% of your CPU capacity.&lt;/p&gt;
&lt;p&gt;CPU-time is priced at &lt;em&gt;$0.00002 per vCPU-second&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Previously, you would be charged for the CPU allocated to the instance multiplied by the time it was active, in this case 1 hour.&lt;/p&gt;
&lt;p&gt;CPU cost would have been: &lt;strong&gt;$0.072&lt;/strong&gt; — 1 vCPU * 3600 seconds * $0.00002&lt;/p&gt;
&lt;p&gt;Now, since you are only using 20% of your CPU capacity, your CPU cost is cut to 20% of the previous amount.&lt;/p&gt;
&lt;p&gt;CPU cost is now: &lt;strong&gt;$0.0144&lt;/strong&gt; — 1 vCPU * 3600 seconds * $0.00002 * 20% utilization&lt;/p&gt;
&lt;p&gt;This can significantly reduce costs for Containers and Sandboxes.&lt;/p&gt;
&lt;aside&gt;&lt;p&gt;Note&lt;/p&gt;&lt;div&gt;&lt;p&gt;Memory cost and disk pricing remain unchanged, and is still calculated based on &lt;em&gt;provisioned&lt;/em&gt; resources.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;See the documentation to learn more about &lt;a href=&quot;https://developers.cloudflare.com/containers/get-started/&quot;&gt;Containers&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/sandbox/&quot;&gt;Sandboxes&lt;/a&gt;,
and &lt;a href=&quot;https://developers.cloudflare.com/containers/pricing&quot;&gt;associated pricing&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 21 Nov 2025 00:00:00 GMT</pubDate><product>Containers</product><category>Containers</category></item><item><title>Workers - Environment variable limits increase for Workers Builds</title><link>https://developers.cloudflare.com/changelog/post/2025-11-21-builds-env-var-increase/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-21-builds-env-var-increase/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/&quot;&gt;Workers Builds&lt;/a&gt; now supports up to 64 environment variables, and each environment variable can be up to 5 KB in size. The previous limit was 5 KB total across all environment variables.&lt;/p&gt;
&lt;p&gt;This change enables better support for complex build configurations, larger application settings, and more flexible CI/CD workflows.&lt;/p&gt;
&lt;p&gt;For more details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/limits-and-pricing/#definitions&quot;&gt;build limits documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 21 Nov 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Better local deployment flow for Cloudflare Workers</title><link>https://developers.cloudflare.com/changelog/post/2025-11-21-wrangler-deploy-remote-config-management/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-21-wrangler-deploy-remote-config-management/</guid><description>&lt;p&gt;Until now, if a Worker had been previously deployed via the &lt;a href=&quot;https://dash.cloudflare.com&quot; target=&quot;_blank&quot;&gt;Cloudflare Dashboard&lt;/a&gt;, a subsequent deployment done via the Cloudflare Workers CLI, &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/&quot;&gt;&lt;strong&gt;Wrangler&lt;/strong&gt;&lt;/a&gt;
(through the &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/general/#deploy&quot;&gt;&lt;code&gt;deploy&lt;/code&gt; command&lt;/a&gt;), would allow the user to override the Worker&apos;s dashboard settings without providing details on
what dashboard settings would be lost.&lt;/p&gt;
&lt;p&gt;Now instead, &lt;code&gt;wrangler deploy&lt;/code&gt; presents a helpful representation of the differences between the &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/configuration/&quot;&gt;local configuration&lt;/a&gt;
and the remote dashboard settings, and offers to update your local configuration file for you.&lt;/p&gt;
&lt;p&gt;See example below showing a before and after for &lt;code&gt;wrangler deploy&lt;/code&gt; when a local configuration is expected to override a Worker&apos;s dashboard settings:&lt;/p&gt;
&lt;article&gt; &lt;p&gt;  &lt;span&gt;Before&lt;/span&gt; &lt;/p&gt; &lt;div&gt; &lt;p&gt;&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/before.Bz-MOePT_1kuOLk.webp&quot; alt=&quot;wrangler deploy run before the improved workflow&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;&lt;/p&gt; &lt;/div&gt; &lt;/article&gt; 
&lt;article&gt; &lt;p&gt;  &lt;span&gt;After&lt;/span&gt; &lt;/p&gt; &lt;div&gt; &lt;p&gt;&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/after.BrkkBaRL_1Mg50Q.webp&quot; alt=&quot;wrangler deploy run after the improved workflow&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;&lt;/p&gt; &lt;/div&gt; &lt;/article&gt; 
&lt;p&gt;Also, if instead Wrangler detects that a deployment would override remote dashboard settings but in an additive way, without modifying or removing any of them, it will simply proceed with the deployment without requesting any user interaction.&lt;/p&gt;
&lt;p&gt;Update to &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/&quot;&gt;Wrangler&lt;/a&gt; v4.50.0 or greater to take advantage of this improved deploy flow.&lt;/p&gt;</description><pubDate>Fri, 21 Nov 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>AI Search - AI Search support for crawling login protected website content</title><link>https://developers.cloudflare.com/changelog/post/2025-11-19-add-extra-headers-for-website-crawling/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-19-add-extra-headers-for-website-crawling/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-search/&quot;&gt;AI Search&lt;/a&gt; now supports &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/data-source/website/#extra-headers-for-access-protected-content&quot;&gt;custom HTTP headers&lt;/a&gt; for website crawling, solving a common problem where valuable content behind authentication or access controls could not be indexed.&lt;/p&gt;
&lt;p&gt;Previously, AI Search could only crawl publicly accessible pages, leaving knowledge bases, documentation, and other protected content out of your search results. With custom headers support, you can now include authentication credentials that allow the crawler to access this protected content.&lt;/p&gt;
&lt;p&gt;This is particularly useful for indexing content like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Internal documentation&lt;/strong&gt; behind corporate login systems&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Premium content&lt;/strong&gt; that requires users to provide access to unlock&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sites protected by Cloudflare Access&lt;/strong&gt; using service tokens&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To add custom headers when creating an AI Search instance, select &lt;strong&gt;Parse options&lt;/strong&gt;. In the &lt;strong&gt;Extra headers&lt;/strong&gt; section, you can add up to five custom headers per Website data source.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/ai-search-extra-headers.B7A2spby_lEmuv.webp&quot; alt=&quot;Custom headers configuration in AI Search&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;For example, to crawl a site protected by &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/&quot;&gt;Cloudflare Access&lt;/a&gt;, you can add service token credentials as custom headers:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;plaintext&quot;&gt;&lt;code class=&quot;language-plaintext&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;CF-Access-Client-Id: your-token-id.access&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;CF-Access-Client-Secret: your-token-secret&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The crawler will automatically include these headers in all requests, allowing it to access protected pages that would otherwise be blocked.&lt;/p&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/data-source/website/#extra-headers-for-access-protected-content&quot;&gt;configuring custom headers for website crawling&lt;/a&gt; in AI Search.&lt;/p&gt;</description><pubDate>Wed, 19 Nov 2025 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>Workers Analytics Engine, Workers - More SQL aggregate, date and time functions available in Workers Analytics Engine</title><link>https://developers.cloudflare.com/changelog/post/2025-11-12-analytics-engine-further-sql-enhancements/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-12-analytics-engine-further-sql-enhancements/</guid><description>&lt;p&gt;You can now perform more powerful queries directly in &lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/&quot; target=&quot;_blank&quot;&gt;Workers Analytics Engine&lt;/a&gt; with a major expansion of our SQL function library.&lt;/p&gt;
&lt;p&gt;Workers Analytics Engine allows you to ingest and store high-cardinality data at scale (such as custom analytics) and query your data through a simple SQL API.&lt;/p&gt;
&lt;p&gt;Today, we&apos;ve expanded Workers Analytics Engine&apos;s SQL capabilities with several new functions:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/sql-reference/aggregate-functions/&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;New aggregate functions:&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;countIf()&lt;/code&gt; - count the number of rows which satisfy a provided condition&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sumIf()&lt;/code&gt; - calculate a sum from rows which satisfy a provided condition&lt;/li&gt;
&lt;li&gt;&lt;code&gt;avgIf()&lt;/code&gt; - calculate an average from rows which satisfy a provided condition&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/sql-reference/date-time-functions/&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;New date and time functions:&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;toYear()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toMonth()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toDayOfMonth()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toDayOfWeek()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toHour()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toMinute()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toSecond()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toStartOfYear()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toStartOfMonth()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toStartOfWeek()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toStartOfDay()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toStartOfHour()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toStartOfFifteenMinutes()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toStartOfTenMinutes()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toStartOfFiveMinutes()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toStartOfMinute()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;today()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toYYYYMM()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Ready to get started?&lt;/h4&gt;
&lt;p&gt;Whether you&apos;re building usage-based billing systems, customer analytics dashboards, or other custom analytics, these functions let you get the most out of your data. &lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/get-started/&quot;&gt;Get started &lt;/a&gt; with Workers Analytics Engine and explore all available functions in our &lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/sql-reference/&quot;&gt;SQL reference documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 12 Nov 2025 00:00:00 GMT</pubDate><product>Workers Analytics Engine</product><category>Workers Analytics Engine</category><category>Workers</category></item><item><title>Workers - Select Wrangler environments using the CLOUDFLARE_ENV environment variable</title><link>https://developers.cloudflare.com/changelog/post/2025-11-09-cloudflare-env-variable/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-09-cloudflare-env-variable/</guid><description>&lt;p&gt;Wrangler now supports using the &lt;code&gt;CLOUDFLARE_ENV&lt;/code&gt; &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/system-environment-variables/#supported-environment-variables&quot;&gt;environment variable&lt;/a&gt; to select the active &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/environments/&quot;&gt;environment&lt;/a&gt; for your Worker commands. This provides a more flexible way to manage environments, especially when working with build tools and CI/CD pipelines.&lt;/p&gt;
&lt;h4&gt;What&apos;s new&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Environment selection via environment variable:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Set &lt;code&gt;CLOUDFLARE_ENV&lt;/code&gt; to specify which environment to use for Wrangler commands&lt;/li&gt;
&lt;li&gt;Works with all Wrangler commands that support the &lt;code&gt;--env&lt;/code&gt; flag&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;--env&lt;/code&gt; command line argument takes precedence over the &lt;code&gt;CLOUDFLARE_ENV&lt;/code&gt; environment variable&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Example usage&lt;/h4&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Deploy to the production environment using CLOUDFLARE_ENV&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;CLOUDFLARE_ENV&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;production&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;deploy&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Upload a version to the staging environment&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;CLOUDFLARE_ENV&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;staging&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;versions&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;upload&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# The --env flag takes precedence over CLOUDFLARE_ENV&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;CLOUDFLARE_ENV&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;dev&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;deploy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--env&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;production&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# This will deploy to production, not dev&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Use with build tools&lt;/h4&gt;
&lt;p&gt;The &lt;code&gt;CLOUDFLARE_ENV&lt;/code&gt; environment variable is particularly useful when working with build tools like Vite. You can set the environment once during the build process, and it will be used for both building and deploying your Worker:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Set the environment for both build and deploy&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;CLOUDFLARE_ENV&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;production&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;build&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;deploy&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;When using &lt;code&gt;@cloudflare/vite-plugin&lt;/code&gt;, the build process generates a &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/configuration/#generated-wrangler-configuration&quot;&gt;&quot;redirected deploy config&quot;&lt;/a&gt; that is flattened to only contain the active environment. Wrangler will validate that the environment specified matches the environment used during the build to prevent accidentally deploying a Worker built for one environment to a different environment.&lt;/p&gt;
&lt;h4&gt;Learn more&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/system-environment-variables/&quot;&gt;System environment variables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/environments/&quot;&gt;Environments&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Sun, 09 Nov 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Workers automatic tracing, now in open beta</title><link>https://developers.cloudflare.com/changelog/post/2025-11-07-automatic-tracing/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-07-automatic-tracing/</guid><description>&lt;p&gt;Enable automatic tracing on your Workers, giving you detailed metadata and timing information for every operation your Worker performs.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/R2_Screenshot.DAnOidMq_Z15kdUk.webp&quot; alt=&quot;Tracing example&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;Tracing helps you identify performance bottlenecks, resolve errors, and understand how your Worker interacts with other services on the Workers platform. You can now answer questions like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Which calls are slowing down my application?&lt;/li&gt;
&lt;li&gt;Which queries to my database take the longest?&lt;/li&gt;
&lt;li&gt;What happened within a request that resulted in an error?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;You can now:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;View traces alongside your logs in the Workers Observability dashboard&lt;/li&gt;
&lt;li&gt;Export traces (and correlated logs) to any &lt;a href=&quot;https://opentelemetry.io/docs/specs/otel/protocol/&quot; target=&quot;_blank&quot;&gt;OTLP-compatible destination&lt;/a&gt;, such as &lt;a href=&quot;https://developers.cloudflare.com/workers/observability/exporting-opentelemetry-data/honeycomb/&quot;&gt;Honeycomb&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/workers/observability/exporting-opentelemetry-data/sentry/&quot;&gt;Sentry&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/workers/observability/exporting-opentelemetry-data/grafana-cloud/&quot;&gt;Grafana&lt;/a&gt;, by configuring a tracing destination in the &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers-and-pages/observability/destinations&quot; target=&quot;_blank&quot;&gt;Cloudflare dashboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Analyze and query across span attributes (operation type, status, duration, errors)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;To get started, set:&lt;/h4&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;jsonc&quot;&gt;&lt;code class=&quot;language-jsonc&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;observability&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;tracing&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;enabled&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;aside&gt;&lt;p&gt;Note&lt;/p&gt;&lt;div&gt;&lt;p&gt;In the future, Cloudflare plans to enable automatic tracing in addition to logs
when you set &lt;code&gt;observability.enabled = true&lt;/code&gt; in your Wrangler configuration.&lt;/p&gt;&lt;p&gt;While automatic tracing is in early beta, this setting will not enable tracing by default,
and will only enable logs.&lt;/p&gt;&lt;p&gt;An updated &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/compatibility-dates/&quot;&gt;&lt;code&gt;compatibility_date&lt;/code&gt;&lt;/a&gt; will be required for this change to take effect.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;h4&gt;Want to learn more?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.cloudflare.com/workers-tracing-now-in-open-beta/&quot; target=&quot;_blank&quot;&gt;Read the announcement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/observability/traces/&quot;&gt;Check out the documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Fri, 07 Nov 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>D1, Workers - D1 can restrict data localization with jurisdictions</title><link>https://developers.cloudflare.com/changelog/post/2025-11-05-d1-jurisdiction/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-05-d1-jurisdiction/</guid><description>&lt;p&gt;You can now set a &lt;a href=&quot;https://developers.cloudflare.com/d1/configuration/data-location/&quot;&gt;jurisdiction&lt;/a&gt; when creating a D1 database to guarantee where your database runs and stores data. Jurisdictions can help you comply with data localization regulations such as GDPR. Supported jurisdictions include &lt;code&gt;eu&lt;/code&gt; and &lt;code&gt;fedramp&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;A jurisdiction can only be set at database creation time via wrangler, REST API or the UI and cannot be added/updated after the database already exists.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler@latest&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;d1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;db-with-jurisdiction&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--jurisdiction&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;eu&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;plaintext&quot;&gt;&lt;code class=&quot;language-plaintext&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl -X POST &quot;https://api.cloudflare.com/client/v4/accounts/&amp;#x3C;account_id&gt;/d1/database&quot; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-H &quot;Authorization: Bearer $TOKEN&quot; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-H &quot;Content-Type: application/json&quot; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--data &apos;{&quot;name&quot;: &quot;db-wth-jurisdiction&quot;, &quot;jurisdiction&quot;: &quot;eu&quot; }&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;To learn more, visit D1&apos;s data location &lt;a href=&quot;https://developers.cloudflare.com/d1/configuration/data-location/&quot;&gt;documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 05 Nov 2025 00:00:00 GMT</pubDate><product>D1</product><category>D1</category><category>Workers</category></item><item><title>Workers VPC - Announcing Workers VPC Services (Beta)</title><link>https://developers.cloudflare.com/changelog/post/2025-09-25-workers-vpc/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-25-workers-vpc/</guid><description>&lt;p&gt;&lt;strong&gt;Workers VPC Services&lt;/strong&gt; is now available, enabling your Workers to securely access resources in your private networks, without having to expose them on the public Internet.&lt;/p&gt;
&lt;h4&gt;What&apos;s new&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;VPC Services&lt;/strong&gt;: Create secure connections to internal APIs, databases, and services using familiar Worker binding syntax&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-cloud Support&lt;/strong&gt;: Connect to resources in private networks in any external cloud (AWS, Azure, GCP, etc.) or on-premise using Cloudflare Tunnels&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Perform application logic in Workers here&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Sample call to an internal API running on ECS in AWS using the binding&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AWS_VPC_ECS_API&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;https://internal-host.example.com&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Additional application logic in Workers&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Getting started&lt;/h4&gt;
&lt;p&gt;Set up a Cloudflare Tunnel, create a VPC Service, add service bindings to your Worker, and access private resources securely. &lt;a href=&quot;https://developers.cloudflare.com/workers-vpc/&quot;&gt;Refer to the documentation&lt;/a&gt; to get started.&lt;/p&gt;</description><pubDate>Wed, 05 Nov 2025 00:00:00 GMT</pubDate><product>Workers VPC</product><category>Workers VPC</category></item><item><title>Workers - Capture Wrangler command output in structured format</title><link>https://developers.cloudflare.com/changelog/post/2025-11-03-wrangler-output-file/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-03-wrangler-output-file/</guid><description>&lt;p&gt;You can now capture Wrangler command output in a structured &lt;a href=&quot;https://github.com/ndjson/ndjson-spec&quot; target=&quot;_blank&quot;&gt;ND-JSON&lt;/a&gt; format by setting the &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/system-environment-variables/#supported-environment-variables&quot;&gt;&lt;code&gt;WRANGLER_OUTPUT_FILE_PATH&lt;/code&gt;&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/system-environment-variables/#supported-environment-variables&quot;&gt;&lt;code&gt;WRANGLER_OUTPUT_FILE_DIRECTORY&lt;/code&gt;&lt;/a&gt; environment variables. This feature is particularly useful for CI/CD pipelines and automation tools that need programmatic access to deployment information such as worker names, version IDs, deployment URLs, and error details. Commands that support this feature include &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/#deploy&quot;&gt;&lt;code&gt;wrangler deploy&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/#versions&quot;&gt;&lt;code&gt;wrangler versions upload&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/#versions&quot;&gt;&lt;code&gt;wrangler versions deploy&lt;/code&gt;&lt;/a&gt;, and &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/#deploy-1&quot;&gt;&lt;code&gt;wrangler pages deploy&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 03 Nov 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers, Durable Objects, Browser Rendering - Workers WebSocket message size limit increased from 1 MiB to 32 MiB</title><link>https://developers.cloudflare.com/changelog/post/2025-10-31-increased-websocket-message-size-limit/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-31-increased-websocket-message-size-limit/</guid><description>&lt;p&gt;Workers, including those using &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/&quot;&gt;Durable Objects&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/workers-bindings/&quot;&gt;Browser Rendering&lt;/a&gt;, may now process WebSocket messages up to 32 MiB in size. Previously, this limit was 1 MiB.&lt;/p&gt;
&lt;p&gt;This change allows Workers to handle use cases requiring large message sizes, such as processing Chrome Devtools Protocol messages.&lt;/p&gt;
&lt;p&gt;For more information, please see the &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/platform/limits/#sqlite-backed-durable-objects-general-limits&quot;&gt;Durable Objects startup limits&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 31 Oct 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category><category>Durable Objects</category><category>Browser Rendering</category></item><item><title>Workflows, Workers - Increased Workflows instance and concurrency limits</title><link>https://developers.cloudflare.com/changelog/post/2025-10-28-raising-limits/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-28-raising-limits/</guid><description>&lt;p&gt;We&apos;ve raised the &lt;a href=&quot;https://developers.cloudflare.com/workflows/&quot;&gt;Cloudflare Workflows&lt;/a&gt; account-level limits for all accounts on the &lt;a href=&quot;https://developers.cloudflare.com/workers/platform/pricing/&quot;&gt;Workers paid plan&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Instance creation rate&lt;/strong&gt; increased from 100 workflow instances per 10 seconds to 100 instances per second&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Concurrency limit&lt;/strong&gt; increased from 4,500 to 10,000 workflow instances per account&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These increases mean you can create new instances up to 10x faster, and have more workflow instances concurrently executing. To learn more and get started with Workflows, refer to &lt;a href=&quot;https://developers.cloudflare.com/workflows/get-started/guide/&quot;&gt;the getting started guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If your application requires a higher limit, fill out the &lt;a href=&quot;https://developers.cloudflare.com/workers/platform/limits/&quot;&gt;Limit Increase Request Form&lt;/a&gt; or contact your account team. Please refer to &lt;a href=&quot;https://developers.cloudflare.com/workflows/reference/pricing/&quot;&gt;Workflows pricing&lt;/a&gt; for more information.&lt;/p&gt;</description><pubDate>Fri, 31 Oct 2025 00:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category><category>Workers</category></item><item><title>Workers - Access Workers preview URLs from the Build details page</title><link>https://developers.cloudflare.com/changelog/post/2025-10-30-builds-preview/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-30-builds-preview/</guid><description>&lt;p&gt;You can now access &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/previews/&quot;&gt;preview URLs&lt;/a&gt; directly from the build details page, making it easier to test your changes when reviewing builds in the dashboard.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/builds-preview-button.CjGnhkt7_kOMMe.webp&quot; alt=&quot;preview button&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;&lt;strong&gt;What&apos;s new&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;Preview&lt;/strong&gt; button now appears in the top-right corner of the build details page for successful builds&lt;/li&gt;
&lt;li&gt;Click it to instantly open the latest preview URL&lt;/li&gt;
&lt;li&gt;Matches the same experience you&apos;re familiar with from Pages&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Thu, 30 Oct 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>AI Search - Reranking and API-based system prompt configuration in AI Search</title><link>https://developers.cloudflare.com/changelog/post/2025-10-27-ai-search-reranking-system-prompt/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-27-ai-search-reranking-system-prompt/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-search/&quot;&gt;AI Search&lt;/a&gt; now supports reranking for improved retrieval quality and allows you to set the system prompt directly in your API requests.&lt;/p&gt;
&lt;h4&gt;Rerank for more relevant results&lt;/h4&gt;
&lt;p&gt;You can now enable &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/reranking/&quot;&gt;reranking&lt;/a&gt; to reorder retrieved documents based on their semantic relevance to the user’s query. Reranking helps improve accuracy, especially for large or noisy datasets where vector similarity alone may not produce the optimal ordering.&lt;/p&gt;
&lt;p&gt;You can enable and configure reranking in the dashboard or directly in your API requests:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;answer&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AI&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;autorag&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;my-autorag&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;aiSearch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;query&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;How do I train a llama to deliver coffee?&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;@cf/meta/llama-3.3-70b-instruct-fp8-fast&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;reranking&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;enabled&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;@cf/baai/bge-reranker-base&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Set system prompts in API&lt;/h4&gt;
&lt;p&gt;Previously, &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/system-prompt/&quot;&gt;system prompts&lt;/a&gt; could only be configured in the dashboard. You can now define them directly in your API requests, giving you per-query control over behavior. For example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Dynamically set query and system prompt in AI Search&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getAnswer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;query&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tone&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;systemPrompt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;`You are a &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;tone&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; assistant.`&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AI&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;autorag&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;my-autorag&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;aiSearch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;query&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;query&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;system_prompt&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;systemPrompt&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Example usage&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;query&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;What is Cloudflare?&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tone&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;friendly&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;answer&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getAnswer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;query&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tone&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;answer&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/reranking/&quot;&gt;Reranking&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/system-prompt/&quot;&gt;System Prompt&lt;/a&gt; in AI Search.&lt;/p&gt;</description><pubDate>Tue, 28 Oct 2025 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>Workers - Automatic resource provisioning for KV, R2, and D1</title><link>https://developers.cloudflare.com/changelog/post/2025-10-24-automatic-resource-provisioning/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-24-automatic-resource-provisioning/</guid><description>&lt;p&gt;Previously, if you wanted to develop or deploy a worker with attached resources, you&apos;d have to first manually create the desired resources. Now, if your Wrangler configuration file includes a KV namespace, D1 database, or R2 bucket that does not yet exist on your account, you can develop locally and deploy your application seamlessly, without having to run additional commands.&lt;/p&gt;
&lt;p&gt;Automatic provisioning is launching as an open beta, and we&apos;d love to hear your feedback to help us make improvements! It currently works for KV, R2, and D1 bindings. You can disable the feature using the &lt;code&gt;--no-x-provision&lt;/code&gt; flag.&lt;/p&gt;
&lt;p&gt;To use this feature, update to wrangler@4.45.0 and add bindings to your config file &lt;em&gt;without&lt;/em&gt; resource IDs e.g.:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;jsonc&quot;&gt;&lt;code class=&quot;language-jsonc&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;kv_namespaces&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;binding&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;MY_KV&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;d1_databases&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;binding&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;MY_DB&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;r2_buckets&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;binding&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;MY_R2&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;wrangler dev&lt;/code&gt; will then automatically create these resources for you locally, and on your next run of &lt;code&gt;wrangler deploy&lt;/code&gt;, Wrangler will call the Cloudflare API to create the requested resources and link them to your Worker.&lt;/p&gt;
&lt;p&gt;Though resource IDs will be automatically written back to your Wrangler config file after resource creation, resources will stay linked across future deploys even without adding the resource IDs to the config file. This is especially useful for shared templates, which now no longer need to include account-specific resource IDs when adding a binding.&lt;/p&gt;</description><pubDate>Fri, 24 Oct 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Build TanStack Start apps with the Cloudflare Vite plugin</title><link>https://developers.cloudflare.com/changelog/post/2025-10-24-tanstack-start/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-24-tanstack-start/</guid><description>&lt;p&gt;The &lt;a href=&quot;https://developers.cloudflare.com/workers/vite-plugin/&quot;&gt;Cloudflare Vite plugin&lt;/a&gt; now supports &lt;a href=&quot;https://tanstack.com/start/&quot; target=&quot;_blank&quot;&gt;TanStack Start&lt;/a&gt; apps.
Get started with new or existing projects.&lt;/p&gt;
&lt;h4&gt;New projects&lt;/h4&gt;
&lt;p&gt;Create a new TanStack Start project that uses the Cloudflare Vite plugin via the &lt;code&gt;create-cloudflare&lt;/code&gt; CLI:&lt;/p&gt;
 &lt;div&gt; &lt;div&gt;  &lt;/div&gt; &lt;div&gt; &lt;div&gt;  &lt;pre&gt;&lt;code class=&quot;astro-qph66ij4&quot;&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; create cloudflare@latest -- my-tanstack-start-app --framework=tanstack-start&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;/div&gt; &lt;/div&gt;&lt;div&gt; &lt;div&gt;  &lt;pre&gt;&lt;code class=&quot;astro-qph66ij4&quot;&gt;&lt;span&gt;yarn&lt;/span&gt;&lt;span&gt; create cloudflare my-tanstack-start-app --framework=tanstack-start&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;/div&gt; &lt;/div&gt;&lt;div&gt; &lt;div&gt;  &lt;pre&gt;&lt;code class=&quot;astro-qph66ij4&quot;&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; create cloudflare@latest my-tanstack-start-app --framework=tanstack-start&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;/div&gt; &lt;/div&gt;  &lt;/div&gt;  
&lt;h4&gt;Existing projects&lt;/h4&gt;
&lt;p&gt;Migrate an existing TanStack Start project to use the Cloudflare Vite plugin:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install &lt;code&gt;@cloudflare/vite-plugin&lt;/code&gt; and &lt;code&gt;wrangler&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
 &lt;div&gt; &lt;div&gt;  &lt;/div&gt; &lt;div&gt; &lt;div&gt;  &lt;pre&gt;&lt;code class=&quot;astro-qph66ij4&quot;&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; i -D @cloudflare/vite-plugin wrangler&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;/div&gt; &lt;/div&gt;&lt;div&gt; &lt;div&gt;  &lt;pre&gt;&lt;code class=&quot;astro-qph66ij4&quot;&gt;&lt;span&gt;yarn&lt;/span&gt;&lt;span&gt; add -D @cloudflare/vite-plugin wrangler&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;/div&gt; &lt;/div&gt;&lt;div&gt; &lt;div&gt;  &lt;pre&gt;&lt;code class=&quot;astro-qph66ij4&quot;&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; add -D @cloudflare/vite-plugin wrangler&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;/div&gt; &lt;/div&gt;&lt;div&gt; &lt;div&gt;  &lt;pre&gt;&lt;code class=&quot;astro-qph66ij4&quot;&gt;&lt;span&gt;bun&lt;/span&gt;&lt;span&gt; add -d @cloudflare/vite-plugin wrangler&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;/div&gt; &lt;/div&gt;  &lt;/div&gt;  
&lt;ol&gt;
&lt;li&gt;Add the Cloudflare plugin to your Vite config&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineConfig&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;vite&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tanstackStart&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@tanstack/react-start/plugin/vite&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;viteReact&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;@vitejs/plugin-react&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cloudflare&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@cloudflare/vite-plugin&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineConfig&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;plugins&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;cloudflare&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; viteEnvironment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;ssr&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;tanstackStart&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;viteReact&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Add your Worker config file&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;wrangler.jsonc&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;jsonc&quot;&gt;&lt;code class=&quot;language-jsonc&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;$schema&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./node_modules/wrangler/config-schema.json&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-tanstack-start-app&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Set this to today&apos;s date&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;compatibility_date&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;2026-04-03&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;compatibility_flags&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;nodejs_compat&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;@tanstack/react-start/server-entry&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;wrangler.toml&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;toml&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;$schema&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./node_modules/wrangler/config-schema.json&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-tanstack-start-app&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Set this to today&apos;s date&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;compatibility_date&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;2026-04-03&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;compatibility_flags&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;nodejs_compat&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;@tanstack/react-start/server-entry&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;ol&gt;
&lt;li&gt;Modify the scripts in your &lt;code&gt;package.json&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;scripts&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;dev&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;vite dev&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;build&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;vite build &amp;#x26;&amp;#x26; tsc --noEmit&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;start&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;node .output/server/index.mjs&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;preview&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;vite preview&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;deploy&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;npm run build &amp;#x26;&amp;#x26; wrangler deploy&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;cf-typegen&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;wrangler types&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;See the &lt;a href=&quot;https://developers.cloudflare.com/workers/framework-guides/web-apps/tanstack-start/&quot;&gt;TanStack Start framework guide&lt;/a&gt; for more info.&lt;/p&gt;</description><pubDate>Fri, 24 Oct 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers AI - Workers AI Markdown Conversion: New endpoint to list supported formats</title><link>https://developers.cloudflare.com/changelog/post/2025-10-23-new-markdown-conversion-endpoint/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-23-new-markdown-conversion-endpoint/</guid><description>&lt;p&gt;Developers can now programmatically retrieve a list of all file formats supported by the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/features/markdown-conversion/&quot;&gt;Markdown Conversion utility&lt;/a&gt; in Workers AI.&lt;/p&gt;
&lt;p&gt;You can use the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/configuration/bindings/&quot;&gt;&lt;code&gt;env.AI&lt;/code&gt;&lt;/a&gt; binding:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AI&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toMarkdown&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;supported&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Or call the REST API:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://api.cloudflare.com/client/v4/accounts/{ACCOUNT_ID}/ai/tomarkdown/supported&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-H&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;Authorization: Bearer {API_TOKEN}&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Both return a list of file formats that users can convert into Markdown:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;extension&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;.pdf&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;mimeType&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;application/pdf&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;extension&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;.jpeg&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;mimeType&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;image/jpeg&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Learn more about our &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/features/markdown-conversion/&quot;&gt;Markdown Conversion utility&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 23 Oct 2025 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category></item><item><title>Workers - Workers Preview URL default behavior now matches your workers.dev setting</title><link>https://developers.cloudflare.com/changelog/post/2025-10-23-preview-url-default-behavior/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-23-preview-url-default-behavior/</guid><description>&lt;p&gt;We have updated the default behavior for Cloudflare Workers &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/previews/&quot;&gt;Preview URLs&lt;/a&gt;. &lt;strong&gt;Going forward, if a preview URL setting is not &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/previews/#toggle-preview-urls-enable-or-disable&quot;&gt;explicitly configured&lt;/a&gt; during deployment, its default behavior will automatically match the setting of your &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/routing/workers-dev/&quot;&gt;&lt;code&gt;workers.dev&lt;/code&gt; subdomain&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This change is intended to provide a more intuitive and secure experience by aligning your preview URL&apos;s default state with your &lt;code&gt;workers.dev&lt;/code&gt; configuration to prevent cases where a preview URL might remain public even after you disabled your &lt;code&gt;workers.dev&lt;/code&gt; route.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What this means for you:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;If neither setting is configured:&lt;/strong&gt; both the workers.dev route and the preview URL will default to enabled&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If your workers.dev route is enabled and you do not explicitly set Preview URLs to enabled or disabled:&lt;/strong&gt; Preview URLs will default to enabled&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If your workers.dev route is disabled and you do not explicitly set Preview URLs to enabled or disabled:&lt;/strong&gt; Preview URLs will default to disabled&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can override the default setting by explicitly enabling or disabling the preview URL in your Worker&apos;s configuration through the &lt;a href=&quot;https://developers.cloudflare.com/api/resources/workers/subresources/scripts/subresources/subdomain/&quot;&gt;API&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/previews/#from-the-dashboard&quot;&gt;Dashboard&lt;/a&gt;, or &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/previews/#from-the-wrangler-configuration-file&quot;&gt;Wrangler&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Wrangler Version Behavior&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The default behavior depends on the version of Wrangler you are using. This new logic applies to the latest version. Here is a summary of the behavior across different versions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Before v4.34.0:&lt;/strong&gt; Preview URLs defaulted to enabled, regardless of the workers.dev setting.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;v4.34.0 up to (but not including) v4.44.0:&lt;/strong&gt; Preview URLs defaulted to disabled, regardless of the workers.dev setting.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;v4.44.0 or later:&lt;/strong&gt; Preview URLs now default to matching your workers.dev setting.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Why we’re making this change&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In July, &lt;a href=&quot;https://developers.cloudflare.com/changelog/2025-07-23-workers-preview-urls/&quot;&gt;we introduced preview URLs to Workers&lt;/a&gt;, which let you preview code changes before deploying to production. This made disabling your Worker’s workers.dev URL an ambiguous action — the preview URL, served as a subdomain of &lt;code&gt;workers.dev&lt;/code&gt; (ex: &lt;code&gt;preview-id-worker-name.account-name.workers.dev&lt;/code&gt;) would still be live even if you had disabled your Worker’s &lt;code&gt;workers.dev&lt;/code&gt; route. If you misinterpreted what it meant to disable your &lt;code&gt;workers.dev&lt;/code&gt; route, you might unintentionally leave preview URLs enabled when you didn’t mean to, and expose them to the public Internet.&lt;/p&gt;
&lt;p&gt;To address this, we made a &lt;a href=&quot;https://developers.cloudflare.com/changelog/2025-09-17-update-preview-url-setting/&quot;&gt;one-time update&lt;/a&gt; to disable preview URLs on existing Workers that had their workers.dev route disabled and changed the default behavior to be disabled for all new deployments where a preview URL setting was not explicitly configured.&lt;/p&gt;
&lt;p&gt;While this change helped secure many customers, it was disruptive for customers who keep their &lt;code&gt;workers.dev&lt;/code&gt; route enabled and actively use the preview functionality, as it now required them to explicitly enable preview URLs on every redeployment.This new, more intuitive behavior ensures that your preview URL settings align with your &lt;code&gt;workers.dev&lt;/code&gt; configuration by default, providing a more secure and predictable experience.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Securing access to &lt;code&gt;workers.dev&lt;/code&gt; and preview URL endpoints&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To further secure your &lt;code&gt;workers.dev&lt;/code&gt; subdomain and preview URL, you can &lt;a href=&quot;https://developers.cloudflare.com/changelog/2025-10-03-one-click-access-for-workers/&quot;&gt;enable Cloudflare Access with a single click&lt;/a&gt; in your Worker&apos;s settings to limit access to specific users or groups.&lt;/p&gt;</description><pubDate>Thu, 23 Oct 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Durable Objects, Workers - View and edit Durable Object data in UI with Data Studio (Beta)</title><link>https://developers.cloudflare.com/changelog/post/2025-10-16-durable-objects-data-studio/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-16-durable-objects-data-studio/</guid><description>&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/do-data-studio.BfCcgtkq_Z4LLzm.webp&quot; alt=&quot;Screenshot of Durable Objects Data Studio&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;You can now view and write to each Durable Object&apos;s storage using a UI editor on the Cloudflare dashboard. Only Durable Objects using &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/best-practices/access-durable-objects-storage/#create-sqlite-backed-durable-object-class&quot;&gt;SQLite storage&lt;/a&gt; can use Data Studio.&lt;/p&gt;
&lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers/durable-objects&quot; target=&quot;_blank&quot;&gt;  Go to &lt;strong&gt;Durable Objects&lt;/strong&gt;  &lt;/a&gt;
&lt;p&gt;Data Studio unlocks easier data access with Durable Objects for prototyping application data models to debugging production storage usage. Before, querying your Durable Objects data required deploying a Worker.&lt;/p&gt;
&lt;p&gt;To access a Durable Object, you can provide an object&apos;s unique name or ID generated by Cloudflare. Data Studio requires you to have at least the &lt;code&gt;Workers Platform Admin&lt;/code&gt; role, and all queries are captured with audit logging for your security and compliance needs. Queries executed by Data Studio send requests to your remote, deployed objects and incur normal usage billing.&lt;/p&gt;
&lt;p&gt;To learn more, visit the Data Studio &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/observability/data-studio/&quot;&gt;documentation&lt;/a&gt;. If you have feedback or suggestions for the new Data Studio, please share your experience on &lt;a href=&quot;https://discord.com/channels/595317990191398933/773219443911819284&quot; target=&quot;_blank&quot;&gt;Discord&lt;/a&gt;&lt;/p&gt;</description><pubDate>Thu, 16 Oct 2025 00:00:00 GMT</pubDate><product>Durable Objects</product><category>Durable Objects</category><category>Workers</category></item><item><title>Workers - Worker startup time limit increased to 1 second</title><link>https://developers.cloudflare.com/changelog/post/2025-10-10-increased-startup-time/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-10-increased-startup-time/</guid><description>&lt;p&gt;You can now upload a Worker that takes up 1 second to parse and execute its global scope. Previously, startup time was limited to 400 ms.&lt;/p&gt;
&lt;p&gt;This allows you to run Workers that import more complex packages and execute more code prior to requests being handled.&lt;/p&gt;
&lt;p&gt;For more information, see the documentation on &lt;a href=&quot;https://developers.cloudflare.com/workers/platform/limits/#worker-startup-time&quot;&gt;Workers startup limits&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 10 Oct 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - You can now deploy full-stack apps on Workers using Terraform</title><link>https://developers.cloudflare.com/changelog/post/2025-10-09-assets-terraform/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-09-assets-terraform/</guid><description>&lt;p&gt;You can now upload Workers with &lt;a href=&quot;https://developers.cloudflare.com/workers/static-assets/&quot;&gt;static assets&lt;/a&gt; (like HTML, CSS, JavaScript, images) with the &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/5.11.0/docs&quot; target=&quot;_blank&quot;&gt;Cloudflare Terraform provider v5.11.0&lt;/a&gt;, making it even easier to deploy and manage full-stack apps with IaC.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Previously&lt;/strong&gt;, you couldn&apos;t use Terraform to upload static assets without writing custom scripts to handle generating an &lt;a href=&quot;https://developers.cloudflare.com/workers/static-assets/direct-upload/#upload-manifest&quot;&gt;asset manifest&lt;/a&gt;, calling the &lt;a href=&quot;https://developers.cloudflare.com/workers/static-assets/direct-upload/#upload-static-assets&quot;&gt;Cloudflare API to upload assets in chunks&lt;/a&gt;, and handling change detection.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Now&lt;/strong&gt;, you simply define the directory where your assets are built, and we handle the rest. Check out the &lt;a href=&quot;https://developers.cloudflare.com/changelog/#examples&quot;&gt;examples&lt;/a&gt; for what this looks like in Terraform configuration.&lt;/p&gt;
&lt;p&gt;You can get started today with &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/5.11.0/docs&quot; target=&quot;_blank&quot;&gt;the Cloudflare Terraform provider (v5.11.0)&lt;/a&gt;, using either the existing &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/workers_script&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;cloudflare_workers_script&lt;/code&gt; resource&lt;/a&gt;, or the beta &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/worker_version&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;cloudflare_worker_version&lt;/code&gt; resource&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Examples&lt;/h4&gt;
&lt;h4&gt;With &lt;code&gt;cloudflare_workers_script&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Here&apos;s how you can use the existing &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/5.11.0/docs/resources/workers_script&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;cloudflare_workers_script&lt;/code&gt;&lt;/a&gt; resource to upload your Worker code and assets in one shot.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;hcl&quot;&gt;&lt;code class=&quot;language-hcl&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;resource&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;cloudflare_workers_script&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my_app&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;account_id&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; var&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;account_id&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;script_name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-app&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;content_file&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./dist/worker/index.js&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;content_sha256&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;filesha256&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;./dist/worker/index.js&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;main_module&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;index.js&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# Just point to your assets directory - that&apos;s it!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;assets&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;directory&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./dist/static&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;With &lt;code&gt;cloudflare_worker&lt;/code&gt;, &lt;code&gt;cloudflare_worker_version&lt;/code&gt;, and &lt;code&gt;cloudflare_workers_deployment&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;And here&apos;s an example using the beta &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/5.11.0/docs/resources/worker_version&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;cloudflare_worker_version&lt;/code&gt;&lt;/a&gt; resource, alongside the &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/worker&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;cloudflare_worker&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/5.11.0/docs/resources/workers_deployment&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;cloudflare_workers_deployment&lt;/code&gt;&lt;/a&gt; resources:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;hcl&quot;&gt;&lt;code class=&quot;language-hcl&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# This tracks the existence of your Worker, so that you&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# can upload code and assets separately from tracking Worker state.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;resource&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;cloudflare_worker&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my_app&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;account_id&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; var&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;account_id&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-app&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;resource&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;cloudflare_worker_version&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my_app_version&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;account_id&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; var&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;account_id&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;worker_id&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; cloudflare_worker&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;my_app&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# Just point to your assets directory - that&apos;s it!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;assets&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;directory&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./dist/static&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;modules&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;         &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;index.js&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;content_file&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./dist/worker/index.js&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;content_type&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;application/javascript+module&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;resource&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;cloudflare_workers_deployment&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my_app_deployment&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;account_id&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; var&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;account_id&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;script_name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; cloudflare_worker&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;my_app&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;strategy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;percentage&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;versions&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;version_id&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; cloudflare_worker_version.my_app_version.id&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;percentage&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;What&apos;s changed&lt;/h4&gt;
&lt;p&gt;Under the hood, the Cloudflare Terraform provider now handles the same logic that Wrangler uses for static asset uploads. This includes scanning your assets directory, computing hashes for each file, generating a manifest with file metadata, and calling the Cloudflare API to upload any missing files in chunks. We support large directories with parallel uploads and chunking, and when the asset manifest hash changes, we detect what&apos;s changed and trigger an upload for &lt;em&gt;only&lt;/em&gt; those changed files.&lt;/p&gt;
&lt;h4&gt;Try it out&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Get started with &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/5.11.0/docs&quot; target=&quot;_blank&quot;&gt;the Cloudflare Terraform provider (v5.11.0)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;You can use either the existing &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/workers_script&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;cloudflare_workers_script&lt;/code&gt; resource&lt;/a&gt; to upload your Worker code and assets in one resource.&lt;/li&gt;
&lt;li&gt;Or you can use the new beta &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/worker_version&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;cloudflare_worker_version&lt;/code&gt; resource&lt;/a&gt; (along with the &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/worker&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;cloudflare_worker&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/5.11.0/docs/resources/workers_deployment&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;cloudflare_workers_deployment&lt;/code&gt;&lt;/a&gt;) resources to more granularly control the lifecycle of each Worker resource.&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Thu, 09 Oct 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - You can now deploy and manage Workflows in Terraform</title><link>https://developers.cloudflare.com/changelog/post/2025-10-09-workflows-terraform/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-09-workflows-terraform/</guid><description>&lt;p&gt;You can now create and manage &lt;a href=&quot;https://developers.cloudflare.com/workflows/&quot;&gt;Workflows&lt;/a&gt; using Terraform, now supported in the &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/workflow&quot; target=&quot;_blank&quot;&gt;Cloudflare Terraform provider v5.11.0&lt;/a&gt;. Workflows allow you to build durable, multi-step applications -- without needing to worry about retrying failed tasks or managing infrastructure.&lt;/p&gt;
&lt;p&gt;Now, you can deploy and manage Workflows through Terraform using the new &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/workflow&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;cloudflare_workflow&lt;/code&gt; resource&lt;/a&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;hcl&quot;&gt;&lt;code class=&quot;language-hcl&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;resource&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;cloudflare_workflow&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my_workflow&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;account_id&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; var&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;account_id&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;workflow_name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-workflow&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;class_name&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;MyWorkflow&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;script_name&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-worker&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Examples&lt;/h4&gt;
&lt;p&gt;Here are full examples of how to configure &lt;code&gt;cloudflare_workflow&lt;/code&gt; in Terraform, using the existing &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/workers_script&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;cloudflare_workers_script&lt;/code&gt; resource&lt;/a&gt;, and the beta &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/worker_version&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;cloudflare_worker_version&lt;/code&gt; resource&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;With &lt;code&gt;cloudflare_workflow&lt;/code&gt; and &lt;code&gt;cloudflare_workers_script&lt;/code&gt;&lt;/h4&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;hcl&quot;&gt;&lt;code class=&quot;language-hcl&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;resource&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;cloudflare_workers_script&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;workflow_worker&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;account_id&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; var&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;cloudflare_account_id&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;script_name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-workflow-worker&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;content_file&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;module&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt;/../dist/worker/index.js&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;content_sha256&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;filesha256&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;module&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt;/../dist/worker/index.js&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;main_module&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;index.js&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;resource&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;cloudflare_workflow&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;workflow&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;account_id&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; var&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;cloudflare_account_id&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;workflow_name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-workflow&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;class_name&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;MyWorkflow&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;script_name&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; cloudflare_workers_script&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;workflow_worker&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;script_name&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;With &lt;code&gt;cloudflare_workflow&lt;/code&gt;, and the new beta resources&lt;/h4&gt;
&lt;p&gt;You can more granularly control the lifecycle of each Worker resource using the beta &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/5.11.0/docs/resources/worker_version&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;cloudflare_worker_version&lt;/code&gt;&lt;/a&gt; resource, alongside the &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/worker&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;cloudflare_worker&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/5.11.0/docs/resources/workers_deployment&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;cloudflare_workers_deployment&lt;/code&gt;&lt;/a&gt; resources.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;hcl&quot;&gt;&lt;code class=&quot;language-hcl&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;resource&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;cloudflare_worker&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;workflow_worker&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;account_id&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; var&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;cloudflare_account_id&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-workflow-worker&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;resource&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;cloudflare_worker_version&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;workflow_worker_version&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;account_id&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; var&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;cloudflare_account_id&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;worker_id&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; cloudflare_worker&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;workflow_worker&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;main_module&lt;/span&gt;&lt;span&gt;         &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;index.js&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;modules&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;         &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;index.js&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;content_file&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;module&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt;/../dist/worker/index.js&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;content_type&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;application/javascript+module&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;resource&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;cloudflare_workers_deployment&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;workflow_deployment&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;account_id&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; var&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;cloudflare_account_id&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;script_name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; cloudflare_worker&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;workflow_worker&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;strategy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;percentage&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;versions&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;version_id&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; cloudflare_worker_version.workflow_worker_version.id&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;percentage&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;resource&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;cloudflare_workflow&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my_workflow&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;account_id&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; var&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;cloudflare_account_id&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;workflow_name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-workflow&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;class_name&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;MyWorkflow&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;script_name&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; cloudflare_worker&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;workflow_worker&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Try it out&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Get started with &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/5.11.0/docs&quot; target=&quot;_blank&quot;&gt;the Cloudflare Terraform provider (v5.11.0)&lt;/a&gt; and the new &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/workflow&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;cloudflare_workflow&lt;/code&gt; resource&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Thu, 09 Oct 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - New Overview Page for Cloudflare Workers</title><link>https://developers.cloudflare.com/changelog/post/2025-10-06-new-worker-overview-page/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-06-new-worker-overview-page/</guid><description>&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/workers-overview.BM_exs4R_IaSn9.webp&quot; alt=&quot;Screenshot of the Workers overview page in the Cloudflare dashboard&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;Each of your Workers now has a new overview page in the Cloudflare dashboard.&lt;/p&gt;
&lt;p&gt;The goal is to make it easier to understand your Worker without digging through multiple tabs. Think of it as a new home base, a place to get a high-level overview on what&apos;s going on.&lt;/p&gt;
&lt;p&gt;It&apos;s the first place you land when you open a Worker in the dashboard, and it gives you an immediate view of what’s going on. You can see requests, errors, and CPU time at a glance. You can view and add bindings, and see recent versions of your app, including who published them.&lt;/p&gt;
&lt;p&gt;Navigation is also simpler, with visually distinct tabs at the top of the page. At the bottom right you&apos;ll find guided steps for what to do next that are based on the state of your Worker, such as adding a &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/bindings/&quot;&gt;binding&lt;/a&gt; or connecting a custom domain.&lt;/p&gt;
&lt;p&gt;We plan to add more here over time. Better insights, more controls, and ways to manage your Worker from one page.&lt;/p&gt;
&lt;p&gt;If you have feedback or suggestions for the new Overview page or your Cloudflare Workers experience in general, we&apos;d love to hear from you. Join the Cloudflare developer community on &lt;a href=&quot;https://discord.com/channels/595317990191398933/1064502845061210152&quot; target=&quot;_blank&quot;&gt;Discord&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 07 Oct 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>R2 - R2 Data Catalog table-level compaction</title><link>https://developers.cloudflare.com/changelog/post/2025-10-06-data-catalog-table-compaction/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-06-data-catalog-table-compaction/</guid><description>&lt;p&gt;You can now enable compaction for individual &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot;&gt;Apache Iceberg&lt;/a&gt; tables in &lt;a href=&quot;https://developers.cloudflare.com/r2/data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt;, giving you fine-grained control over different workloads.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Enable compaction for a specific table (no token required)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;r2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bucket&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;catalog&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;compaction&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;enable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;#x3C;BUCKET&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;#x3C;NAMESPACE&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;#x3C;TABLE&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--target-size&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;256&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;This allows you to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Apply different target file sizes per table&lt;/li&gt;
&lt;li&gt;Disable compaction for specific tables&lt;/li&gt;
&lt;li&gt;Optimize based on table-specific access patterns&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Learn more at &lt;a href=&quot;https://developers.cloudflare.com/r2/data-catalog/manage-catalogs/&quot;&gt;Manage catalogs&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 06 Oct 2025 00:00:00 GMT</pubDate><product>R2</product><category>R2</category></item><item><title>Workers - One-click Cloudflare Access for Workers</title><link>https://developers.cloudflare.com/changelog/post/2025-10-03-one-click-access-for-workers/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-03-one-click-access-for-workers/</guid><description>&lt;p&gt;You can now enable &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/policies/&quot;&gt;Cloudflare Access&lt;/a&gt; for your &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/routing/workers-dev/&quot;&gt;&lt;code&gt;workers.dev&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/previews/&quot;&gt;Preview URLs&lt;/a&gt; in a single click.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/workers-access.DGGYThLx_1YsjKO.webp&quot; alt=&quot;Screenshot of the Enable/Disable Cloudflare Access button on the workers.dev route settings page&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;Access allows you to limit access to your Workers to specific users or groups. You can limit access to yourself, your teammates, your organization, or anyone else you specify in your &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/policies/&quot;&gt;Access policy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To enable Cloudflare Access:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;In the Cloudflare dashboard, go to the &lt;strong&gt;Workers &amp;#x26; Pages&lt;/strong&gt; page.&lt;/p&gt;
&lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers-and-pages&quot; target=&quot;_blank&quot;&gt;  Go to &lt;strong&gt;Workers &amp;#x26; Pages&lt;/strong&gt;  &lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In &lt;strong&gt;Overview&lt;/strong&gt;, select your Worker.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go to &lt;strong&gt;Settings&lt;/strong&gt; &gt; &lt;strong&gt;Domains &amp;#x26; Routes&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For &lt;code&gt;workers.dev&lt;/code&gt; or Preview URLs, click &lt;strong&gt;Enable Cloudflare Access&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Optionally, to configure the Access application, click &lt;strong&gt;Manage Cloudflare Access&lt;/strong&gt;. There, you can change the email addresses you want to authorize. View &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/policies/#selectors&quot;&gt;Access policies&lt;/a&gt; to learn about configuring alternate rules.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To fully secure your application, it is important that you validate the JWT that Cloudflare Access adds to the &lt;code&gt;Cf-Access-Jwt-Assertion&lt;/code&gt; header on the incoming request.&lt;/p&gt;
&lt;p&gt;The following code will validate the JWT using the &lt;a href=&quot;https://www.npmjs.com/package/jose&quot; target=&quot;_blank&quot;&gt;jose NPM package&lt;/a&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;jwtVerify&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;createRemoteJWKSet&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;jose&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Verify the POLICY_AUD environment variable is set&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;POLICY_AUD&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Missing required audience&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;status&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;403&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Content-Type&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;text/plain&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Get the JWT from the request headers&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;token&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;cf-access-jwt-assertion&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Check if token exists&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;token&lt;/span&gt;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Missing required CF Access JWT&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;status&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;403&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Content-Type&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;text/plain&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;try&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// Create JWKS from your team domain&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;JWKS&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;createRemoteJWKSet&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;URL&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;TEAM_DOMAIN&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/cdn-cgi/access/certs`&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// Verify the JWT&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;payload&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;jwtVerify&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;token&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;JWKS&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;issuer&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;TEAM_DOMAIN&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;audience&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;POLICY_AUD&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// Token is valid, proceed with your application logic&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`Hello &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;payload&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;email&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;authenticated user&quot;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;!`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Content-Type&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;text/plain&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;catch&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// Token verification failed&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`Invalid token: &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;status&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;403&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Content-Type&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;text/plain&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Required environment variables&lt;/h4&gt;
&lt;p&gt;Add these &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/environment-variables/&quot;&gt;environment variables&lt;/a&gt; to your Worker:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;POLICY_AUD&lt;/code&gt;: Your application&apos;s AUD tag&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TEAM_DOMAIN&lt;/code&gt;: &lt;code&gt;https://&amp;#x3C;your-team-name&gt;.cloudflareaccess.com&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both of these appear in the modal that appears when you enable Cloudflare Access.&lt;/p&gt;
&lt;p&gt;You can set these variables by adding them to your Worker&apos;s &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/configuration/&quot;&gt;Wrangler configuration file&lt;/a&gt;, or via the Cloudflare dashboard under &lt;strong&gt;Workers &amp;#x26; Pages&lt;/strong&gt; &gt; &lt;strong&gt;your-worker&lt;/strong&gt; &gt; &lt;strong&gt;Settings&lt;/strong&gt; &gt; &lt;strong&gt;Environment Variables&lt;/strong&gt;.&lt;/p&gt;</description><pubDate>Fri, 03 Oct 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers AI - New Deepgram Flux model available on Workers AI</title><link>https://developers.cloudflare.com/changelog/post/2025-10-02-deepgram-flux/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-02-deepgram-flux/</guid><description>&lt;p&gt;Deepgram&apos;s newest Flux model &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/flux/&quot;&gt;&lt;code&gt;@cf/deepgram/flux&lt;/code&gt;&lt;/a&gt; is now available on Workers AI, hosted directly on Cloudflare&apos;s infrastructure. We&apos;re excited to be a launch partner with Deepgram and offer their new Speech Recognition model built specifically for enabling voice agents. Check out &lt;a href=&quot;https://deepgram.com/flux&quot; target=&quot;_blank&quot;&gt;Deepgram&apos;s blog&lt;/a&gt; for more details on the release.&lt;/p&gt;
&lt;p&gt;The Flux model can be used in conjunction with Deepgram&apos;s speech-to-text model &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/nova-3/&quot;&gt;&lt;code&gt;@cf/deepgram/nova-3&lt;/code&gt;&lt;/a&gt; and text-to-speech model &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/aura-1/&quot;&gt;&lt;code&gt;@cf/deepgram/aura-1&lt;/code&gt;&lt;/a&gt; to build end-to-end voice agents. Having Deepgram on Workers AI takes advantage of our edge GPU infrastructure, for ultra low latency voice AI applications.&lt;/p&gt;
&lt;h4&gt;Promotional Pricing&lt;/h4&gt;
&lt;p&gt;For the month of October 2025, Deepgram&apos;s Flux model will be free to use on Workers AI. Official pricing will be announced soon and charged after the promotional pricing period ends on October 31, 2025. Check out the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/flux/&quot;&gt;model page&lt;/a&gt; for pricing details in the future.&lt;/p&gt;
&lt;h4&gt;Example Usage&lt;/h4&gt;
&lt;p&gt;The new Flux model is WebSocket only as it requires live bi-directional streaming in order to recognize speech activity.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create a worker that establishes a websocket connection with &lt;code&gt;@cf/deepgram/flux&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Promise&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;resp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AI&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;@cf/deepgram/flux&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;encoding&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;linear16&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;sample_rate&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;16000&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;websocket&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;resp&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;satisfies&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ExportedHandler&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Env&lt;/span&gt;&lt;span&gt;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Deploy your worker&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;deploy&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Write a client script to connect to your worker and start sending random audio bytes to it&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ws&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;WebSocket&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;wss://&amp;#x3C;your-worker-url.com&gt;&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;ws&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;onopen&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;Connected to WebSocket&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Generate and send random audio bytes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// You can replace this part with a function&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// that reads from your mic or other audio source&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;audioData&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;generateRandomAudio&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ws&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;send&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;audioData&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;Audio data sent&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;ws&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;onmessage&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Transcription will be received here&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Add your custom logic to parse the data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;Received:&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;ws&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;onerror&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;WebSocket error:&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;ws&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;onclose&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;WebSocket closed&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Generate random audio data (1 second of noise at 44.1kHz, mono)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;generateRandomAudio&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sampleRate&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;44100&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;duration&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;numSamples&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sampleRate&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;duration&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;buffer&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ArrayBuffer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;numSamples&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;view&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Int16Array&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;buffer&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;numSamples&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;view&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Math&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;floor&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Math&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;random&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;65536&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;32768&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;buffer&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;</description><pubDate>Thu, 02 Oct 2025 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category></item><item><title>Workers Analytics Engine, Workers - Workers Analytics Engine adds supports for new SQL functions</title><link>https://developers.cloudflare.com/changelog/post/2025-09-26-analytics-engine-sql-enhancements/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-26-analytics-engine-sql-enhancements/</guid><description>&lt;p&gt;You can now perform more powerful queries directly in &lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/&quot; target=&quot;_blank&quot;&gt;Workers Analytics Engine&lt;/a&gt; with a major expansion of our SQL function library.&lt;/p&gt;
&lt;p&gt;Workers Analytics Engine allows you to ingest and store high-cardinality data at scale (such as custom analytics) and query your data through a simple SQL API.&lt;/p&gt;
&lt;p&gt;Today, we&apos;ve expanded Workers Analytics Engine&apos;s SQL capabilities with several new functions:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/sql-reference/aggregate-functions/&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;New aggregate functions:&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;argMin()&lt;/code&gt; - Returns the value associated with the minimum in a group&lt;/li&gt;
&lt;li&gt;&lt;code&gt;argMax()&lt;/code&gt; - Returns the value associated with the maximum in a group&lt;/li&gt;
&lt;li&gt;&lt;code&gt;topK()&lt;/code&gt; - Returns an array of the most frequent values in a group&lt;/li&gt;
&lt;li&gt;&lt;code&gt;topKWeighted()&lt;/code&gt; - Returns an array of the most frequent values in a group using weights&lt;/li&gt;
&lt;li&gt;&lt;code&gt;first_value()&lt;/code&gt; - Returns the first value in an ordered set of values within a partition&lt;/li&gt;
&lt;li&gt;&lt;code&gt;last_value()&lt;/code&gt; - Returns the last value in an ordered set of values within a partition&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/sql-reference/bit-functions/&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;New bit functions:&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;bitAnd()&lt;/code&gt; - Returns the bitwise AND of two expressions&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bitCount()&lt;/code&gt; - Returns the number of bits set to one in the binary representation of a number&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bitHammingDistance()&lt;/code&gt; - Returns the number of bits that differ between two numbers&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bitNot()&lt;/code&gt; - Returns a number with all bits flipped&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bitOr()&lt;/code&gt; - Returns the inclusive bitwise OR of two expressions&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bitRotateLeft()&lt;/code&gt; - Rotates all bits in a number left by specified positions&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bitRotateRight()&lt;/code&gt; - Rotates all bits in a number right by specified positions&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bitShiftLeft()&lt;/code&gt; - Shifts all bits in a number left by specified positions&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bitShiftRight()&lt;/code&gt; - Shifts all bits in a number right by specified positions&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bitTest()&lt;/code&gt; - Returns the value of a specific bit in a number&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bitXor()&lt;/code&gt; - Returns the bitwise exclusive-or of two expressions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/sql-reference/mathematical-functions/&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;New mathematical functions:&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;abs()&lt;/code&gt; - Returns the absolute value of a number&lt;/li&gt;
&lt;li&gt;&lt;code&gt;log()&lt;/code&gt; - Computes the natural logarithm of a number&lt;/li&gt;
&lt;li&gt;&lt;code&gt;round()&lt;/code&gt; - Rounds a number to a specified number of decimal places&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ceil()&lt;/code&gt; - Rounds a number up to the nearest integer&lt;/li&gt;
&lt;li&gt;&lt;code&gt;floor()&lt;/code&gt; - Rounds a number down to the nearest integer&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pow()&lt;/code&gt; - Returns a number raised to the power of another number&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/sql-reference/string-functions/&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;New string functions:&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;lowerUTF8()&lt;/code&gt; - Converts a string to lowercase using UTF-8 encoding&lt;/li&gt;
&lt;li&gt;&lt;code&gt;upperUTF8()&lt;/code&gt; - Converts a string to uppercase using UTF-8 encoding&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/sql-reference/encoding-functions/&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;New encoding functions:&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hex()&lt;/code&gt; - Converts a number to its hexadecimal representation&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bin()&lt;/code&gt; - Converts a string to its binary representation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/sql-reference/type-conversion-functions/&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;New type conversion functions:&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;toUInt8()&lt;/code&gt; - Converts any numeric expression, or expression resulting in a string representation of a decimal, into an unsigned 8 bit integer&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Ready to get started?&lt;/h4&gt;
&lt;p&gt;Whether you&apos;re building usage-based billing systems, customer analytics dashboards, or other custom analytics, these functions let you get the most out of your data. &lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/get-started/&quot;&gt;Get started &lt;/a&gt; with Workers Analytics Engine and explore all available functions in our &lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/sql-reference/&quot;&gt;SQL reference documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 02 Oct 2025 00:00:00 GMT</pubDate><product>Workers Analytics Engine</product><category>Workers Analytics Engine</category><category>Workers</category></item><item><title>Containers - Larger Container instance types</title><link>https://developers.cloudflare.com/changelog/post/2025-10-01-new-container-instance-types/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-01-new-container-instance-types/</guid><description>&lt;p&gt;New instance types provide up to 4 vCPU, 12 GiB of memory, and 20 GB of disk per container instance.&lt;/p&gt;















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Instance Type&lt;/th&gt;&lt;th&gt;vCPU&lt;/th&gt;&lt;th&gt;Memory&lt;/th&gt;&lt;th&gt;Disk&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;lite&lt;/td&gt;&lt;td&gt;1/16&lt;/td&gt;&lt;td&gt;256 MiB&lt;/td&gt;&lt;td&gt;2 GB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;basic&lt;/td&gt;&lt;td&gt;1/4&lt;/td&gt;&lt;td&gt;1 GiB&lt;/td&gt;&lt;td&gt;4 GB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;standard-1&lt;/td&gt;&lt;td&gt;1/2&lt;/td&gt;&lt;td&gt;4 GiB&lt;/td&gt;&lt;td&gt;8 GB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;standard-2&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;6 GiB&lt;/td&gt;&lt;td&gt;12 GB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;standard-3&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;8 GiB&lt;/td&gt;&lt;td&gt;16 GB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;standard-4&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;12 GiB&lt;/td&gt;&lt;td&gt;20 GB&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The &lt;code&gt;dev&lt;/code&gt; and &lt;code&gt;standard&lt;/code&gt; instance types are preserved for backward compatibility and are aliases for &lt;code&gt;lite&lt;/code&gt; and &lt;code&gt;standard-1&lt;/code&gt;, respectively. The &lt;code&gt;standard-1&lt;/code&gt; instance type now provides up to 8 GB of disk instead of only 4 GB.&lt;/p&gt;
&lt;p&gt;See the &lt;a href=&quot;https://developers.cloudflare.com/containers/get-started/&quot;&gt;getting started guide&lt;/a&gt; to deploy your first Container,
and the &lt;a href=&quot;https://developers.cloudflare.com/containers/platform-details/limits/&quot;&gt;limits documentation&lt;/a&gt; for more details on the available instance types and limits.&lt;/p&gt;</description><pubDate>Wed, 01 Oct 2025 00:00:00 GMT</pubDate><product>Containers</product><category>Containers</category></item><item><title>Workers - Automatic loopback bindings via ctx.exports</title><link>https://developers.cloudflare.com/changelog/post/2025-09-26-ctx-exports/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-26-ctx-exports/</guid><description>&lt;p&gt;The &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/context/#exports&quot;&gt;&lt;code&gt;ctx.exports&lt;/code&gt; API&lt;/a&gt; contains automatically-configured bindings corresponding to your Worker&apos;s top-level exports. For each top-level export extending &lt;code&gt;WorkerEntrypoint&lt;/code&gt;, &lt;code&gt;ctx.exports&lt;/code&gt; will contain a &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings&quot;&gt;Service Binding&lt;/a&gt; by the same name, and for each export extending &lt;code&gt;DurableObject&lt;/code&gt; (and for which storage has been configured via a &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/reference/durable-objects-migrations/&quot;&gt;migration&lt;/a&gt;), &lt;code&gt;ctx.exports&lt;/code&gt; will contain a &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/api/namespace/&quot;&gt;Durable Object namespace binding&lt;/a&gt;. This means you no longer have to configure these bindings explicitly in &lt;code&gt;wrangler.jsonc&lt;/code&gt;/&lt;code&gt;wrangler.toml&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;WorkerEntrypoint&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;cloudflare:workers&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Greeter&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;WorkerEntrypoint&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;greet&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;`Hello, &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;!`&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;greeting&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;exports&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Greeter&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;greet&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;World&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;greeting&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;At present, you must use &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/compatibility-flags#enable-ctxexports&quot;&gt;the &lt;code&gt;enable_ctx_exports&lt;/code&gt; compatibility flag&lt;/a&gt; to enable this API, though it will be on by default in the future.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/context/#exports&quot;&gt;See the API reference for more information.&lt;/a&gt;&lt;/p&gt;</description><pubDate>Fri, 26 Sep 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Pipelines - Pipelines now supports SQL transformations and Apache Iceberg</title><link>https://developers.cloudflare.com/changelog/post/2025-09-25-pipelines-sql/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-25-pipelines-sql/</guid><description>&lt;p&gt;Today, we&apos;re launching the new &lt;a href=&quot;https://developers.cloudflare.com/pipelines/&quot;&gt;Cloudflare Pipelines&lt;/a&gt;: a streaming data platform that ingests events, transforms them with &lt;a href=&quot;https://developers.cloudflare.com/pipelines/sql-reference/select-statements/&quot;&gt;SQL&lt;/a&gt;, and writes to &lt;a href=&quot;https://developers.cloudflare.com/r2/&quot;&gt;R2&lt;/a&gt; as &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot;&gt;Apache Iceberg&lt;/a&gt; tables or Parquet files.&lt;/p&gt;
&lt;p&gt;Pipelines can receive events via &lt;a href=&quot;https://developers.cloudflare.com/pipelines/streams/writing-to-streams/#send-via-http&quot;&gt;HTTP endpoints&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/pipelines/streams/writing-to-streams/#send-via-workers&quot;&gt;Worker bindings&lt;/a&gt;, transform them with SQL, and deliver to R2 with exactly-once guarantees. This makes it easy to build analytics-ready warehouses for server logs, mobile application events, IoT telemetry, or clickstream data without managing streaming infrastructure.&lt;/p&gt;
&lt;p&gt;For example, here&apos;s a pipeline that ingests clickstream events and filters out bot traffic while extracting domain information:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;INSERT into&lt;/span&gt;&lt;span&gt; events_table&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;user_id,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;lower&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; event_type,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;to_timestamp_micros(ts_us) &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; event_time,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;regexp_match(&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;^https?://([^/]+)&apos;&lt;/span&gt;&lt;span&gt;)[1]  &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; domain,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;referrer,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;user_agent&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; events_json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;page_view&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;AND&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;NOT&lt;/span&gt;&lt;span&gt; regexp_like(user_agent, &lt;/span&gt;&lt;span&gt;&apos;(?i)bot|spider&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Get started by creating a pipeline in the dashboard or running a single command in &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/&quot;&gt;Wrangler&lt;/a&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pipelines&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;setup&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Check out our &lt;a href=&quot;https://developers.cloudflare.com/pipelines/getting-started/&quot;&gt;getting started guide&lt;/a&gt; to learn how to create a pipeline that delivers events to an &lt;a href=&quot;https://developers.cloudflare.com/r2/data-catalog/&quot;&gt;Iceberg table&lt;/a&gt; you can query with R2 SQL. Read more about today&apos;s announcement in our &lt;a href=&quot;https://blog.cloudflare.com/cloudflare-data-platform&quot; target=&quot;_blank&quot;&gt;blog post&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 25 Sep 2025 13:00:00 GMT</pubDate><product>Pipelines</product><category>Pipelines</category></item><item><title>R2 SQL - Announcing R2 SQL</title><link>https://developers.cloudflare.com/changelog/post/2025-09-25-announcing-r2-sql-open-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-25-announcing-r2-sql-open-beta/</guid><description>&lt;p&gt;Today, we&apos;re launching the &lt;strong&gt;open beta&lt;/strong&gt; for &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/&quot;&gt;R2 SQL&lt;/a&gt;: A serverless, distributed query engine that can efficiently analyze petabytes of data in &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot;&gt;Apache Iceberg&lt;/a&gt; tables managed by &lt;a href=&quot;https://developers.cloudflare.com/r2/data-catalog&quot;&gt;R2 Data Catalog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;R2 SQL is ideal for exploring analytical and time-series data stored in R2, such as logs, events from &lt;a href=&quot;https://developers.cloudflare.com/pipelines/&quot;&gt;Pipelines&lt;/a&gt;, or clickstream and user behavior data.&lt;/p&gt;
&lt;p&gt;If you already have a table in R2 Data Catalog, running queries is as simple as:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;r2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sql&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;query&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;YOUR_WAREHOUSE&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;user_id,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;event_type,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FROM events.user_events&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;WHERE event_type = &apos;CHANGELOG&apos; or event_type = &apos;BLOG&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;AND __ingest_ts &gt; &apos;2025-09-24T00:00:00Z&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;ORDER BY __ingest_ts DESC&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;LIMIT 100&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;To get started with R2 SQL, check out our &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/get-started/&quot;&gt;getting started guide&lt;/a&gt; or learn more about supported features in the &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/sql-reference/&quot;&gt;SQL reference&lt;/a&gt;. For a technical deep dive into how we built R2 SQL, read our &lt;a href=&quot;https://blog.cloudflare.com/r2-sql-deep-dive/&quot; target=&quot;_blank&quot;&gt;blog post&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 25 Sep 2025 13:00:00 GMT</pubDate><product>R2 SQL</product><category>R2 SQL</category></item><item><title>Browser Rendering - Browser Rendering Playwright GA, Stagehand support (Beta), and higher limits</title><link>https://developers.cloudflare.com/changelog/post/2025-09-25-br-playwright-ga-stagehand-limits/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-25-br-playwright-ga-stagehand-limits/</guid><description>&lt;p&gt;We’re shipping three updates to Browser Rendering:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Playwright support is now Generally Available and synced with &lt;a href=&quot;https://playwright.dev/docs/release-notes#version-155&quot; target=&quot;_blank&quot;&gt;Playwright v1.55&lt;/a&gt;, giving you a stable foundation for critical automation and AI-agent workflows.&lt;/li&gt;
&lt;li&gt;We’re also adding &lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/stagehand/&quot;&gt;Stagehand support (Beta)&lt;/a&gt; so you can combine code with natural language instructions to build more resilient automations.&lt;/li&gt;
&lt;li&gt;Finally, we’ve tripled &lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/limits/#workers-paid&quot;&gt;limits&lt;/a&gt; for paid plans across both the &lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/rest-api/&quot;&gt;REST API&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/workers-bindings/&quot;&gt;Workers Bindings&lt;/a&gt; to help you scale.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To get started with Stagehand, refer to the &lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/stagehand/&quot;&gt;Stagehand&lt;/a&gt; example that uses Stagehand and &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/&quot;&gt;Workers AI&lt;/a&gt; to search for a movie on this &lt;a href=&quot;https://demo.playwright.dev/movies&quot; target=&quot;_blank&quot;&gt;example movie directory&lt;/a&gt;, extract its details using natural language (title, year, rating, duration, and genre), and return the information along with a screenshot of the webpage.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stagehand&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Stagehand&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;LOCAL&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;localBrowserLaunchOptions&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; cdpUrl&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;endpointURLString&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;BROWSER&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;llmClient&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;WorkersAIClient&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AI&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;verbose&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stagehand&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;init&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;page&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stagehand&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;page&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;page&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;goto&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;https://demo.playwright.dev/movies&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// if search is a multi-step action, stagehand will return an array of actions it needs to act on&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;actions&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;page&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;observe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;Search for &quot;Furiosa&quot;&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;action&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;of&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;actions&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;page&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;act&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;action&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;page&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;act&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;Click the search result&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// normal playwright functions work as expected&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;page&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;waitForSelector&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;.info-wrapper .cast&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;movieInfo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;page&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;extract&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;instruction&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;Extract movie information&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;schema&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;object&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;year&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;number&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;rating&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;number&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;genres&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;array&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;duration&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;number&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;describe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Duration in minutes&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stagehand&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;close&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/images/browser-rendering/speedystagehand.gif&quot; alt=&quot;Stagehand video&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;</description><pubDate>Thu, 25 Sep 2025 12:00:00 GMT</pubDate><product>Browser Rendering</product><category>Browser Rendering</category></item><item><title>AI Search - AI Search (formerly AutoRAG) now with More Models To Choose From</title><link>https://developers.cloudflare.com/changelog/post/2025-09-25-ai-search-more-models/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-25-ai-search-more-models/</guid><description>&lt;p&gt;AutoRAG is now AI Search! The new name marks a new and bigger mission: to make world-class search infrastructure available to every developer and business.&lt;/p&gt;
&lt;p&gt;With AI Search you can now use models from different providers like OpenAI and Anthropic. By attaching your provider keys to the AI Gateway linked to your AI Search instance, you can use many more models for both embedding and inference.&lt;/p&gt;
&lt;p&gt;To use AI Search with other &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/models/&quot;&gt;model providers&lt;/a&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Add provider keys to AI Gateway&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;Go to AI &gt; AI Gateway in the dashboard.&lt;/li&gt;
&lt;li&gt;Select or create an AI gateway.&lt;/li&gt;
&lt;li&gt;In Provider Keys, choose your provider, click Add, and enter the key.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Connect a gateway to AI Search&lt;/strong&gt;: When creating a new AI Search, select the AI Gateway with your provider keys. For an existing AI Search, go to Settings and switch to a gateway that has your keys under Resources.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Select models&lt;/strong&gt;: Embedding models are only available to be changed when creating a new AI Search. Generation model can be selected when creating a new AI Search and can be changed at any time in Settings.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Once configured, your AI Search instance will be able to reference models available through your AI Gateway when making a &lt;code&gt;/ai-search&lt;/code&gt; request:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Query your AI Search instance with a natural language question to an OpenAI model&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AI&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;autorag&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;my-ai-search&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;aiSearch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;query&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;What&apos;s new for Cloudflare Birthday Week?&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;openai/gpt-5&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Return only the generated answer as plain text&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Content-Type&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;text/plain&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;In the coming weeks we will also roll out updates to align the APIs with the new name. The existing APIs will continue to be supported for the time being. Stay tuned to the &lt;a href=&quot;https://developers.cloudflare.com/changelog/product/ai-search/&quot;&gt;AI Search Changelog&lt;/a&gt; and &lt;a href=&quot;https://discord.cloudflare.com/&quot; target=&quot;_blank&quot;&gt;Discord&lt;/a&gt; for more updates!&lt;/p&gt;</description><pubDate>Thu, 25 Sep 2025 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>Containers - Run more Containers with higher resource limits</title><link>https://developers.cloudflare.com/changelog/post/2025-09-24-higher-container-resource-limits/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-24-higher-container-resource-limits/</guid><description>&lt;p&gt;You can now run more Containers concurrently with higher limits on CPU, memory, and disk.&lt;/p&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Limit&lt;/th&gt;&lt;th&gt;New Limit&lt;/th&gt;&lt;th&gt;Previous Limit&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Memory for concurrent live Container instances&lt;/td&gt;&lt;td&gt;400GiB&lt;/td&gt;&lt;td&gt;40GiB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;vCPU for concurrent live Container instances&lt;/td&gt;&lt;td&gt;100&lt;/td&gt;&lt;td&gt;20&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Disk for concurrent live Container instances&lt;/td&gt;&lt;td&gt;2TB&lt;/td&gt;&lt;td&gt;100GB&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;You can now run 1000 instances of the &lt;code&gt;dev&lt;/code&gt; instance type, 400 instances of &lt;code&gt;basic&lt;/code&gt;, or 100 instances of &lt;code&gt;standard&lt;/code&gt; concurrently.&lt;/p&gt;
&lt;p&gt;This opens up new possibilities for running larger-scale workloads on Containers.&lt;/p&gt;
&lt;p&gt;See the &lt;a href=&quot;https://developers.cloudflare.com/containers/get-started/&quot;&gt;getting started guide&lt;/a&gt; to deploy your first Container,
and the &lt;a href=&quot;https://developers.cloudflare.com/containers/platform-details/limits/&quot;&gt;limits documentation&lt;/a&gt; for more details on the available instance types and limits.&lt;/p&gt;</description><pubDate>Thu, 25 Sep 2025 00:00:00 GMT</pubDate><product>Containers</product><category>Containers</category></item><item><title>R2 - R2 Data Catalog now supports compaction</title><link>https://developers.cloudflare.com/changelog/post/2025-09-25-data-catalog-compaction/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-25-data-catalog-compaction/</guid><description>&lt;p&gt;You can now enable automatic compaction for &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot;&gt;Apache Iceberg&lt;/a&gt; tables in &lt;a href=&quot;https://developers.cloudflare.com/r2/data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt; to improve query performance.&lt;/p&gt;
&lt;p&gt;Compaction is the process of taking a group of small files and combining them into fewer larger files. This is an important maintenance operation as it helps ensure that query performance remains consistent by reducing the number of files that needs to be scanned.&lt;/p&gt;
&lt;p&gt;To enable automatic compaction in R2 Data Catalog, find it under &lt;strong&gt;R2 Data Catalog&lt;/strong&gt; in your R2 bucket settings in the dashboard.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/compaction.MLojYuHL_wkqll.webp&quot; alt=&quot;compaction-dash&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;Or with &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/&quot;&gt;Wrangler&lt;/a&gt;, run:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;r2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bucket&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;catalog&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;compaction&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;enable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;#x3C;BUCKET_NAME&gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--target-size&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;128&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--token&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;#x3C;API_TOKEN&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;To get started with compaction, check out &lt;a href=&quot;https://developers.cloudflare.com/r2/data-catalog/manage-catalogs/&quot;&gt;manage catalogs&lt;/a&gt;. For best practices and limitations, refer to &lt;a href=&quot;https://developers.cloudflare.com/r2/data-catalog/table-maintenance/&quot;&gt;about compaction&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 25 Sep 2025 00:00:00 GMT</pubDate><product>R2</product><category>R2</category></item><item><title>Workers - Improved support for running multiple Workers with `wrangler dev`</title><link>https://developers.cloudflare.com/changelog/post/2025-09-23-wrangler-dev-multi-config-cross-command-support/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-23-wrangler-dev-multi-config-cross-command-support/</guid><description>&lt;p&gt;You can run multiple Workers in a single dev command by passing multiple config files to &lt;code&gt;wrangler dev&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dev&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--config&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;./web/wrangler.jsonc&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--config&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;./api/wrangler.jsonc&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Previously, if you ran the command above and then also ran wrangler dev for a different Worker, the Workers running in separate wrangler dev sessions could not communicate with each other. This prevented you from being able to use &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings/&quot; target=&quot;_blank&quot;&gt;Service Bindings&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/workers/observability/logs/tail-workers/&quot; target=&quot;_blank&quot;&gt;Tail Workers&lt;/a&gt; in local development, when running separate wrangler dev sessions.&lt;/p&gt;
&lt;p&gt;Now, the following works as expected:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Terminal 1: Run your application that includes both Web and API workers&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dev&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--config&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;./web/wrangler.jsonc&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--config&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;./api/wrangler.jsonc&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Terminal 2: Run your auth worker separately&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dev&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--config&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;./auth/wrangler.jsonc&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;These Workers can now communicate with each other across separate dev commands, regardless of your development setup.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// This service binding call now works across dev commands&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;authorized&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AUTH&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;isAuthorized&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;authorized&lt;/span&gt;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;Unauthorized&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; status&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;401&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;Hello from API Worker!&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; status&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;200&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Check out the &lt;a href=&quot;https://developers.cloudflare.com/workers/development-testing/multi-workers&quot;&gt;Developing with multiple Workers&lt;/a&gt; guide to learn more about the different approaches and when to use each one.&lt;/p&gt;</description><pubDate>Tue, 23 Sep 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>AI Search - New Metrics View in AutoRAG</title><link>https://developers.cloudflare.com/changelog/post/2025-09-19-autorag-metrics/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-19-autorag-metrics/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-search/&quot;&gt;AutoRAG&lt;/a&gt; now includes a &lt;strong&gt;Metrics&lt;/strong&gt; tab that shows how your data is indexed and searched. Get a clear view of the health of your indexing pipeline, compare usage between &lt;code&gt;ai-search&lt;/code&gt; and &lt;code&gt;search&lt;/code&gt;, and see which files are retrieved most often.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/metrics.BBUwKIos_zR8bd.webp&quot; alt=&quot;Metrics&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;You can find these metrics within each AutoRAG instance:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Indexing: Track how files are ingested and see status changes over time.&lt;/li&gt;
&lt;li&gt;Search breakdown: Compare usage between &lt;code&gt;ai-search&lt;/code&gt; and &lt;code&gt;search&lt;/code&gt; endpoints.&lt;/li&gt;
&lt;li&gt;Top file retrievals: Identify which files are most frequently retrieved in a given period.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Try it today in &lt;a href=&quot;https://developers.cloudflare.com/ai-search/get-started/&quot;&gt;AutoRAG&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 19 Sep 2025 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>Workers - Rate Limiting in Workers is now GA</title><link>https://developers.cloudflare.com/changelog/post/2025-09-19-ratelimit-workers-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-19-ratelimit-workers-ga/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/bindings/rate-limit/&quot;&gt;Rate Limiting within Cloudflare Workers&lt;/a&gt; is now Generally Available (GA).&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;ratelimit&lt;/code&gt; binding is now stable and recommended for all production workloads. Existing deployments using the unsafe binding will continue to function to allow for a smooth transition.&lt;/p&gt;
&lt;p&gt;For more details, refer to &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/bindings/rate-limit/&quot;&gt;Workers Rate Limiting&lt;/a&gt; documentation.&lt;/p&gt;</description><pubDate>Fri, 19 Sep 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Panic Recovery for Rust Workers</title><link>https://developers.cloudflare.com/changelog/post/2025-09-19-workers-rs-panic-recovery/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-19-workers-rs-panic-recovery/</guid><description>&lt;p&gt;In &lt;a href=&quot;https://github.com/cloudflare/workers-rs&quot; target=&quot;_blank&quot;&gt;workers-rs&lt;/a&gt;, Rust panics were previously non-recoverable. A panic would put the Worker into an invalid state, and further function calls could result in memory overflows or exceptions.&lt;/p&gt;
&lt;p&gt;Now, when a panic occurs, in-flight requests will throw 500 errors, but the Worker will automatically and instantly recover for future requests.&lt;/p&gt;
&lt;p&gt;This ensures more reliable deployments. Automatic panic recovery is enabled for all new workers-rs deployments as of version 0.6.5, with no configuration required.&lt;/p&gt;
&lt;h4&gt;Fixing Rust Panics with Wasm Bindgen&lt;/h4&gt;
&lt;p&gt;Rust Workers are built with Wasm Bindgen, which treats panics as non-recoverable. After a panic, the entire Wasm application is considered to be in an invalid state.&lt;/p&gt;
&lt;p&gt;We now attach a default panic handler in Rust:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;rust&quot;&gt;&lt;code class=&quot;language-rust&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;panic&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;set_hook&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Box&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;move&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt;panic_info&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;hook_impl&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;panic_info&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Which is registered by default in the JS initialization:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;setPanicHook&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;./index.js&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;setPanicHook&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;err&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Panic handler!&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;err&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;When a panic occurs, we reset the Wasm state to revert the Wasm application to how it was when the application started.&lt;/p&gt;
&lt;h4&gt;Resetting VM State in Wasm Bindgen&lt;/h4&gt;
&lt;p&gt;We worked upstream on the Wasm Bindgen project to implement a new &lt;a href=&quot;https://github.com/wasm-bindgen/wasm-bindgen/pull/4644&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;--experimental-reset-state-function&lt;/code&gt; compilation option&lt;/a&gt; which outputs a new &lt;code&gt;__wbg_reset_state&lt;/code&gt; function.&lt;/p&gt;
&lt;p&gt;This function clears all internal state related to the Wasm VM, and updates all function bindings in place to reference the new WebAssembly instance.&lt;/p&gt;
&lt;p&gt;One other necessary change here was associating Wasm-created JS objects with an instance identity. If a JS object created by an earlier instance is then passed into a new instance later on, a new &quot;stale object&quot; error is specially thrown when using this feature.&lt;/p&gt;
&lt;h4&gt;Layered Solution&lt;/h4&gt;
&lt;p&gt;Building on this new Wasm Bindgen feature, layered with our new default panic handler, we also added a proxy wrapper to ensure all top-level exported class instantiations (such as for Rust Durable Objects) are tracked and fully reinitialized when resetting the Wasm instance. This was necessary because
the workerd runtime will instantiate exported classes, which would then be associated with the Wasm instance.&lt;/p&gt;
&lt;p&gt;This approach now provides full panic recovery for Rust Workers on subsequent requests.&lt;/p&gt;
&lt;p&gt;Of course, we never want panics, but when they do happen they are isolated and can be investigated further from the error logs - avoiding broader service disruption.&lt;/p&gt;
&lt;h4&gt;WebAssembly Exception Handling&lt;/h4&gt;
&lt;p&gt;In the future, full support for recoverable panics could be implemented without needing reinitialization at all, utilizing the &lt;a href=&quot;https://github.com/WebAssembly/exception-handling/blob/main/proposals/exception-handling/Exceptions.md&quot; target=&quot;_blank&quot;&gt;WebAssembly Exception Handling&lt;/a&gt;
proposal, part of the newly announced &lt;a href=&quot;https://webassembly.org/news/2025-09-17-wasm-3.0/&quot; target=&quot;_blank&quot;&gt;WebAssembly 3.0&lt;/a&gt; specification. This would allow unwinding panics as normal JS errors, and concurrent requests would no longer fail.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;We&apos;re making significant improvements to the reliability of &lt;a href=&quot;https://github.com/cloudflare/workers-rs&quot; target=&quot;_blank&quot;&gt;Rust Workers&lt;/a&gt;. Join us in &lt;code&gt;#rust-on-workers&lt;/code&gt; on the &lt;a href=&quot;https://discord.gg/cloudflaredev&quot; target=&quot;_blank&quot;&gt;Cloudflare Developers Discord&lt;/a&gt; to stay updated.&lt;/strong&gt;&lt;/p&gt;</description><pubDate>Fri, 19 Sep 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Increased vCPU for Workers Builds on paid plans</title><link>https://developers.cloudflare.com/changelog/post/2025-09-07-builds-increased-cpu-paid/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-07-builds-increased-cpu-paid/</guid><description>&lt;p&gt;We recently &lt;a href=&quot;https://developers.cloudflare.com/changelog/2025-08-04-builds-increased-disk-size/&quot;&gt;increased the available disk space&lt;/a&gt; from 8 GB to 20 GB for &lt;strong&gt;all&lt;/strong&gt; plans. Building on that improvement, we’re now doubling the CPU power available for paid plans — from 2 vCPU to &lt;strong&gt;4 vCPU&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;These changes continue our focus on making &lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/&quot;&gt;Workers Builds&lt;/a&gt; faster and more reliable.&lt;/p&gt;















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Metric&lt;/th&gt;&lt;th&gt;Free Plan&lt;/th&gt;&lt;th&gt;Paid Plans&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;CPU&lt;/td&gt;&lt;td&gt;2 vCPU&lt;/td&gt;&lt;td&gt;&lt;strong&gt;4 vCPU&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h4&gt;Performance Improvements&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fast build times&lt;/strong&gt;: Even single-threaded workloads benefit from having more vCPUs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2x faster multi-threaded builds&lt;/strong&gt;: Tools like &lt;a href=&quot;https://esbuild.github.io/&quot; target=&quot;_blank&quot;&gt;esbuild&lt;/a&gt; and &lt;a href=&quot;https://webpack.js.org/&quot; target=&quot;_blank&quot;&gt;webpack&lt;/a&gt; can now utilize additional cores, delivering near-linear performance scaling&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All other &lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/limits-and-pricing/&quot;&gt;build limits&lt;/a&gt; — including memory, build minutes, and timeout remain unchanged.&lt;/p&gt;</description><pubDate>Thu, 18 Sep 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Preview URLs now default to opt-in</title><link>https://developers.cloudflare.com/changelog/post/2025-09-17-update-preview-url-setting/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-17-update-preview-url-setting/</guid><description>&lt;p&gt;To prevent the accidental exposure of applications, we&apos;ve updated how &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/previews/&quot;&gt;Worker preview URLs&lt;/a&gt; (&lt;code&gt;&amp;#x3C;PREVIEW&gt;-&amp;#x3C;WORKER_NAME&gt;.&amp;#x3C;SUBDOMAIN&gt;.workers.dev&lt;/code&gt;) are handled. We made this change to ensure preview URLs are only active when intentionally configured, improving the default security posture of your Workers.&lt;/p&gt;
&lt;h4&gt;One-Time Update for Workers with workers.dev Disabled&lt;/h4&gt;
&lt;p&gt;We performed a one-time update to disable preview URLs for existing Workers where the &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/routing/workers-dev/&quot;&gt;workers.dev subdomain&lt;/a&gt; was also disabled.&lt;/p&gt;
&lt;p&gt;Because preview URLs were historically enabled by default, users who had intentionally disabled their workers.dev route may not have realized their Worker was still accessible at a separate preview URL. This update was performed to ensure that using a preview URL is always an intentional, opt-in choice.&lt;/p&gt;
&lt;p&gt;If your Worker was affected, its preview URL (&lt;code&gt;&amp;#x3C;PREVIEW&gt;-&amp;#x3C;WORKER_NAME&gt;.&amp;#x3C;SUBDOMAIN&gt;.workers.dev&lt;/code&gt;) will now direct to an informational page explaining this change.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How to Re-enable Your Preview URL&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If your preview URL was disabled, you can re-enable it &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/previews/#toggle-preview-urls-enable-or-disable&quot;&gt;via the Cloudflare dashboard&lt;/a&gt; by navigating to your Worker&apos;s Settings page and toggling on the Preview URL.&lt;/p&gt;
&lt;p&gt;Alternatively, you can use Wrangler by adding the &lt;code&gt;preview_urls = true&lt;/code&gt; setting to your Wrangler file and redeploying the Worker.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;wrangler.jsonc&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;jsonc&quot;&gt;&lt;code class=&quot;language-jsonc&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;preview_urls&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;wrangler.toml&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;toml&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;preview_urls&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; You can set &lt;code&gt;preview_urls = true&lt;/code&gt; with any Wrangler version that supports the preview URL flag (v3.91.0+). However, we recommend updating to v4.34.0 or newer, as this version defaults &lt;code&gt;preview_urls&lt;/code&gt; to false, ensuring preview URLs are always enabled by explicit choice.&lt;/p&gt;</description><pubDate>Wed, 17 Sep 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Remote bindings GA - Connect to remote resources (D1, KV, R2, etc.) during local development</title><link>https://developers.cloudflare.com/changelog/post/2025-09-16-remote-bindings-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-16-remote-bindings-ga/</guid><description>&lt;p&gt;Three months ago &lt;a href=&quot;https://developers.cloudflare.com/changelog/2025-06-18-remote-bindings-beta/&quot;&gt;we announced the public beta&lt;/a&gt; of &lt;a href=&quot;https://developers.cloudflare.com/workers/development-testing/#remote-bindings&quot;&gt;remote bindings&lt;/a&gt; for local development. Now, we&apos;re excited to say that it&apos;s available for everyone in Wrangler, Vite, and Vitest without using an experimental flag!&lt;/p&gt;
&lt;p&gt;With remote bindings, you can now connect to deployed resources like &lt;a href=&quot;https://developers.cloudflare.com/r2/&quot;&gt;R2 buckets&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/d1/&quot;&gt;D1 databases&lt;/a&gt; while running Worker code on your local machine. This means you can test your local code changes against real data and services, without the overhead of deploying for each iteration.&lt;/p&gt;
&lt;h4&gt;Example configuration&lt;/h4&gt;
&lt;p&gt;To enable remote bindings, add &lt;code&gt;&quot;remote&quot; : true&lt;/code&gt; to each binding that you want to rely on a remote resource running on Cloudflare:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;wrangler.jsonc&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;jsonc&quot;&gt;&lt;code class=&quot;language-jsonc&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-worker&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Set this to today&apos;s date&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;compatibility_date&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;2026-04-03&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;r2_buckets&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;bucket_name&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;screenshots-bucket&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;binding&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;screenshots_bucket&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;remote&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;wrangler.toml&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;toml&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-worker&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Set this to today&apos;s date&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;compatibility_date&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;2026-04-03&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[[&lt;/span&gt;&lt;span&gt;r2_buckets&lt;/span&gt;&lt;span&gt;]]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;bucket_name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;screenshots-bucket&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;binding&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;screenshots_bucket&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;remote&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;When remote bindings are configured, your Worker &lt;strong&gt;still executes locally&lt;/strong&gt;, but all binding calls are proxied to the deployed resource that runs on Cloudflare&apos;s network.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You can &lt;a href=&quot;https://developers.cloudflare.com/workers/development-testing/#remote-bindings&quot;&gt;try out remote bindings&lt;/a&gt; for local development today with:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/&quot;&gt;Wrangler v4.37.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;https://developers.cloudflare.com/workers/vite-plugin/&quot;&gt;Cloudflare Vite Plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;https://developers.cloudflare.com/workers/testing/vitest-integration/&quot;&gt;Cloudflare Vitest Plugin&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Tue, 16 Sep 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>D1, Workers - D1 automatically retries read-only queries</title><link>https://developers.cloudflare.com/changelog/post/2025-09-11-d1-automatic-read-retries/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-11-d1-automatic-read-retries/</guid><description>&lt;p&gt;D1 now detects read-only queries and automatically attempts up to two retries to execute those queries in the event of failures with retryable errors. You can access the number of execution attempts in the returned &lt;a href=&quot;https://developers.cloudflare.com/d1/worker-api/return-object/#d1result&quot;&gt;response metadata&lt;/a&gt; property &lt;code&gt;total_attempts&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;At the moment, only read-only queries are retried, that is, queries containing only the following SQLite keywords: &lt;code&gt;SELECT&lt;/code&gt;, &lt;code&gt;EXPLAIN&lt;/code&gt;, &lt;code&gt;WITH&lt;/code&gt;. Queries containing any &lt;a href=&quot;https://sqlite.org/lang_keywords.html&quot; target=&quot;_blank&quot;&gt;SQLite keyword&lt;/a&gt; that leads to database writes are not retried.&lt;/p&gt;
&lt;p&gt;The retry success ratio among read-only retryable errors varies from 5% all the way up to 95%, depending on the underlying error and its duration (like network errors or other internal errors).&lt;/p&gt;
&lt;p&gt;The retry success ratio among all retryable errors is lower, indicating that there are write-queries that could be retried. Therefore, we recommend D1 users to continue applying &lt;a href=&quot;https://developers.cloudflare.com/d1/best-practices/retry-queries/&quot;&gt;retries in their own code&lt;/a&gt; for queries that are not read-only but are idempotent according to the business logic of the application.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/d1-auto-retry-success-ratio.yPw8B0tB_1c6euA.webp&quot; alt=&quot;D1 automatically query retries success ratio&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;D1 ensures that any retry attempt does not cause database writes, making the automatic retries safe from side-effects, even if a query causing changes slips through the read-only detection. D1 achieves this by checking for modifications after every query execution, and if any write occurred due to a retry attempt, the query is rolled back.&lt;/p&gt;
&lt;p&gt;The read-only query detection heuristics are simple for now, and there is room for improvement to capture more cases of queries that can be retried, so this is just the beginning.&lt;/p&gt;</description><pubDate>Thu, 11 Sep 2025 00:00:00 GMT</pubDate><product>D1</product><category>D1</category><category>Workers</category></item><item><title>Workers - Worker version rollback limit increased from 10 to 100</title><link>https://developers.cloudflare.com/changelog/post/2025-09-11-increased-version-rollback-limit/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-11-increased-version-rollback-limit/</guid><description>&lt;p&gt;The number of recent versions available for a Worker rollback has been increased from 10 to 100.&lt;/p&gt;
&lt;p&gt;This allows you to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Promote any of the 100 most recent versions to be the active deployment.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Split traffic using &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/versions-and-deployments/gradual-deployments/&quot;&gt;gradual deployments&lt;/a&gt; between your latest code and any of the 100 most recent versions.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can do this through the Cloudflare dashboard or with &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/general/#rollback&quot;&gt;Wrangler&apos;s rollback command&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/versions-and-deployments/&quot;&gt;versioned deployments&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/versions-and-deployments/rollbacks/&quot;&gt;rollbacks&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 11 Sep 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Agents, Workers - Agents SDK v0.1.0 and workers-ai-provider v2.0.0 with AI SDK v5 support</title><link>https://developers.cloudflare.com/changelog/post/2025-09-03-agents-sdk-beta-v5/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-03-agents-sdk-beta-v5/</guid><description>&lt;p&gt;We&apos;ve shipped a new release for the &lt;a href=&quot;https://github.com/cloudflare/agents&quot; target=&quot;_blank&quot;&gt;Agents SDK&lt;/a&gt; bringing full compatibility with &lt;a href=&quot;https://ai-sdk.dev/docs/introduction&quot; target=&quot;_blank&quot;&gt;AI SDK v5&lt;/a&gt; and introducing automatic message migration that handles all legacy formats transparently.&lt;/p&gt;
&lt;p&gt;This release includes improved streaming and tool support, tool confirmation detection (for &quot;human in the loop&quot; systems), enhanced React hooks with automatic tool resolution, improved error handling for streaming responses, and seamless migration utilities that work behind the scenes.&lt;/p&gt;
&lt;p&gt;This makes it ideal for building production AI chat interfaces with Cloudflare Workers AI models, agent workflows, human-in-the-loop systems, or any application requiring reliable message handling across SDK versions — all while maintaining backward compatibility.&lt;/p&gt;
&lt;p&gt;Additionally, we&apos;ve updated workers-ai-provider v2.0.0, the official provider for Cloudflare Workers AI models, to be compatible with AI SDK v5.&lt;/p&gt;
&lt;h4&gt;useAgentChat(options)&lt;/h4&gt;
&lt;p&gt;Creates a new chat interface with enhanced v5 capabilities.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Basic chat setup&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;messages&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sendMessage&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;addToolResult&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;useAgentChat&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;agent&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;experimental_automaticToolResolution&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;tools&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// With custom tool confirmation&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;chat&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;useAgentChat&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;agent&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;experimental_automaticToolResolution&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;toolsRequiringConfirmation&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;dangerousOperation&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Automatic Tool Resolution&lt;/h4&gt;
&lt;p&gt;Tools are automatically categorized based on their configuration:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tools&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Auto-executes (has execute function)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;getLocalTime&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Get current local time&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;inputSchema&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;object&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;execute&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Date&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toLocaleString&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Requires confirmation (no execute function)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;deleteFile&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Delete a file from the system&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;inputSchema&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;object&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;filename&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Server-executed (no client confirmation)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;analyzeData&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Analyze dataset on server&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;inputSchema&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;object&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; data&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;array&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;number&lt;/span&gt;&lt;span&gt;()) &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;serverExecuted&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;satisfies&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Record&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AITool&lt;/span&gt;&lt;span&gt;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Message Handling&lt;/h4&gt;
&lt;p&gt;Send messages using the new v5 format with parts array:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Text message&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sendMessage&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;role&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;user&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;parts&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;text&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; text&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Hello, assistant!&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Multi-part message with file&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sendMessage&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;role&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;user&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;parts&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;text&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; text&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Analyze this image:&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;image&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; image&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;imageData&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Tool Confirmation Detection&lt;/h4&gt;
&lt;p&gt;Simplified logic for detecting pending tool confirmations:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pendingToolCallConfirmation&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;messages&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;some&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;parts&lt;/span&gt;&lt;span&gt;?.&lt;/span&gt;&lt;span&gt;some&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;part&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;isToolUIPart&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;part&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;&amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;part&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;state&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;===&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;input-available&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Handle tool confirmation&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;pendingToolCallConfirmation&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;addToolResult&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;toolCallId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;part&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toolCallId&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tool&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getToolName&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;part&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;User approved the action&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Automatic Message Migration&lt;/h4&gt;
&lt;p&gt;Seamlessly handle legacy message formats without code changes.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// All these formats are automatically converted:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Legacy v4 string content&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;legacyMessage&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;role&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;user&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;content&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Hello world&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Legacy v4 with tool calls&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;legacyWithTools&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;role&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;assistant&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;content&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;toolInvocations&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;toolCallId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;123&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;toolName&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;weather&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;args&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; city&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;SF&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;state&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;result&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Sunny, 72°F&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Automatically becomes v5 format:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;//   role: &quot;assistant&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;//   parts: [{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;//     type: &quot;tool-call&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;//     toolCallId: &quot;123&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;//     toolName: &quot;weather&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;//     args: { city: &quot;SF&quot; },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;//     state: &quot;result&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;//     result: &quot;Sunny, 72°F&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;//   }]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Tool Definition Updates&lt;/h4&gt;
&lt;p&gt;Migrate tool definitions to use the new &lt;code&gt;inputSchema&lt;/code&gt; property.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Before (AI SDK v4)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tools&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;weather&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Get weather information&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;parameters&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;object&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;city&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;execute&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;args&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getWeather&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;args&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;city&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// After (AI SDK v5)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tools&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;weather&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Get weather information&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;inputSchema&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;object&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;city&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;execute&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;args&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getWeather&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;args&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;city&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Cloudflare Workers AI Integration&lt;/h4&gt;
&lt;p&gt;Seamless integration with Cloudflare Workers AI models through the updated workers-ai-provider v2.0.0.&lt;/p&gt;
&lt;h4&gt;Model Setup with Workers AI&lt;/h4&gt;
&lt;p&gt;Use Cloudflare Workers AI models directly in your agent workflows:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;createWorkersAI&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;workers-ai-provider&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;useAgentChat&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;agents/ai-react&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Create Workers AI model (v2.0.0 - same API, enhanced v5 internals)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;createWorkersAI&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;binding&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AI&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)(&lt;/span&gt;&lt;span&gt;&quot;@cf/meta/llama-3.2-3b-instruct&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Enhanced File and Image Support&lt;/h4&gt;
&lt;p&gt;Workers AI models now support v5 file handling with automatic conversion:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Send images and files to Workers AI models&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sendMessage&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;role&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;user&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;parts&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;text&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; text&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Analyze this image:&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;file&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;imageBuffer&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;mediaType&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;image/jpeg&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Workers AI provider automatically converts to proper format&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Streaming with Workers AI&lt;/h4&gt;
&lt;p&gt;Enhanced streaming support with automatic warning detection:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Streaming with Workers AI models&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;streamText&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;createWorkersAI&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; binding&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AI&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)(&lt;/span&gt;&lt;span&gt;&quot;@cf/meta/llama-3.2-3b-instruct&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;messages&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;onChunk&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;chunk&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Enhanced streaming with warning handling&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;chunk&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Import Updates&lt;/h4&gt;
&lt;p&gt;Update your imports to use the new v5 types:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Before (AI SDK v4)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import type &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Message&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;ai&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;useChat&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;ai/react&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// After (AI SDK v5)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import type &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;UIMessage&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;ai&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// or alias for compatibility&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import type &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;UIMessage&lt;/span&gt;&lt;span&gt; as &lt;/span&gt;&lt;span&gt;Message&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;ai&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;useChat&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@ai-sdk/react&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Resources&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/cloudflare/agents/blob/main/docs/migration-to-ai-sdk-v5.md&quot; target=&quot;_blank&quot;&gt;Migration Guide&lt;/a&gt; - Comprehensive migration documentation&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ai-sdk.dev/docs/migration-guides/migration-guide-5-0&quot; target=&quot;_blank&quot;&gt;AI SDK v5 Documentation&lt;/a&gt; - Official AI SDK migration guide&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/cloudflare/agents-starter/pull/105&quot; target=&quot;_blank&quot;&gt;An Example PR showing the migration from AI SDK v4 to v5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/cloudflare/agents/issues&quot; target=&quot;_blank&quot;&gt;GitHub Issues&lt;/a&gt; - Report bugs or request features&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Feedback Welcome&lt;/h4&gt;
&lt;p&gt;We&apos;d love your feedback! We&apos;re particularly interested in feedback on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Migration experience&lt;/strong&gt; - How smooth was the upgrade process?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tool confirmation workflow&lt;/strong&gt; - Does the new automatic detection work as expected?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Message format handling&lt;/strong&gt; - Any edge cases with legacy message conversion?&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>Workers - Built with Cloudflare button</title><link>https://developers.cloudflare.com/changelog/post/2025-09-10-built-with-cloudflare-button/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-10-built-with-cloudflare-button/</guid><description>&lt;p&gt;We&apos;ve updated our &quot;Built with Cloudflare&quot; button to make it easier to share that you&apos;re building on Cloudflare with the world. Embed it in your project&apos;s README, blog post, or wherever you want to let people know.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://workers.cloudflare.com/built-with-cloudflare.svg&quot; alt=&quot;Built with Cloudflare&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;Check out the &lt;a href=&quot;https://developers.cloudflare.com/workers/platform/built-with-cloudflare&quot;&gt;documentation&lt;/a&gt; for usage information.&lt;/p&gt;</description><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Deploy static sites to Workers without a configuration file</title><link>https://developers.cloudflare.com/changelog/post/2025-09-09-interactive-wrangler-assets/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-09-interactive-wrangler-assets/</guid><description>&lt;p&gt;Deploying static site to Workers is now easier. When you run &lt;code&gt;wrangler deploy [directory]&lt;/code&gt; or &lt;code&gt;wrangler deploy --assets [directory]&lt;/code&gt; without an existing &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/configuration/&quot;&gt;configuration file&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/&quot;&gt;Wrangler CLI&lt;/a&gt; now guides you through the deployment process with interactive prompts.&lt;/p&gt;
&lt;h4&gt;Before and after&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Before:&lt;/strong&gt; Required remembering multiple flags and parameters&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;deploy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--assets&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;./dist&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--compatibility-date&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2025-09-09&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-project&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt; Simple directory deployment with guided setup&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;deploy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dist&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Interactive prompts handle the rest as shown in the example flow below&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;What&apos;s new&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Interactive prompts for missing configuration:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Wrangler detects when you&apos;re trying to deploy a directory of static assets&lt;/li&gt;
&lt;li&gt;Prompts you to confirm the deployment type&lt;/li&gt;
&lt;li&gt;Asks for a project name (with smart defaults)&lt;/li&gt;
&lt;li&gt;Automatically sets the compatibility date to today&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Automatic configuration generation:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Creates a &lt;code&gt;wrangler.jsonc&lt;/code&gt; file with your deployment settings&lt;/li&gt;
&lt;li&gt;Stores your choices for future deployments&lt;/li&gt;
&lt;li&gt;Eliminates the need to remember complex command-line flags&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Example workflow&lt;/h4&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Deploy your built static site&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;deploy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dist&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Wrangler will prompt:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;✔&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;It&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;looks&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;like&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;you&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;are&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;trying&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;deploy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;directory&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;of&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;assets&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;only.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Is&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;correct?&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;…&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;✔&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;What&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;do&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;you&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;want&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;your&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;project?&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;…&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-astro-site&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Automatically generates a wrangler.jsonc file and adds it to your project:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-astro-site&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;compatibility_date&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;2025-09-09&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;assets&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;directory&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;dist&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Next time you run wrangler deploy, this will use the configuration in your newly generated wrangler.jsonc file&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;deploy&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Requirements&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;You must use Wrangler version 4.24.4 or later in order to use this feature&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Tue, 09 Sep 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers AI - Introducing EmbeddingGemma from Google on Workers AI</title><link>https://developers.cloudflare.com/changelog/post/2025-09-05-embeddinggemma/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-05-embeddinggemma/</guid><description>&lt;p&gt;We&apos;re excited to be a launch partner alongside &lt;a href=&quot;https://developers.googleblog.com/en/introducing-embeddinggemma/&quot; target=&quot;_blank&quot;&gt;Google&lt;/a&gt; to bring their newest embedding model, &lt;strong&gt;EmbeddingGemma&lt;/strong&gt;, to Workers AI that delivers best-in-class performance for its size, enabling RAG and semantic search use cases.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/embeddinggemma-300m/&quot;&gt;&lt;code&gt;@cf/google/embeddinggemma-300m&lt;/code&gt;&lt;/a&gt; is a 300M parameter embedding model from Google, built from Gemma 3 and the same research used to create Gemini models. This multilingual model supports 100+ languages, making it ideal for RAG systems, semantic search, content classification, and clustering tasks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Using EmbeddingGemma in AI Search:&lt;/strong&gt;
Now you can leverage EmbeddingGemma directly through AI Search for your RAG pipelines. EmbeddingGemma&apos;s multilingual capabilities make it perfect for global applications that need to understand and retrieve content across different languages with exceptional accuracy.&lt;/p&gt;
&lt;p&gt;To use EmbeddingGemma for your AI Search projects:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Create&lt;/strong&gt; in the &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/ai/ai-search&quot; target=&quot;_blank&quot;&gt;AI Search dashboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Follow the setup flow for your new RAG instance&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Generate Index&lt;/strong&gt; step, open up &lt;strong&gt;More embedding models&lt;/strong&gt; and select &lt;code&gt;@cf/google/embeddinggemma-300m&lt;/code&gt; as your embedding model&lt;/li&gt;
&lt;li&gt;Complete the setup to create an AI Search&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Try it out and let us know what you think!&lt;/p&gt;</description><pubDate>Fri, 05 Sep 2025 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category></item><item><title>Workers, Workers for Platforms - Increased static asset limits for Workers</title><link>https://developers.cloudflare.com/changelog/post/2025-09-02-increased-static-asset-limits/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-02-increased-static-asset-limits/</guid><description>&lt;p&gt;You can now upload up to &lt;strong&gt;100,000 static assets&lt;/strong&gt; per Worker version&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Paid and Workers for Platforms users can now upload up to &lt;strong&gt;100,000 static assets&lt;/strong&gt; per Worker version, a 5x increase from the previous limit of 20,000.&lt;/li&gt;
&lt;li&gt;Customers on the free plan still have the same limit as before — 20,000 static assets per version of your Worker&lt;/li&gt;
&lt;li&gt;The individual file size limit of 25 MiB remains unchanged for all customers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This increase allows you to build larger applications with more static assets without hitting limits.&lt;/p&gt;
&lt;h4&gt;Wrangler&lt;/h4&gt;
&lt;p&gt;To take advantage of the increased limits, you must use &lt;strong&gt;Wrangler version 4.34.0 or higher&lt;/strong&gt;.
Earlier versions of Wrangler will continue to enforce the previous 20,000 file limit.&lt;/p&gt;
&lt;h4&gt;Learn more&lt;/h4&gt;
&lt;p&gt;For more information about Workers static assets, see the &lt;a href=&quot;https://developers.cloudflare.com/workers/static-assets/&quot;&gt;Static Assets documentation&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/workers/platform/limits/#static-assets&quot;&gt;Platform Limits&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category><category>Workers for Platforms</category></item><item><title>Workers - A new, simpler REST API for Cloudflare Workers (Beta)</title><link>https://developers.cloudflare.com/changelog/post/2025-09-03-new-workers-api/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-03-new-workers-api/</guid><description>&lt;p&gt;You can now manage &lt;a href=&quot;https://developers.cloudflare.com/api/resources/workers/subresources/beta/subresources/workers/methods/create/&quot;&gt;&lt;strong&gt;Workers&lt;/strong&gt;&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/api/resources/workers/subresources/beta/subresources/workers/models/worker/#(schema)&quot;&gt;&lt;strong&gt;Versions&lt;/strong&gt;&lt;/a&gt;, and &lt;a href=&quot;https://developers.cloudflare.com/api/resources/workers/subresources/scripts/subresources/content/methods/update/&quot;&gt;&lt;strong&gt;Deployments&lt;/strong&gt;&lt;/a&gt; as separate resources with a new, resource-oriented API (Beta).&lt;/p&gt;
&lt;p&gt;This new API is supported in the &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs&quot; target=&quot;_blank&quot;&gt;Cloudflare Terraform provider&lt;/a&gt; and the &lt;a href=&quot;https://github.com/cloudflare/cloudflare-typescript&quot; target=&quot;_blank&quot;&gt;Cloudflare Typescript SDK&lt;/a&gt;, allowing platform teams to manage a Worker&apos;s infrastructure in Terraform, while development teams handle code deployments from a separate repository or workflow. We also designed this API with AI agents in mind, as a clear, predictable structure is essential for them to reliably build, test, and deploy applications.&lt;/p&gt;
&lt;h4&gt;Try it out&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/resources/workers/subresources/beta/&quot;&gt;&lt;strong&gt;New beta API endpoints&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/cloudflare/cloudflare-typescript&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;Cloudflare TypeScript SDK v5.0.0&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/cloudflare/cloudflare-go&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;Cloudflare Go SDK v6.0.0&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;Terraform provider v5.9.0&lt;/strong&gt;&lt;/a&gt;: &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/worker&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;cloudflare_worker&lt;/code&gt;&lt;/a&gt; , &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/worker_version&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;cloudflare_worker_version&lt;/code&gt;&lt;/a&gt;, and &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/workers_deployment&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;cloudflare_workers_deployments&lt;/code&gt;&lt;/a&gt; resources.&lt;/li&gt;
&lt;li&gt;See full examples in our &lt;a href=&quot;https://developers.cloudflare.com/workers/platform/infrastructure-as-code&quot;&gt;Infrastructure as Code (IaC) guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Before: Eight+ endpoints with mixed responsibilities&lt;/h4&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/api-before.VkE1i-Rj_eezro.webp&quot; alt=&quot;Before&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;The existing API was originally designed for simple, one-shot script uploads:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-X&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;PUT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;https://api.cloudflare.com/client/v4/accounts/&lt;/span&gt;&lt;span&gt;$ACCOUNT_ID&lt;/span&gt;&lt;span&gt;/workers/scripts/&lt;/span&gt;&lt;span&gt;$SCRIPT_NAME&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;-H&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;X-Auth-Email: &lt;/span&gt;&lt;span&gt;$CLOUDFLARE_EMAIL&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;-H&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;X-Auth-Key: &lt;/span&gt;&lt;span&gt;$CLOUDFLARE_API_KEY&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;-H&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Content-Type: multipart/form-data&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;-F&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;metadata={&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;main_module&quot;: &quot;worker.js&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;compatibility_date&quot;: &quot;$today$&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;-F&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;worker.js=@worker.js;type=application/javascript+module&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;This API worked for creating a basic Worker, uploading all of its code, and deploying it immediately — but came with challenges:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;A Worker couldn&apos;t exist without code&lt;/strong&gt;: To create a Worker, you had to upload its code in the same API request. This meant platform teams couldn&apos;t provision Workers with the proper settings, and then hand them off to development teams to deploy the actual code.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Several endpoints implicitly created deployments&lt;/strong&gt;: Simple updates like adding a secret or changing a script&apos;s content would implicitly create a new version and immediately deploy it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Updating a setting was confusing&lt;/strong&gt;: Configuration was scattered across eight endpoints with overlapping responsibilities.  This ambiguity made it difficult for human developers (and even more so for AI agents) to reliably update a Worker via API.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Scripts used names as primary identifiers&lt;/strong&gt;: This meant simple renames could turn into a risky migration, requiring you to create a brand new Worker and update every reference. If you were using Terraform, this could inadvertently destroy your Worker altogether.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;After: Three resources with clear boundaries&lt;/h4&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/api-after.J8u2vIcT_ZesBmg.webp&quot; alt=&quot;After&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;All endpoints now use simple JSON payloads, with script content embedded as &lt;code&gt;base64&lt;/code&gt;-encoded strings -- a more consistent and reliable approach than the previous &lt;code&gt;multipart/form-data&lt;/code&gt; format.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Worker&lt;/strong&gt;: The parent resource representing your application. It has a stable UUID and holds persistent settings like &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;tags&lt;/code&gt;, and &lt;code&gt;logpush&lt;/code&gt;. You can now create a Worker to establish its identity and settings &lt;strong&gt;before&lt;/strong&gt; any code is uploaded.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Version&lt;/strong&gt;: An immutable snapshot of your code and its specific configuration, like bindings and &lt;code&gt;compatibility_date&lt;/code&gt;. Creating a new version is a safe action that doesn&apos;t affect live traffic.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deployment&lt;/strong&gt;: An explicit action that directs traffic to a specific version.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;aside&gt;&lt;p&gt;Note&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/resources/workers/subresources/beta/subresources/workers/&quot;&gt;Workers&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/api/resources/workers/subresources/beta/subresources/workers/subresources/versions/&quot;&gt;Versions&lt;/a&gt; use the new &lt;code&gt;/workers/&lt;/code&gt; beta endpoints, while &lt;a href=&quot;https://developers.cloudflare.com/api/resources/workers/subresources/scripts/subresources/deployments/&quot;&gt;Deployments&lt;/a&gt; remain on the existing &lt;code&gt;/scripts/&lt;/code&gt; endpoint. Pair the new endpoints with the existing Deployment API for a complete workflow.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;h4&gt;Why this matters&lt;/h4&gt;
&lt;h4&gt;You can now create Workers before uploading code&lt;/h4&gt;
&lt;p&gt;Workers are now standalone resources that can be created and configured without any code. Platform teams can provision Workers with the right settings, then hand them off to development teams for implementation.&lt;/p&gt;
&lt;h4&gt;Example: Typescript SDK&lt;/h4&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Step 1: Platform team creates the Worker resource (no code needed)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;worker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;workers&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;beta&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;workers&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;payment-service&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;account_id&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;...&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;observability&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;enabled&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Step 2: Development team adds code and creates a version later&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;workers&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;beta&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;workers&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;versions&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;worker&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;account_id&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;...&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;main_module&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;worker.js&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;compatibility_date&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;$today&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;bindings&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [ &lt;/span&gt;&lt;span&gt;/*...*/&lt;/span&gt;&lt;span&gt; ]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;modules&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;worker.js&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;content_type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;application/javascript+module&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;content_base64&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Buffer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;scriptContent&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toString&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;base64&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Step 3: Deploy explicitly when ready&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;deployment&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;workers&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;scripts&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;deployments&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;worker&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;account_id&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;...&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;strategy&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;percentage&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;versions&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;percentage&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;version_id&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Example: Terraform&lt;/h4&gt;
&lt;p&gt;If you use Terraform, you can now declare the Worker in your Terraform configuration and manage configuration outside of Terraform in your Worker&apos;s &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/configuration/&quot;&gt;&lt;code&gt;wrangler.jsonc&lt;/code&gt; file&lt;/a&gt; and deploy code changes using &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/&quot;&gt;Wrangler&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;tf&quot;&gt;&lt;code class=&quot;language-tf&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;resource&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;cloudflare_worker&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my_worker&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;account_id&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;...&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-important-service&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Manage Versions and Deployments here or outside of Terraform&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# resource &quot;cloudflare_worker_version&quot; &quot;my_worker_version&quot; {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# resource &quot;cloudflare_workers_deployment&quot; &quot;my_worker_deployment&quot; {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Deployments are always explicit, never implicit&lt;/h4&gt;
&lt;p&gt;Creating a version and deploying it are now always explicit, separate actions - never implicit side effects. To update version-specific settings (like bindings), you create a new version with those changes. The existing deployed version remains unchanged until you explicitly deploy the new one.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Step 1: Create a new version with updated settings (doesn&apos;t affect live traffic)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;POST&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/workers/workers/{id}/versions&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;compatibility_date&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;$today&lt;/span&gt;&lt;span&gt;&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;bindings&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;MY_NEW_ENV_VAR&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;text&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;new_value&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;type&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;plain_text&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;modules&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [...]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Step 2: Explicitly deploy when ready (now affects live traffic)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;POST&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/workers/scripts/{script_name}/deployments&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;strategy&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;percentage&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;versions&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;percentage&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;100,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;version_id&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;new_version_id&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Settings are clearly organized by scope&lt;/h4&gt;
&lt;p&gt;Configuration is now logically divided: &lt;a href=&quot;https://developers.cloudflare.com/api/resources/workers/subresources/beta/subresources/workers/&quot;&gt;&lt;strong&gt;Worker settings&lt;/strong&gt;&lt;/a&gt; (like &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;tags&lt;/code&gt;) persist across all versions, while &lt;a href=&quot;https://developers.cloudflare.com/api/resources/workers/subresources/beta/subresources/workers/subresources/versions/&quot;&gt;&lt;strong&gt;Version settings&lt;/strong&gt;&lt;/a&gt; (like &lt;code&gt;bindings&lt;/code&gt; and &lt;code&gt;compatibility_date&lt;/code&gt;) are specific to each code snapshot.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Worker settings (the parent resource)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;PUT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/workers/workers/{id}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;payment-service&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;tags&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;production&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;logpush&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Version settings (the &quot;code&quot;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;POST&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/workers/workers/{id}/versions&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;compatibility_date&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;$today&lt;/span&gt;&lt;span&gt;&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;bindings&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [...],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;modules&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [...]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;&lt;code&gt;/workers&lt;/code&gt; API endpoints now support UUIDs (in addition to names)&lt;/h4&gt;
&lt;p&gt;The &lt;code&gt;/workers/workers/&lt;/code&gt; path now supports addressing a Worker by both its immutable UUID and its mutable name.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Both work for the same Worker&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;GET&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/workers/workers/29494978e03748669e8effb243cf2515&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# UUID (stable for automation)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;GET&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/workers/workers/payment-service&lt;/span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;span&gt;# Name (convenient for humans)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;This dual approach means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Developers can use readable names for debugging.&lt;/li&gt;
&lt;li&gt;Automation can rely on stable UUIDs to prevent errors when Workers are renamed.&lt;/li&gt;
&lt;li&gt;Terraform can rename Workers without destroying and recreating them.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Learn more&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/platform/infrastructure-as-code&quot;&gt;Infrastructure as Code (IaC) guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/resources/workers/subresources/beta/&quot;&gt;API documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/versions-and-deployments/&quot;&gt;Versions and Deployments overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Technical notes&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;The pre-existing Workers REST API remains fully supported. Once the new API exits beta, we&apos;ll provide a migration timeline with ample notice and comprehensive migration guides.&lt;/li&gt;
&lt;li&gt;Existing Terraform resources and SDK methods will continue to be fully supported through the current major version.&lt;/li&gt;
&lt;li&gt;While the Deployments API currently remains on the &lt;code&gt;/scripts/&lt;/code&gt; endpoint, we plan to introduce a new Deployments endpoint under &lt;code&gt;/workers/&lt;/code&gt; to match the new API structure.&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers AI - Deepgram and Leonardo partner models now available on Workers AI</title><link>https://developers.cloudflare.com/changelog/post/2025-08-27-partner-models/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-08-27-partner-models/</guid><description>&lt;p&gt;New state-of-the-art models have landed on Workers AI! This time, we&apos;re introducing new &lt;strong&gt;partner models&lt;/strong&gt; trained by our friends at &lt;a href=&quot;https://deepgram.com&quot; target=&quot;_blank&quot;&gt;Deepgram&lt;/a&gt; and &lt;a href=&quot;https://leonardo.ai&quot; target=&quot;_blank&quot;&gt;Leonardo&lt;/a&gt;, hosted on Workers AI infrastructure.&lt;/p&gt;
&lt;p&gt;As well, we&apos;re introuding a new turn detection model that enables you to detect when someone is done speaking — useful for building voice agents!&lt;/p&gt;
&lt;p&gt;Read the &lt;a href=&quot;https://blog.cloudflare.com/workers-ai-partner-models&quot; target=&quot;_blank&quot;&gt;blog&lt;/a&gt; for more details and check out some of the new models on our platform:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/aura-1&quot;&gt;&lt;code&gt;@cf/deepgram/aura-1&lt;/code&gt;&lt;/a&gt; is a text-to-speech model that allows you to input text and have it come to life in a customizable voice&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/nova-3&quot;&gt;&lt;code&gt;@cf/deepgram/nova-3&lt;/code&gt;&lt;/a&gt; is speech-to-text model that transcribes multilingual audio at a blazingly fast speed&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/smart-turn-v2&quot;&gt;&lt;code&gt;@cf/pipecat-ai/smart-turn-v2&lt;/code&gt;&lt;/a&gt; helps you detect when someone is done speaking&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/lucid-origin&quot;&gt;&lt;code&gt;@cf/leonardo/lucid-origin&lt;/code&gt;&lt;/a&gt; is a text-to-image model that generates images with sharp graphic design, stunning full-HD renders, or highly specific creative direction&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/phoenix-1.0&quot;&gt;&lt;code&gt;@cf/leonardo/phoenix-1.0&lt;/code&gt;&lt;/a&gt; is a text-to-image model with exceptional prompt adherence and coherent text&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can filter out new partner models with the &lt;code&gt;Partner&lt;/code&gt; capability on our &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models&quot;&gt;Models&lt;/a&gt; page.&lt;/p&gt;
&lt;p&gt;As well, we&apos;re introducing WebSocket support for some of our audio models, which you can filter though the &lt;code&gt;Realtime&lt;/code&gt; capability on our &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models&quot;&gt;Models&lt;/a&gt; page. WebSockets allows you to create a bi-directional connection to our inference server with low latency — perfect for those that are building voice agents.&lt;/p&gt;
&lt;p&gt;An example python snippet on how to use WebSockets with our new Aura model:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;plaintext&quot;&gt;&lt;code class=&quot;language-plaintext&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import os&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import asyncio&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import websockets&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;uri = f&quot;wss://api.cloudflare.com/client/v4/accounts/{ACCOUNT_ID}/ai/run/@cf/deepgram/aura-1&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;input = [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;Line one, out of three lines that will be provided to the aura model.&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;Line two, out of three lines that will be provided to the aura model.&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;Line three, out of three lines that will be provided to the aura model. This is a last line.&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;async def text_to_speech():&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;async with websockets.connect(uri, additional_headers={&quot;Authorization&quot;: os.getenv(&quot;CF_TOKEN&quot;)}) as websocket:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;print(&quot;connection established&quot;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;for line in input:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;print(f&quot;sending `{line}`&quot;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;await websocket.send(json.dumps({&quot;type&quot;: &quot;Speak&quot;, &quot;text&quot;: line}))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;print(&quot;line was sent, flushing&quot;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;await websocket.send(json.dumps({&quot;type&quot;: &quot;Flush&quot;}))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;print(&quot;flushed, recving&quot;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;resp = await websocket.recv()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;print(f&quot;response received {resp}&quot;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;if __name__ == &quot;__main__&quot;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;asyncio.run(text_to_speech())&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;</description><pubDate>Wed, 27 Aug 2025 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category></item><item><title>Vectorize - List all vectors in a Vectorize index with the new list-vectors operation</title><link>https://developers.cloudflare.com/changelog/post/2025-08-26-vectorize-list-vectors/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-08-26-vectorize-list-vectors/</guid><description>&lt;p&gt;You can now list all vector identifiers in a Vectorize index using the new &lt;code&gt;list-vectors&lt;/code&gt; operation. This enables bulk operations, auditing, and data migration workflows through paginated requests that maintain snapshot consistency.&lt;/p&gt;
&lt;p&gt;The operation is available via Wrangler CLI and REST API. Refer to the &lt;a href=&quot;https://developers.cloudflare.com/vectorize/best-practices/list-vectors/&quot;&gt;list-vectors best practices guide&lt;/a&gt; for detailed usage guidance.&lt;/p&gt;</description><pubDate>Tue, 26 Aug 2025 00:00:00 GMT</pubDate><product>Vectorize</product><category>Vectorize</category></item><item><title>Secrets Store, AI Gateway, SSL/TLS - Manage and deploy your AI provider keys through Bring Your Own Key (BYOK) with AI Gateway, now powered by Cloudflare Secrets Store</title><link>https://developers.cloudflare.com/changelog/post/2025-08-25-secrets-store-ai-gateway/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-08-25-secrets-store-ai-gateway/</guid><description>&lt;p&gt;Cloudflare Secrets Store is now integrated with AI Gateway, allowing you to store, manage, and deploy your AI provider keys in a secure and seamless configuration through &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/configuration/bring-your-own-keys/&quot; target=&quot;_blank&quot;&gt;Bring Your Own Key&lt;/a&gt;. Instead of passing your AI provider keys directly in every request header, you can centrally manage each key with Secrets Store and deploy in your gateway configuration using only a reference, rather than passing the value in plain text.&lt;/p&gt;
&lt;p&gt;You can now create a secret directly from your AI Gateway &lt;a href=&quot;http://dash.cloudflare.com/?to=/:account/ai-gateway&quot; target=&quot;_blank&quot;&gt;in the dashboard&lt;/a&gt; by navigating into your gateway -&gt; &lt;strong&gt;Provider Keys&lt;/strong&gt; -&gt; &lt;strong&gt;Add&lt;/strong&gt;.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/add-secret-ai-gateway.B-SIPr6s_jJjDD.webp&quot; alt=&quot;Import repo or choose template&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;You can also create your secret with the newly available &lt;strong&gt;ai_gateway&lt;/strong&gt; scope via &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/&quot; target=&quot;_blank&quot;&gt;wrangler&lt;/a&gt;, the &lt;a href=&quot;http://dash.cloudflare.com/?to=/:account/secrets-store&quot; target=&quot;_blank&quot;&gt;Secrets Store dashboard&lt;/a&gt;, or the &lt;a href=&quot;https://developers.cloudflare.com/api/resources/secrets_store/&quot; target=&quot;_blank&quot;&gt;API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Then, pass the key in the request header using its Secrets Store reference:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;plaintext&quot;&gt;&lt;code class=&quot;language-plaintext&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl -X POST https://gateway.ai.cloudflare.com/v1/&amp;#x3C;ACCOUNT_ID&gt;/my-gateway/anthropic/v1/messages \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--header &apos;cf-aig-authorization: ANTHROPIC_KEY_1 \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--header &apos;anthropic-version: 2023-06-01&apos; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--header &apos;Content-Type: application/json&apos; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--data  &apos;{&quot;model&quot;: &quot;claude-3-opus-20240229&quot;, &quot;messages&quot;: [{&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;What is Cloudflare?&quot;}]}&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Or, using Javascript:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;plaintext&quot;&gt;&lt;code class=&quot;language-plaintext&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import Anthropic from &apos;@anthropic-ai/sdk&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const anthropic = new Anthropic({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;apiKey: &quot;ANTHROPIC_KEY_1&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;baseURL: &quot;https://gateway.ai.cloudflare.com/v1/&amp;#x3C;ACCOUNT_ID&gt;/my-gateway/anthropic&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const message = await anthropic.messages.create({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;model: &apos;claude-3-opus-20240229&apos;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;messages: [{role: &quot;user&quot;, content: &quot;What is Cloudflare?&quot;}],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;max_tokens: 1024&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For more information, check out the &lt;a href=&quot;https://blog.cloudflare.com/ai-gateway-aug-2025-refresh&quot; target=&quot;_blank&quot;&gt;blog&lt;/a&gt;!&lt;/p&gt;</description><pubDate>Mon, 25 Aug 2025 11:00:00 GMT</pubDate><product>Secrets Store</product><category>Secrets Store</category><category>AI Gateway</category><category>SSL/TLS</category></item><item><title>Workers - Content type returned in Workers Assets for Javascript files is now `text/javascript`</title><link>https://developers.cloudflare.com/changelog/post/2025-08-25-workers-assets-javascript-content-type/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-08-25-workers-assets-javascript-content-type/</guid><description>&lt;p&gt;JavaScript asset responses have been updated to use the &lt;code&gt;text/javascript&lt;/code&gt; Content-Type header instead of &lt;code&gt;application/javascript&lt;/code&gt;. While both MIME types are widely supported by browsers, the HTML Living Standard explicitly recommends &lt;code&gt;text/javascript&lt;/code&gt; as the preferred type going forward.&lt;/p&gt;
&lt;p&gt;This change improves:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Standards alignment: Ensures consistency with the HTML spec and modern web platform guidance.&lt;/li&gt;
&lt;li&gt;Interoperability: Some developer tools, validators, and proxies expect text/javascript and may warn or behave inconsistently with application/javascript.&lt;/li&gt;
&lt;li&gt;Future-proofing: By following the spec-preferred MIME type, we reduce the risk of deprecation warnings or unexpected behavior in evolving browser environments.&lt;/li&gt;
&lt;li&gt;Consistency: Most frameworks, CDNs, and hosting providers now default to text/javascript, so this change matches common ecosystem practice.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Because all major browsers accept both MIME types, this update is backwards compatible and should not cause breakage.&lt;/p&gt;
&lt;p&gt;Users will see this change on the next deployment of their assets.&lt;/p&gt;</description><pubDate>Mon, 25 Aug 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>KV - Workers KV completes hybrid storage provider rollout for improved performance, fault-tolerance</title><link>https://developers.cloudflare.com/changelog/post/2025-08-22-kv-performance-improvements/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-08-22-kv-performance-improvements/</guid><description>&lt;p&gt;Workers KV has completed rolling out performance improvements across all KV namespaces, providing a significant latency reduction on read operations for all KV users. This is due to architectural changes to KV&apos;s underlying storage infrastructure, which introduces a new metadata later and substantially improves redundancy.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/kv-hybrid-providers-performance-improvements.D6MBO22S_2ok8qE.webp&quot; alt=&quot;Workers KV latency improvements showing P95 and P99 performance gains in Europe, Asia, Africa and Middle East regions as measured within KV&amp;#x27;s internal storage gateway worker.&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;h4&gt;Performance improvements&lt;/h4&gt;
&lt;p&gt;The new hybrid architecture delivers substantial latency reductions throughout Europe, Asia, Middle East, Africa regions. Over the past 2 weeks, we have observed the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;p95 latency&lt;/strong&gt;: Reduced from ~150ms to ~50ms (67% decrease)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;p99 latency&lt;/strong&gt;: Reduced from ~350ms to ~250ms (29% decrease)&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Fri, 22 Aug 2025 12:00:00 GMT</pubDate><product>KV</product><category>KV</category></item><item><title>Workflows, Workers - Build durable multi-step applications in Python with Workflows (now in beta)</title><link>https://developers.cloudflare.com/changelog/post/2025-08-22-workflows-python-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-08-22-workflows-python-beta/</guid><description>&lt;p&gt;You can now build &lt;a href=&quot;https://developers.cloudflare.com/workflows/&quot;&gt;Workflows&lt;/a&gt; using Python. With Python Workflows, you get automatic retries, state persistence, and the ability to run multi-step operations that can span minutes, hours, or weeks using Python’s familiar syntax and the &lt;a href=&quot;https://developers.cloudflare.com/workers/languages/python/&quot;&gt;Python Workers&lt;/a&gt; runtime.&lt;/p&gt;
&lt;p&gt;Python Workflows use the same step-based execution model as JavaScript Workflows, but with Python syntax and access to Python’s ecosystem. Python Workflows also enable &lt;a href=&quot;https://developers.cloudflare.com/workflows/python/dag/&quot;&gt;DAG (Directed Acyclic Graph) workflows&lt;/a&gt;, where you can define complex dependencies between steps using the depends parameter.&lt;/p&gt;
&lt;p&gt;Here’s a simple example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; workers &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; Response&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; WorkflowEntrypoint&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;PythonWorkflowStarter&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;WorkflowEntrypoint&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;step&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;step&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;do&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;my first step&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my_first_step&lt;/span&gt;&lt;span&gt;():&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;# do some work&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Hello Python!&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my_first_step&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; step&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;my-sleep-step&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;10 seconds&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;step&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;do&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;my second step&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my_second_step&lt;/span&gt;&lt;span&gt;():&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;# do some more work&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Hello again!&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my_second_step&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Default&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;WorkerEntrypoint&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;MY_WORKFLOW&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Hello Workflow creation!&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;aside&gt;&lt;p&gt;Note&lt;/p&gt;&lt;div&gt;&lt;p&gt;Python Workflows requires a &lt;code&gt;compatibility_date = &quot;2025-08-01&quot;&lt;/code&gt;, or lower, in your wrangler toml file.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;Python Workflows support the same core capabilities as JavaScript Workflows, including sleep scheduling, event-driven workflows, and built-in error handling with configurable retry policies.&lt;/p&gt;
&lt;p&gt;To learn more and get started, refer to &lt;a href=&quot;https://developers.cloudflare.com/workflows/python/&quot;&gt;Python Workflows documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 22 Aug 2025 00:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category><category>Workers</category></item><item><title>Durable Objects, Workers - New getByName() API to access Durable Objects</title><link>https://developers.cloudflare.com/changelog/post/2025-08-21-durable-objects-get-by-name/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-08-21-durable-objects-get-by-name/</guid><description>&lt;p&gt;You can now create a client (a &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/api/stub/&quot;&gt;Durable Object stub&lt;/a&gt;) to a Durable Object with the new &lt;code&gt;getByName&lt;/code&gt; method, removing the need to convert Durable Object names to IDs and then create a stub.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Before: (1) translate name to ID then (2) get a client&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;objectId&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;MY_DURABLE_OBJECT&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;idFromName&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;foo&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// or .newUniqueId()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stub&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;MY_DURABLE_OBJECT&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;objectId&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Now: retrieve client to Durable Object directly via its name&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stub&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;MY_DURABLE_OBJECT&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getByName&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;foo&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Use client to send request to the remote Durable Object&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rpcResponse&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stub&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sayHello&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Each Durable Object has a globally-unique name, which allows you to send requests to a specific object from anywhere in the world. Thus, a Durable Object can be used to coordinate between multiple clients who need to work together. You can have billions of Durable Objects, providing isolation between application tenants.&lt;/p&gt;
&lt;p&gt;To learn more, visit the Durable Objects &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/api/namespace/#getbyname&quot;&gt;API Documentation&lt;/a&gt; or the &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/get-started/&quot;&gt;getting started guide&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 21 Aug 2025 00:00:00 GMT</pubDate><product>Durable Objects</product><category>Durable Objects</category><category>Workers</category></item><item><title>Queues - Subscribe to events from Cloudflare services with Queues</title><link>https://developers.cloudflare.com/changelog/post/2025-08-19-event-subscriptions/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-08-19-event-subscriptions/</guid><description>&lt;p&gt;You can now subscribe to events from other Cloudflare services (for example, &lt;a href=&quot;https://developers.cloudflare.com/kv/&quot;&gt;Workers KV&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/workers-ai&quot;&gt;Workers AI&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/workers&quot;&gt;Workers&lt;/a&gt;) and consume those events via &lt;a href=&quot;https://developers.cloudflare.com/queues/&quot;&gt;Queues&lt;/a&gt;, allowing you to build custom workflows, integrations, and logic in response to account activity.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/queues-event-subscriptions.3aVidnXJ_Z2p3fRA.webp&quot; alt=&quot;Event subscriptions architecture&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;Event subscriptions allow you to receive messages when events occur across your Cloudflare account. Cloudflare products can publish structured events to a queue, which you can then consume with &lt;a href=&quot;https://developers.cloudflare.com/workers/&quot;&gt;Workers&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/queues/configuration/pull-consumers/&quot;&gt;pull via HTTP from anywhere&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To create a subscription, use the dashboard or &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/queues/#queues-subscription-create&quot;&gt;Wrangler&lt;/a&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;queues&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;subscription&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-queue&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--source&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;r2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--events&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bucket.created&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;An event is a structured record of something happening in your Cloudflare account – like a Workers AI batch request being queued, a Worker build completing, or an R2 bucket being created. Events follow a consistent structure:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;cf.r2.bucket.created&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;source&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;r2&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;payload&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-bucket&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;WNAM&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;accountId&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;f9f79265f388666de8122cfb508d7776&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;eventTimestamp&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;2025-07-28T10:30:00Z&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Current &lt;a href=&quot;https://developers.cloudflare.com/queues/event-subscriptions/events-schemas/&quot;&gt;event sources&lt;/a&gt; include &lt;a href=&quot;https://developers.cloudflare.com/r2/&quot;&gt;R2&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/kv/&quot;&gt;Workers KV&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/&quot;&gt;Workers AI&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/&quot;&gt;Workers Builds&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/vectorize/&quot;&gt;Vectorize&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/r2/data-migration/super-slurper/&quot;&gt;Super Slurper&lt;/a&gt;, and &lt;a href=&quot;https://developers.cloudflare.com/workflows/&quot;&gt;Workflows&lt;/a&gt;. More sources and events are on the way.&lt;/p&gt;
&lt;p&gt;For more information on event subscriptions, available events, and how to get started, refer to our &lt;a href=&quot;https://developers.cloudflare.com/queues/event-subscriptions/&quot;&gt;documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 19 Aug 2025 12:00:00 GMT</pubDate><product>Queues</product><category>Queues</category></item><item><title>Workers - Easier debugging in Workers with improved Wrangler error screen</title><link>https://developers.cloudflare.com/changelog/post/2025-08-19-improved-wrangler-error-screen/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-08-19-improved-wrangler-error-screen/</guid><description>&lt;p&gt;Wrangler&apos;s error screen has received several improvements to enhance your debugging experience!&lt;/p&gt;
&lt;p&gt;The error screen now features a refreshed design thanks to &lt;a href=&quot;https://www.npmjs.com/package/youch&quot; target=&quot;_blank&quot;&gt;youch&lt;/a&gt;, with support for both light and dark themes, improved source map resolution logic that handles missing source files more reliably, and better error cause display.&lt;/p&gt;















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Before&lt;/th&gt;&lt;th&gt;After (Light)&lt;/th&gt;&lt;th&gt;After (Dark)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/old-error-screen.yurLWiKb_Z1vn3jq.webp&quot; alt=&quot;Old error screen&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;&lt;/td&gt;&lt;td&gt;&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/new-error-screen-light.CcroERTP_2f4pOC.webp&quot; alt=&quot;New light theme error screen&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;&lt;/td&gt;&lt;td&gt;&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/new-error-screen-dark.BIDA2RGg_Q0JqP.webp&quot; alt=&quot;New dark theme error screen&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Try it out now with &lt;code&gt;npx wrangler@latest dev&lt;/code&gt; in your Workers project.&lt;/p&gt;</description><pubDate>Tue, 19 Aug 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - The Node.js and Web File System APIs in Workers</title><link>https://developers.cloudflare.com/changelog/post/2025-08-15-nodejs-fs/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-08-15-nodejs-fs/</guid><description>&lt;p&gt;Implementations of the &lt;a href=&quot;https://nodejs.org/docs/latest/api/fs.html&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;node:fs&lt;/code&gt; module&lt;/a&gt; and the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/File_System_Access_API&quot; target=&quot;_blank&quot;&gt;Web File System API&lt;/a&gt; are now available in Workers.&lt;/p&gt;
&lt;h4&gt;Using the &lt;code&gt;node:fs&lt;/code&gt; module&lt;/h4&gt;
&lt;p&gt;The &lt;code&gt;node:fs&lt;/code&gt; module provides access to a virtual file system in Workers. You can use it to read and write files, create directories, and perform other file system operations.&lt;/p&gt;
&lt;p&gt;The virtual file system is ephemeral with each individual request havig its own isolated temporary file space. Files written to the file system will not persist across requests and will not be shared across requests or across different Workers.&lt;/p&gt;
&lt;p&gt;Workers running with the &lt;code&gt;nodejs_compat&lt;/code&gt; compatibility flag will have access to the &lt;code&gt;node:fs&lt;/code&gt; module by default when the compatibility date is set to &lt;code&gt;2025-09-01&lt;/code&gt; or later. Support for the API can also be enabled using the &lt;code&gt;enable_nodejs_fs_module&lt;/code&gt; compatibility flag together with the &lt;code&gt;nodejs_compat&lt;/code&gt; flag. The &lt;code&gt;node:fs&lt;/code&gt; module can be disabled using the &lt;code&gt;disable_nodejs_fs_module&lt;/code&gt; compatibility flag.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;fs&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;node:fs&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;config&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;JSON&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;parse&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;fs&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;readFileSync&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;/bundle/config.json&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;utf-8&quot;&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`Config value: &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;config&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;There are a number of initial limitations to the &lt;code&gt;node:fs&lt;/code&gt; implementation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The glob APIs (e.g. &lt;code&gt;fs.globSync(...)&lt;/code&gt;) are not implemented.&lt;/li&gt;
&lt;li&gt;The file watching APIs (e.g. &lt;code&gt;fs.watch(...)&lt;/code&gt;) are not implemented.&lt;/li&gt;
&lt;li&gt;The file timestamps (modified time, access time, etc) are only partially supported. For now, these will always return the Unix epoch.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Refer to the &lt;a href=&quot;https://nodejs.org/docs/latest/api/fs.html&quot; target=&quot;_blank&quot;&gt;Node.js documentation&lt;/a&gt; for more information on the &lt;code&gt;node:fs&lt;/code&gt; module and its APIs.&lt;/p&gt;
&lt;h4&gt;The Web File System API&lt;/h4&gt;
&lt;p&gt;The Web File System API provides access to the same virtual file system as the &lt;code&gt;node:fs&lt;/code&gt; module, but with a different API surface. The Web File System API is only available in Workers running with the &lt;code&gt;enable_web_file_system&lt;/code&gt; compatibility flag. The &lt;code&gt;nodejs_compat&lt;/code&gt; compatibility flag is not required to use the Web File System API.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;root&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;navigator&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;storage&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getDirectory&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tmp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;root&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getDirectoryHandle&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;/tmp&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tmp&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getFileHandle&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;data.txt&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; create&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;writable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;createWritable&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;writer&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;writable&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getWriter&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;writer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;write&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Hello, World!&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;writer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;close&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;File written successfully!&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;As there are still some parts of the Web File System API tht are not fully standardized, there may be some differences between the Workers implementation and the implementations in browsers.&lt;/p&gt;</description><pubDate>Fri, 15 Aug 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Workers Static Assets: Corrected handling of double slashes in redirect rule paths</title><link>https://developers.cloudflare.com/changelog/post/2025-08-15-static-assets-redirect-url/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-08-15-static-assets-redirect-url/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/static-assets/&quot;&gt;Static Assets&lt;/a&gt;: Fixed a bug in how &lt;a href=&quot;https://developers.cloudflare.com/workers/static-assets/redirects/&quot; target=&quot;_blank&quot;&gt;redirect rules&lt;/a&gt; defined in your Worker&apos;s &lt;code&gt;_redirects&lt;/code&gt; file are processed.&lt;/p&gt;
&lt;p&gt;If you&apos;re serving Static Assets with a &lt;code&gt;_redirects&lt;/code&gt; file containing a rule like &lt;code&gt;/ja/* /:splat&lt;/code&gt;, paths with double slashes were previously misinterpreted as external URLs. For example, visiting &lt;code&gt;/ja//example.com&lt;/code&gt; would incorrectly redirect to &lt;code&gt;https://example.com&lt;/code&gt; instead of &lt;code&gt;/example.com&lt;/code&gt; on your domain. This has been fixed and double slashes now correctly resolve as local paths. Note: &lt;a href=&quot;https://developers.cloudflare.com/pages/&quot;&gt;Cloudflare Pages&lt;/a&gt; was not affected by this issue.&lt;/p&gt;</description><pubDate>Fri, 15 Aug 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Workers per-branch preview URLs now support long branch names</title><link>https://developers.cloudflare.com/changelog/post/2025-08-08-support-long-branch-names-preview-aliases/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-08-08-support-long-branch-names-preview-aliases/</guid><description>&lt;p&gt;We&apos;ve updated &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/previews/&quot;&gt;preview URLs&lt;/a&gt; for Cloudflare Workers to support long branch names.&lt;/p&gt;
&lt;p&gt;Previously, branch and Worker names exceeding the 63-character DNS limit would cause alias generation to fail, leaving pull requests without aliased preview URLs. This particularly impacted teams relying on descriptive branch naming.&lt;/p&gt;
&lt;p&gt;Now, Cloudflare automatically truncates long branch names and appends a unique hash, ensuring every pull request gets a working preview link.&lt;/p&gt;
&lt;h4&gt;How it works&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;63 characters or less&lt;/strong&gt;: &lt;code&gt;&amp;#x3C;branch-name&gt;-&amp;#x3C;worker-name&gt;&lt;/code&gt; → Uses actual branch name as is&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;64 characters or more&lt;/strong&gt;: &lt;code&gt;&amp;#x3C;truncated-branch-name&gt;--&amp;#x3C;hash&gt;-&amp;#x3C;worker-name&gt;&lt;/code&gt; → Uses truncated name with 4-character hash&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hash generation&lt;/strong&gt;: The hash is derived from the full branch name to ensure uniqueness&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stable URLs&lt;/strong&gt;: The same branch always generates the same hash across all commits&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Requirements and compatibility&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Wrangler 4.30.0 or later&lt;/strong&gt;: This feature requires updating to wrangler@4.30.0+&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No configuration needed&lt;/strong&gt;: Works automatically with existing preview URL setups&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Thu, 14 Aug 2025 01:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Python Workers handlers now live in an entrypoint class</title><link>https://developers.cloudflare.com/changelog/post/2025-08-14-new-python-handlers/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-08-14-new-python-handlers/</guid><description>&lt;p&gt;We are changing how Python Workers are structured by default. Previously, handlers were defined at the top-level of a module as &lt;code&gt;on_fetch&lt;/code&gt;, &lt;code&gt;on_scheduled&lt;/code&gt;, etc. methods, but now they live in an entrypoint class.&lt;/p&gt;
&lt;p&gt;Here&apos;s an example of how to now define a Worker with a fetch handler:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; workers &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; Response&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; WorkerEntrypoint&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Default&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;WorkerEntrypoint&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Hello World!&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;To keep using the old-style handlers, you can specify the &lt;code&gt;disable_python_no_global_handlers&lt;/code&gt; compatibility flag in your wrangler file:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;wrangler.jsonc&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;jsonc&quot;&gt;&lt;code class=&quot;language-jsonc&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;compatibility_flags&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;disable_python_no_global_handlers&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;wrangler.toml&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;toml&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;compatibility_flags&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;disable_python_no_global_handlers&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;Consult the &lt;a href=&quot;https://developers.cloudflare.com/workers/languages/python/&quot;&gt;Python Workers documentation&lt;/a&gt; for more details.&lt;/p&gt;</description><pubDate>Thu, 14 Aug 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Terraform provider improvements — Python Workers support, smaller plan diffs, and API SDK fixes</title><link>https://developers.cloudflare.com/changelog/post/2025-08-14-workers-terraform-and-sdk-improvements/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-08-14-workers-terraform-and-sdk-improvements/</guid><description>&lt;p&gt;The recent &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/workers_script&quot; target=&quot;_blank&quot;&gt;Cloudflare Terraform Provider&lt;/a&gt; and SDK releases (such as &lt;a href=&quot;https://github.com/cloudflare/cloudflare-typescript&quot; target=&quot;_blank&quot;&gt;cloudflare-typescript&lt;/a&gt;) bring significant improvements to the Workers developer experience. These updates focus on reliability, performance, and adding &lt;a href=&quot;https://developers.cloudflare.com/workers/languages/python/&quot;&gt;Python Workers&lt;/a&gt; support.&lt;/p&gt;
&lt;h4&gt;Terraform Improvements&lt;/h4&gt;
&lt;h4&gt;Fixed Unwarranted Plan Diffs&lt;/h4&gt;
&lt;p&gt;Resolved several issues with the &lt;code&gt;cloudflare_workers_script&lt;/code&gt; resource that resulted in unwarranted plan diffs, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Using Durable Objects migrations&lt;/li&gt;
&lt;li&gt;Using some bindings such as &lt;code&gt;secret_text&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Using smart placement&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A resource should never show a plan diff if there isn&apos;t an actual change. This fix reduces unnecessary noise in your Terraform plan and is available in Cloudflare Terraform Provider 5.8.0.&lt;/p&gt;
&lt;h4&gt;Improved File Management&lt;/h4&gt;
&lt;p&gt;You can now specify &lt;code&gt;content_file&lt;/code&gt; and &lt;code&gt;content_sha256&lt;/code&gt; instead of &lt;code&gt;content&lt;/code&gt;. This prevents the Workers script content from being stored in the state file which greatly reduces plan diff size and noise. If your workflow synced plans remotely, this should now happen much faster since there is less data to sync. This is available in Cloudflare Terraform Provider 5.7.0.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;tf&quot;&gt;&lt;code class=&quot;language-tf&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;resource&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;cloudflare_workers_script&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my_worker&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;account_id&lt;/span&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;123456789&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;script_name&lt;/span&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my_worker&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;main_module&lt;/span&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;worker.mjs&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;content_file&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;worker.mjs&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;content_sha256&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;filesha256&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;worker.mjs&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Assets Headers and Redirects Support&lt;/h4&gt;
&lt;p&gt;Fixed the &lt;code&gt;cloudflare_workers_script&lt;/code&gt; resource to properly support headers and redirects for Assets:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;tf&quot;&gt;&lt;code class=&quot;language-tf&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;resource&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;cloudflare_workers_script&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my_worker&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;account_id&lt;/span&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;123456789&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;script_name&lt;/span&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my_worker&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;main_module&lt;/span&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;worker.mjs&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;content_file&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;worker.mjs&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;content_sha256&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;filesha256&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;worker.mjs&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;assets&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;config&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;_headers&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;redirects&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;_redirects&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# Completion jwt from:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# https://developers.cloudflare.com/api/resources/workers/subresources/assets/subresources/upload/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;jwt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;jwt&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Available in Cloudflare Terraform Provider 5.8.0.&lt;/p&gt;
&lt;h4&gt;Python Workers Support&lt;/h4&gt;
&lt;p&gt;Added support for uploading &lt;a href=&quot;https://developers.cloudflare.com/workers/languages/python/&quot;&gt;Python Workers&lt;/a&gt; (beta) in Terraform. You can now deploy Python Workers with:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;tf&quot;&gt;&lt;code class=&quot;language-tf&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;resource&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;cloudflare_workers_script&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my_worker&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;account_id&lt;/span&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;123456789&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;script_name&lt;/span&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my_worker&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;content_file&lt;/span&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;worker.py&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;content_sha256&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;filesha256&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;worker.py&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;content_type&lt;/span&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;text/x-python&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Available in Cloudflare Terraform Provider 5.8.0.&lt;/p&gt;
&lt;h4&gt;SDK Enhancements&lt;/h4&gt;
&lt;h4&gt;Improved File Upload API&lt;/h4&gt;
&lt;p&gt;Fixed an issue where Workers script versions in the SDK did not allow uploading files. This now works, and also has an improved files upload interface:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;scriptContent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;export default {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;async fetch(request, env, ctx) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return new Response(&apos;Hello World!&apos;, { status: 200 });&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;workers&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;scripts&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;versions&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;my-worker&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;account_id&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;123456789&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;main_module&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;my-worker.mjs&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;files&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;toFile&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Buffer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;scriptContent&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&apos;my-worker.mjs&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;application/javascript+module&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Will be available in cloudflare-typescript 4.6.0. A similar change will be available in cloudflare-python 4.4.0.&lt;/p&gt;
&lt;h4&gt;Fixed updating KV values&lt;/h4&gt;
&lt;p&gt;Previously when creating a KV value like this:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cf&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;kv&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;namespaces&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;values&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;my-kv-namespace&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;key1&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;account_id&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;123456789&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my metadata&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;JSON&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;stringify&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;hello&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;world&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;...and recalling it in your Worker like this:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;c&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;KV&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;&amp;#x3C;{&lt;/span&gt;&lt;span&gt;hello&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;}&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;key1&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;json&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;You&apos;d get back this: &lt;code&gt;{metadata:&apos;my metadata&apos;, value:&quot;{&apos;hello&apos;:&apos;world&apos;}&quot;}&lt;/code&gt; instead of the correct value of &lt;code&gt;{hello: &apos;world&apos;}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This is fixed in cloudflare-typescript 4.5.0 and will be fixed in cloudflare-python 4.4.0.&lt;/p&gt;</description><pubDate>Thu, 14 Aug 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - MessageChannel and MessagePort</title><link>https://developers.cloudflare.com/changelog/post/2025-08-11-messagechannel/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-08-11-messagechannel/</guid><description>&lt;p&gt;A minimal implementation of the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/MessageChannel&quot; target=&quot;_blank&quot;&gt;MessageChannel API&lt;/a&gt; is now available in Workers. This means that you can use &lt;code&gt;MessageChannel&lt;/code&gt; to send messages between different parts of your Worker, but not across different Workers.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;MessageChannel&lt;/code&gt; and &lt;code&gt;MessagePort&lt;/code&gt; APIs will be available by default at the global scope
with any worker using a compatibility date of &lt;code&gt;2025-08-15&lt;/code&gt; or later. It is also available
using the &lt;code&gt;expose_global_message_channel&lt;/code&gt; compatibility flag, or can be explicitly disabled
using the &lt;code&gt;no_expose_global_message_channel&lt;/code&gt; compatibility flag.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;port1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;port2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MessageChannel&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;port2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;onmessage&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;Received message:&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;port2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;postMessage&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;Hello from port2!&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Any value that can be used with the &lt;code&gt;structuredClone(...)&lt;/code&gt; API can be sent over the port.&lt;/p&gt;
&lt;h4&gt;Differences&lt;/h4&gt;
&lt;p&gt;There are a number of key limitations to the &lt;code&gt;MessageChannel&lt;/code&gt; API in Workers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Transfer lists are currently not supported. This means that you will not be able to transfer
ownership of objects like &lt;code&gt;ArrayBuffer&lt;/code&gt; or &lt;code&gt;MessagePort&lt;/code&gt; between ports.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;MessagePort&lt;/code&gt; is not yet serializable. This means that you cannot send a &lt;code&gt;MessagePort&lt;/code&gt; object
through the &lt;code&gt;postMessage&lt;/code&gt; method or via JSRPC calls.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;&apos;messageerror&apos;&lt;/code&gt; event is only partially supported. If the &lt;code&gt;&apos;onmessage&apos;&lt;/code&gt; handler throws an
error, the &lt;code&gt;&apos;messageerror&apos;&lt;/code&gt; event will be triggered, however, it will not be triggered when there
are errors serializing or deserializing the message data. Instead, the error will be thrown when
the &lt;code&gt;postMessage&lt;/code&gt; method is called on the sending port.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;&apos;close&apos;&lt;/code&gt; event will be emitted on both ports when one of the ports is closed, however it
will not be emitted when the Worker is terminated or when one of the ports is garbage collected.&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Mon, 11 Aug 2025 01:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Wrangler and the Cloudflare Vite plugin support `.env` files in local development</title><link>https://developers.cloudflare.com/changelog/post/2025-08-08-dot-env-in-local-dev/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-08-08-dot-env-in-local-dev/</guid><description>&lt;p&gt;Now, you can use &lt;code&gt;.env&lt;/code&gt; files to provide secrets and override environment variables on the &lt;code&gt;env&lt;/code&gt; object during local development with Wrangler and the Cloudflare Vite plugin.&lt;/p&gt;
&lt;p&gt;Previously in local development, if you wanted to provide secrets or environment variables during local development, you had to use &lt;code&gt;.dev.vars&lt;/code&gt; files.
This is still supported, but you can now also use &lt;code&gt;.env&lt;/code&gt; files, which are more familiar to many developers.&lt;/p&gt;
&lt;h4&gt;Using &lt;code&gt;.env&lt;/code&gt; files in local development&lt;/h4&gt;
&lt;p&gt;You can create a &lt;code&gt;.env&lt;/code&gt; file in your project root to define environment variables that will be used when running &lt;code&gt;wrangler dev&lt;/code&gt; or &lt;code&gt;vite dev&lt;/code&gt;. The &lt;code&gt;.env&lt;/code&gt; file should be formatted like a &lt;code&gt;dotenv&lt;/code&gt; file, such as &lt;code&gt;KEY=&quot;VALUE&quot;&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;TITLE&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;My Worker&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;API_TOKEN&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;dev-token&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;When you run &lt;code&gt;wrangler dev&lt;/code&gt; or &lt;code&gt;vite dev&lt;/code&gt;, the environment variables defined in the &lt;code&gt;.env&lt;/code&gt; file will be available in your Worker code via the &lt;code&gt;env&lt;/code&gt; object:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;TITLE&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// &quot;My Worker&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apiToken&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;API_TOKEN&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// &quot;dev-token&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;`https://api.example.com/data?token=&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;apiToken&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`Title: &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; - `&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;()))&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Multiple environments with &lt;code&gt;.env&lt;/code&gt; files&lt;/h4&gt;
&lt;p&gt;If your Worker defines multiple &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/environments/&quot;&gt;environments&lt;/a&gt;, you can set different variables for each environment (ex: production or staging) by creating files named &lt;code&gt;.env.&amp;#x3C;environment-name&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;When you use &lt;code&gt;wrangler &amp;#x3C;command&gt; --env &amp;#x3C;environment-name&gt;&lt;/code&gt; or &lt;code&gt;CLOUDFLARE_ENV=&amp;#x3C;environment-name&gt; vite dev&lt;/code&gt;, the corresponding environment-specific file will also be loaded and merged with the &lt;code&gt;.env&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;For example, if you want to set different environment variables for the &lt;code&gt;staging&lt;/code&gt; environment, you can create a file named &lt;code&gt;.env.staging&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;API_TOKEN&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;staging-token&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;When you run &lt;code&gt;wrangler dev --env staging&lt;/code&gt; or &lt;code&gt;CLOUDFLARE_ENV=staging vite dev&lt;/code&gt;, the environment variables from &lt;code&gt;.env.staging&lt;/code&gt; will be merged onto those from &lt;code&gt;.env&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;TITLE&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// &quot;My Worker&quot; (from `.env`)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apiToken&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;API_TOKEN&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// &quot;staging-token&quot; (from `.env.staging`, overriding the value from `.env`)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;`https://api.example.com/data?token=&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;apiToken&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`Title: &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; - `&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;()))&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Find out more&lt;/h4&gt;
&lt;p&gt;For more information on how to use &lt;code&gt;.env&lt;/code&gt; files with Wrangler and the Cloudflare Vite plugin, see the following documentation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/development-testing/environment-variables&quot;&gt;Environment variables and secrets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler&quot; target=&quot;_blank&quot;&gt;Wrangler Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/vite&quot; target=&quot;_blank&quot;&gt;Cloudflare Vite Plugin Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Fri, 08 Aug 2025 01:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Stream - Introducing observability and metrics for Stream Live Inputs</title><link>https://developers.cloudflare.com/changelog/post/2025-08-08-stream-live-observability/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-08-08-stream-live-observability/</guid><description>&lt;p&gt;New information about broadcast metrics and events is now available in
&lt;a href=&quot;https://developers.cloudflare.com/stream/&quot;&gt;Cloudflare Stream&lt;/a&gt; in the Live Input details of the Dashboard.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/2025-08-05-live-input-metrics.B31Z3RGB_Z3m1Fc.webp&quot; alt=&quot;Live Input details showing metrics&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;You can now easily understand broadcast-side health and performance with new
observability, which can help when troubleshooting common issues, particularly
for new customers who are just getting started, and platform customers who may
have limited visibility into how their end-users configure their encoders.&lt;/p&gt;
&lt;p&gt;To get started, start a live stream (&lt;a href=&quot;https://developers.cloudflare.com/stream/examples/obs-from-scratch/&quot;&gt;just getting started?&lt;/a&gt;), then visit the Live Input details page in Dash.&lt;/p&gt;
&lt;p&gt;See our new live &lt;a href=&quot;https://developers.cloudflare.com/stream/stream-live/troubleshooting/&quot;&gt;Troubleshooting&lt;/a&gt; guide
to learn what these metrics mean and how to use them to address common broadcast
issues.&lt;/p&gt;</description><pubDate>Fri, 08 Aug 2025 00:00:00 GMT</pubDate><product>Stream</product><category>Stream</category></item><item><title>Workers - Directly import `waitUntil` in Workers for easily spawning background tasks</title><link>https://developers.cloudflare.com/changelog/post/2025-08-08-add-waituntil-cloudflare-workers/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-08-08-add-waituntil-cloudflare-workers/</guid><description>&lt;p&gt;You can now import &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/context/#waituntil&quot;&gt;&lt;code&gt;waitUntil&lt;/code&gt;&lt;/a&gt; from &lt;code&gt;cloudflare:workers&lt;/code&gt; to extend your Worker&apos;s execution beyond the request lifecycle from anywhere in your code.&lt;/p&gt;
&lt;p&gt;Previously, &lt;code&gt;waitUntil&lt;/code&gt; could only be accessed through the &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/context/&quot;&gt;execution context&lt;/a&gt; (&lt;code&gt;ctx&lt;/code&gt;) parameter passed to your Worker&apos;s handler functions. This meant that if you needed to schedule background tasks from deeply nested functions or utility modules, you had to pass the &lt;code&gt;ctx&lt;/code&gt; object through multiple function calls to access &lt;code&gt;waitUntil&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Now, you can import &lt;code&gt;waitUntil&lt;/code&gt; directly and use it anywhere in your Worker without needing to pass &lt;code&gt;ctx&lt;/code&gt; as a parameter:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;waitUntil&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;cloudflare:workers&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;trackAnalytics&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;eventData&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;analyticsPromise&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;https://analytics.example.com/track&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;method&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;POST&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;JSON&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;stringify&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;eventData&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Extend execution to ensure analytics tracking completes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;waitUntil&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;analyticsPromise&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;This is particularly useful when you want to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Schedule background tasks from utility functions or modules&lt;/li&gt;
&lt;li&gt;Extend execution for analytics, logging, or cleanup operations&lt;/li&gt;
&lt;li&gt;Avoid passing the execution context through multiple layers of function calls&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;waitUntil&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;cloudflare:workers&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Background task that should complete even after response is sent&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;cleanupTempData&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;KV_NAMESPACE&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Hello, World!&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cleanupTempData&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;kvNamespace&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// This function can now use waitUntil without needing ctx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;deletePromise&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;kvNamespace&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;delete&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;temp-key&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;waitUntil&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;deletePromise&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;aside&gt;&lt;p&gt;Note&lt;/p&gt;&lt;div&gt;&lt;p&gt;The imported &lt;code&gt;waitUntil&lt;/code&gt; function works the same way as &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/context/#waituntil&quot;&gt;&lt;code&gt;ctx.waitUntil()&lt;/code&gt;&lt;/a&gt;. It extends your Worker&apos;s execution to wait for the provided promise to settle, but does not block the response from being sent to the client.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;For more information, see the &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/context/#waituntil&quot;&gt;&lt;code&gt;waitUntil&lt;/code&gt; documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 08 Aug 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Requests made from Cloudflare Workers can now force a revalidation of their cache with the origin</title><link>https://developers.cloudflare.com/changelog/post/2025-08-07-cache-no-cache/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-08-07-cache-no-cache/</guid><description>&lt;p&gt;By setting the value of the &lt;code&gt;cache&lt;/code&gt; property to &lt;code&gt;no-cache&lt;/code&gt;, you can force &lt;a href=&quot;https://developers.cloudflare.com/workers/reference/how-the-cache-works/&quot;&gt;Cloudflare&apos;s
cache&lt;/a&gt; to revalidate its contents with the origin when
making subrequests from &lt;a href=&quot;https://developers.cloudflare.com/workers&quot;&gt;Cloudflare Workers&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;req&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Request&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;https://cloudflare.com&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cache&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;no-cache&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;req&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Promise&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Request&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;https://cloudflare.com&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; cache&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;no-cache&apos;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;satisfies&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ExportedHandler&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Environment&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;When &lt;code&gt;no-cache&lt;/code&gt; is set, the Worker request will first look for a match in Cloudflare&apos;s cache, then:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If there is a match, a conditional request is sent to the origin, regardless of whether or not the match is fresh or stale. If the resource has not changed, the
cached version is returned. If the resource has changed, it will be downloaded from the origin, updated in the cache, and returned.&lt;/li&gt;
&lt;li&gt;If there is no match, Workers will make a standard request to the origin and cache the response.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This increases compatibility with NPM packages and JavaScript frameworks that rely on setting the
&lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/request/#options&quot;&gt;&lt;code&gt;cache&lt;/code&gt;&lt;/a&gt; property, which is a cross-platform standard part
of the &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/request/&quot;&gt;&lt;code&gt;Request&lt;/code&gt;&lt;/a&gt; interface. Previously, if you set the &lt;code&gt;cache&lt;/code&gt;
property on &lt;code&gt;Request&lt;/code&gt; to &lt;code&gt;&apos;no-cache&apos;&lt;/code&gt;, the Workers runtime threw an exception.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Learn &lt;a href=&quot;https://developers.cloudflare.com/workers/reference/how-the-cache-works/&quot;&gt;how the Cache works with Cloudflare Workers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Enable &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/nodejs/&quot;&gt;Node.js compatibility&lt;/a&gt; for your Cloudflare Worker&lt;/li&gt;
&lt;li&gt;Explore &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/&quot;&gt;Runtime APIs&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/bindings/&quot;&gt;Bindings&lt;/a&gt; available in Cloudflare Workers&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Thu, 07 Aug 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Agents, Workers - Agents SDK adds MCP Elicitation support, http-streamable suppport, task queues, email integration and more</title><link>https://developers.cloudflare.com/changelog/post/2025-08-05-agents-mcp-update/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-08-05-agents-mcp-update/</guid><description>&lt;p&gt;The latest releases of &lt;a href=&quot;https://github.com/cloudflare/agents&quot; target=&quot;_blank&quot;&gt;@cloudflare/agents&lt;/a&gt; brings major improvements to MCP transport protocols support and agents connectivity. Key updates include:&lt;/p&gt;
&lt;h4&gt;MCP elicitation support&lt;/h4&gt;
&lt;p&gt;MCP servers can now request user input during tool execution, enabling interactive workflows like confirmations, forms, and multi-step processes. This feature uses durable storage to preserve elicitation state even during agent hibernation, ensuring seamless user interactions across agent lifecycle events.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Request user confirmation via elicitation&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;confirmation&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;elicitInput&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;`Are you sure you want to increment the counter by &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;amount&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;?`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;requestedSchema&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;object&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;properties&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;confirmed&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;boolean&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Confirm increment&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Check to confirm the increment&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;required&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;confirmed&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Check out our &lt;a href=&quot;https://github.com/whoiskatrin/agents/tree/main/examples/mcp-elicitation-demo&quot; target=&quot;_blank&quot;&gt;demo&lt;/a&gt; to see elicitation in action.&lt;/p&gt;
&lt;h4&gt;HTTP streamable transport for MCP&lt;/h4&gt;
&lt;p&gt;MCP now supports HTTP streamable transport which is recommended over SSE. This transport type offers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Better performance&lt;/strong&gt;: More efficient data streaming and reduced overhead&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Improved reliability&lt;/strong&gt;: Enhanced connection stability and error recover- &lt;strong&gt;Automatic fallback&lt;/strong&gt;: If streamable transport is not available, it gracefully falls back to SSE&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyMCP&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;serve&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;/mcp&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;binding&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;MyMCP&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The SDK automatically selects the best available transport method, gracefully falling back from streamable-http to SSE when needed.&lt;/p&gt;
&lt;h4&gt;Enhanced MCP connectivity&lt;/h4&gt;
&lt;p&gt;Significant improvements to MCP server connections and transport reliability:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Auto transport selection&lt;/strong&gt;: Automatically determines the best transport method, falling back from streamable-http to SSE as needed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Improved error handling&lt;/strong&gt;: Better connection state management and error reporting for MCP servers&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reliable prop updates&lt;/strong&gt;: Centralized agent property updates ensure consistency across different contexts&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Lightweight .queue for fast task deferral&lt;/h4&gt;
&lt;p&gt;You can use &lt;code&gt;.queue()&lt;/code&gt; to enqueue background work — ideal for tasks like processing user messages, sending notifications etc.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyAgent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Agent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;doSomethingExpensive&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;payload&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// a long running process that you want to run in the background&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;queueSomething&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;queue&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;doSomethingExpensive&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;somePayload&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// this will NOT block further execution, and runs in the background&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;queue&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;doSomethingExpensive&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;someOtherPayload&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// the callback will NOT run until the previous callback is complete&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// ... call as many times as you want&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Want to try it yourself? Just define a method like processMessage in your agent, and you’re ready to scale.&lt;/p&gt;
&lt;h4&gt;New email adapter&lt;/h4&gt;
&lt;p&gt;Want to build an AI agent that can receive and respond to emails automatically? With the new email adapter and onEmail lifecycle method, now you can.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;EmailAgent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Agent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;onEmail&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;email&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AgentEmail&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;raw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;email&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getRaw&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;parsed&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;PostalMime&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;parse&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;raw&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// create a response based on the email contents&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// and then send a reply&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;replyToEmail&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;email&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fromName&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Email Agent&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;`Thanks for your email! You&apos;ve sent us &quot;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;parsed&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;subject&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;. We&apos;ll process it shortly.`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;You route incoming mail like this:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;email&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;email&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;routeAgentEmail&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;email&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;resolver&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;createAddressBasedEmailResolver&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;EmailAgent&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;You can find a full example &lt;a href=&quot;https://github.com/cloudflare/agents/tree/main/examples/email-agent&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Automatic context wrapping for custom methods&lt;/h4&gt;
&lt;p&gt;Custom methods are now automatically wrapped with the agent&apos;s context, so calling &lt;code&gt;getCurrentAgent()&lt;/code&gt; should work regardless of where in an agent&apos;s lifecycle it&apos;s called. Previously this would not work on RPC calls, but now just works out of the box.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyAgent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Agent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;suggestReply&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// getCurrentAgent() now correctly works, even when called inside an RPC method&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;agent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getCurrentAgent&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;generateText&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;prompt&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;`Suggest a reply to: &quot;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot; from &quot;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;agent&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tools&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;replyWithEmoji&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Try it out and tell us what you build!&lt;/p&gt;</description><pubDate>Tue, 05 Aug 2025 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>Agents, Workers - Cloudflare Sandbox SDK adds streaming, code interpreter, Git support, process control and more</title><link>https://developers.cloudflare.com/changelog/post/2025-08-05-sandbox-sdk-major-update/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-08-05-sandbox-sdk-major-update/</guid><description>&lt;p&gt;We’ve shipped a major release for the &lt;a href=&quot;https://github.com/cloudflare/sandbox-sdk&quot; target=&quot;_blank&quot;&gt;@cloudflare/sandbox&lt;/a&gt; SDK, turning it into a full-featured, container-based execution platform that runs securely on Cloudflare Workers.&lt;/p&gt;
&lt;p&gt;This update adds live streaming of output, persistent Python and JavaScript code interpreters with rich output support (charts, tables, HTML, JSON), file system access, Git operations, full background process control, and the ability to expose running services via public URLs.&lt;/p&gt;
&lt;p&gt;This makes it ideal for building AI agents, CI runners, cloud REPLs, data analysis pipelines, or full developer tools — all without managing infrastructure.&lt;/p&gt;
&lt;h4&gt;Code interpreter (Python, JS, TS)&lt;/h4&gt;
&lt;p&gt;Create persistent code contexts with support for rich visual + structured outputs.&lt;/p&gt;
&lt;h4&gt;createCodeContext(options)&lt;/h4&gt;
&lt;p&gt;Creates a new code execution context with persistent state.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Create a Python context&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pythonCtx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandbox&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;createCodeContext&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; language&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;python&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Create a JavaScript context&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;jsCtx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandbox&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;createCodeContext&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; language&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;javascript&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;language: Programming language (&apos;python&apos; | &apos;javascript&apos; | &apos;typescript&apos;)&lt;/li&gt;
&lt;li&gt;cwd: Working directory (default: /workspace)&lt;/li&gt;
&lt;li&gt;envVars: Environment variables for the context&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;runCode(code, options)&lt;/h4&gt;
&lt;p&gt;Executes code with optional streaming callbacks.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Simple execution&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;execution&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandbox&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;runCode&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;print(&quot;Hello World&quot;)&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;context&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pythonCtx&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// With streaming callbacks&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandbox&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;runCode&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;for i in range(5):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;print(f&quot;Step {i}&quot;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;time.sleep(1)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;context&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pythonCtx&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;onStdout&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Real-time:&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;onResult&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Result:&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;language: Programming language (&apos;python&apos; | &apos;javascript&apos; | &apos;typescript&apos;)&lt;/li&gt;
&lt;li&gt;cwd: Working directory (default: /workspace)&lt;/li&gt;
&lt;li&gt;envVars: Environment variables for the context&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Real-time streaming output&lt;/h4&gt;
&lt;p&gt;Returns a streaming response for real-time processing.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stream&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandbox&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;runCodeStream&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;import time; [print(i) for i in range(10)]&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Process the stream as needed&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Rich output handling&lt;/h4&gt;
&lt;p&gt;Interpreter outputs are auto-formatted and returned in multiple formats:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;text&lt;/li&gt;
&lt;li&gt;html (e.g., Pandas tables)&lt;/li&gt;
&lt;li&gt;png, svg (e.g., Matplotlib charts)&lt;/li&gt;
&lt;li&gt;json (structured data)&lt;/li&gt;
&lt;li&gt;chart (parsed visualizations)&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandbox&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;runCode&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import seaborn as sns&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import matplotlib.pyplot as plt&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;data = sns.load_dataset(&quot;flights&quot;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;pivot = data.pivot(&quot;month&quot;, &quot;year&quot;, &quot;passengers&quot;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sns.heatmap(pivot, annot=True, fmt=&quot;d&quot;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;plt.title(&quot;Flight Passengers&quot;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;plt.show()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;pivot.to_dict()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; context&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pythonCtx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;png&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Chart output:&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;png&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Preview URLs from Exposed Ports&lt;/h4&gt;
&lt;p&gt;Start background processes and expose them with live URLs.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandbox&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;startProcess&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;python -m http.server 8000&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;preview&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandbox&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;exposePort&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;8000&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Live preview at:&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;preview&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Full process lifecycle control&lt;/h4&gt;
&lt;p&gt;Start, inspect, and terminate long-running background processes.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;process&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandbox&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;startProcess&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;node server.js&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`Started process &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;process&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; with PID &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;process&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pid&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Monitor the process&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;logStream&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandbox&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;streamProcessLogs&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;process&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;of&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;parseSSEStream&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;LogEvent&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;logStream&lt;/span&gt;&lt;span&gt;)) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`Server: &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;listProcesses() - List all running processes&lt;/li&gt;
&lt;li&gt;getProcess(id) - Get detailed process status&lt;/li&gt;
&lt;li&gt;killProcess(id, signal) - Terminate specific processes&lt;/li&gt;
&lt;li&gt;killAllProcesses() - Kill all processes&lt;/li&gt;
&lt;li&gt;streamProcessLogs(id, options) - Stream logs from running processes&lt;/li&gt;
&lt;li&gt;getProcessLogs(id) - Get accumulated process output&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Git integration&lt;/h4&gt;
&lt;p&gt;Clone Git repositories directly into the sandbox.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandbox&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gitCheckout&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;https://github.com/user/repo&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;branch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;main&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;targetDir&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-project&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Sandboxes are still experimental. We&apos;re using them to explore how isolated, container-like workloads might scale on Cloudflare — and to help define the developer experience around them.&lt;/p&gt;</description><pubDate>Tue, 05 Aug 2025 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>Agents, Workers AI - OpenAI open models now available on Workers AI</title><link>https://developers.cloudflare.com/changelog/post/2025-08-05-openai-open-models/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-08-05-openai-open-models/</guid><description>&lt;p&gt;We&apos;re thrilled to be a Day 0 partner with &lt;a href=&quot;http://openai.com/index/introducing-gpt-oss&quot; target=&quot;_blank&quot;&gt;OpenAI&lt;/a&gt; to bring their &lt;a href=&quot;https://openai.com/index/gpt-oss-model-card/&quot; target=&quot;_blank&quot;&gt;latest open models&lt;/a&gt; to Workers AI, including support for Responses API, Code Interpreter, and Web Search (coming soon).&lt;/p&gt;
&lt;p&gt;Get started with the new models at &lt;code&gt;@cf/openai/gpt-oss-120b&lt;/code&gt; and &lt;code&gt;@cf/openai/gpt-oss-20b&lt;/code&gt;.
Check out the &lt;a href=&quot;https://blog.cloudflare.com/openai-gpt-oss-on-workers-ai&quot; target=&quot;_blank&quot;&gt;blog&lt;/a&gt; for more details about the new models, and the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/gpt-oss-120b&quot;&gt;&lt;code&gt;gpt-oss-120b&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/gpt-oss-20b&quot;&gt;&lt;code&gt;gpt-oss-20b&lt;/code&gt;&lt;/a&gt; model pages for more information about pricing and context windows.&lt;/p&gt;
&lt;h4&gt;Responses API&lt;/h4&gt;
&lt;p&gt;If you call the model through:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Workers Binding, it will accept/return Responses API – &lt;code&gt;env.AI.run(“@cf/openai/gpt-oss-120b”)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;REST API on &lt;code&gt;/run&lt;/code&gt; endpoint, it will accept/return Responses API – &lt;code&gt;https://api.cloudflare.com/client/v4/accounts/&amp;#x3C;account_id&gt;/ai/run/@cf/openai/gpt-oss-120b&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;REST API on new &lt;code&gt;/responses&lt;/code&gt; endpoint, it will accept/return Responses API – &lt;code&gt;https://api.cloudflare.com/client/v4/accounts/&amp;#x3C;account_id&gt;/ai/v1/responses&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;REST API for OpenAI Compatible endpoint, it will return Chat Completions (coming soon) – &lt;code&gt;https://api.cloudflare.com/client/v4/accounts/&amp;#x3C;account_id&gt;/ai/v1/chat/completions&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;plaintext&quot;&gt;&lt;code class=&quot;language-plaintext&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl https://api.cloudflare.com/client/v4/accounts/&amp;#x3C;account_id&gt;/ai/v1/responses \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-H &quot;Content-Type: application/json&quot; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-H &quot;Authorization: Bearer $CLOUDFLARE_API_KEY&quot; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-d &apos;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;model&quot;: &quot;@cf/openai/gpt-oss-120b&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;reasoning&quot;: {&quot;effort&quot;: &quot;medium&quot;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;input&quot;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;role&quot;: &quot;user&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;content&quot;: &quot;What are the benefits of open-source models?&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Code Interpreter&lt;/h4&gt;
&lt;p&gt;The model is natively trained to support stateful code execution, and we&apos;ve implemented support for this feature using our &lt;a href=&quot;https://github.com/cloudflare/sandbox-sdk&quot; target=&quot;_blank&quot;&gt;Sandbox SDK&lt;/a&gt; and &lt;a href=&quot;https://blog.cloudflare.com/containers-are-available-in-public-beta-for-simple-global-and-programmable/&quot; target=&quot;_blank&quot;&gt;Containers&lt;/a&gt;. Cloudflare&apos;s Developer Platform is uniquely positioned to support this feature, so we&apos;re very excited to bring our products together to support this new use case.&lt;/p&gt;
&lt;h4&gt;Web Search (coming soon)&lt;/h4&gt;
&lt;p&gt;We are working to implement Web Search for the model, where users can bring their own Exa API Key so the model can browse the Internet.&lt;/p&gt;</description><pubDate>Tue, 05 Aug 2025 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers AI</category></item><item><title>Workers - Increased disk space for Workers Builds</title><link>https://developers.cloudflare.com/changelog/post/2025-08-04-builds-increased-disk-size/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-08-04-builds-increased-disk-size/</guid><description>&lt;p&gt;As part of the ongoing open beta for &lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/&quot;&gt;Workers Builds&lt;/a&gt;, we’ve increased the available disk space for builds from &lt;strong&gt;8 GB&lt;/strong&gt; to &lt;strong&gt;20 GB&lt;/strong&gt; for both Free and Paid plans.&lt;/p&gt;
&lt;p&gt;This provides more space for larger projects, dependencies, and build artifacts while improving overall build reliability.&lt;/p&gt;















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Metric&lt;/th&gt;&lt;th&gt;Free Plan&lt;/th&gt;&lt;th&gt;Paid Plans&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Disk Space&lt;/td&gt;&lt;td&gt;20 GB&lt;/td&gt;&lt;td&gt;20 GB&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;All other &lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/limits-and-pricing/&quot;&gt;build limits&lt;/a&gt; — including CPU, memory, build minutes, and timeout remain unchanged.&lt;/p&gt;</description><pubDate>Mon, 04 Aug 2025 01:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Develop locally with Containers and the Cloudflare Vite plugin</title><link>https://developers.cloudflare.com/changelog/post/2025-08-01-containers-in-vite-dev/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-08-01-containers-in-vite-dev/</guid><description>&lt;p&gt;You can now configure and run &lt;a href=&quot;https://developers.cloudflare.com/containers&quot;&gt;Containers&lt;/a&gt; alongside your &lt;a href=&quot;https://developers.cloudflare.com/workers&quot;&gt;Worker&lt;/a&gt; during local development when using the &lt;a href=&quot;https://developers.cloudflare.com/workers/vite-plugin/&quot;&gt;Cloudflare Vite plugin&lt;/a&gt;. Previously, you could only develop locally when using &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/&quot;&gt;Wrangler&lt;/a&gt; as your local development server.&lt;/p&gt;
&lt;h4&gt;Configuration&lt;/h4&gt;
&lt;p&gt;You can simply configure your Worker and your Container(s) in your Wrangler configuration file:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;wrangler.jsonc&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;jsonc&quot;&gt;&lt;code class=&quot;language-jsonc&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;container-starter&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;src/index.js&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;containers&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;class_name&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;MyContainer&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./Dockerfile&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;instances&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;durable_objects&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;bindings&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;class_name&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;MyContainer&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;MY_CONTAINER&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;migrations&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;new_sqlite_classes&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;MyContainer&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;tag&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;v1&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;wrangler.toml&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;toml&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;container-starter&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;src/index.js&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[[&lt;/span&gt;&lt;span&gt;containers&lt;/span&gt;&lt;span&gt;]]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;class_name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;MyContainer&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./Dockerfile&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;instances&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[[&lt;/span&gt;&lt;span&gt;durable_objects&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;bindings&lt;/span&gt;&lt;span&gt;]]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;class_name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;MyContainer&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;MY_CONTAINER&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[[&lt;/span&gt;&lt;span&gt;migrations&lt;/span&gt;&lt;span&gt;]]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;new_sqlite_classes&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;MyContainer&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;tag&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;v1&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;h4&gt;Worker Code&lt;/h4&gt;
&lt;p&gt;Once your Worker and Containers are configured, you can access the Container instances from your Worker code:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Container&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getContainer&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@cloudflare/containers&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyContainer&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Container&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;defaultPort &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;4000&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// Port the container is listening on&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;sleepAfter &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;10m&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// Stop the instance if requests not sent for 10 minutes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;session-id&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sessionId&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Get the container instance for the given session ID&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;containerInstance&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getContainer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;MY_CONTAINER&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sessionId&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Pass the request to the container instance on its default port&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;containerInstance&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Local development&lt;/h4&gt;
&lt;p&gt;To develop your Worker locally, start a local dev server by running&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;vite&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dev&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;in your terminal.&lt;/p&gt;
&lt;h4&gt;Resources&lt;/h4&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://developers.cloudflare.com/containers/&quot; target=&quot;_blank&quot;&gt;Cloudflare Containers&lt;/a&gt; or the &lt;a href=&quot;https://developers.cloudflare.com/workers/vite-plugin/&quot; target=&quot;_blank&quot;&gt;Cloudflare Vite plugin&lt;/a&gt; in our developer docs.&lt;/p&gt;</description><pubDate>Fri, 01 Aug 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers, Secrets Store - Deploy to Cloudflare buttons now support Worker environment variables, secrets, and Secrets Store secrets</title><link>https://developers.cloudflare.com/changelog/post/2025-07-01-workers-deploy-button-supports-environment-variables-and-secrets/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-07-01-workers-deploy-button-supports-environment-variables-and-secrets/</guid><description>&lt;p&gt;Any template which uses &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/environment-variables/&quot;&gt;Worker environment variables&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/secrets/&quot;&gt;secrets&lt;/a&gt;, or &lt;a href=&quot;https://developers.cloudflare.com/secrets-store/&quot;&gt;Secrets Store secrets&lt;/a&gt; can now be deployed using a &lt;a href=&quot;https://developers.cloudflare.com/workers/platform/deploy-buttons/&quot;&gt;Deploy to Cloudflare button&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Define environment variables and secrets store bindings in your Wrangler configuration file as normal:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;wrangler.jsonc&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;jsonc&quot;&gt;&lt;code class=&quot;language-jsonc&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-worker&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./src/index.ts&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Set this to today&apos;s date&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;compatibility_date&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;2026-04-03&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;vars&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;API_HOST&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;https://example.com&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;secrets_store_secrets&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;binding&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;API_KEY&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;store_id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;demo&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;secret_name&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;api-key&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;wrangler.toml&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;toml&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-worker&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./src/index.ts&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Set this to today&apos;s date&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;compatibility_date&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;2026-04-03&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;vars&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;API_HOST&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;https://example.com&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[[&lt;/span&gt;&lt;span&gt;secrets_store_secrets&lt;/span&gt;&lt;span&gt;]]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;binding&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;API_KEY&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;store_id&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;demo&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;secret_name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;api-key&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;Add secrets to a &lt;code&gt;.dev.vars.example&lt;/code&gt; or &lt;code&gt;.env.example&lt;/code&gt; file:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ini&quot;&gt;&lt;code class=&quot;language-ini&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;COOKIE_SIGNING_KEY&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;my-secret &lt;/span&gt;&lt;span&gt;# comment&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;And optionally, you can add a description for these bindings in your template&apos;s &lt;code&gt;package.json&lt;/code&gt; to help users understand how to configure each value:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-worker&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;cloudflare&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;bindings&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;API_KEY&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Select your company&apos;s API key for connecting to the example service.&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;COOKIE_SIGNING_KEY&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Generate a random string using `openssl rand -hex 32`.&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;These secrets and environment variables will be presented to users in the dashboard as they deploy this template, allowing them to configure each value. Additional information about creating templates and Deploy to Cloudflare buttons can be found in &lt;a href=&quot;https://developers.cloudflare.com/workers/platform/deploy-buttons/&quot;&gt;our documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 29 Jul 2025 01:00:00 GMT</pubDate><product>Workers</product><category>Workers</category><category>Secrets Store</category></item><item><title>Browser Rendering - Introducing pricing for the Browser Rendering API — $0.09 per browser hour</title><link>https://developers.cloudflare.com/changelog/post/2025-07-28-br-pricing/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-07-28-br-pricing/</guid><description>&lt;p&gt;We’ve launched pricing for &lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/&quot;&gt;Browser Rendering&lt;/a&gt;, including a free tier and a pay-as-you-go model that scales with your needs. Starting &lt;strong&gt;August 20, 2025&lt;/strong&gt;, Cloudflare will begin billing for Browser Rendering.&lt;/p&gt;
&lt;p&gt;There are two ways to use Browser Rendering. Depending on the method you use, here’s how billing will work:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/rest-api/&quot;&gt;&lt;strong&gt;REST API&lt;/strong&gt;&lt;/a&gt;: Charged for &lt;strong&gt;Duration&lt;/strong&gt; only ($/browser hour)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/workers-bindings/&quot;&gt;&lt;strong&gt;Workers Bindings&lt;/strong&gt;&lt;/a&gt;: Charged for both &lt;strong&gt;Duration&lt;/strong&gt; and &lt;strong&gt;Concurrency&lt;/strong&gt; ($/browser hour and # of concurrent browsers)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Included usage and pricing by plan&lt;/p&gt;























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Plan&lt;/th&gt;&lt;th&gt;Included duration&lt;/th&gt;&lt;th&gt;Included concurrency&lt;/th&gt;&lt;th&gt;Price (beyond included)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Workers Free&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;10 minutes per day&lt;/td&gt;&lt;td&gt;3 concurrent browsers&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Workers Paid&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;10 hours per month&lt;/td&gt;&lt;td&gt;10 concurrent browsers (averaged monthly)&lt;/td&gt;&lt;td&gt;&lt;strong&gt;1. REST API&lt;/strong&gt;: $0.09 per additional browser hour &lt;br&gt;&lt;strong&gt;2. Workers Bindings&lt;/strong&gt;: $0.09 per additional browser hour &lt;br&gt; $2.00 per additional concurrent browser&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;What you need to know:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Workers Free Plan:&lt;/strong&gt; 10 minutes of browser usage per day with 3 concurrent browsers at no charge.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Workers Paid Plan:&lt;/strong&gt; 10 hours of browser usage per month with 10 concurrent browsers (averaged monthly) at no charge. Additional usage is charged as shown above.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can monitor usage via the &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers/browser-rendering&quot; target=&quot;_blank&quot;&gt;Cloudflare dashboard&lt;/a&gt;. Go to &lt;strong&gt;Compute (Workers)&lt;/strong&gt; &gt; &lt;strong&gt;Browser Rendering&lt;/strong&gt;.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/dashboard.BQnX87lT_39GAT.webp&quot; alt=&quot;Browser Rendering dashboard&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;If you&apos;ve been using Browser Rendering and do not wish to incur charges, ensure your usage stays within your plan&apos;s &lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/pricing/&quot;&gt;included usage&lt;/a&gt;. To estimate costs, take a look at these &lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/pricing/#examples-of-workers-paid-pricing&quot;&gt;example pricing scenarios&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 28 Jul 2025 12:00:00 GMT</pubDate><product>Browser Rendering</product><category>Browser Rendering</category></item><item><title>Browser Rendering - Browser Rendering now supports local development</title><link>https://developers.cloudflare.com/changelog/post/2025-07-22-br-local-dev/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-07-22-br-local-dev/</guid><description>&lt;p&gt;You can now run your Browser Rendering locally using &lt;code&gt;npx wrangler dev&lt;/code&gt;, which spins up a browser directly on your machine before deploying to Cloudflare&apos;s global network. By running tests locally, you can quickly develop, debug, and test changes without needing to deploy or worry about usage costs.&lt;/p&gt;
&lt;p&gt;Get started with this &lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/workers-bindings/screenshots/&quot;&gt;example guide&lt;/a&gt; that shows how to use Cloudflare&apos;s &lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/puppeteer/&quot;&gt;fork of Puppeteer&lt;/a&gt; (you can also use &lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/playwright/&quot;&gt;Playwright&lt;/a&gt;) to take screenshots of webpages and store the results in &lt;a href=&quot;https://developers.cloudflare.com/kv/&quot;&gt;Workers KV&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 22 Jul 2025 11:00:00 GMT</pubDate><product>Browser Rendering</product><category>Browser Rendering</category></item><item><title>Workers - Test out code changes before shipping with per-branch preview deployments for Cloudflare Workers</title><link>https://developers.cloudflare.com/changelog/post/2025-07-23-workers-preview-urls/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-07-23-workers-preview-urls/</guid><description>&lt;p&gt;Now, when you connect your Cloudflare Worker to a git repository on GitHub or GitLab, each branch of your repository has its own stable preview URL, that you can use to preview code changes before merging the pull request and deploying to production.&lt;/p&gt;
&lt;p&gt;This works the same way that Cloudflare Pages does — every time you create a pull request, you&apos;ll automatically get a shareable preview link where you can see your changes running, without affecting production. The link stays the same, even as you add commits to the same branch.
These preview URLs are named after your branch and are posted as a comment to each pull request. The URL stays the same with every commit and always points to the latest version of that branch.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/preview-urls-comment.0wQffFIq_2uQPCz.webp&quot; alt=&quot;PR comment preview&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;h4&gt;Preview URL types&lt;/h4&gt;
&lt;p&gt;Each comment includes &lt;strong&gt;two preview URLs&lt;/strong&gt; as shown above:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Commit Preview URL&lt;/strong&gt;: Unique to the specific version/commit (e.g., &lt;code&gt;&amp;#x3C;version-prefix&gt;-&amp;#x3C;worker-name&gt;.&amp;#x3C;subdomain&gt;.workers.dev&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Branch Preview URL&lt;/strong&gt;: A stable alias based on the branch name (e.g., &lt;code&gt;&amp;#x3C;branch-name&gt;-&amp;#x3C;worker-name&gt;.&amp;#x3C;subdomain&gt;.workers.dev&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;How it works&lt;/h4&gt;
&lt;p&gt;When you create a pull request:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A preview alias is automatically created&lt;/strong&gt; based on the Git branch name (e.g., &lt;code&gt;&amp;#x3C;branch-name&gt;&lt;/code&gt; becomes &lt;code&gt;&amp;#x3C;branch-name&gt;-&amp;#x3C;worker-name&gt;.&amp;#x3C;subdomain&gt;.workers.dev&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No configuration is needed&lt;/strong&gt;, the alias is generated for you&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The link stays the same&lt;/strong&gt; even as you add commits to the same branch&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Preview URLs are posted directly to your pull request as comments&lt;/strong&gt; (just like they are in Cloudflare Pages)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Custom alias name&lt;/h4&gt;
&lt;p&gt;You can also assign a custom preview alias using the &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/&quot;&gt;Wrangler CLI&lt;/a&gt;, by passing the &lt;code&gt;--preview-alias&lt;/code&gt; flag when &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/general/#versions-upload&quot;&gt;uploading a version&lt;/a&gt; of your Worker:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;versions&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;upload&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--preview-alias&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;staging&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Limitations while in beta&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Only available on the &lt;strong&gt;workers.dev&lt;/strong&gt; subdomain (custom domains not yet supported)&lt;/li&gt;
&lt;li&gt;Requires &lt;strong&gt;Wrangler v4.21.0+&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Preview URLs are not generated for Workers that use &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/&quot;&gt;Durable Objects&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Not yet supported for &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-for-platforms/workers-for-platforms/&quot;&gt;Workers for Platforms&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Tue, 22 Jul 2025 01:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Stream - Audio mode for Media Transformations</title><link>https://developers.cloudflare.com/changelog/post/2025-07-22-media-transformations-audio-mode/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-07-22-media-transformations-audio-mode/</guid><description>&lt;p&gt;We now support &lt;code&gt;audio&lt;/code&gt; mode! Use this feature to extract audio from a source video, outputting
an M4A file to use in downstream workflows like &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/&quot;&gt;AI inference&lt;/a&gt;, content moderation, or transcription.&lt;/p&gt;
&lt;p&gt;For example,&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;https://example.com/cdn-cgi/media/&amp;#x3C;OPTIONS&gt;/&amp;#x3C;SOURCE-VIDEO&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;https://example.com/cdn-cgi/media/mode=audio,time=3s,duration=60s/&amp;#x3C;input video with diction&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For more information, learn about &lt;a href=&quot;https://developers.cloudflare.com/stream/transform-videos/&quot;&gt;Transforming Videos&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 22 Jul 2025 00:00:00 GMT</pubDate><product>Stream</product><category>Stream</category></item><item><title>Email Routing - Subaddressing support in Email Routing</title><link>https://developers.cloudflare.com/changelog/post/2025-07-21-subaddressing/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-07-21-subaddressing/</guid><description>&lt;p&gt;Subaddressing, as defined in &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc5233&quot; target=&quot;_blank&quot;&gt;RFC 5233&lt;/a&gt;, also known as plus addressing, is now supported in Email Routing. This enables using the &quot;+&quot; separator to augment your custom addresses with arbitrary detail information.&lt;/p&gt;
&lt;p&gt;Now you can send an email to &lt;code&gt;user+detail@example.com&lt;/code&gt; and it will be captured by the &lt;code&gt;user@example.com&lt;/code&gt; custom address. The &lt;code&gt;+detail&lt;/code&gt; part is ignored by Email Routing, but it can be captured next in the processing chain in the logs, an &lt;a href=&quot;https://developers.cloudflare.com/email-routing/email-workers/&quot;&gt;Email Worker&lt;/a&gt; or an &lt;a href=&quot;https://github.com/cloudflare/agents/tree/main/examples/email-agent&quot; target=&quot;_blank&quot;&gt;Agent application&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Customers can use this feature to dynamically add context to their emails, such as tracking the source of an email or categorizing emails without needing to create multiple custom addresses.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/subaddressing.x65bljxx_Z2W6LN.webp&quot; alt=&quot;Subaddressing&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;Check our &lt;a href=&quot;https://developers.cloudflare.com/email-routing/setup/email-routing-addresses/#subaddressing&quot;&gt;Developer Docs&lt;/a&gt; to learn on to enable subaddressing in Email Routing.&lt;/p&gt;</description><pubDate>Mon, 21 Jul 2025 00:00:00 GMT</pubDate><product>Email Routing</product><category>Email Routing</category></item><item><title>Workers - The Cloudflare Vite plugin now supports Vite 7</title><link>https://developers.cloudflare.com/changelog/post/2025-07-17-vite-plugin-vite-7-support/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-07-17-vite-plugin-vite-7-support/</guid><description>&lt;p&gt;&lt;a href=&quot;https://vite.dev/blog/announcing-vite7&quot; target=&quot;_blank&quot;&gt;Vite 7&lt;/a&gt; is now supported in the Cloudflare Vite plugin.
See the &lt;a href=&quot;https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md#700-2025-06-24&quot; target=&quot;_blank&quot;&gt;Vite changelog&lt;/a&gt; for a list of changes.&lt;/p&gt;
&lt;p&gt;Note that the minimum Node.js versions supported by Vite 7 are 20.19 and 22.12.
We continue to support Vite 6 so you do not need to immediately upgrade.&lt;/p&gt;</description><pubDate>Thu, 17 Jul 2025 01:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>AI Search - Faster indexing and new Jobs view in AutoRAG</title><link>https://developers.cloudflare.com/changelog/post/2025-07-08-autorag-jobs-view/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-07-08-autorag-jobs-view/</guid><description>&lt;p&gt;You can now expect &lt;strong&gt;3-5× faster indexing&lt;/strong&gt; in AutoRAG, and with it, a brand new &lt;strong&gt;Jobs view&lt;/strong&gt; to help you monitor indexing progress.&lt;/p&gt;
&lt;p&gt;With each AutoRAG, indexing jobs are automatically triggered to sync your data source (i.e. R2 bucket) with your Vectorize index, ensuring new or updated files are reflected in your query results. You can also trigger jobs manually via the &lt;a href=&quot;https://developers.cloudflare.com/api/resources/ai-search/subresources/rags/&quot;&gt;Sync API&lt;/a&gt; or by clicking “Sync index” in the dashboard.&lt;/p&gt;
&lt;p&gt;With the new jobs observability, you can now:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;View the status, job ID, source, start time, duration and last sync time for each indexing job&lt;/li&gt;
&lt;li&gt;Inspect real-time logs of job events (e.g. &lt;code&gt;Starting indexing data source...&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;See a history of past indexing jobs under the Jobs tab of your AutoRAG&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This makes it easier to understand what’s happening behind the scenes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Coming soon:&lt;/strong&gt; We’re adding APIs to programmatically check indexing status, making it even easier to integrate AutoRAG into your workflows.&lt;/p&gt;
&lt;p&gt;Try it out today on the &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/ai/autorag&quot; target=&quot;_blank&quot;&gt;Cloudflare dashboard&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 08 Jul 2025 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>Cloudflare Images - HEIC support in Cloudflare Images</title><link>https://developers.cloudflare.com/changelog/post/heic-support/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/heic-support/</guid><description>&lt;p&gt;You can use Images to ingest HEIC images and serve them in supported output formats like AVIF, WebP, JPEG, and PNG.&lt;/p&gt;
&lt;p&gt;When inputting a HEIC image, dimension and sizing limits may still apply. Refer to our documentation to see limits for &lt;a href=&quot;https://developers.cloudflare.com/images/upload-images/&quot;&gt;uploading to Images&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/images/transform-images/&quot;&gt;transforming a remote image&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 08 Jul 2025 00:00:00 GMT</pubDate><product>Cloudflare Images</product><category>Cloudflare Images</category></item><item><title>Workers - Workers now supports JavaScript debug terminals in VSCode, Cursor and Windsurf IDEs</title><link>https://developers.cloudflare.com/changelog/post/2025-07-04-javascript-debug-terminals/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-07-04-javascript-debug-terminals/</guid><description>&lt;p&gt;Workers now support breakpoint debugging using VSCode&apos;s built-in &lt;a href=&quot;https://code.visualstudio.com/docs/nodejs/nodejs-debugging#_javascript-debug-terminal&quot; target=&quot;_blank&quot;&gt;JavaScript Debug Terminals&lt;/a&gt;. All you have to do is open a JS debug terminal (&lt;code&gt;Cmd + Shift + P&lt;/code&gt; and then type &lt;code&gt;javascript debug&lt;/code&gt;) and run &lt;code&gt;wrangler dev&lt;/code&gt; (or &lt;code&gt;vite dev&lt;/code&gt;) from within the debug terminal. VSCode will automatically connect to your running Worker (even if you&apos;re running multiple Workers at once!) and start a debugging session.&lt;/p&gt;
&lt;p&gt;In 2023 we announced &lt;a href=&quot;https://blog.cloudflare.com/debugging-cloudflare-workers/&quot; target=&quot;_blank&quot;&gt;breakpoint debugging support&lt;/a&gt; for Workers, which meant that you could easily debug your Worker code in Wrangler&apos;s built-in devtools (accessible via the &lt;code&gt;[d]&lt;/code&gt; hotkey) as well as multiple other devtools clients, &lt;a href=&quot;https://developers.cloudflare.com/workers/observability/dev-tools/breakpoints/&quot; target=&quot;_blank&quot;&gt;including VSCode&lt;/a&gt;. For most developers, breakpoint debugging via VSCode is the most natural flow, but until now it&apos;s required &lt;a href=&quot;https://developers.cloudflare.com/workers/observability/dev-tools/breakpoints/#setup-vs-code-to-use-breakpoints&quot; target=&quot;_blank&quot;&gt;manually configuring a &lt;code&gt;launch.json&lt;/code&gt; file&lt;/a&gt;, running &lt;code&gt;wrangler dev&lt;/code&gt;, and connecting via VSCode&apos;s built-in debugger. Now it&apos;s much more seamless!&lt;/p&gt;</description><pubDate>Fri, 04 Jul 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Hyperdrive - Hyperdrive now supports configuring the amount of database connections</title><link>https://developers.cloudflare.com/changelog/post/2025-07-02-hyperdrive-configurable-connection-count/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-07-02-hyperdrive-configurable-connection-count/</guid><description>&lt;p&gt;You can now specify the number of connections your Hyperdrive configuration uses to connect to your origin database.&lt;/p&gt;
&lt;p&gt;All configurations have a minimum of 5 connections. The maximum connection count for a Hyperdrive configuration depends on the &lt;a href=&quot;https://developers.cloudflare.com/hyperdrive/platform/limits/&quot;&gt;Hyperdrive limits of your Workers plan&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This feature allows you to right-size your connection pool based on your database capacity and application requirements. You can configure connection counts through the Cloudflare dashboard or API.&lt;/p&gt;
&lt;p&gt;Refer to the &lt;a href=&quot;https://developers.cloudflare.com/hyperdrive/concepts/connection-pooling/&quot;&gt;Hyperdrive configuration documentation&lt;/a&gt; for more information.&lt;/p&gt;</description><pubDate>Thu, 03 Jul 2025 00:00:00 GMT</pubDate><product>Hyperdrive</product><category>Hyperdrive</category></item><item><title>Workers - Enhanced support for static assets with the Cloudflare Vite plugin</title><link>https://developers.cloudflare.com/changelog/post/2025-07-01-vite-plugin-enhanced-assets-support/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-07-01-vite-plugin-enhanced-assets-support/</guid><description>&lt;p&gt;You can now use any of Vite&apos;s &lt;a href=&quot;https://vite.dev/guide/assets&quot; target=&quot;_blank&quot;&gt;static asset handling&lt;/a&gt; features in your Worker as well as in your frontend.
These include importing assets as URLs, importing as strings and importing from the &lt;code&gt;public&lt;/code&gt; directory as well as inlining assets.&lt;/p&gt;
&lt;p&gt;Additionally, assets imported as URLs in your Worker are now automatically moved to the client build output.&lt;/p&gt;
&lt;p&gt;Here is an example that fetches an imported asset using the &lt;a href=&quot;https://developers.cloudflare.com/workers/static-assets/binding/#binding&quot;&gt;assets binding&lt;/a&gt; and modifies the response.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Import the asset URL&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// This returns the resolved path in development and production&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;myImage&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;./my-image.png&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Fetch the asset using the binding&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ASSETS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;URL&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;myImage&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Create a new `Response` object that can be modified&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;modifiedResponse&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Add an additional header&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;modifiedResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;append&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;my-header&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;imported-asset&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Return the modfied response&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;modifiedResponse&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Refer to &lt;a href=&quot;https://developers.cloudflare.com/workers/vite-plugin/reference/static-assets/&quot;&gt;Static Assets&lt;/a&gt; in the Cloudflare Vite plugin docs for more info.&lt;/p&gt;</description><pubDate>Tue, 01 Jul 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Email Routing - Mail authentication requirements for Email Routing</title><link>https://developers.cloudflare.com/changelog/post/2025-06-30-mail-authentication/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-06-30-mail-authentication/</guid><description>&lt;p&gt;The Email Routing platform supports &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc7208&quot; target=&quot;_blank&quot;&gt;SPF&lt;/a&gt; records and &lt;a href=&quot;https://en.wikipedia.org/wiki/DomainKeys_Identified_Mail&quot; target=&quot;_blank&quot;&gt;DKIM (DomainKeys Identified Mail)&lt;/a&gt; signatures and
honors these protocols when the sending domain has them configured. However, if the sending domain doesn&apos;t implement them,
we still forward the emails to upstream mailbox providers.&lt;/p&gt;
&lt;p&gt;Starting on July 3, 2025, we will require all emails to be authenticated using at least one of the protocols, SPF or DKIM, to
forward them. We also strongly recommend that all senders implement the DMARC protocol.&lt;/p&gt;
&lt;p&gt;If you are using a Worker with an Email trigger to receive email messages and forward them upstream, you will need to handle the case where
the forward action may fail due to missing authentication on the incoming email.&lt;/p&gt;
&lt;p&gt;SPAM has been a long-standing issue with email. By enforcing mail authentication, we will increase the efficiency of identifying abusive senders and blocking
bad emails.
If you&apos;re an email server delivering emails to large mailbox providers, it&apos;s likely you already use these protocols; otherwise, please ensure
you have them properly configured.&lt;/p&gt;</description><pubDate>Mon, 30 Jun 2025 00:00:00 GMT</pubDate><product>Email Routing</product><category>Email Routing</category></item><item><title>Workers - Remote bindings (beta) now works with Next.js — connect to remote resources (D1, KV, R2, etc.) during local development</title><link>https://developers.cloudflare.com/changelog/post/2025-06-25-getplatformproxy-support-remote-bindings/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-06-25-getplatformproxy-support-remote-bindings/</guid><description>&lt;p&gt;We &lt;a href=&quot;https://github.com/cloudflare/workers-sdk/discussions/9660&quot; target=&quot;_blank&quot;&gt;recently announced&lt;/a&gt; our public beta for &lt;a href=&quot;https://developers.cloudflare.com/workers/development-testing/#remote-bindings&quot;&gt;remote bindings&lt;/a&gt;, which allow you to connect to deployed resources running on your Cloudflare account (like &lt;a href=&quot;https://developers.cloudflare.com/r2&quot;&gt;R2 buckets&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/d1&quot;&gt;D1 databases&lt;/a&gt;) while running a local development session.&lt;/p&gt;
&lt;p&gt;Now, you can use remote bindings with your Next.js applications through the &lt;a href=&quot;https://opennext.js.org/cloudflare/bindings#remote-bindings&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;@opennextjs/cloudflare&lt;/code&gt; adaptor&lt;/a&gt; by enabling the experimental feature in your &lt;code&gt;next.config.ts&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;diff&quot;&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;initOpenNextCloudflareForDev();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;initOpenNextCloudflareForDev({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;experimental: { remoteBindings: true }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Then, all you have to do is specify which bindings you want connected to the deployed resource on your Cloudflare account via the &lt;code&gt;experimental_remote&lt;/code&gt; flag in your binding definition:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;wrangler.jsonc&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;jsonc&quot;&gt;&lt;code class=&quot;language-jsonc&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;r2_buckets&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;bucket_name&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;testing-bucket&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;binding&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;MY_BUCKET&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;experimental_remote&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;wrangler.toml&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;toml&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[[&lt;/span&gt;&lt;span&gt;r2_buckets&lt;/span&gt;&lt;span&gt;]]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;bucket_name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;testing-bucket&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;binding&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;MY_BUCKET&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;experimental_remote&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;You can then run &lt;code&gt;next dev&lt;/code&gt; to start a local development session (or start a preview with &lt;code&gt;opennextjs-cloudflare preview&lt;/code&gt;), and all requests to &lt;code&gt;env.MY_BUCKET&lt;/code&gt; will be proxied to the remote &lt;code&gt;testing-bucket&lt;/code&gt; — rather than the &lt;a href=&quot;https://developers.cloudflare.com/workers/development-testing/#bindings-during-local-development&quot;&gt;default local binding simulations&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Remote bindings &amp;#x26; ISR&lt;/h4&gt;
&lt;p&gt;Remote bindings are also used during the build process, which comes with significant benefits for pages using &lt;a href=&quot;https://opennext.js.org/aws/inner_workings/components/server/node#isrssg&quot; target=&quot;_blank&quot;&gt;Incremental Static Regeneration (ISR)&lt;/a&gt;. During the build step for an ISR page, your server executes the page&apos;s code just as it would for normal user requests. If a page needs data to display (like fetching user info from &lt;a href=&quot;https://developers.cloudflare.com/kv&quot;&gt;KV&lt;/a&gt;), those requests are actually made. The server then uses this fetched data to render the final HTML.&lt;/p&gt;
&lt;p&gt;Data fetching is a critical part of this process, as the finished HTML is only as good as the data it was built with. If the build process can&apos;t fetch real data, you end up with a pre-rendered page that&apos;s empty or incomplete.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;With remote bindings support in OpenNext,&lt;/strong&gt; your pre-rendered pages are built with real data from the start. The build process uses any configured remote bindings, and any data fetching occurs against the deployed resources on your Cloudflare account.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Want to learn more?&lt;/strong&gt; Get started with &lt;a href=&quot;https://opennext.js.org/cloudflare/bindings#remote-bindings&quot; target=&quot;_blank&quot;&gt;remote bindings and OpenNext&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Have feedback?&lt;/strong&gt; Join the discussion in our &lt;a href=&quot;https://github.com/cloudflare/workers-sdk/discussions/9660&quot; target=&quot;_blank&quot;&gt;beta announcement&lt;/a&gt; to share feedback or report any issues.&lt;/p&gt;</description><pubDate>Mon, 30 Jun 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Run and connect Workers in separate dev commands with the Cloudflare Vite plugin</title><link>https://developers.cloudflare.com/changelog/post/2025-06-26-vite-plugin-cross-commands-binding/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-06-26-vite-plugin-cross-commands-binding/</guid><description>&lt;p&gt;Workers can now talk to each other across separate dev commands using service bindings and tail consumers, whether started with &lt;code&gt;vite dev&lt;/code&gt; or &lt;code&gt;wrangler dev&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Simply start each Worker in its own terminal:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Terminal 1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;vite&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dev&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Terminal 2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dev&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;This is useful when different teams maintain different Workers, or when each Worker has its own build setup or tooling.&lt;/p&gt;
&lt;p&gt;Check out the &lt;a href=&quot;https://developers.cloudflare.com/workers/development-testing/multi-workers&quot;&gt;Developing with multiple Workers&lt;/a&gt; guide to learn more about the different approaches and when to use each one.&lt;/p&gt;</description><pubDate>Thu, 26 Jun 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Agents, Workers, Workflows - Run AI-generated code on-demand with Code Sandboxes (new)</title><link>https://developers.cloudflare.com/changelog/post/2025-06-24-announcing-sandboxes/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-06-24-announcing-sandboxes/</guid><description>&lt;p&gt;AI is supercharging app development for everyone, but we need a safe way to run untrusted, LLM-written code. We’re introducing &lt;a href=&quot;https://www.npmjs.com/package/@cloudflare/sandbox&quot; target=&quot;_blank&quot;&gt;Sandboxes&lt;/a&gt;, which let your Worker run actual processes in a secure, container-based environment.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getSandbox&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@cloudflare/sandbox&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Sandbox&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;@cloudflare/sandbox&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Env&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandbox&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getSandbox&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Sandbox&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-sandbox&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandbox&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;exec&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;ls&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;-la&quot;&lt;/span&gt;&lt;span&gt;])&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Methods&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;exec(command: string, args: string[], options?: { stream?: boolean })&lt;/code&gt;:Execute a command in the sandbox.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gitCheckout(repoUrl: string, options: { branch?: string; targetDir?: string; stream?: boolean })&lt;/code&gt;: Checkout a git repository in the sandbox.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mkdir(path: string, options: { recursive?: boolean; stream?: boolean })&lt;/code&gt;: Create a directory in the sandbox.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;writeFile(path: string, content: string, options: { encoding?: string; stream?: boolean })&lt;/code&gt;: Write content to a file in the sandbox.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;readFile(path: string, options: { encoding?: string; stream?: boolean })&lt;/code&gt;: Read content from a file in the sandbox.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;deleteFile(path: string, options?: { stream?: boolean })&lt;/code&gt;: Delete a file from the sandbox.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;renameFile(oldPath: string, newPath: string, options?: { stream?: boolean })&lt;/code&gt;: Rename a file in the sandbox.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;moveFile(sourcePath: string, destinationPath: string, options?: { stream?: boolean })&lt;/code&gt;: Move a file from one location to another in the sandbox.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ping()&lt;/code&gt;: Ping the sandbox.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sandboxes are still experimental. We&apos;re using them to explore how isolated, container-like workloads might scale on Cloudflare — and to help define the developer experience around them.&lt;/p&gt;
&lt;p&gt;You can try it today from your Worker, with just a few lines of code. Let us know what you build.&lt;/p&gt;</description><pubDate>Wed, 25 Jun 2025 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category><category>Workflows</category></item><item><title>Durable Objects, Workers - @cloudflare/actors library - SDK for Durable Objects in beta</title><link>https://developers.cloudflare.com/changelog/post/2025-06-25-actors-package-alpha/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-06-25-actors-package-alpha/</guid><description>&lt;p&gt;The new &lt;a href=&quot;https://www.npmjs.com/package/@cloudflare/actors&quot; target=&quot;_blank&quot;&gt;@cloudflare/actors&lt;/a&gt; library is now in beta!&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;@cloudflare/actors&lt;/code&gt; library is a new SDK for Durable Objects and provides a powerful set of abstractions for building real-time, interactive, and multiplayer applications on top of Durable Objects. With beta usage and feedback, &lt;code&gt;@cloudflare/actors&lt;/code&gt; will become the recommended way to build on Durable Objects and draws upon Cloudflare&apos;s experience building products/features on Durable Objects.&lt;/p&gt;
&lt;p&gt;The name &quot;actors&quot; originates from the &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/concepts/what-are-durable-objects/#actor-programming-model&quot;&gt;actor programming model&lt;/a&gt;, which closely ties to how Durable Objects are modelled.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;@cloudflare/actors&lt;/code&gt; library includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Storage helpers for querying embeddeded, per-object SQLite storage&lt;/li&gt;
&lt;li&gt;Storage helpers for managing SQL schema migrations&lt;/li&gt;
&lt;li&gt;Alarm helpers for scheduling multiple alarms provided a date, delay in seconds, or cron expression&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Actor&lt;/code&gt; class for using Durable Objects with a defined pattern&lt;/li&gt;
&lt;li&gt;Durable Objects &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/api/base/&quot; target=&quot;_blank&quot;&gt;Workers API&lt;/a&gt; is always available for your application as needed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Storage and alarm helper methods can be combined with &lt;a href=&quot;https://github.com/cloudflare/actors?tab=readme-ov-file#storage--alarms-with-durableobject-class&quot; target=&quot;_blank&quot;&gt;any Javascript class&lt;/a&gt; that defines your Durable Object, i.e, ones that extend &lt;code&gt;DurableObject&lt;/code&gt; including the &lt;code&gt;Actor&lt;/code&gt; class.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Storage&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@cloudflare/actors/storage&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ChatRoom&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DurableObject&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Env&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;storage&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Storage&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;constructor&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DurableObjectState&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Env&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;super&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;storage&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Storage&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;storage&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;storage&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;migrations&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;idMonotonicInc&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Create users table&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;sql&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY)&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Promise&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// Run migrations before executing SQL query&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;storage&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;runMigrations&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// Query with SQL template&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;userId&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;URL&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;searchParams&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;userId&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;query&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;storage&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sql&lt;/span&gt;&lt;span&gt;`SELECT * FROM users WHERE id = &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;userId&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;JSON&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;stringify&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;query&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;@cloudflare/actors&lt;/code&gt; library introduces the &lt;code&gt;Actor&lt;/code&gt; class pattern. &lt;code&gt;Actor&lt;/code&gt; lets you access Durable Objects without writing the Worker that communicates with your Durable Object (the Worker is created for you). By default, requests are routed to a Durable Object named &quot;default&quot;.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyActor&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Actor&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Env&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Promise&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;Hello, World!&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;handler&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;MyActor&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;You can &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/get-started/#3-instantiate-and-communicate-with-a-durable-object&quot;&gt;route&lt;/a&gt; to different Durable Objects by name within your &lt;code&gt;Actor&lt;/code&gt; class using &lt;a href=&quot;https://github.com/cloudflare/actors?tab=readme-ov-file#actor-with-custom-name&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;nameFromRequest&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyActor&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Actor&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Env&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;nameFromRequest&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;URL&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;searchParams&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;userId&quot;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;??&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;foo&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Promise&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`Actor identifier (Durable Object name): &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;identifier&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;handler&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;MyActor&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For more examples, check out the library &lt;a href=&quot;https://github.com/cloudflare/actors?tab=readme-ov-file#getting-started&quot; target=&quot;_blank&quot;&gt;README&lt;/a&gt;. &lt;code&gt;@cloudflare/actors&lt;/code&gt; library is a place for more helpers and built-in patterns, like retry handling and Websocket-based applications, to reduce development overhead for common Durable Objects functionality. Please share feedback and what more you would like to see on our &lt;a href=&quot;https://discord.com/channels/595317990191398933/773219443911819284&quot; target=&quot;_blank&quot;&gt;Discord channel&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 25 Jun 2025 00:00:00 GMT</pubDate><product>Durable Objects</product><category>Durable Objects</category><category>Workers</category></item><item><title>Workers - Increased blob size limits in Workers Analytics Engine</title><link>https://developers.cloudflare.com/changelog/post/2025-06-20-increased-blob-size-limits-in-workers-analytics/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-06-20-increased-blob-size-limits-in-workers-analytics/</guid><description>&lt;p&gt;We’ve increased the total allowed size of &lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/get-started/#2-write-data-points-from-your-worker&quot;&gt;&lt;code&gt;blob&lt;/code&gt;&lt;/a&gt; fields on data points written to &lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/&quot;&gt;Workers Analytics Engine&lt;/a&gt; from &lt;strong&gt;5 KB to 16 KB&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This change gives you more flexibility when logging rich observability data — such as base64-encoded payloads, AI inference traces, or custom metadata — without hitting request size limits.&lt;/p&gt;
&lt;p&gt;You can find full details on limits for queries, filters, payloads, and more &lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/limits/&quot;&gt;here in the Workers Analytics Engine limits documentation&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;analyticsDataset&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeDataPoint&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// The sum of all of the blob&apos;s sizes can now be 16 KB&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;blobs&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// The URL of the request to the Worker&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// Some metadata about your application you&apos;d like to store&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;JSON&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;stringify&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// The version of your Worker this datapoint was collected from&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;versionMetadata&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;tag&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;indexes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;sample-index&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;analyticsDataset&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeDataPoint&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// The sum of all of the blob&apos;s sizes can now be 16 KB&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;blobs&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// The URL of the request to the Worker&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// Some metadata about your application you&apos;d like to store&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;JSON&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;stringify&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// The version of your Worker this datapoint was collected from&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;versionMetadata&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;tag&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;indexes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;sample-index&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;</description><pubDate>Fri, 20 Jun 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>AI Search - View custom metadata in responses and guide AI-search with context in AutoRAG</title><link>https://developers.cloudflare.com/changelog/post/2025-06-19-autorag-custom-metadata-and-context/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-06-19-autorag-custom-metadata-and-context/</guid><description>&lt;p&gt;In &lt;a href=&quot;https://developers.cloudflare.com/ai-search/&quot;&gt;AutoRAG&lt;/a&gt;, you can now view your object&apos;s custom metadata in the response from &lt;a href=&quot;https://developers.cloudflare.com/ai-search/usage/workers-binding/&quot;&gt;&lt;code&gt;/search&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/ai-search/usage/workers-binding/&quot;&gt;&lt;code&gt;/ai-search&lt;/code&gt;&lt;/a&gt;, and optionally add a &lt;code&gt;context&lt;/code&gt; field in the custom metadata of an object to provide additional guidance for AI-generated answers.&lt;/p&gt;
&lt;p&gt;You can add &lt;a href=&quot;https://developers.cloudflare.com/r2/api/workers/workers-api-reference/#r2putoptions&quot;&gt;custom metadata&lt;/a&gt; to an object when uploading it to your R2 bucket.&lt;/p&gt;
&lt;h4&gt;Object&apos;s custom metadata in search responses&lt;/h4&gt;
&lt;p&gt;When you run a search, AutoRAG now returns any custom metadata associated with the object. This metadata appears in the response inside &lt;code&gt;attributes&lt;/code&gt; then &lt;code&gt;file&lt;/code&gt; , and can be used for downstream processing.&lt;/p&gt;
&lt;p&gt;For example, the &lt;code&gt;attributes&lt;/code&gt; section of your search response may look like:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;attributes&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;timestamp&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1750001460000&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;folder&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;docs/&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;filename&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;launch-checklist.md&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;https://wiki.company.com/docs/launch-checklist&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;context&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;A checklist for internal launch readiness, including legal, engineering, and marketing steps.&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Add a &lt;code&gt;context&lt;/code&gt; field to guide LLM answers&lt;/h4&gt;
&lt;p&gt;When you include a custom metadata field named &lt;code&gt;context&lt;/code&gt;, AutoRAG attaches that value to each chunk of the file. When you run an &lt;code&gt;/ai-search&lt;/code&gt; query, this &lt;code&gt;context&lt;/code&gt; is passed to the LLM and can be used as additional input when generating an answer.&lt;/p&gt;
&lt;p&gt;We recommend using the &lt;code&gt;context&lt;/code&gt; field to describe supplemental information you want the LLM to consider, such as a summary of the document or a source URL. If you have several different metadata attributes, you can join them together however you choose within the &lt;code&gt;context&lt;/code&gt; string.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;context&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;summary: &apos;Checklist for internal product launch readiness, including legal, engineering, and marketing steps.&apos;; url: &apos;https://wiki.company.com/docs/launch-checklist&apos;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;This gives you more control over how your content is interpreted, without requiring you to modify the original contents of the file.&lt;/p&gt;
&lt;p&gt;Learn more in AutoRAG&apos;s &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/metadata&quot;&gt;metadata filtering documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 19 Jun 2025 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>AI Search - Filter your AutoRAG search by file name</title><link>https://developers.cloudflare.com/changelog/post/2025-06-19-autorag-filename-filter/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-06-19-autorag-filename-filter/</guid><description>&lt;p&gt;In &lt;a href=&quot;https://developers.cloudflare.com/ai-search/&quot;&gt;AutoRAG&lt;/a&gt;, you can now &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/metadata/&quot;&gt;filter&lt;/a&gt; by an object&apos;s file name using the &lt;code&gt;filename&lt;/code&gt; attribute, giving you more control over which files are searched for a given query.&lt;/p&gt;
&lt;p&gt;This is useful when your application has already determined which files should be searched. For example, you might query a PostgreSQL database to get a list of files a user has access to based on their permissions, and then use that list to limit what AutoRAG retrieves.&lt;/p&gt;
&lt;p&gt;For example, your search query may look like:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AI&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;autorag&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;my-autorag&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;search&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;query&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;what is the project deadline?&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;filters&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;eq&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;filename&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;project-alpha-roadmap.md&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;This allows you to connect your application logic with AutoRAG&apos;s retrieval process, making it easy to control what gets searched without needing to reindex or modify your data.&lt;/p&gt;
&lt;p&gt;Learn more in AutoRAG&apos;s &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/metadata/&quot;&gt;metadata filtering documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 19 Jun 2025 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>D1, Workers, Workers for Platforms - Automate Worker deployments with a simplified SDK and more reliable Terraform provider</title><link>https://developers.cloudflare.com/changelog/post/2025-06-17-workers-terraform-sdk-api-fixes/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-06-17-workers-terraform-sdk-api-fixes/</guid><description>&lt;h4&gt;Simplified Worker Deployments with our SDKs&lt;/h4&gt;
&lt;p&gt;We&apos;ve simplified the programmatic deployment of Workers via our &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/api/reference/sdks/&quot;&gt;Cloudflare SDKs&lt;/a&gt;. This update abstracts away the low-level complexities of the &lt;code&gt;multipart/form-data&lt;/code&gt; upload process, allowing you to focus on your code while we handle the deployment mechanics.&lt;/p&gt;
&lt;p&gt;This new interface is available in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/cloudflare/cloudflare-typescript&quot; target=&quot;_blank&quot;&gt;cloudflare-typescript&lt;/a&gt; (4.4.1)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/cloudflare/cloudflare-python&quot; target=&quot;_blank&quot;&gt;cloudflare-python&lt;/a&gt; (4.3.1)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For complete examples, see our guide on &lt;a href=&quot;https://developers.cloudflare.com/workers/platform/infrastructure-as-code&quot;&gt;programmatic Worker deployments&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;The Old way: Manual API calls&lt;/h4&gt;
&lt;p&gt;Previously, deploying a Worker programmatically required manually constructing a &lt;code&gt;multipart/form-data&lt;/code&gt; HTTP request, packaging your code and a separate &lt;code&gt;metadata.json&lt;/code&gt; file. This was more complicated and verbose, and prone to formatting errors.&lt;/p&gt;
&lt;p&gt;For example, here&apos;s how you would upload a Worker script previously with cURL:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://api.cloudflare.com/client/v4/accounts/&amp;#x3C;account_id&gt;/workers/scripts/my-hello-world-script&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-X&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;PUT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-H&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;Authorization: Bearer &amp;#x3C;api_token&gt;&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-F&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;metadata={&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;main_module&quot;: &quot;my-hello-world-script.mjs&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;bindings&quot;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;type&quot;: &quot;plain_text&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;name&quot;: &quot;MESSAGE&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;text&quot;: &quot;Hello World!&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;compatibility_date&quot;: &quot;$today&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;};type=application/json&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-F&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;my-hello-world-script.mjs=@-;filename=my-hello-world-script.mjs;type=application/javascript+module&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span&gt;EOF&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export default {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;async fetch(request, env, ctx) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return new Response(env.MESSAGE, { status: 200 });&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;EOF&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;After: SDK interface&lt;/h4&gt;
&lt;p&gt;With the new SDK interface, you can now define your entire Worker configuration using a single, structured object.&lt;/p&gt;
&lt;p&gt;This approach allows you to specify metadata like &lt;code&gt;main_module&lt;/code&gt;, &lt;code&gt;bindings&lt;/code&gt;, and &lt;code&gt;compatibility_date&lt;/code&gt; as clearer properties directly alongside your script content. Our SDK takes this logical object and automatically constructs the complex multipart/form-data API request behind the scenes.&lt;/p&gt;
&lt;p&gt;Here&apos;s how you can now programmatically deploy a Worker via the &lt;a href=&quot;https://github.com/cloudflare/cloudflare-typescript&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;cloudflare-typescript&lt;/code&gt; SDK&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;cloudflare&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;toFile&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;cloudflare/index&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// ... client setup, script content, etc.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;workers&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;scripts&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;scriptName&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;account_id&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;accountID&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;main_module&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;scriptFileName&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;bindings&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; []&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;files&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;scriptFileName&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;toFile&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Buffer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;scriptContent&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;scriptFileName&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;application/javascript+module&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;cloudflare&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;toFile&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&apos;cloudflare/index&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// ... client setup, script content, etc.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;workers&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;scripts&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;scriptName&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;account_id&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;accountID&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;main_module&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;scriptFileName&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;bindings&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; []&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;files&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;scriptFileName&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;toFile&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Buffer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;scriptContent&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;scriptFileName&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;application/javascript+module&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;View the complete example here: &lt;a href=&quot;https://github.com/cloudflare/cloudflare-typescript/blob/main/examples/workers/script-upload.ts&quot; target=&quot;_blank&quot;&gt;https://github.com/cloudflare/cloudflare-typescript/blob/main/examples/workers/script-upload.ts&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Terraform provider improvements&lt;/h4&gt;
&lt;p&gt;We&apos;ve also made several fixes and enhancements to the &lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare&quot; target=&quot;_blank&quot;&gt;Cloudflare Terraform provider&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixed the &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/workers_script&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;cloudflare_workers_script&lt;/code&gt;&lt;/a&gt; resource in Terraform, which previously was producing a diff even when there were no changes. Now, your &lt;code&gt;terraform plan&lt;/code&gt; outputs will be cleaner and more reliable.&lt;/li&gt;
&lt;li&gt;Fixed the &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/workers_for_platforms_dispatch_namespace&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;cloudflare_workers_for_platforms_dispatch_namespace&lt;/code&gt;&lt;/a&gt;, where the provider would attempt to recreate the namespace on a &lt;code&gt;terraform apply&lt;/code&gt;. The resource now correctly reads its remote state, ensuring stability for production environments and CI/CD workflows.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/workers_route&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;cloudflare_workers_route&lt;/code&gt;&lt;/a&gt; resource now allows for the &lt;code&gt;script&lt;/code&gt; property to be empty, null, or omitted to indicate that pattern should be negated for all scripts (see routes &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/routing/routes&quot;&gt;docs&lt;/a&gt;). You can now reserve a pattern or temporarily disable a Worker on a route without deleting the route definition itself.&lt;/li&gt;
&lt;li&gt;Using &lt;code&gt;primary_location_hint&lt;/code&gt; in the &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/d1_database&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;cloudflare_d1_database&lt;/code&gt;&lt;/a&gt; resource will no longer always try to recreate. You can now safely change the location hint for a D1 database without causing a destructive operation.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;API improvements&lt;/h4&gt;
&lt;p&gt;We&apos;ve also properly documented the &lt;a href=&quot;https://developers.cloudflare.com/api/resources/workers/subresources/scripts/subresources/script_and_version_settings&quot;&gt;Workers Script And Version Settings&lt;/a&gt; in our public OpenAPI spec and SDKs.&lt;/p&gt;</description><pubDate>Thu, 19 Jun 2025 00:00:00 GMT</pubDate><product>D1</product><category>D1</category><category>Workers</category><category>Workers for Platforms</category></item><item><title>Workers - Remote bindings public beta - Connect to remote resources (D1, KV, R2, etc.) during local development</title><link>https://developers.cloudflare.com/changelog/post/2025-06-18-remote-bindings-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-06-18-remote-bindings-beta/</guid><description>&lt;p&gt;Today &lt;a href=&quot;https://github.com/cloudflare/workers-sdk/discussions/9660&quot; target=&quot;_blank&quot;&gt;we announced the public beta&lt;/a&gt; of &lt;a href=&quot;https://developers.cloudflare.com/workers/development-testing/#remote-bindings&quot;&gt;remote bindings&lt;/a&gt; for local development. With remote bindings, you can now connect to deployed resources like &lt;a href=&quot;https://developers.cloudflare.com/r2/&quot;&gt;R2 buckets&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/d1/&quot;&gt;D1 databases&lt;/a&gt; while running Worker code on your local machine. This means you can test your local code changes against real data and services, without the overhead of deploying for each iteration.&lt;/p&gt;
&lt;h4&gt;Example configuration&lt;/h4&gt;
&lt;p&gt;To enable remote mode, add &lt;code&gt;&quot;experimental_remote&quot; : true&lt;/code&gt; to each binding that you want to rely on a remote resource running on Cloudflare:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;wrangler.jsonc&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;jsonc&quot;&gt;&lt;code class=&quot;language-jsonc&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-worker&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Set this to today&apos;s date&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;compatibility_date&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;2026-04-03&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;r2_buckets&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;bucket_name&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;screenshots-bucket&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;binding&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;screenshots_bucket&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;experimental_remote&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;wrangler.toml&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;toml&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-worker&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Set this to today&apos;s date&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;compatibility_date&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;2026-04-03&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[[&lt;/span&gt;&lt;span&gt;r2_buckets&lt;/span&gt;&lt;span&gt;]]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;bucket_name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;screenshots-bucket&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;binding&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;screenshots_bucket&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;experimental_remote&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;When remote bindings are configured, your Worker &lt;strong&gt;still executes locally&lt;/strong&gt;, but all binding calls are proxied to the deployed resource that runs on Cloudflare&apos;s network.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You can try out remote bindings for local development today with:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/development-testing/#remote-bindings&quot;&gt;Wrangler v4.20.3&lt;/a&gt;: Use the &lt;code&gt;wrangler dev --x-remote-bindings&lt;/code&gt; command.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;https://developers.cloudflare.com/workers/development-testing/#remote-bindings&quot;&gt;Cloudflare Vite Plugin&lt;/a&gt;: Refer to the documentation for how to enable in your Vite config.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;https://developers.cloudflare.com/workers/development-testing/#remote-bindings&quot;&gt;Cloudflare Vitest Plugin&lt;/a&gt;: Refer to the documentation for how to enable in your Vitest config.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Have feedback?&lt;/strong&gt;
Join the discussion in our &lt;a href=&quot;https://github.com/cloudflare/workers-sdk/discussions/9660&quot; target=&quot;_blank&quot;&gt;beta announcement&lt;/a&gt; to share feedback or report any issues.&lt;/p&gt;</description><pubDate>Wed, 18 Jun 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Control which routes invoke your Worker script for Single Page Applications</title><link>https://developers.cloudflare.com/changelog/post/2025-06-17-advanced-routing/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-06-17-advanced-routing/</guid><description>&lt;p&gt;For those building &lt;a href=&quot;https://developers.cloudflare.com/workers/static-assets/routing/single-page-application/#advanced-routing-control&quot;&gt;Single Page Applications (SPAs) on Workers&lt;/a&gt;, you can now explicitly define which routes invoke your Worker script in Wrangler configuration. The &lt;a href=&quot;https://developers.cloudflare.com/workers/static-assets/binding/#run_worker_first&quot;&gt;&lt;code&gt;run_worker_first&lt;/code&gt; config option&lt;/a&gt; has now been expanded to accept an array of route patterns, allowing you to more granularly specify when your Worker script runs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Configuration example:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;wrangler.jsonc&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;jsonc&quot;&gt;&lt;code class=&quot;language-jsonc&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-spa-worker&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Set this to today&apos;s date&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;compatibility_date&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;2026-04-03&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./src/index.ts&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;assets&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;directory&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./dist/&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;not_found_handling&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;single-page-application&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;binding&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;ASSETS&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;run_worker_first&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&quot;/api/*&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;!/api/docs/*&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;wrangler.toml&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;toml&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-spa-worker&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Set this to today&apos;s date&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;compatibility_date&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;2026-04-03&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./src/index.ts&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;assets&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;directory&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./dist/&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;not_found_handling&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;single-page-application&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;binding&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;ASSETS&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;run_worker_first&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;/api/*&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;!/api/docs/*&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;This new routing control was done in partnership with our community and customers who provided great feedback on &lt;a href=&quot;https://github.com/cloudflare/workers-sdk/discussions/9143&quot; target=&quot;_blank&quot;&gt;our public proposal&lt;/a&gt;. Thank you to everyone who brought forward use-cases and feedback on the design!&lt;/p&gt;
&lt;h4&gt;Prerequisites&lt;/h4&gt;
&lt;p&gt;To use advanced routing control with &lt;code&gt;run_worker_first&lt;/code&gt;, you&apos;ll need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/install-and-update/&quot;&gt;Wrangler&lt;/a&gt; v4.20.0 and above&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/vite-plugin/get-started/&quot;&gt;Cloudflare Vite plugin&lt;/a&gt; v1.7.0 and above&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Tue, 17 Jun 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - SSRF vulnerability in @opennextjs/cloudflare proactively mitigated for all Cloudflare customers</title><link>https://developers.cloudflare.com/changelog/post/2025-06-17-open-next-ssrf/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-06-17-open-next-ssrf/</guid><description>&lt;p&gt;Mitigations have been put in place for all existing and future deployments of sites with the Cloudflare adapter for Open Next in response to an identified Server-Side Request Forgery (SSRF) vulnerability in the &lt;code&gt;@opennextjs/cloudflare&lt;/code&gt; package.&lt;/p&gt;
&lt;p&gt;The vulnerability stemmed from an unimplemented feature in the Cloudflare adapter for Open Next, which allowed users to proxy arbitrary remote content via the &lt;code&gt;/_next/image&lt;/code&gt; endpoint.&lt;/p&gt;
&lt;p&gt;This issue allowed attackers to load remote resources from arbitrary hosts under the victim site&apos;s domain for any site deployed using the Cloudflare adapter for Open Next. For example: &lt;code&gt;https://victim-site.com/_next/image?url=https://attacker.com&lt;/code&gt;. In this example, attacker-controlled content from &lt;code&gt;attacker.com&lt;/code&gt; is served through the victim site&apos;s domain (&lt;code&gt;victim-site.com&lt;/code&gt;), violating the same-origin policy and potentially misleading users or other services.&lt;/p&gt;
&lt;p&gt;References: &lt;a href=&quot;https://www.cve.org/cverecord?id=CVE-2025-6087&quot; target=&quot;_blank&quot;&gt;https://www.cve.org/cverecord?id=CVE-2025-6087&lt;/a&gt;, &lt;a href=&quot;https://github.com/opennextjs/opennextjs-cloudflare/security/advisories/GHSA-rvpw-p7vw-wj3m&quot; target=&quot;_blank&quot;&gt;https://github.com/opennextjs/opennextjs-cloudflare/security/advisories/GHSA-rvpw-p7vw-wj3m&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Impact&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;SSRF via unrestricted remote URL loading&lt;/li&gt;
&lt;li&gt;Arbitrary remote content loading&lt;/li&gt;
&lt;li&gt;Potential internal service exposure or phishing risks through domain abuse&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Mitigation&lt;/h4&gt;
&lt;p&gt;The following mitigations have been put in place:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Server side updates&lt;/strong&gt; to Cloudflare&apos;s platform to restrict the content loaded via the &lt;code&gt;/_next/image&lt;/code&gt; endpoint to images. The update automatically mitigates the issue for all existing and any future sites deployed to Cloudflare using the affected version of the Cloudflare adapter for Open Next&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Root cause fix:&lt;/strong&gt; Pull request &lt;a href=&quot;https://github.com/opennextjs/opennextjs-cloudflare/pull/727&quot; target=&quot;_blank&quot;&gt;#727&lt;/a&gt; to the Cloudflare adapter for Open Next. The patched version of the adapter has been released as &lt;code&gt;@opennextjs/cloudflare@1.3.0&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Package dependency update:&lt;/strong&gt; Pull request &lt;a href=&quot;https://github.com/cloudflare/workers-sdk/pull/9608&quot; target=&quot;_blank&quot;&gt;cloudflare/workers-sdk#9608&lt;/a&gt; to create-cloudflare (c3) to use the fixed version of the Cloudflare adapter for Open Next. The patched version of create-cloudflare has been published as &lt;code&gt;create-cloudflare@2.49.3&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;In addition to the automatic mitigation deployed on Cloudflare&apos;s platform, we encourage affected users to upgrade to &lt;code&gt;@opennext/cloudflare&lt;/code&gt; v1.3.0 and use the &lt;a href=&quot;https://nextjs.org/docs/pages/api-reference/components/image#remotepatterns&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;remotePatterns&lt;/code&gt;&lt;/a&gt; filter in Next config if they need to allow-list external urls with images assets.&lt;/p&gt;</description><pubDate>Tue, 17 Jun 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Grant account members read-only access to the Workers Platform</title><link>https://developers.cloudflare.com/changelog/post/2025-06-16-workers-platform-admin-role/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-06-16-workers-platform-admin-role/</guid><description>&lt;p&gt;You can now grant members of your Cloudflare account read-only access to the Workers
Platform.&lt;/p&gt;
&lt;p&gt;The new &quot;Workers Platform (Read-only)&quot; role grants read-only access to all products typically used as part of Cloudflare&apos;s Developer Platform, including &lt;a href=&quot;https://developers.cloudflare.com/workers/&quot;&gt;Workers&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/pages/&quot;&gt;Pages&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/&quot;&gt;Durable Objects&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/kv/&quot;&gt;KV&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/r2/&quot;&gt;R2&lt;/a&gt;, Zones, &lt;a href=&quot;https://developers.cloudflare.com/analytics/account-and-zone-analytics/zone-analytics/&quot;&gt;Zone Analytics&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/rules/&quot;&gt;Page Rules&lt;/a&gt;. When Cloudflare introduces new products to the Workers platform, we will add additional read-only permissions to this role.&lt;/p&gt;
&lt;p&gt;Additionally, the role previously named &quot;Workers Admin&quot; has been renamed to &quot;Workers Platform Admin&quot;. This
change ensures that the name more accurately reflects the permissions granted — this
role has always granted access to more than just
Workers — it grants read and write access to the products mentioned above, and similarly, as new products are added to the Workers platform, we will add additional read and write permissions to this role.&lt;/p&gt;
&lt;p&gt;You can review the updated roles in the &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/manage-members/roles/&quot;&gt;developer docs&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 16 Jun 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Stream - Increased limits for Media Transformations</title><link>https://developers.cloudflare.com/changelog/post/2025-06-10-media-transformations-limits-increase/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-06-10-media-transformations-limits-increase/</guid><description>&lt;p&gt;We have increased the limits for &lt;a href=&quot;https://developers.cloudflare.com/stream/transform-videos/&quot;&gt;Media Transformations&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Input file size limit is now 100MB (was 40MB)&lt;/li&gt;
&lt;li&gt;Output video duration limit is now 1 minute (was 30 seconds)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Additionally, we have improved caching of the input asset, resulting in fewer
requests to origin storage even when transformation options may differ.&lt;/p&gt;
&lt;p&gt;For more information, learn about &lt;a href=&quot;https://developers.cloudflare.com/stream/transform-videos/&quot;&gt;Transforming Videos&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 10 Jun 2025 00:00:00 GMT</pubDate><product>Stream</product><category>Stream</category></item><item><title>Workers - Access git commit sha and branch name as environment variables in Workers Builds</title><link>https://developers.cloudflare.com/changelog/post/2025-06-10-default-env-vars/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-06-10-default-env-vars/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/&quot;&gt;Workers Builds&lt;/a&gt; connects your Worker to a &lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/git-integration/&quot;&gt;Git repository&lt;/a&gt;, and automates building and deploying your code on each pushed change.&lt;/p&gt;
&lt;p&gt;To make CI/CD pipelines even more flexible, Workers Builds now automatically injects &lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/configuration/#environment-variables&quot;&gt;default environment variables&lt;/a&gt; into your build process (much like the defaults in &lt;a href=&quot;https://developers.cloudflare.com/pages/configuration/build-configuration/#environment-variables&quot;&gt;Cloudflare Pages projects&lt;/a&gt;). You can use these variables to customize your build process based on the deployment context, such as the branch or commit.&lt;/p&gt;
&lt;p&gt;The following environment variables are injected by default:&lt;/p&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Environment Variable&lt;/th&gt;&lt;th&gt;Injected value&lt;/th&gt;&lt;th&gt;Example use-case&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;CI&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Changing build behavior when run on CI versus locally&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;WORKERS_CI&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Changing build behavior when run on Workers Builds versus locally&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;WORKERS_CI_BUILD_UUID&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;#x3C;build-uuid-of-current-build&gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Passing the Build UUID along to custom workflows&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;WORKERS_CI_COMMIT_SHA&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;#x3C;sha1-hash-of-current-commit&gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Passing current commit ID to error reporting, for example, Sentry&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;WORKERS_CI_BRANCH&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;#x3C;branch-name-from-push-event&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Customizing build based on branch, for example, disabling debug logging on &lt;code&gt;production&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;You can override these default values and add your own custom environment variables by navigating to &lt;strong&gt;your Worker&lt;/strong&gt; &gt; &lt;strong&gt;Settings&lt;/strong&gt; &gt; &lt;strong&gt;Environment variables&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Learn more in the &lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/configuration/#environment-variables&quot;&gt;Build configuration documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 10 Jun 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Workers native integrations were removed from the Cloudflare dashboard</title><link>https://developers.cloudflare.com/changelog/post/2025-06-09-workers-integrations-changes/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-06-09-workers-integrations-changes/</guid><description>&lt;p&gt;Workers native integrations were &lt;a href=&quot;https://blog.cloudflare.com/announcing-database-integrations/&quot; target=&quot;_blank&quot;&gt;originally launched in May 2023&lt;/a&gt; to connect to popular database and observability providers with your Worker in just a few clicks. We are changing how developers connect Workers to these external services. The &lt;strong&gt;Integrations&lt;/strong&gt; tab in the dashboard has been removed in favor of a more direct, command-line-based approach using &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/general/#secret&quot;&gt;Wrangler secrets&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;What&apos;s changed&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Integrations tab removed&lt;/strong&gt;: The integrations setup flow is no longer available in the Workers dashboard.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Manual secret configuration&lt;/strong&gt;: New connections should be configured by adding credentials as secrets to your Workers using &lt;code&gt;npx wrangler secret put&lt;/code&gt; commands.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Impact on existing integrations&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Existing integrations will continue to work without any changes required.&lt;/strong&gt; If you have integrations that were previously created through the dashboard, they will remain functional.&lt;/p&gt;
&lt;h4&gt;Updating existing integrations&lt;/h4&gt;
&lt;p&gt;If you&apos;d like to modify your existing integration, you can update the secrets, environment variables, or &lt;a href=&quot;https://developers.cloudflare.com/workers/observability/logs/tail-workers/&quot;&gt;Tail Workers&lt;/a&gt; that were created from the original integration setup.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Update secrets&lt;/strong&gt;: Use &lt;code&gt;npx wrangler secret put &amp;#x3C;SECRET_NAME&gt;&lt;/code&gt; to update credential values.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Modify environment variables&lt;/strong&gt;: Update variables through the dashboard or Wrangler configuration.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dashboard management&lt;/strong&gt;: Access your Worker&apos;s settings in the &lt;a href=&quot;https://dash.cloudflare.com&quot; target=&quot;_blank&quot;&gt;Cloudflare dashboard&lt;/a&gt; to modify connections created by our removed native integrations feature.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you have previously set up an observability integration with &lt;a href=&quot;https://sentry.io&quot; target=&quot;_blank&quot;&gt;Sentry&lt;/a&gt;, the following environment variables were set and are still modifiable:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;BLOCKED_HEADERS&lt;/code&gt;: headers to exclude sending to Sentry&lt;/li&gt;
&lt;li&gt;&lt;code&gt;EXCEPTION_SAMPLING_RATE&lt;/code&gt;: number from 0 - 100, where 0 = no events go through to Sentry, and 100 = all events go through to Sentry&lt;/li&gt;
&lt;li&gt;&lt;code&gt;STATUS_CODES_TO_SAMPLING_RATES&lt;/code&gt;: a map of status codes -- like 400 or with wildcards like 4xx -- to sampling rates described above&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Setting up new database and observability connections&lt;/h4&gt;
&lt;p&gt;For new connections, refer to our step-by-step guides on connecting to popular database and observability providers including: &lt;a href=&quot;https://developers.cloudflare.com/workers/observability/third-party-integrations/sentry&quot;&gt;Sentry&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/workers/databases/third-party-integrations/turso/&quot;&gt;Turso&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/workers/databases/third-party-integrations/neon/&quot;&gt;Neon&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/workers/databases/third-party-integrations/supabase/&quot;&gt;Supabase&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/workers/databases/third-party-integrations/planetscale/&quot;&gt;PlanetScale&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/workers/databases/third-party-integrations/upstash/&quot;&gt;Upstash&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/workers/databases/third-party-integrations/xata/&quot;&gt;Xata&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 09 Jun 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Performance and size optimization for the Cloudflare adapter for Open Next</title><link>https://developers.cloudflare.com/changelog/post/2025-06-05-open-next-size/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-06-05-open-next-size/</guid><description>&lt;p&gt;With the release of the Cloudflare adapter for Open Next v1.0.0 in May 2025, we already had followups plans &lt;a href=&quot;https://blog.cloudflare.com/deploying-nextjs-apps-to-cloudflare-workers-with-the-opennext-adapter/#1-0-and-the-road-ahead&quot; target=&quot;_blank&quot;&gt;to improve performance and size&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;@opennextjs/cloudflare&lt;/code&gt; v1.2 released on June 5, 2025 delivers on these enhancements. By removing &lt;code&gt;babel&lt;/code&gt; from the app code and dropping a dependency on &lt;code&gt;@ampproject/toolbox-optimizer&lt;/code&gt;, we were able to reduce generated bundle sizes. Additionally, by stopping preloading of all app routes, we were able to improve the cold start time.&lt;/p&gt;
&lt;p&gt;This means that users will now see a decrease from 14 to 8MiB (2.3 to 1.6MiB gzipped) in generated bundle size for a Next app created via create-next-app, and typically 100ms faster startup times for their medium-sized apps.&lt;/p&gt;
&lt;p&gt;Users only need to update to the latest version of &lt;code&gt;@opennextjs/cloudflare&lt;/code&gt; to automatically benefit from these improvements.&lt;/p&gt;
&lt;p&gt;Note that we published &lt;a href=&quot;https://github.com/opennextjs/opennextjs-cloudflare/security/advisories/GHSA-rvpw-p7vw-wj3m&quot; target=&quot;_blank&quot;&gt;CVE-2005-6087&lt;/a&gt; for a SSRF vulnerability in the &lt;code&gt;@opennextjs/cloudflare&lt;/code&gt; package.
The vulnerability has been fixed from &lt;code&gt;@opennextjs/cloudflare&lt;/code&gt; v1.3.0 onwards. Please update to any version after this one.&lt;/p&gt;</description><pubDate>Thu, 05 Jun 2025 19:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>AI Gateway - AI Gateway adds OpenAI compatible endpoint</title><link>https://developers.cloudflare.com/changelog/post/2025-06-03-aig-openai-compatible-endpoint/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-06-03-aig-openai-compatible-endpoint/</guid><description>&lt;p&gt;Users can now use an &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/usage/chat-completion/&quot;&gt;OpenAI Compatible endpoint&lt;/a&gt; in AI Gateway to easily switch between providers, while keeping the exact same request and response formats. We&apos;re launching now with the chat completions endpoint, with the embeddings endpoint coming up next.&lt;/p&gt;
&lt;p&gt;To get started, use the OpenAI compatible chat completions endpoint URL with your own account id and gateway id and switch between providers by changing the &lt;code&gt;model&lt;/code&gt; and &lt;code&gt;apiKey&lt;/code&gt; parameters.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;OpenAI&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;openai&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;OpenAI&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;apiKey&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;YOUR_PROVIDER_API_KEY&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// Provider API key&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;baseURL&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;https://gateway.ai.cloudflare.com/v1/{account_id}/{gateway_id}/compat&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;chat&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;completions&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;google-ai-studio/gemini-2.0-flash&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;messages&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; role&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;user&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; content&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;What is Cloudflare?&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;choices&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;content&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Additionally, the &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/usage/chat-completion/&quot;&gt;OpenAI Compatible endpoint&lt;/a&gt; can be combined with our &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/usage/universal/&quot;&gt;Universal Endpoint&lt;/a&gt; to add fallbacks across multiple providers. That means AI Gateway will return every response in the same standardized format, no extra parsing logic required!&lt;/p&gt;
&lt;p&gt;Learn more in the &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/usage/chat-completion/&quot;&gt;OpenAI Compatibility&lt;/a&gt; documentation.&lt;/p&gt;</description><pubDate>Tue, 03 Jun 2025 00:00:00 GMT</pubDate><product>AI Gateway</product><category>AI Gateway</category></item><item><title>Workers - View an architecture diagram of your Worker directly in the Cloudflare dashboard</title><link>https://developers.cloudflare.com/changelog/post/2025-06-03-visualize-your-worker-architecture/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-06-03-visualize-your-worker-architecture/</guid><description>&lt;p&gt;You can now visualize, explore and modify your Worker’s architecture directly in the Cloudflare dashboard, making it easier to understand how your application connects to Cloudflare resources like &lt;a href=&quot;https://developers.cloudflare.com/d1&quot;&gt;D1 databases&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/durable-objects&quot;&gt;Durable Objects&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/kv&quot;&gt;KV namespaces&lt;/a&gt;, and &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/bindings/&quot;&gt;more&lt;/a&gt;.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/bindings-canvas.CszRUVlh_1ytnrB.webp&quot; alt=&quot;Bindings canvas&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;With this new view, you can easily:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Explore existing bindings in a visual, architecture-style diagram&lt;/li&gt;
&lt;li&gt;Add and manage bindings directly from the same interface&lt;/li&gt;
&lt;li&gt;Discover the full range of compute, storage, AI, and media resources you can attach to your Workers application.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To get started, head to the &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers-and-pages&quot; target=&quot;_blank&quot;&gt;Cloudflare dashboard&lt;/a&gt; and open the &lt;strong&gt;Bindings&lt;/strong&gt; tab of any Workers application.&lt;/p&gt;</description><pubDate>Tue, 03 Jun 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Pages - Cloudflare Pages builds now provide Node.js v22 by default</title><link>https://developers.cloudflare.com/changelog/post/2025-05-30-pages-build-image-v3/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-05-30-pages-build-image-v3/</guid><description>&lt;p&gt;When you use the built-in build system that is part of &lt;a href=&quot;https://developers.cloudflare.com/pages/&quot;&gt;Cloudflare Pages&lt;/a&gt;, the &lt;a href=&quot;https://developers.cloudflare.com/pages/configuration/build-image/&quot;&gt;Build Image&lt;/a&gt; now includes Node.js v22. Previously, Node.js v18 was provided by default, and Node.js v18 is now end-of-life (EOL).&lt;/p&gt;
&lt;p&gt;If you are creating a new Pages project, the new V3 build image that includes Node.js v22 will be used by default. If you have an existing Pages project, you can update to the latest build image by navigating to Settings &gt; Build &amp;#x26; deployments &gt; Build system version in the Cloudflare dashboard for a specific Pages project.&lt;/p&gt;
&lt;p&gt;Note that you can always specify a particular version of Node.js or other built-in dependencies by &lt;a href=&quot;https://developers.cloudflare.com/pages/configuration/build-image/#override-default-versions&quot;&gt;setting an environment variable&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For more, refer to the &lt;a href=&quot;https://developers.cloudflare.com/pages/configuration/build-image&quot;&gt;developer docs for Cloudflare Pages builds&lt;/a&gt;&lt;/p&gt;</description><pubDate>Fri, 30 May 2025 00:00:00 GMT</pubDate><product>Pages</product><category>Pages</category></item><item><title>Workers - Debug, profile, and view logs for your Worker in Chrome Devtools — now supported in the Cloudflare Vite plugin</title><link>https://developers.cloudflare.com/changelog/post/2025-05-21-vite-plugin-chrome-devtools/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-05-21-vite-plugin-chrome-devtools/</guid><description>&lt;p&gt;You can now &lt;a href=&quot;https://developers.cloudflare.com/workers/observability/dev-tools/&quot; target=&quot;_blank&quot;&gt;debug, profile, view logs, and analyze memory usage for your Worker&lt;/a&gt; using &lt;a href=&quot;https://developer.chrome.com/docs/devtools&quot; target=&quot;_blank&quot;&gt;Chrome Devtools&lt;/a&gt; when your Worker runs locally using the &lt;a href=&quot;https://developers.cloudflare.com/workers/vite-plugin/&quot; target=&quot;_blank&quot;&gt;Cloudflare Vite plugin&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Previously, this was only possible if your Worker ran locally using the &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/&quot; target=&quot;_blank&quot;&gt;Wrangler CLI&lt;/a&gt;, and now you can do all the same things if your Worker uses &lt;a href=&quot;https://vite.dev/&quot; target=&quot;_blank&quot;&gt;Vite&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When you run &lt;code&gt;vite&lt;/code&gt;, you&apos;ll now see a debug URL in your console:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;plaintext&quot;&gt;&lt;code class=&quot;language-plaintext&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;VITE v6.3.5  ready in 461 ms&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;➜  Local:   http://localhost:5173/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;➜  Network: use --host to expose&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;➜  Debug:   http://localhost:5173/__debug&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;➜  press h + enter to show help&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Open the URL in Chrome, and an instance of Chrome Devtools will open and connect to your Worker running locally. You can then use Chrome Devtools to debug and introspect performance issues. For example, you can navigate to the Performance tab to understand where CPU time is spent in your Worker:&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/profile.Dz8PUp_K_Z16J4tW.webp&quot; alt=&quot;CPU Profile&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;For more information on how to get the most out of Chrome Devtools, refer to the following docs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/observability/dev-tools/breakpoints/&quot;&gt;Debug code by setting breakpoints&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/observability/dev-tools/cpu-usage/&quot;&gt;Profile CPU usage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/observability/dev-tools/memory-usage/&quot;&gt;Observe memory usage and debug memory leaks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Fri, 30 May 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>D1, Workers - 50-500ms Faster D1 REST API Requests</title><link>https://developers.cloudflare.com/changelog/post/2025-05-30-d1-rest-api-latency/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-05-30-d1-rest-api-latency/</guid><description>&lt;p&gt;Users using Cloudflare&apos;s &lt;a href=&quot;https://developers.cloudflare.com/api/resources/d1/&quot;&gt;REST API&lt;/a&gt; to query their D1 database can see lower end-to-end request latency now that D1 authentication is performed at the closest Cloudflare network data center that received the request. Previously, authentication required D1 REST API requests to proxy to Cloudflare&apos;s core, centralized data centers, which added network round trips and latency.&lt;/p&gt;
&lt;p&gt;Latency improvements range from 50-500 ms depending on request location and &lt;a href=&quot;https://developers.cloudflare.com/d1/configuration/data-location/&quot;&gt;database location&lt;/a&gt; and only apply to the REST API. REST API requests and databases outside the United States see a bigger benefit since Cloudflare&apos;s primary core data centers reside in the United States.&lt;/p&gt;
&lt;p&gt;D1 query endpoints like &lt;code&gt;/query&lt;/code&gt; and &lt;code&gt;/raw&lt;/code&gt; have the most noticeable improvements since they no longer access Cloudflare&apos;s core data centers. D1 control plane endpoints such as those to create and delete databases see smaller improvements, since they still require access to Cloudflare&apos;s core data centers for other control plane metadata.&lt;/p&gt;</description><pubDate>Thu, 29 May 2025 00:00:00 GMT</pubDate><product>D1</product><category>D1</category><category>Workers</category></item><item><title>Browser Rendering - Playwright MCP server is now compatible with Browser Rendering</title><link>https://developers.cloudflare.com/changelog/post/2025-05-28-playwright-mcp/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-05-28-playwright-mcp/</guid><description>&lt;p&gt;We&apos;re excited to share that you can now use the &lt;a href=&quot;https://github.com/cloudflare/playwright-mcp&quot; target=&quot;_blank&quot;&gt;Playwright MCP&lt;/a&gt; server with Browser Rendering.&lt;/p&gt;
&lt;p&gt;Once you &lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/playwright/playwright-mcp/#deploying&quot;&gt;deploy the server&lt;/a&gt;, you can use any MCP client with it to interact with Browser Rendering. This allows you to run AI models that can automate browser tasks, such as taking screenshots, filling out forms, or scraping data.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/playground-ai-screenshot.v44jFMBu_Z1xgc6e.webp&quot; alt=&quot;Access Analytics&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;Playwright MCP is available as an npm package at &lt;a href=&quot;https://www.npmjs.com/package/@cloudflare/playwright-mcp&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;@cloudflare/playwright-mcp&lt;/code&gt;&lt;/a&gt;. To install it, type:&lt;/p&gt;
 &lt;div&gt; &lt;div&gt;  &lt;/div&gt; &lt;div&gt; &lt;div&gt;  &lt;pre&gt;&lt;code class=&quot;astro-qph66ij4&quot;&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; i -D @cloudflare/playwright-mcp&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;/div&gt; &lt;/div&gt;&lt;div&gt; &lt;div&gt;  &lt;pre&gt;&lt;code class=&quot;astro-qph66ij4&quot;&gt;&lt;span&gt;yarn&lt;/span&gt;&lt;span&gt; add -D @cloudflare/playwright-mcp&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;/div&gt; &lt;/div&gt;&lt;div&gt; &lt;div&gt;  &lt;pre&gt;&lt;code class=&quot;astro-qph66ij4&quot;&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; add -D @cloudflare/playwright-mcp&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;/div&gt; &lt;/div&gt;&lt;div&gt; &lt;div&gt;  &lt;pre&gt;&lt;code class=&quot;astro-qph66ij4&quot;&gt;&lt;span&gt;bun&lt;/span&gt;&lt;span&gt; add -d @cloudflare/playwright-mcp&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;/div&gt; &lt;/div&gt;  &lt;/div&gt;  
&lt;p&gt;Deploying the server is then as easy as:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;cloudflare:workers&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;createMcpAgent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@cloudflare/playwright-mcp&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;PlaywrightMCP&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;createMcpAgent&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;BROWSER&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;PlaywrightMCP&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;mount&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;/sse&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Check out the full code at &lt;a href=&quot;https://github.com/cloudflare/playwright-mcp&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Learn more about Playwright MCP in our &lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/playwright/playwright-mcp/&quot;&gt;documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 28 May 2025 00:00:00 GMT</pubDate><product>Browser Rendering</product><category>Browser Rendering</category></item><item><title>Workers - Handle incoming request cancellation in Workers with Request.signal</title><link>https://developers.cloudflare.com/changelog/post/2025-05-22-handle-request-cancellation/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-05-22-handle-request-cancellation/</guid><description>&lt;p&gt;In Cloudflare Workers, you can now attach an event listener to &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/request/&quot;&gt;&lt;code&gt;Request&lt;/code&gt;&lt;/a&gt; objects, using the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Request/signal&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;signal&lt;/code&gt; property&lt;/a&gt;. This allows you to perform tasks when the request to your Worker is canceled by the client. To use this feature, you must set the &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/compatibility-flags/#enable-requestsignal-for-incoming-requests&quot;&gt;&lt;code&gt;enable_request_signal&lt;/code&gt;&lt;/a&gt; compatibility flag.&lt;/p&gt;
&lt;p&gt;You can use a listener to perform cleanup tasks or write to logs before your Worker&apos;s invocation ends. For example, if you run the Worker below, and then abort the request from the client, a log will be written:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// This sets up an event listener that will be called if the client disconnects from your&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// worker.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;signal&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;addEventListener&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;abort&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;The request was aborted!&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;readable&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;writable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;IdentityTransformStream&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;sendPing&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;writable&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;readable&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Content-Type&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;text/plain&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sendPing&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;writable&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;writer&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;writable&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getWriter&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;enc&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;TextEncoder&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;;;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Send &apos;ping&apos; every second to keep the connection alive&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;writer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;write&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;enc&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;encode&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;ping&lt;/span&gt;&lt;span&gt;\r\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;scheduler&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;wait&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1000&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Promise&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// This sets up an event listener that will be called if the client disconnects from your&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// worker.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;signal&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;addEventListener&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;abort&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;The request was aborted!&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;readable&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;writable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;IdentityTransformStream&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;sendPing&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;writable&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;readable&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; headers&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;Content-Type&apos;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;text/plain&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;satisfies&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ExportedHandler&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Env&lt;/span&gt;&lt;span&gt;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sendPing&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;writable&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;WritableStream&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Promise&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;writer&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;writable&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getWriter&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;enc&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;TextEncoder&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;;;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Send &apos;ping&apos; every second to keep the connection alive&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;writer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;write&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;enc&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;encode&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;ping&lt;/span&gt;&lt;span&gt;\r\n&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;scheduler&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;wait&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1000&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;For more information see the &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/request&quot;&gt;&lt;code&gt;Request&lt;/code&gt; documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 22 May 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers, Durable Objects - Durable Objects are now supported in Python Workers</title><link>https://developers.cloudflare.com/changelog/post/2025-05-14-python-worker-durable-object/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-05-14-python-worker-durable-object/</guid><description>&lt;p&gt;You can now create &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/&quot;&gt;Durable Objects&lt;/a&gt; using
&lt;a href=&quot;https://developers.cloudflare.com/workers/languages/python/&quot;&gt;Python Workers&lt;/a&gt;. A Durable Object is a special kind of
Cloudflare Worker which uniquely combines compute with storage, enabling stateful
long-running applications which run close to your users. For more info see
&lt;a href=&quot;https://developers.cloudflare.com/durable-objects/concepts/what-are-durable-objects/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can define a Durable Object in Python in a similar way to JavaScript:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; workers &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; DurableObject&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; Response&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; WorkerEntrypoint&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; urllib&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;parse &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; urlparse&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyDurableObject&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;DurableObject&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;__init__&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ctx &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; ctx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;env &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; env&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;result &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;storage&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sql&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;exec&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;SELECT &apos;Hello, World!&apos; as greeting&quot;&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;one&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;greeting&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Default&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;WorkerEntrypoint&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;url &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;urlparse&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;MY_DURABLE_OBJECT&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;idFromName&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;stub &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;MY_DURABLE_OBJECT&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;greeting &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; stub&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; greeting&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Define the Durable Object in your Wrangler configuration file:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;wrangler.jsonc&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;jsonc&quot;&gt;&lt;code class=&quot;language-jsonc&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;durable_objects&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;bindings&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;MY_DURABLE_OBJECT&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;class_name&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;MyDurableObject&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;wrangler.toml&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;toml&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[[&lt;/span&gt;&lt;span&gt;durable_objects&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;bindings&lt;/span&gt;&lt;span&gt;]]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;MY_DURABLE_OBJECT&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;class_name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;MyDurableObject&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;Then define the storage backend for your Durable Object:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;wrangler.jsonc&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;jsonc&quot;&gt;&lt;code class=&quot;language-jsonc&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;migrations&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;tag&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;v1&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// Should be unique for each entry&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;new_sqlite_classes&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// Array of new classes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;MyDurableObject&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;wrangler.toml&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;toml&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[[&lt;/span&gt;&lt;span&gt;migrations&lt;/span&gt;&lt;span&gt;]]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;tag&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;v1&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;new_sqlite_classes&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;MyDurableObject&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;Then test your new Durable Object locally by running &lt;code&gt;wrangler dev&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;plaintext&quot;&gt;&lt;code class=&quot;language-plaintext&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npx wrangler dev&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Consult the &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/&quot;&gt;Durable Objects documentation&lt;/a&gt; for more details.&lt;/p&gt;</description><pubDate>Fri, 16 May 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category><category>Durable Objects</category></item><item><title>Hyperdrive - Hyperdrive achieves FedRAMP Moderate-Impact Authorization</title><link>https://developers.cloudflare.com/changelog/post/2025-05-14-hyperdrive-fedramp/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-05-14-hyperdrive-fedramp/</guid><description>&lt;p&gt;Hyperdrive has been approved for FedRAMP Authorization and is now available in the &lt;a href=&quot;https://marketplace.fedramp.gov/products/FR2000863987&quot; target=&quot;_blank&quot;&gt;FedRAMP Marketplace&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;FedRAMP is a U.S. government program that provides standardized assessment and authorization for cloud products and services. As a result of this product update,
Hyperdrive has been approved as an authorized service to be used by U.S. federal agencies at the Moderate Impact level.&lt;/p&gt;
&lt;p&gt;For detailed information regarding FedRAMP and its implications, please refer to the &lt;a href=&quot;https://marketplace.fedramp.gov/products/FR2000863987&quot; target=&quot;_blank&quot;&gt;official FedRAMP documentation for Cloudflare&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 14 May 2025 00:00:00 GMT</pubDate><product>Hyperdrive</product><category>Hyperdrive</category></item><item><title>Stream - Introducing Origin Restrictions for Media Transformations</title><link>https://developers.cloudflare.com/changelog/post/2025-05-14-media-transformations-origin-restrictions/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-05-14-media-transformations-origin-restrictions/</guid><description>&lt;p&gt;We are adding &lt;a href=&quot;https://developers.cloudflare.com/stream/transform-videos/sources/&quot;&gt;source origin restrictions&lt;/a&gt; to
the Media Transformations beta. This allows customers to restrict what sources
can be used to fetch images and video for transformations. This feature is the
same as --- and uses the same settings as ---
&lt;a href=&quot;https://developers.cloudflare.com/images/transform-images/sources/&quot;&gt;Image Transformations sources&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When transformations is first enabled, the default setting only allows
transformations on images and media from the same website or domain being used to make
the transformation request. In other words, by default, requests to
&lt;code&gt;example.com/cdn-cgi/media&lt;/code&gt; can only reference originals on &lt;code&gt;example.com&lt;/code&gt;.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/allowed-origins.4hu5lHws_ZsjEgI.webp&quot; alt=&quot;Enable allowed origins from the Cloudflare dashboard&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;Adding access to other sources, or allowing any source,
&lt;a href=&quot;https://developers.cloudflare.com/images/transform-images/sources/&quot;&gt;is easy to do&lt;/a&gt;
in the &lt;strong&gt;Transformations&lt;/strong&gt; tab under &lt;strong&gt;Stream&lt;/strong&gt;. Click each domain enabled for
Transformations and set its sources list to match the needs of your content. The
user making this change will need permission to edit zone settings.&lt;/p&gt;
&lt;p&gt;For more information, learn about &lt;a href=&quot;https://developers.cloudflare.com/stream/transform-videos/&quot;&gt;Transforming Videos&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 14 May 2025 00:00:00 GMT</pubDate><product>Stream</product><category>Stream</category></item><item><title>Queues - Publish messages to Queues directly via HTTP</title><link>https://developers.cloudflare.com/changelog/post/2025-05-09-publish-to-queues-via-http/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-05-09-publish-to-queues-via-http/</guid><description>&lt;p&gt;You can now publish messages to &lt;a href=&quot;https://developers.cloudflare.com/queues/&quot;&gt;Cloudflare Queues&lt;/a&gt; directly via HTTP from any service or programming language that supports sending HTTP requests. Previously, publishing to queues was only possible from within &lt;a href=&quot;https://developers.cloudflare.com/workers/&quot;&gt;Cloudflare Workers&lt;/a&gt;. You can already consume from queues via Workers or &lt;a href=&quot;https://developers.cloudflare.com/queues/configuration/pull-consumers/&quot;&gt;HTTP pull consumers&lt;/a&gt;, and now publishing is just as flexible.&lt;/p&gt;
&lt;p&gt;Publishing via HTTP requires a &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/api/get-started/create-token/&quot;&gt;Cloudflare API token&lt;/a&gt; with &lt;code&gt;Queues Edit&lt;/code&gt; permissions for authentication. Here&apos;s a simple example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;https://api.cloudflare.com/client/v4/accounts/&amp;#x3C;account_id&gt;/queues/&amp;#x3C;queue_id&gt;/messages&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-X&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;POST&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-H&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;Authorization: Bearer &amp;#x3C;api_token&gt;&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--data&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;{ &quot;body&quot;: { &quot;greeting&quot;: &quot;hello&quot;, &quot;timestamp&quot;:  &quot;2025-07-24T12:00:00Z&quot;} }&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;You can also use our &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/api/reference/sdks/&quot;&gt;SDKs&lt;/a&gt; for TypeScript, Python, and Go.&lt;/p&gt;
&lt;p&gt;To get started with HTTP publishing, check out our &lt;a href=&quot;https://developers.cloudflare.com/queues/examples/publish-to-a-queue-via-http/&quot;&gt;step-by-step example&lt;/a&gt; and the full API documentation in our &lt;a href=&quot;https://developers.cloudflare.com/api/resources/queues/subresources/messages/methods/push/&quot;&gt;API reference&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 09 May 2025 12:00:00 GMT</pubDate><product>Queues</product><category>Queues</category></item><item><title>Workers - Improved memory efficiency for WebAssembly Workers</title><link>https://developers.cloudflare.com/changelog/post/2025-05-08-finalization-registry/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-05-08-finalization-registry/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/FinalizationRegistry&quot; target=&quot;_blank&quot;&gt;FinalizationRegistry&lt;/a&gt; is now available in Workers. You can opt-in using the &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/compatibility-flags/#enable-finalizationregistry-and-weakref&quot;&gt;&lt;code&gt;enable_weak_ref&lt;/code&gt;&lt;/a&gt; compatibility flag.&lt;/p&gt;
&lt;p&gt;This can reduce memory leaks when using WebAssembly-based Workers, which includes &lt;a href=&quot;https://developers.cloudflare.com/workers/languages/python/&quot;&gt;Python Workers&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/workers/languages/rust/&quot;&gt;Rust Workers&lt;/a&gt;. The FinalizationRegistry works by enabling toolchains such as &lt;a href=&quot;https://emscripten.org/&quot; target=&quot;_blank&quot;&gt;Emscripten&lt;/a&gt; and &lt;a href=&quot;https://rustwasm.github.io/wasm-bindgen/&quot; target=&quot;_blank&quot;&gt;wasm-bindgen&lt;/a&gt; to automatically free WebAssembly heap allocations. If you are using WASM and seeing Exceeded Memory errors and cannot determine a cause using &lt;a href=&quot;https://developers.cloudflare.com/workers/observability/dev-tools/memory-usage/&quot;&gt;memory profiling&lt;/a&gt;, you may want to enable the FinalizationRegistry.&lt;/p&gt;
&lt;p&gt;For more information refer to the &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/compatibility-flags/#enable-finalizationregistry-and-weakref&quot;&gt;&lt;code&gt;enable_weak_ref&lt;/code&gt;&lt;/a&gt; compatibility flag documentation.&lt;/p&gt;</description><pubDate>Thu, 08 May 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>R2 - R2 Dashboard experience gets new updates</title><link>https://developers.cloudflare.com/changelog/post/2025-05-01-r2-dashboard-updates/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-05-01-r2-dashboard-updates/</guid><description>&lt;p&gt;We&apos;re excited to announce several improvements to the &lt;a href=&quot;https://developers.cloudflare.com/r2/&quot;&gt;Cloudflare R2&lt;/a&gt; dashboard experience that make managing your object storage easier and more intuitive:&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/r2-dashboard-updates.B7WXxzMk_Z2vfGut.webp&quot; alt=&quot;Cloudflare R2 Dashboard&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;h4&gt;All-new settings page&lt;/h4&gt;
&lt;p&gt;We&apos;ve redesigned the bucket settings page, giving you a centralized location to manage all your bucket configurations in one place.&lt;/p&gt;
&lt;h4&gt;Improved navigation and sharing&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Deeplink support for prefix directories: Navigate through your bucket hierarchy without losing your state. Your browser&apos;s back button now works as expected, and you can share direct links to specific prefix directories with teammates.&lt;/li&gt;
&lt;li&gt;Objects as clickable links: Objects are now proper links that you can copy or &lt;code&gt;CMD + Click&lt;/code&gt; to open in a new tab.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Clearer public access controls&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Renamed &quot;r2.dev domain&quot; to &quot;Public Development URL&quot; for better clarity when exposing bucket contents for non-production workloads.&lt;/li&gt;
&lt;li&gt;Public Access status now clearly displays &quot;Enabled&quot; when your bucket is exposed to the internet (via Public Development URL or Custom Domains).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We&apos;ve also made numerous other usability improvements across the board to make your R2 experience smoother and more productive.&lt;/p&gt;</description><pubDate>Thu, 01 May 2025 00:00:00 GMT</pubDate><product>R2</product><category>R2</category></item><item><title>Workers - Cron triggers are now supported in Python Workers</title><link>https://developers.cloudflare.com/changelog/post/2025-04-22-python-worker-cron-triggers/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-04-22-python-worker-cron-triggers/</guid><description>&lt;p&gt;You can now create Python Workers which are executed via a cron trigger.&lt;/p&gt;
&lt;p&gt;This is similar to how it&apos;s done in JavaScript Workers, simply define a scheduled event
listener in your Worker:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; workers &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; handler&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;handler&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;on_scheduled&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;cron processed&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Define a cron trigger configuration in your Wrangler configuration file:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;wrangler.jsonc&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;jsonc&quot;&gt;&lt;code class=&quot;language-jsonc&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;triggers&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Schedule cron triggers:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// - At every 3rd minute&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// - At 15:00 (UTC) on first day of the month&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// - At 23:59 (UTC) on the last weekday of the month&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;crons&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;*/3 * * * *&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;0 15 1 * *&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;59 23 LW * *&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;wrangler.toml&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;toml&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;triggers&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;crons&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;*/3 * * * *&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;0 15 1 * *&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;59 23 LW * *&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;Then test your new handler by using Wrangler with the &lt;code&gt;--test-scheduled&lt;/code&gt; flag and
making a request to &lt;code&gt;/cdn-cgi/handler/scheduled?cron=*+*+*+*+*&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dev&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--test-scheduled&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;http://localhost:8787/cdn-cgi/handler/scheduled?cron=*+*+*+*+*&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Consult the &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/cron-triggers/&quot;&gt;Workers Cron Triggers page&lt;/a&gt; for full details on cron triggers in Workers.&lt;/p&gt;</description><pubDate>Thu, 24 Apr 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>AI Search - Metadata filtering and multitenancy support in AutoRAG</title><link>https://developers.cloudflare.com/changelog/post/2025-04-23-autorag-metadata-filtering/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-04-23-autorag-metadata-filtering/</guid><description>&lt;p&gt;You can now filter &lt;a href=&quot;https://developers.cloudflare.com/ai-search/&quot;&gt;AutoRAG&lt;/a&gt; search results by &lt;code&gt;folder&lt;/code&gt; and &lt;code&gt;timestamp&lt;/code&gt; using &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/metadata&quot;&gt;metadata filtering&lt;/a&gt; to narrow down the scope of your query.&lt;/p&gt;
&lt;p&gt;This makes it easy to build &lt;a href=&quot;https://developers.cloudflare.com/ai-search/how-to/multitenancy/&quot;&gt;multitenant experiences&lt;/a&gt; where each user can only access their own data. By organizing your content into per-tenant folders and applying a &lt;code&gt;folder&lt;/code&gt; filter at query time, you ensure that each tenant retrieves only their own documents.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example folder structure:&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;customer-a/logs/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;customer-a/contracts/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;customer-b/contracts/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Example query:&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AI&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;autorag&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;my-autorag&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;search&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;query&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;When did I sign my agreement contract?&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;filters&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;eq&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;folder&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;customer-a/contracts/&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;You can use metadata filtering by creating a new AutoRAG or reindexing existing data. To reindex all content in an existing AutoRAG, update any chunking setting and select &lt;strong&gt;Sync index&lt;/strong&gt;. Metadata filtering is available for all data indexed on or after &lt;strong&gt;April 21, 2025&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;If you are new to AutoRAG, get started with the &lt;a href=&quot;https://developers.cloudflare.com/ai-search/get-started/&quot;&gt;Get started AutoRAG guide&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 23 Apr 2025 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>Queues - Increased limits for Queues pull consumers</title><link>https://developers.cloudflare.com/changelog/post/2025-04-17-pull-consumer-limits/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-04-17-pull-consumer-limits/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/queues/configuration/pull-consumers/&quot;&gt;Queues pull consumers&lt;/a&gt; can now pull and acknowledge up to &lt;strong&gt;5,000 messages / second per queue&lt;/strong&gt;. Previously, pull consumers were rate limited to 1,200 requests / 5 minutes, aggregated across all queues.&lt;/p&gt;
&lt;p&gt;Pull consumers allow you to consume messages over HTTP from any environment—including outside of &lt;a href=&quot;https://developers.cloudflare.com/workers&quot;&gt;Cloudflare Workers&lt;/a&gt;. They’re also useful when you need fine-grained control over how quickly messages are consumed.&lt;/p&gt;
&lt;p&gt;To setup a new queue with a pull based consumer using &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/&quot;&gt;Wrangler&lt;/a&gt;, run:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;queues&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-queue&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;queues&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;consumer&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;http&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-queue&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;You can also configure a pull consumer using the &lt;a href=&quot;https://developers.cloudflare.com/api/resources/queues/subresources/consumers/methods/create/&quot;&gt;REST API&lt;/a&gt; or the Queues dashboard.&lt;/p&gt;
&lt;p&gt;Once configured, you can pull messages from the queue using any HTTP client. You&apos;ll need a &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/api/get-started/create-token/&quot;&gt;Cloudflare API Token&lt;/a&gt; with &lt;code&gt;queues_read&lt;/code&gt; and &lt;code&gt;queues_write&lt;/code&gt; permissions. For example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;https://api.cloudflare.com/client/v4/accounts/&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;CF_ACCOUNT_ID&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/queues/&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;QUEUE_ID&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/messages/pull&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;--header &lt;/span&gt;&lt;span&gt;&quot;Authorization: Bearer &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;API_TOKEN&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;--header &lt;/span&gt;&lt;span&gt;&quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;--data &lt;/span&gt;&lt;span&gt;&apos;{ &quot;visibility_timeout&quot;: 10000, &quot;batch_size&quot;: 2 }&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;To learn more about how to acknowledge messages, pull batches at once, and setup multiple consumers, refer to the &lt;a href=&quot;https://developers.cloudflare.com/queues/configuration/pull-consumers&quot;&gt;pull consumer documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As always, Queues doesn&apos;t charge for data egress. Pull operations continue to be billed at the &lt;a href=&quot;https://developers.cloudflare.com/queues/platform/pricing&quot;&gt;existing rate&lt;/a&gt;, of $0.40 / million operations. The increased limits are available now, on all new and existing queues. If you&apos;re new to Queues, &lt;a href=&quot;https://developers.cloudflare.com/queues/get-started&quot;&gt;get started with the Cloudflare Queues guide&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 17 Apr 2025 12:00:00 GMT</pubDate><product>Queues</product><category>Queues</category></item><item><title>KV - Read multiple keys from Workers KV with bulk reads</title><link>https://developers.cloudflare.com/changelog/post/2025-04-10-kv-bulk-reads/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-04-10-kv-bulk-reads/</guid><description>&lt;p&gt;You can now retrieve up to 100 keys in a single bulk read request made to Workers KV using the binding.&lt;/p&gt;
&lt;p&gt;This makes it easier to request multiple KV pairs within a single Worker invocation. Retrieving many key-value pairs using the bulk read operation is more performant than making individual requests since bulk read operations are not affected by &lt;a href=&quot;https://developers.cloudflare.com/workers/platform/limits/#simultaneous-open-connections&quot;&gt;Workers simultaneous connection limits&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Read single key&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;key-a&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;NAMESPACE&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Read multiple keys&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;keys&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;key-a&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;key-b&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;key-c&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;// up to 100 keys&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;values&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Map&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;NAMESPACE&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;keys&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Print the value of &quot;key-a&quot; to the console.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`The first key is &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;values&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;key-a&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;.`&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Consult the &lt;a href=&quot;https://developers.cloudflare.com/kv/api/read-key-value-pairs/&quot;&gt;Workers KV Read key-value pairs API&lt;/a&gt; for full details on Workers KV&apos;s new bulk reads support.&lt;/p&gt;</description><pubDate>Thu, 17 Apr 2025 00:00:00 GMT</pubDate><product>KV</product><category>KV</category></item><item><title>Workers, Workers for Platforms - Fixed and documented Workers Routes and Secrets API</title><link>https://developers.cloudflare.com/changelog/post/2025-04-15-workers-api-fixes/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-04-15-workers-api-fixes/</guid><description>&lt;h4&gt;Workers Routes API&lt;/h4&gt;
&lt;p&gt;Previously, a request to the Workers &lt;a href=&quot;https://developers.cloudflare.com/api/resources/workers/subresources/routes/methods/create/&quot;&gt;Create Route API&lt;/a&gt; always returned &lt;code&gt;null&lt;/code&gt; for &quot;script&quot; and an empty string for &quot;pattern&quot; even if the request was successful.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://api.cloudflare.com/client/v4/zones/&lt;/span&gt;&lt;span&gt;$CF_ACCOUNT_ID&lt;/span&gt;&lt;span&gt;/workers/routes&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;-X &lt;/span&gt;&lt;span&gt;PUT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;-H &lt;/span&gt;&lt;span&gt;&quot;Authorization: Bearer &lt;/span&gt;&lt;span&gt;$CF_API_TOKEN&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;-H &lt;/span&gt;&lt;span&gt;&apos;Content-Type: application/json&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;--data &lt;/span&gt;&lt;span&gt;&apos;{ &quot;pattern&quot;: &quot;example.com/*&quot;, &quot;script&quot;: &quot;hello-world-script&quot; }&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;bf153a27ba2b464bb9f04dcf75de1ef9&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;pattern&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;request_limit_fail_open&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;success&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;errors&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;messages&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Now, it properly returns all values!&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;bf153a27ba2b464bb9f04dcf75de1ef9&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;pattern&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;example.com/*&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;hello-world-script&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;request_limit_fail_open&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;success&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;errors&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;messages&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Workers Secrets API&lt;/h4&gt;
&lt;p&gt;The &lt;a href=&quot;https://developers.cloudflare.com/api/resources/workers/subresources/scripts/subresources/secrets/&quot;&gt;Workers&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/api/resources/workers_for_platforms/subresources/dispatch/subresources/namespaces/subresources/scripts/subresources/secrets/&quot;&gt;Workers for Platforms&lt;/a&gt; secrets APIs are now properly documented in the Cloudflare OpenAPI docs. Previously, these endpoints were not publicly documented, leaving users confused on how to directly manage their secrets via the API. Now, you can find the proper endpoints in our public documentation, as well as in our API Library SDKs such as &lt;a href=&quot;https://github.com/cloudflare/cloudflare-typescript&quot; target=&quot;_blank&quot;&gt;cloudflare-typescript&lt;/a&gt; (&gt;4.2.0) and &lt;a href=&quot;https://github.com/cloudflare/cloudflare-python&quot; target=&quot;_blank&quot;&gt;cloudflare-python&lt;/a&gt; (&gt;4.1.0).&lt;/p&gt;
&lt;p&gt;Note the &lt;code&gt;cloudflare_workers_secret&lt;/code&gt; and &lt;code&gt;cloudflare_workers_for_platforms_script_secret&lt;/code&gt; &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs&quot; target=&quot;_blank&quot;&gt;Terraform resources&lt;/a&gt; are being removed in a future release. This resource is not recommended for managing secrets. Users should instead use the:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/resources/secrets_store/&quot;&gt;Secrets Store&lt;/a&gt; with the &quot;Secrets Store Secret&quot; binding on Workers and Workers for Platforms Script Upload&lt;/li&gt;
&lt;li&gt;&quot;Secret Text&quot; Binding on &lt;a href=&quot;https://developers.cloudflare.com/api/resources/workers/subresources/scripts/methods/update/&quot;&gt;Workers Script Upload&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/api/resources/workers_for_platforms/subresources/dispatch/subresources/namespaces/subresources/scripts/methods/update/&quot;&gt;Workers for Platforms Script Upload&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Workers (and WFP) Secrets API&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Tue, 15 Apr 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category><category>Workers for Platforms</category></item><item><title>Stream - Signed URLs and Infrastructure Improvements on Stream Live WebRTC Beta</title><link>https://developers.cloudflare.com/changelog/post/2025-04-14-webrtc-beta-signed-urls/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-04-14-webrtc-beta-signed-urls/</guid><description>&lt;p&gt;Cloudflare &lt;a href=&quot;https://developers.cloudflare.com/stream/&quot;&gt;Stream&lt;/a&gt; has completed an infrastructure upgrade for our &lt;a href=&quot;https://developers.cloudflare.com/stream/webrtc-beta/&quot;&gt;Live WebRTC beta&lt;/a&gt; support which brings increased scalability and improved playback performance to all customers. WebRTC allows broadcasting directly from a browser (or supported WHIP client) with ultra-low latency to tens of thousands of concurrent viewers across the globe.&lt;/p&gt;
&lt;p&gt;Additionally, as part of this upgrade, the WebRTC beta now supports Signed URLs to protect playback, just like our standard live stream options (HLS/DASH).&lt;/p&gt;
&lt;p&gt;For more information, learn about the &lt;a href=&quot;https://developers.cloudflare.com/stream/webrtc-beta/&quot;&gt;Stream Live WebRTC beta&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 11 Apr 2025 00:00:00 GMT</pubDate><product>Stream</product><category>Stream</category></item><item><title>Workers AI - Workers AI for Developer Week - faster inference, new models, async batch API, expanded LoRA support</title><link>https://developers.cloudflare.com/changelog/post/2025-04-11-new-models-faster-inference/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-04-11-new-models-faster-inference/</guid><description>&lt;p&gt;Happy Developer Week 2025! Workers AI is excited to announce a couple of new features and improvements available today. Check out our &lt;a href=&quot;https://blog.cloudflare.com/workers-ai-improvements&quot; target=&quot;_blank&quot;&gt;blog&lt;/a&gt; for all the announcement details.&lt;/p&gt;
&lt;h4&gt;Faster inference + New models&lt;/h4&gt;
&lt;p&gt;We’re rolling out some in-place improvements to our models that can help speed up inference by 2-4x! Users of the models below will enjoy an automatic speed boost starting today:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/llama-3.3-70b-instruct-fp8-fast/&quot;&gt;&lt;code&gt;@cf/meta/llama-3.3-70b-instruct-fp8-fast&lt;/code&gt;&lt;/a&gt; gets a speed boost of 2-4x, leveraging techniques like speculative decoding, prefix caching, and an updated inference backend.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/bge-small-en-v1.5/&quot;&gt;&lt;code&gt;@cf/baai/bge-small-en-v1.5&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/bge-base-en-v1.5/&quot;&gt;&lt;code&gt;@cf/baai/bge-base-en-v1.5&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/bge-large-en-v1.5/&quot;&gt;&lt;code&gt;@cf/baai/bge-large-en-v1.5&lt;/code&gt;&lt;/a&gt; get an updated back end, which should improve inference times by 2x.
&lt;ul&gt;
&lt;li&gt;With the &lt;code&gt;bge&lt;/code&gt; models, we’re also announcing a new parameter called &lt;code&gt;pooling&lt;/code&gt; which can take &lt;code&gt;cls&lt;/code&gt; or &lt;code&gt;mean&lt;/code&gt; as options. We highly recommend using &lt;code&gt;pooling: cls&lt;/code&gt; which will help generate more accurate embeddings. However, embeddings generated with cls pooling are not backwards compatible with mean pooling. For this to not be a breaking change, the default remains as mean pooling. Please specify &lt;code&gt;pooling: cls&lt;/code&gt; to enjoy more accurate embeddings going forward.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We’re also excited to launch a few new models in our catalog to help round out your experience with Workers AI. We’ll be deprecating some older models in the future, so stay tuned for a deprecation announcement. Today’s new models include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/mistral-small-3.1-24b-instruct/&quot;&gt;&lt;code&gt;@cf/mistralai/mistral-small-3.1-24b-instruct&lt;/code&gt;&lt;/a&gt;: a 24B parameter model achieving state-of-the-art capabilities comparable to larger models, with support for vision and tool calling.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/gemma-3-12b-it/&quot;&gt;&lt;code&gt;@cf/google/gemma-3-12b-it&lt;/code&gt;&lt;/a&gt;: well-suited for a variety of text generation and image understanding tasks, including question answering, summarization and reasoning, with a 128K context window, and multilingual support in over 140 languages.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/qwq-32b/&quot;&gt;&lt;code&gt;@cf/qwen/qwq-32b&lt;/code&gt;&lt;/a&gt;: a medium-sized reasoning model, which is capable of achieving competitive performance against state-of-the-art reasoning models, e.g., DeepSeek-R1, o1-mini.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/qwen2.5-coder-32b-instruct/&quot;&gt;&lt;code&gt;@cf/qwen/qwen2.5-coder-32b-instruct&lt;/code&gt;&lt;/a&gt;: the current state-of-the-art open-source code LLM, with its coding abilities matching those of GPT-4o.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Batch Inference&lt;/h4&gt;
&lt;p&gt;Introducing a new batch inference feature that allows you to send us an array of requests, which we will fulfill as fast as possible and send them back as an array. This is really helpful for large workloads such as summarization, embeddings, etc. where you don’t have a human-in-the-loop. Using the batch API will guarantee that your requests are fulfilled eventually, rather than erroring out if we don’t have enough capacity at a given time.&lt;/p&gt;
&lt;p&gt;Check out the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/features/batch-api/&quot;&gt;tutorial&lt;/a&gt; to get started! Models that support batch inference today include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/llama-3.3-70b-instruct-fp8-fast/&quot;&gt;&lt;code&gt;@cf/meta/llama-3.3-70b-instruct-fp8-fast&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/bge-small-en-v1.5/&quot;&gt;&lt;code&gt;@cf/baai/bge-small-en-v1.5&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/bge-base-en-v1.5/&quot;&gt;&lt;code&gt;@cf/baai/bge-base-en-v1.5&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/bge-large-en-v1.5/&quot;&gt;&lt;code&gt;@cf/baai/bge-large-en-v1.5&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/bge-m3/&quot;&gt;&lt;code&gt;@cf/baai/bge-m3&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/m2m100-1.2b/&quot;&gt;&lt;code&gt;@cf/meta/m2m100-1.2b&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Expanded LoRA support&lt;/h4&gt;
&lt;p&gt;We’ve upgraded our LoRA experience to include 8 newer models, and can support ranks of up to 32 with a 300MB safetensors file limit (previously limited to rank of 8 and 100MB safetensors) Check out our &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/features/fine-tunes/loras/&quot;&gt;LoRAs page&lt;/a&gt; to get started. Models that support LoRAs now include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/llama-3.2-11b-vision-instruct/&quot;&gt;&lt;code&gt;@cf/meta/llama-3.2-11b-vision-instruct&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/llama-3.3-70b-instruct-fp8-fast/&quot;&gt;&lt;code&gt;@cf/meta/llama-3.3-70b-instruct-fp8-fast&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/llama-guard-3-8b/&quot;&gt;&lt;code&gt;@cf/meta/llama-guard-3-8b&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/llama-3.1-8b-instruct-fast/&quot;&gt;&lt;code&gt;@cf/meta/llama-3.1-8b-instruct-fast&lt;/code&gt;&lt;/a&gt; (coming soon)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/deepseek-r1-distill-qwen-32b/&quot;&gt;&lt;code&gt;@cf/deepseek-ai/deepseek-r1-distill-qwen-32b&lt;/code&gt;&lt;/a&gt; (coming soon)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/qwen2.5-coder-32b-instruct/&quot;&gt;&lt;code&gt;@cf/qwen/qwen2.5-coder-32b-instruct&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/qwq-32b/&quot;&gt;&lt;code&gt;@cf/qwen/qwq-32b&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/mistral-small-3.1-24b-instruct/&quot;&gt;&lt;code&gt;@cf/mistralai/mistral-small-3.1-24b-instruct&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/gemma-3-12b-it/&quot;&gt;&lt;code&gt;@cf/google/gemma-3-12b-it&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Fri, 11 Apr 2025 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category></item><item><title>D1, Workers - D1 Read Replication Public Beta</title><link>https://developers.cloudflare.com/changelog/post/2025-04-10-d1-read-replication-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-04-10-d1-read-replication-beta/</guid><description>&lt;p&gt;D1 read replication is available in public beta to help lower average latency and increase overall throughput for read-heavy applications like e-commerce websites or content management tools.&lt;/p&gt;
&lt;p&gt;Workers can leverage read-only database copies, called read replicas, by using D1 &lt;a href=&quot;https://developers.cloudflare.com/d1/best-practices/read-replication&quot;&gt;Sessions API&lt;/a&gt;. A session encapsulates all the queries from one logical session for your application. For example, a session may correspond to all queries coming from a particular web browser session. With Sessions API, D1 queries in a session are guaranteed to be &lt;a href=&quot;https://developers.cloudflare.com/d1/best-practices/read-replication/#replica-lag-and-consistency-model&quot;&gt;sequentially consistent&lt;/a&gt; to avoid data consistency pitfalls. D1 &lt;a href=&quot;https://developers.cloudflare.com/d1/reference/time-travel/#bookmarks&quot;&gt;bookmarks&lt;/a&gt; can be used from a previous session to ensure logical consistency between sessions.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// retrieve bookmark from previous session stored in HTTP header&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bookmark&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;x-d1-bookmark&quot;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;??&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;first-unconstrained&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;session&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DB&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;withSession&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;bookmark&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;session&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;prepare&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`SELECT * FROM Customers WHERE CompanyName = &apos;Bs Beverages&apos;`&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// store bookmark for a future session&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;set&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;x-d1-bookmark&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;session&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getBookmark&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;??&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Read replicas are automatically created by Cloudflare (currently one in each supported &lt;a href=&quot;https://developers.cloudflare.com/d1/best-practices/read-replication/#read-replica-locations&quot;&gt;D1 region&lt;/a&gt;), are active/inactive based on query traffic, and are transparently routed to by Cloudflare at no additional cost.&lt;/p&gt;
&lt;p&gt;To checkout D1 read replication, deploy the following Worker code using Sessions API, which will prompt you to create a D1 database and enable read replication on said database.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://deploy.workers.cloudflare.com/?url=https://github.com/cloudflare/templates/tree/main/d1-starter-sessions-api&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://deploy.workers.cloudflare.com/button&quot; alt=&quot;Deploy to Cloudflare&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;To learn more about how read replication was implemented, go to our &lt;a href=&quot;https://blog.cloudflare.com/d1-read-replication-beta&quot; target=&quot;_blank&quot;&gt;blog post&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 10 Apr 2025 00:00:00 GMT</pubDate><product>D1</product><category>D1</category><category>Workers</category></item><item><title>Pipelines, R2, Workers - Cloudflare Pipelines now available in beta</title><link>https://developers.cloudflare.com/changelog/post/2025-04-10-launching-pipelines/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-04-10-launching-pipelines/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/pipelines&quot;&gt;Cloudflare Pipelines&lt;/a&gt; is now available in beta, to all users with a &lt;a href=&quot;https://developers.cloudflare.com/workers/platform/pricing&quot;&gt;Workers Paid&lt;/a&gt; plan.&lt;/p&gt;
&lt;p&gt;Pipelines let you ingest high volumes of real time data, without managing the underlying infrastructure. A single pipeline can ingest up to 100 MB of data per second, via HTTP or from a &lt;a href=&quot;https://developers.cloudflare.com/workers&quot;&gt;Worker&lt;/a&gt;. Ingested data is automatically batched, written to output files, and delivered to an &lt;a href=&quot;https://developers.cloudflare.com/r2&quot;&gt;R2 bucket&lt;/a&gt; in your account. You can use Pipelines to build a data lake of clickstream data, or to store events from a Worker.&lt;/p&gt;
&lt;p&gt;Create your first pipeline with a single command:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler@latest&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pipelines&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-clickstream-pipeline&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--r2-bucket&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-bucket&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;🌀&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Authorizing&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;R2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bucket&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-bucket&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;🌀&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Creating&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pipeline&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;named&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-clickstream-pipeline&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;✅&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Successfully&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;created&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pipeline&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-clickstream-pipeline&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Id:&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;0e00c5ff09b34d018152af98d06f5a1xvc&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Name:&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;my-clickstream-pipeline&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Sources:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;HTTP:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;Endpoint:&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;https://0e00c5ff09b34d018152af98d06f5a1xvc.pipelines.cloudflare.com/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;Authentication:&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;Format:&lt;/span&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;JSON&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Worker:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;Format:&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;JSON&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Destination:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Type:&lt;/span&gt;&lt;span&gt;         &lt;/span&gt;&lt;span&gt;R2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Bucket:&lt;/span&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;my-bucket&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Format:&lt;/span&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;newline-delimited&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;JSON&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Compression:&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;GZIP&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Batch&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;hints:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Max&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bytes:&lt;/span&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MB&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Max&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;duration:&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;300&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;seconds&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Max&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;records:&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;100,000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;🎉&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;You&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;can&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;now&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;send&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;your&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pipeline!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Send&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;your&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pipeline&apos;s HTTP endpoint:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl &quot;https://0e00c5ff09b34d018152af98d06f5a1xvc.pipelines.cloudflare.com/&quot; -d &apos;[{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;...JSON_DATA...&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}]&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;To send data to your pipeline from a Worker, add the following configuration to your config file:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;pipelines&quot;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;pipeline&quot;: &quot;my-clickstream-pipeline&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;binding&quot;: &quot;PIPELINE&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Head over to our &lt;a href=&quot;https://developers.cloudflare.com/pipelines/getting-started&quot;&gt;getting started guide&lt;/a&gt; for an in-depth tutorial to building with Pipelines.&lt;/p&gt;</description><pubDate>Thu, 10 Apr 2025 00:00:00 GMT</pubDate><product>Pipelines</product><category>Pipelines</category><category>R2</category><category>Workers</category></item><item><title>R2 - R2 Data Catalog is a managed Apache Iceberg data catalog built directly into R2 buckets</title><link>https://developers.cloudflare.com/changelog/post/2025-04-10-r2-data-catalog-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-04-10-r2-data-catalog-beta/</guid><description>&lt;p&gt;Today, we&apos;re launching &lt;a href=&quot;https://developers.cloudflare.com/r2/data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt; in open beta, a managed Apache Iceberg catalog built directly into your &lt;a href=&quot;https://developers.cloudflare.com/r2/&quot;&gt;Cloudflare R2&lt;/a&gt; bucket.&lt;/p&gt;
&lt;p&gt;If you&apos;re not already familiar with it, &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot;&gt;Apache Iceberg&lt;/a&gt; is an open table format designed to handle large-scale analytics datasets stored in object storage, offering ACID transactions and schema evolution. R2 Data Catalog exposes a standard Iceberg REST catalog interface, so you can connect engines like &lt;a href=&quot;https://developers.cloudflare.com/r2/data-catalog/config-examples/spark-scala/&quot;&gt;Spark&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/r2/data-catalog/config-examples/snowflake/&quot;&gt;Snowflake&lt;/a&gt;, and &lt;a href=&quot;https://developers.cloudflare.com/r2/data-catalog/config-examples/pyiceberg/&quot;&gt;PyIceberg&lt;/a&gt; to start querying your tables using the tools you already know.&lt;/p&gt;
&lt;p&gt;To enable a data catalog on your R2 bucket, find &lt;strong&gt;R2 Data Catalog&lt;/strong&gt; in your buckets settings in the dashboard, or run:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;r2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bucket&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;catalog&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;enable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-bucket&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;And that&apos;s it. You&apos;ll get a catalog URI and warehouse you can plug into your favorite Iceberg engines.&lt;/p&gt;
&lt;p&gt;Visit our &lt;a href=&quot;https://developers.cloudflare.com/r2/data-catalog/get-started/&quot;&gt;getting started guide&lt;/a&gt; for step-by-step instructions on enabling R2 Data Catalog, creating tables, and running your first queries.&lt;/p&gt;</description><pubDate>Thu, 10 Apr 2025 00:00:00 GMT</pubDate><product>R2</product><category>R2</category></item><item><title>Hyperdrive - Hyperdrive now supports custom TLS/SSL certificates</title><link>https://developers.cloudflare.com/changelog/post/2025-04-09-hyperdrive-custom-certificate-support/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-04-09-hyperdrive-custom-certificate-support/</guid><description>&lt;p&gt;Hyperdrive now supports more SSL/TLS security options for your database connections:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Configure Hyperdrive to verify server certificates with &lt;code&gt;verify-ca&lt;/code&gt; or &lt;code&gt;verify-full&lt;/code&gt; SSL modes and protect against man-in-the-middle attacks&lt;/li&gt;
&lt;li&gt;Configure Hyperdrive to provide client certificates to the database server to authenticate itself (mTLS) for stronger security beyond username and password&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Use the new &lt;code&gt;wrangler cert&lt;/code&gt; commands to create certificate authority (CA) certificate bundles or client certificate pairs:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Create CA certificate bundle&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cert&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;upload&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;certificate-authority&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--ca-cert&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;your-ca-cert.pem&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;your-custom-ca-name&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Create client certificate pair&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cert&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;upload&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mtls-certificate&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--cert&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;client-cert.pem&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--key&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;client-key.pem&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;your-client-cert-name&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Then create a Hyperdrive configuration with the certificates and desired SSL mode:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;hyperdrive&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;your-hyperdrive-config&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--connection-string=&quot;postgres://user:password@hostname:port/database&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--ca-certificate-id&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;#x3C;CA_CERT_ID&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--mtls-certificate-id&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;#x3C;CLIENT_CERT_ID&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--sslmode&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;verify-full&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://developers.cloudflare.com/hyperdrive/configuration/tls-ssl-certificates-for-hyperdrive/&quot;&gt;configuring SSL/TLS certificates for Hyperdrive&lt;/a&gt; to enhance your database security posture.&lt;/p&gt;</description><pubDate>Wed, 09 Apr 2025 00:00:00 GMT</pubDate><product>Hyperdrive</product><category>Hyperdrive</category></item><item><title>Workers - Investigate your Workers with the Query Builder in the new Observability dashboard</title><link>https://developers.cloudflare.com/changelog/post/2025-04-09-qb-workers-logs-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-04-09-qb-workers-logs-ga/</guid><description>&lt;p&gt;The &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers-and-pages/observability/&quot; target=&quot;_blank&quot;&gt;Workers Observability dashboard&lt;/a&gt; offers a single place to investigate and explore your &lt;a href=&quot;https://developers.cloudflare.com/workers/observability/logs/workers-logs&quot;&gt;Workers Logs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;Overview&lt;/strong&gt; tab shows logs from all your Workers in one place. The &lt;strong&gt;Invocations&lt;/strong&gt; view groups logs together by invocation, which refers to the specific trigger that started the execution of the Worker (i.e. fetch). The &lt;strong&gt;Events&lt;/strong&gt; view shows logs in the order they were produced, based on timestamp. Previously, you could only view logs for a single Worker.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/2025-04-09-workers-observability-overview.BKVvdscp_Z2bR5zE.webp&quot; alt=&quot;Workers Observability Overview Tab&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;The &lt;strong&gt;Investigate&lt;/strong&gt; tab presents a Query Builder, which helps you write structured queries to investigate and visualize your logs. The Query Builder can help answer questions such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Which paths are experiencing the most 5XX errors?&lt;/li&gt;
&lt;li&gt;What is the wall time distribution by status code for my Worker?&lt;/li&gt;
&lt;li&gt;What are the slowest requests, and where are they coming from?&lt;/li&gt;
&lt;li&gt;Who are my top N users?&lt;/li&gt;
&lt;/ul&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/2025-04-09-query-builder.CaW9IZza_ZBBKf9.webp&quot; alt=&quot;Workers Observability Overview Tab&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;The Query Builder can use any field that you store in your logs as a key to visualize, filter, and group by. Use the Query Builder to quickly access your data, build visualizations, save queries, and share them with your team.&lt;/p&gt;
&lt;h4&gt;Workers Logs is now Generally Available&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/observability/logs/workers-logs&quot;&gt;Workers Logs&lt;/a&gt; is now Generally Available. With a &lt;a href=&quot;https://developers.cloudflare.com/workers/observability/logs/workers-logs/#enable-workers-logs&quot;&gt;small change&lt;/a&gt; to your Wrangler configuration, Workers Logs ingests, indexes, and stores all logs emitted from your Workers for up to 7 days.&lt;/p&gt;
&lt;p&gt;We&apos;ve introduced a number of changes during our beta period, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dashboard enhancements with customizable fields as columns in the Logs view and support for invocation-based grouping&lt;/li&gt;
&lt;li&gt;Performance improvements to ensure no adverse impact&lt;/li&gt;
&lt;li&gt;Public &lt;a href=&quot;https://developers.cloudflare.com/api/resources/workers/subresources/observability/&quot; target=&quot;_blank&quot;&gt;API endpoints&lt;/a&gt; for broader consumption&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The API documents three endpoints: list the keys in the telemetry dataset, run a query, and list the unique values for a key. For more, visit our &lt;a href=&quot;https://developers.cloudflare.com/api/resources/workers/subresources/observability/&quot; target=&quot;_blank&quot;&gt;REST API documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Visit the &lt;a href=&quot;https://developers.cloudflare.com/workers/observability/query-builder&quot;&gt;docs&lt;/a&gt; to learn more about the capabilities and methods exposed by the Query Builder. Start using Workers Logs and the Query Builder today by enabling observability for your Workers:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;wrangler.jsonc&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;jsonc&quot;&gt;&lt;code class=&quot;language-jsonc&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;observability&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;enabled&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;logs&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;invocation_logs&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;head_sampling_rate&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// optional. default = 1.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;wrangler.toml&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;toml&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;observability&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;enabled&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;observability&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;logs&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;invocation_logs&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;head_sampling_rate&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;</description><pubDate>Wed, 09 Apr 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - CPU time and Wall time now published for Workers Invocations</title><link>https://developers.cloudflare.com/changelog/post/2025-04-09-workers-timing/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-04-09-workers-timing/</guid><description>&lt;p&gt;You can now observe and investigate the CPU time and Wall time for every Workers Invocations.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For &lt;a href=&quot;https://developers.cloudflare.com/workers/observability/logs/workers-logs&quot;&gt;Workers Logs&lt;/a&gt;, CPU time and Wall time are surfaced in the &lt;a href=&quot;https://developers.cloudflare.com/workers/observability/logs/workers-logs/#invocation-logs&quot;&gt;Invocation Log&lt;/a&gt;..&lt;/li&gt;
&lt;li&gt;For &lt;a href=&quot;https://developers.cloudflare.com/workers/observability/logs/tail-workers&quot;&gt;Tail Workers&lt;/a&gt;, CPU time and Wall time are surfaced at the top level of the &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/workers_trace_events&quot;&gt;Workers Trace Events object&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;For &lt;a href=&quot;https://developers.cloudflare.com/workers/observability/logs/logpush&quot;&gt;Workers Logpush&lt;/a&gt;, CPU and Wall time are surfaced at the top level of the &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/workers_trace_events&quot;&gt;Workers Trace Events object&lt;/a&gt;. All new jobs will have these new fields included by default. Existing jobs need to be updated to include CPU time and Wall time.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can use a Workers Logs filter to search for logs where Wall time exceeds 100ms.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/2025-04-09-wall-time-filter.CT-VQyTS_Z97Aoe.webp&quot; alt=&quot;Workers Logs Wall Time Filter&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;You can also use the Workers Observability &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers-and-pages/observability/investigate&quot; target=&quot;_blank&quot;&gt;Query Builder&lt;/a&gt; to find the median CPU time and median Wall time for all of your Workers.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/2025-04-09-query-builder.CaW9IZza_ZBBKf9.webp&quot; alt=&quot;Query Builder filter&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;</description><pubDate>Wed, 09 Apr 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Email Routing - Local development support for Email Workers</title><link>https://developers.cloudflare.com/changelog/post/2025-04-08-local-development/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-04-08-local-development/</guid><description>&lt;p&gt;Email Workers enables developers to programmatically take action on anything that hits their email inbox. If you&apos;re building with Email Workers, you can now test the behavior of an Email Worker script, receiving, replying and sending emails in your local environment using &lt;code&gt;wrangler dev&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Below is an example that shows you how you can receive messages using the &lt;code&gt;email()&lt;/code&gt; handler and parse them using &lt;a href=&quot;https://www.npmjs.com/package/postal-mime&quot; target=&quot;_blank&quot;&gt;postal-mime&lt;/a&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&lt;span&gt; as &lt;/span&gt;&lt;span&gt;PostalMime&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;postal-mime&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;email&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;parser&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;PostalMime&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rawEmail&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;raw&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;email&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;parser&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;parse&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rawEmail&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;arrayBuffer&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;email&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Now when you run &lt;code&gt;npx wrangler dev&lt;/code&gt;, wrangler will expose a local &lt;code&gt;/cdn-cgi/handler/email&lt;/code&gt; endpoint that you can &lt;code&gt;POST&lt;/code&gt; email messages to and trigger your Worker&apos;s &lt;code&gt;email()&lt;/code&gt; handler:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-X&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;POST&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;http://localhost:8787/cdn-cgi/handler/email&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--url-query&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;from=sender@example.com&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--url-query&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;to=recipient@example.com&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--header&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;Content-Type: application/json&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--data-raw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;Received: from smtp.example.com (127.0.0.1)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;by cloudflare-email.com (unknown) id 4fwwffRXOpyR&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;for &amp;#x3C;recipient@example.com&gt;; Tue, 27 Aug 2024 15:50:20 +0000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;From: &quot;John&quot; &amp;#x3C;sender@example.com&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Reply-To: sender@example.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;To: recipient@example.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Subject: Testing Email Workers Local Dev&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Content-Type: text/html; charset=&quot;windows-1252&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;X-Mailer: Curl&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Date: Tue, 27 Aug 2024 08:49:44 -0700&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Message-ID: &amp;#x3C;6114391943504294873000@ZSH-GHOSTTY&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Hi there&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;This is what you get in the console:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;received&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;from smtp.example.com (127.0.0.1) by cloudflare-email.com (unknown) id 4fwwffRXOpyR for &amp;#x3C;recipient@example.com&gt;; Tue, 27 Aug 2024 15:50:20 +0000&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;from&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\&quot;&lt;/span&gt;&lt;span&gt;John&lt;/span&gt;&lt;span&gt;\&quot;&lt;/span&gt;&lt;span&gt; &amp;#x3C;sender@example.com&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;reply-to&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;sender@example.com&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;to&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;recipient@example.com&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;subject&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Testing Email Workers Local Dev&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;content-type&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;text/html; charset=&lt;/span&gt;&lt;span&gt;\&quot;&lt;/span&gt;&lt;span&gt;windows-1252&lt;/span&gt;&lt;span&gt;\&quot;&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;x-mailer&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Curl&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;date&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Tue, 27 Aug 2024 08:49:44 -0700&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;message-id&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&amp;#x3C;6114391943504294873000@ZSH-GHOSTTY&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;address&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;sender@example.com&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;John&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;address&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;recipient@example.com&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;replyTo&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;address&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;sender@example.com&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;subject&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Testing Email Workers Local Dev&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;messageId&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&amp;#x3C;6114391943504294873000@ZSH-GHOSTTY&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;2024-08-27T15:49:44.000Z&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;html&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Hi there&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;attachments&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Local development is a critical part of the development flow, and also works for sending, replying and forwarding emails. See &lt;a href=&quot;https://developers.cloudflare.com/email-routing/email-workers/local-development/&quot;&gt;our documentation&lt;/a&gt; for more information.&lt;/p&gt;</description><pubDate>Tue, 08 Apr 2025 00:00:00 GMT</pubDate><product>Email Routing</product><category>Email Routing</category></item><item><title>Hyperdrive - Hyperdrive Free plan makes fast, global database access available to all</title><link>https://developers.cloudflare.com/changelog/post/2025-04-08-hyperdrive-free-plan/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-04-08-hyperdrive-free-plan/</guid><description>&lt;p&gt;Hyperdrive is now available on the Free plan of Cloudflare Workers, enabling you to build Workers that connect to PostgreSQL or MySQL databases without compromise.&lt;/p&gt;
&lt;p&gt;Low-latency access to SQL databases is critical to building full-stack Workers applications. We want you to be able to build on fast, global apps on Workers,
regardless of the tools you use. So we made Hyperdrive available for all, to make it easier to build Workers that connect to PostgreSQL and MySQL.&lt;/p&gt;
&lt;p&gt;If you want to learn more about how Hyperdrive works, read the &lt;a href=&quot;https://blog.cloudflare.com/how-hyperdrive-speeds-up-database-access&quot; target=&quot;_blank&quot;&gt;deep dive&lt;/a&gt; on how Hyperdrive can make your database queries up to 4x faster.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/hyperdrive-global-placement.DHxlaFbz_1MNCXL.webp&quot; alt=&quot;Hyperdrive provides edge connection setup and global connection pooling for optimal latencies.&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;Visit the docs to &lt;a href=&quot;https://developers.cloudflare.com/hyperdrive/get-started/&quot;&gt;get started&lt;/a&gt; with Hyperdrive for PostgreSQL or MySQL.&lt;/p&gt;</description><pubDate>Tue, 08 Apr 2025 00:00:00 GMT</pubDate><product>Hyperdrive</product><category>Hyperdrive</category></item><item><title>Hyperdrive - Hyperdrive introduces support for MySQL and MySQL-compatible databases</title><link>https://developers.cloudflare.com/changelog/post/2025-04-08-hyperdrive-mysql-support/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-04-08-hyperdrive-mysql-support/</guid><description>&lt;p&gt;Hyperdrive now supports connecting to MySQL and MySQL-compatible databases, including Amazon RDS and Aurora MySQL, Google Cloud SQL for MySQL, Azure Database for MySQL, PlanetScale and MariaDB.&lt;/p&gt;
&lt;p&gt;Hyperdrive makes your regional, MySQL databases fast when connecting from Cloudflare Workers. It eliminates unnecessary network roundtrips during connection setup, pools database connections globally, and can cache query results to provide the fastest possible response times.&lt;/p&gt;
&lt;p&gt;Best of all, you can connect using your existing drivers, ORMs, and query builders with Hyperdrive&apos;s secure credentials, no code changes required.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;createConnection&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;mysql2/promise&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;interface&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Env&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;HYPERDRIVE&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Hyperdrive&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Promise&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;connection&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;createConnection&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;HYPERDRIVE&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;user&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;HYPERDRIVE&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;user&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;password&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;HYPERDRIVE&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;password&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;database&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;HYPERDRIVE&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;database&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;port&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;HYPERDRIVE&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;port&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;disableEval&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// Required for Workers compatibility&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;results&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fields&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;connection&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;query&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;SHOW tables;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;waitUntil&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;connection&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;end&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;JSON&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;stringify&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;results&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fields&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;Content-Type&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;application/json&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;Access-Control-Allow-Origin&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;*&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;satisfies&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ExportedHandler&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Env&lt;/span&gt;&lt;span&gt;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://developers.cloudflare.com/hyperdrive/concepts/how-hyperdrive-works/&quot;&gt;how Hyperdrive works&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/hyperdrive/get-started/&quot;&gt;get started building Workers that connect to MySQL with Hyperdrive&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 08 Apr 2025 00:00:00 GMT</pubDate><product>Hyperdrive</product><category>Hyperdrive</category></item><item><title>Workers - Deploy a Workers application in seconds with one-click</title><link>https://developers.cloudflare.com/changelog/post/2025-04-08-deploy-to-cloudflare-button/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-04-08-deploy-to-cloudflare-button/</guid><description>&lt;p&gt;You can now add a &lt;a href=&quot;https://developers.cloudflare.com/workers/platform/deploy-buttons/&quot;&gt;Deploy to Cloudflare&lt;/a&gt; button to the README of your Git repository containing a Workers application — making it simple for other developers to quickly set up and deploy your project!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://deploy.workers.cloudflare.com/?url=https://github.com/cloudflare/templates/tree/main/saas-admin-template&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://deploy.workers.cloudflare.com/button&quot; alt=&quot;Deploy to Cloudflare&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Deploy to Cloudflare button:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Creates a new Git repository on your GitHub/ GitLab account&lt;/strong&gt;: Cloudflare will automatically clone and create a new repository on your account, so you can continue developing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automatically provisions resources the app needs&lt;/strong&gt;: If your repository requires Cloudflare primitives like a &lt;a href=&quot;https://developers.cloudflare.com/kv/&quot;&gt;Workers KV namespace&lt;/a&gt;, a &lt;a href=&quot;https://developers.cloudflare.com/d1/&quot;&gt;D1 database&lt;/a&gt;, or an &lt;a href=&quot;https://developers.cloudflare.com/r2/&quot;&gt;R2 bucket&lt;/a&gt;, Cloudflare will automatically provision them on your account and bind them to your Worker upon deployment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Configures Workers Builds (CI/CD)&lt;/strong&gt;: Every new push to your production branch on your newly created repository will automatically build and deploy courtesy of &lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/&quot;&gt;Workers Builds&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Adds preview URLs to each pull request&lt;/strong&gt;: If you&apos;d like to test your changes before deploying, you can push changes to a &lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/build-branches/#configure-non-production-branch-builds&quot;&gt;non-production branch&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/previews/&quot;&gt;preview URLs&lt;/a&gt; will be generated and &lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/git-integration/github-integration/#pull-request-comment&quot;&gt;posted back to GitHub as a comment&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/dtw-user-flow.zgS3Y8iK_Z1r8gDo.webp&quot; alt=&quot;Import repo or choose template&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;To create a Deploy to Cloudflare button in your README, you can add the following snippet, including your Git repository URL:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;md&quot;&gt;&lt;code class=&quot;language-md&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;![&lt;/span&gt;&lt;span&gt;Deploy to Cloudflare&lt;/span&gt;&lt;span&gt;](&lt;/span&gt;&lt;span&gt;https://deploy.workers.cloudflare.com/button&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;](&lt;/span&gt;&lt;span&gt;https://deploy.workers.cloudflare.com/?url=&amp;#x3C;YOUR_GIT_REPO_URL&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Check out our &lt;a href=&quot;https://developers.cloudflare.com/workers/platform/deploy-buttons/&quot;&gt;documentation&lt;/a&gt; for more information on how to set up a deploy button for your application and best practices to ensure a successful deployment for other developers.&lt;/p&gt;</description><pubDate>Tue, 08 Apr 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers, Workers for Platforms - Full-stack frameworks are now Generally Available on Cloudflare Workers</title><link>https://developers.cloudflare.com/changelog/post/2025-04-08-fullstack-on-workers/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-04-08-fullstack-on-workers/</guid><description>&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/fullstack-on-workers.D7fotYu2_ZMwDKf.webp&quot; alt=&quot;Full-stack on Cloudflare Workers&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;The following full-stack frameworks now have Generally Available (&quot;GA&quot;) adapters for Cloudflare Workers, and are ready for you to use in production:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/framework-guides/web-apps/react-router/&quot;&gt;React Router v7 (Remix)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/framework-guides/web-apps/astro/&quot;&gt;Astro&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/framework-guides/web-apps/more-web-frameworks/hono/&quot;&gt;Hono&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/framework-guides/web-apps/vue/&quot;&gt;Vue.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/framework-guides/web-apps/more-web-frameworks/nuxt/&quot;&gt;Nuxt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/framework-guides/web-apps/sveltekit/&quot;&gt;Svelte (SvelteKit)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;And &lt;a href=&quot;https://developers.cloudflare.com/workers/framework-guides/&quot;&gt;more&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following frameworks are now in &lt;strong&gt;beta&lt;/strong&gt;, with GA support coming very soon:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/framework-guides/web-apps/nextjs/&quot;&gt;Next.js&lt;/a&gt;, supported through &lt;a href=&quot;https://opennext.js.org/cloudflare&quot; target=&quot;_blank&quot;&gt;@opennextjs/cloudflare&lt;/a&gt; is now &lt;code&gt;v1.0-beta&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/framework-guides/web-apps/more-web-frameworks/angular/&quot;&gt;Angular&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/framework-guides/web-apps/more-web-frameworks/solid/&quot;&gt;SolidJS (SolidStart)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can also build complete full-stack apps on Workers &lt;strong&gt;without a framework&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can &lt;a href=&quot;https://blog.cloudflare.com/introducing-the-cloudflare-vite-plugin&quot; target=&quot;_blank&quot;&gt;“just use Vite&quot;&lt;/a&gt; and React together, and build a back-end API in the same Worker. Follow our &lt;a href=&quot;https://developers.cloudflare.com/workers/vite-plugin/tutorial/&quot;&gt;React SPA with an API tutorial&lt;/a&gt; to learn how.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Get started building today with our &lt;a href=&quot;https://developers.cloudflare.com/workers/framework-guides/&quot;&gt;framework guides&lt;/a&gt;&lt;/strong&gt;, or read our &lt;a href=&quot;https://blog.cloudflare.com/full-stack-development-on-cloudflare-workers&quot; target=&quot;_blank&quot;&gt;Developer Week 2025 blog post&lt;/a&gt; about all the updates to building full-stack applications on Workers.&lt;/p&gt;</description><pubDate>Tue, 08 Apr 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category><category>Workers for Platforms</category></item><item><title>Workers - Improved support for Node.js Crypto and TLS APIs in Workers</title><link>https://developers.cloudflare.com/changelog/post/2025-04-08-nodejs-crypto-and-tls/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-04-08-nodejs-crypto-and-tls/</guid><description>&lt;p&gt;When using a Worker with the &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/nodejs/&quot;&gt;&lt;code&gt;nodejs_compat&lt;/code&gt;&lt;/a&gt; compatibility flag enabled,
the following Node.js APIs are now available:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/nodejs/crypto/&quot;&gt;&lt;code&gt;node:crypto&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/nodejs/tls/&quot;&gt;&lt;code&gt;node:tls&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This make it easier to reuse existing Node.js code in Workers or use npm packages that depend on these APIs.&lt;/p&gt;
&lt;h4&gt;node:crypto&lt;/h4&gt;
&lt;p&gt;The full &lt;a href=&quot;https://nodejs.org/api/crypto.html&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;node:crypto&lt;/code&gt;&lt;/a&gt; API is now available in Workers.&lt;/p&gt;
&lt;p&gt;You can use it to verify and sign data:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sign&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;verify&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;node:crypto&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;signature&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sign&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;sha256&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;-data to sign-&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;PRIVATE_KEY&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;verified&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;verify&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;sha256&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;-data to sign-&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;PUBLIC_KEY&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;signature&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Or, to encrypt and decrypt data:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;publicEncrypt&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;privateDecrypt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;node:crypto&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;encrypted&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;publicEncrypt&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;PUBLIC_KEY&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;some data&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;plaintext&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;privateDecrypt&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;PRIVATE_KEY&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;encrypted&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;See the &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/nodejs/crypto/&quot;&gt;&lt;code&gt;node:crypto&lt;/code&gt; documentation&lt;/a&gt; for more information.&lt;/p&gt;
&lt;h4&gt;node:tls&lt;/h4&gt;
&lt;p&gt;The following APIs from &lt;code&gt;node:tls&lt;/code&gt; are now available:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://nodejs.org/api/tls.html#tlsconnectoptions-callback&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;connect&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nodejs.org/api/tls.html#class-tlstlssocket&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;TLSSocket&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nodejs.org/api/tls.html#tlscheckserveridentityhostname-cert&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;checkServerIdentity&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nodejs.org/api/tls.html#tlscreatesecurecontextoptions&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;createSecureContext&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This enables secure connections over TLS (Transport Layer Security) to external services.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;connect&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;node:tls&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// ... in a request handler ...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;connectionOptions&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; key&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;KEY&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; cert&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;CERT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;socket&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;connect&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;connectionOptions&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;socket&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;authorized&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Connection authorized&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;socket&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;on&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;data&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;socket&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;on&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;end&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;server ends connection&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;See the &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/nodejs/tls/&quot;&gt;&lt;code&gt;node:tls&lt;/code&gt; documentation&lt;/a&gt; for more information.&lt;/p&gt;</description><pubDate>Tue, 08 Apr 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - The Cloudflare Vite plugin is now Generally Available</title><link>https://developers.cloudflare.com/changelog/post/2025-04-08-vite-plugin/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-04-08-vite-plugin/</guid><description>&lt;p&gt;The &lt;a href=&quot;https://developers.cloudflare.com/workers/vite-plugin/&quot;&gt;Cloudflare Vite plugin&lt;/a&gt; has &lt;a href=&quot;https://blog.cloudflare.com/introducing-the-cloudflare-vite-plugin&quot; target=&quot;_blank&quot;&gt;reached v1.0&lt;/a&gt; and is now Generally Available (&quot;GA&quot;).&lt;/p&gt;
&lt;p&gt;When you use &lt;code&gt;@cloudflare/vite-plugin&lt;/code&gt;, you can use Vite&apos;s local development server and build tooling, while ensuring that while developing, your code runs in &lt;a href=&quot;https://github.com/cloudflare/workerd&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;workerd&lt;/code&gt;&lt;/a&gt;, the open-source Workers runtime.&lt;/p&gt;
&lt;p&gt;This lets you get the best of both worlds for a full-stack app — you can use &lt;a href=&quot;https://vite.dev/guide/features.html#hot-module-replacement&quot; target=&quot;_blank&quot;&gt;Hot Module Replacement&lt;/a&gt; from Vite right alongside &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/&quot;&gt;Durable Objects&lt;/a&gt; and other runtime APIs and bindings that are unique to Cloudflare Workers.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;@cloudflare/vite-plugin&lt;/code&gt; is made possible by the new &lt;a href=&quot;https://vite.dev/guide/api-environment&quot; target=&quot;_blank&quot;&gt;environment API&lt;/a&gt; in Vite, and was built &lt;a href=&quot;https://blog.cloudflare.com/introducing-the-cloudflare-vite-plugin&quot; target=&quot;_blank&quot;&gt;in partnership with the Vite team&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Framework support&lt;/h4&gt;
&lt;p&gt;You can build any type of application with &lt;code&gt;@cloudflare/vite-plugin&lt;/code&gt;, using any rendering mode, from single page applications (SPA) and static sites to server-side rendered (SSR) pages and API routes.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/framework-guides/web-apps/react-router/&quot;&gt;React Router v7 (Remix)&lt;/a&gt; is the first full-stack framework to provide full support for Cloudflare Vite plugin, allowing you to use all parts of Cloudflare&apos;s developer platform, without additional build steps.&lt;/p&gt;
&lt;p&gt;You can also build complete full-stack apps on Workers &lt;strong&gt;without a framework&lt;/strong&gt; — &lt;a href=&quot;https://blog.cloudflare.com/introducing-the-cloudflare-vite-plugin&quot; target=&quot;_blank&quot;&gt;&quot;just use Vite&quot;&lt;/a&gt; and React together, and build a back-end API in the same Worker. Follow our &lt;a href=&quot;https://developers.cloudflare.com/workers/vite-plugin/tutorial/&quot;&gt;React SPA with an API tutorial&lt;/a&gt; to learn how.&lt;/p&gt;
&lt;h4&gt;Configuration&lt;/h4&gt;
&lt;p&gt;If you&apos;re already using &lt;a href=&quot;https://vite.dev/&quot; target=&quot;_blank&quot;&gt;Vite&lt;/a&gt; in your build and development toolchain, you can start using our plugin with minimal changes to your &lt;code&gt;vite.config.ts&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineConfig&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;vite&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cloudflare&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@cloudflare/vite-plugin&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineConfig&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;plugins&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;cloudflare&lt;/span&gt;&lt;span&gt;()]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Take a look at the &lt;a href=&quot;https://developers.cloudflare.com/workers/vite-plugin/&quot;&gt;documentation for our Cloudflare Vite plugin&lt;/a&gt; for more information!&lt;/p&gt;</description><pubDate>Tue, 08 Apr 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Agents, Workers - Build MCP servers with the Agents SDK</title><link>https://developers.cloudflare.com/changelog/post/2025-04-07-mcp-servers-agents-sdk-updates/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-04-07-mcp-servers-agents-sdk-updates/</guid><description>&lt;p&gt;The Agents SDK now includes built-in support for building remote MCP (Model Context Protocol) servers directly as part of your Agent. This allows you to easily create and manage MCP servers, without the need for additional infrastructure or configuration.&lt;/p&gt;
&lt;p&gt;The SDK includes a new &lt;code&gt;MCPAgent&lt;/code&gt; class that extends the &lt;code&gt;Agent&lt;/code&gt; class and allows you to expose resources and tools over the MCP protocol, as well as authorization and authentication to enable remote MCP servers.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyMCP&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;McpAgent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;server &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;McpServer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Demo&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;1.0.0&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;init&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;resource&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`counter`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;`mcp://resource/counter`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;uri&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// ...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;tool&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;add&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;Add two numbers together&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;number&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; b&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;number&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// ...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyMCP&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;McpAgent&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Env&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;server &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;McpServer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Demo&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;1.0.0&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;init&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;resource&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`counter`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;`mcp://resource/counter`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;uri&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// ...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;tool&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;add&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;Add two numbers together&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;number&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; b&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;number&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// ...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;See &lt;a href=&quot;https://github.com/cloudflare/agents/tree/main/examples/mcp&quot; target=&quot;_blank&quot;&gt;the example&lt;/a&gt; for the full code and as the basis for building your own MCP servers, and the &lt;a href=&quot;https://github.com/cloudflare/agents/tree/main/examples/mcp-client&quot; target=&quot;_blank&quot;&gt;client example&lt;/a&gt; for how to build an Agent that acts as an MCP client.&lt;/p&gt;
&lt;p&gt;To learn more, review the &lt;a href=&quot;https://blog.cloudflare.com/building-ai-agents-with-mcp-authn-authz-and-durable-objects&quot; target=&quot;_blank&quot;&gt;announcement blog&lt;/a&gt; as part of Developer Week 2025.&lt;/p&gt;
&lt;h4&gt;Agents SDK updates&lt;/h4&gt;
&lt;p&gt;We&apos;ve made a number of improvements to the &lt;a href=&quot;https://developers.cloudflare.com/agents/&quot;&gt;Agents SDK&lt;/a&gt;, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Support for building MCP servers with the new &lt;code&gt;MCPAgent&lt;/code&gt; class.&lt;/li&gt;
&lt;li&gt;The ability to export the current agent, request and WebSocket connection context using &lt;code&gt;import { context } from &quot;agents&quot;&lt;/code&gt;, allowing you to minimize or avoid direct dependency injection when calling tools.&lt;/li&gt;
&lt;li&gt;Fixed a bug that prevented query parameters from being sent to the Agent server from the &lt;code&gt;useAgent&lt;/code&gt; React hook.&lt;/li&gt;
&lt;li&gt;Automatically converting the &lt;code&gt;agent&lt;/code&gt; name in &lt;code&gt;useAgent&lt;/code&gt; or &lt;code&gt;useAgentChat&lt;/code&gt; to kebab-case to ensure it matches the naming convention expected by &lt;a href=&quot;https://developers.cloudflare.com/agents/api-reference/routing/&quot;&gt;&lt;code&gt;routeAgentRequest&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To install or update the Agents SDK, run &lt;code&gt;npm i agents@latest&lt;/code&gt; in an existing project, or explore the &lt;code&gt;agents-starter&lt;/code&gt; project:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cloudflare@latest&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--template&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cloudflare/agents-starter&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;See the full release notes and changelog &lt;a href=&quot;https://github.com/cloudflare/agents/blob/main/packages/agents/CHANGELOG.md&quot; target=&quot;_blank&quot;&gt;on the Agents SDK repository&lt;/a&gt; and&lt;/p&gt;</description><pubDate>Mon, 07 Apr 2025 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>AI Search, Vectorize - Create fully-managed RAG pipelines for your AI applications with AutoRAG</title><link>https://developers.cloudflare.com/changelog/post/2025-04-07-autorag-open-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-04-07-autorag-open-beta/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-search/&quot;&gt;AutoRAG&lt;/a&gt; is now in open beta, making it easy for you to build fully-managed retrieval-augmented generation (RAG) pipelines without managing infrastructure. Just upload your docs to &lt;a href=&quot;https://developers.cloudflare.com/r2/get-started/&quot;&gt;R2&lt;/a&gt;, and AutoRAG handles the rest: embeddings, indexing, retrieval, and response generation via API.&lt;/p&gt;
&lt;p&gt;With AutoRAG, you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Customize your pipeline:&lt;/strong&gt; Choose from &lt;a href=&quot;https://developers.cloudflare.com/workers-ai&quot;&gt;Workers AI&lt;/a&gt; models, configure chunking strategies, edit system prompts, and more.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Instant setup:&lt;/strong&gt; AutoRAG provisions everything you need from &lt;a href=&quot;https://developers.cloudflare.com/vectorize&quot;&gt;Vectorize&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway&quot;&gt;AI gateway&lt;/a&gt;, to pipeline logic for you, so you can go from zero to a working RAG pipeline in seconds.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keep your index fresh:&lt;/strong&gt; AutoRAG continuously syncs your index with your data source to ensure responses stay accurate and up to date.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ask questions:&lt;/strong&gt; Query your data and receive grounded responses via a &lt;a href=&quot;https://developers.cloudflare.com/ai-search/usage/workers-binding/&quot;&gt;Workers binding&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/ai-search/usage/rest-api/&quot;&gt;API&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Whether you&apos;re building internal tools, AI-powered search, or a support assistant, AutoRAG gets you from idea to deployment in minutes.&lt;/p&gt;
&lt;p&gt;Get started in the &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/ai/autorag&quot; target=&quot;_blank&quot;&gt;Cloudflare dashboard&lt;/a&gt; or check out the &lt;a href=&quot;https://developers.cloudflare.com/ai-search/get-started/&quot;&gt;guide&lt;/a&gt; for instructions on how to build your RAG pipeline today.&lt;/p&gt;</description><pubDate>Mon, 07 Apr 2025 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category><category>Vectorize</category></item><item><title>Browser Rendering - Browser Rendering REST API is Generally Available, with new endpoints and a free tier</title><link>https://developers.cloudflare.com/changelog/post/2025-04-07-br-free-ga-playwright/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-04-07-br-free-ga-playwright/</guid><description>&lt;p&gt;We’re excited to announce Browser Rendering is now available on the &lt;a href=&quot;https://www.cloudflare.com/plans/developer-platform/&quot; target=&quot;_blank&quot;&gt;Workers Free plan&lt;/a&gt;, making it even easier to prototype and experiment with web search and headless browser use-cases when building applications on Workers.&lt;/p&gt;
&lt;p&gt;The Browser Rendering &lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/rest-api/&quot;&gt;REST API&lt;/a&gt; is now Generally Available&lt;/strong&gt;, allowing you to control browser instances from outside of Workers applications. We&apos;ve added three new endpoints to help automate more browser tasks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Extract structured data&lt;/strong&gt; – Use &lt;code&gt;/json&lt;/code&gt; to retrieve structured data from a webpage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Retrieve links&lt;/strong&gt; – Use &lt;code&gt;/links&lt;/code&gt; to pull all links from a webpage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Convert to Markdown&lt;/strong&gt; – Use &lt;code&gt;/markdown&lt;/code&gt; to convert webpage content into Markdown format.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For example, to fetch the Markdown representation of a webpage:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-X&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;POST&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;https://api.cloudflare.com/client/v4/accounts/&amp;#x3C;accountId&gt;/browser-rendering/markdown&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-H&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;Content-Type: application/json&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-H&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;Authorization: Bearer &amp;#x3C;apiToken&gt;&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;url&quot;: &quot;https://example.com&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For the full list of endpoints, check out our &lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/rest-api/&quot;&gt;REST API documentation&lt;/a&gt;. You can also interact with Browser Rendering via the &lt;a href=&quot;https://github.com/cloudflare/cloudflare-typescript&quot; target=&quot;_blank&quot;&gt;Cloudflare TypeScript SDK&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We also recently landed support for &lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/playwright/&quot;&gt;Playwright&lt;/a&gt; in Browser Rendering for browser automation from Cloudflare &lt;a href=&quot;https://developers.cloudflare.com/workers/&quot;&gt;Workers&lt;/a&gt;, in addition to &lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/puppeteer/&quot;&gt;Puppeteer&lt;/a&gt;, giving you more flexibility to test across different browser environments.&lt;/p&gt;
&lt;p&gt;Visit the &lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/&quot;&gt;Browser Rendering docs&lt;/a&gt; to learn more about how to use headless browsers in your applications.&lt;/p&gt;</description><pubDate>Mon, 07 Apr 2025 00:00:00 GMT</pubDate><product>Browser Rendering</product><category>Browser Rendering</category></item><item><title>Durable Objects, Workers - Durable Objects on Workers Free plan</title><link>https://developers.cloudflare.com/changelog/post/2025-04-07-durable-objects-free-tier/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-04-07-durable-objects-free-tier/</guid><description>&lt;p&gt;Durable Objects can now be used with zero commitment on the &lt;a href=&quot;https://developers.cloudflare.com/workers/platform/pricing/&quot;&gt;Workers Free plan&lt;/a&gt; allowing you to build AI agents with &lt;a href=&quot;https://developers.cloudflare.com/agents/&quot;&gt;Agents SDK&lt;/a&gt;, collaboration tools, and real-time applications like chat or multiplayer games.&lt;/p&gt;
&lt;p&gt;Durable Objects let you build stateful, serverless applications with millions of tiny coordination instances that run your application code alongside (in the same thread!) your durable storage. Each Durable Object can access its own SQLite database through a &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/best-practices/access-durable-objects-storage/&quot;&gt;Storage API&lt;/a&gt;. A Durable Object class is defined in a Worker script encapsulating the Durable Object&apos;s behavior when accessed from a Worker. To try the code below, click the button:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://deploy.workers.cloudflare.com/?url=https://github.com/cloudflare/templates/tree/main/hello-world-do-template&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://deploy.workers.cloudflare.com/button&quot; alt=&quot;Deploy to Cloudflare&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DurableObject&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;cloudflare:workers&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Durable Object&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyDurableObject&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DurableObject&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sayHello&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;`Hello, &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;!`&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Worker&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Every unique ID refers to an individual instance of the Durable Object class&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;MY_DURABLE_OBJECT&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;idFromName&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;foo&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// A stub is a client used to invoke methods on the Durable Object&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stub&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;MY_DURABLE_OBJECT&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Methods on the Durable Object are invoked via the stub&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stub&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sayHello&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;world&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Free plan &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/platform/pricing/&quot;&gt;limits&lt;/a&gt; apply to Durable Objects compute and storage usage. Limits allow developers to build real-world applications, with every Worker request able to call a Durable Object on the free plan.&lt;/p&gt;
&lt;p&gt;For more information, checkout:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/durable-objects/concepts/what-are-durable-objects/&quot;&gt;Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.cloudflare.com/sqlite-in-durable-objects/&quot; target=&quot;_blank&quot;&gt;Zero-latency SQLite storage in every Durable Object blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Mon, 07 Apr 2025 00:00:00 GMT</pubDate><product>Durable Objects</product><category>Durable Objects</category><category>Workers</category></item><item><title>Durable Objects, Workers - SQLite in Durable Objects GA with 10GB storage per object</title><link>https://developers.cloudflare.com/changelog/post/2025-04-07-sqlite-in-durable-objects-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-04-07-sqlite-in-durable-objects-ga/</guid><description>&lt;p&gt;SQLite in Durable Objects is now generally available (GA) with 10GB SQLite database per Durable Object. Since the &lt;a href=&quot;https://blog.cloudflare.com/sqlite-in-durable-objects/&quot; target=&quot;_blank&quot;&gt;public beta&lt;/a&gt; in September 2024, we&apos;ve added feature parity and robustness for the SQLite storage backend compared to the preexisting key-value (KV) storage backend for Durable Objects.&lt;/p&gt;
&lt;p&gt;SQLite-backed Durable Objects are recommended for all new Durable Object classes, using &lt;code&gt;new_sqlite_classes&lt;/code&gt; &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/best-practices/access-durable-objects-storage/#create-sqlite-backed-durable-object-class&quot;&gt;Wrangler configuration&lt;/a&gt;. Only SQLite-backed Durable Objects have access to Storage API&apos;s &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/api/sqlite-storage-api/#sql-api&quot;&gt;SQL&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/api/sqlite-storage-api/#pitr-point-in-time-recovery-api&quot;&gt;point-in-time recovery&lt;/a&gt; methods, which provide relational data modeling, SQL querying, and better data management.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyDurableObject&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DurableObject&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;sql&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;SqlStorage&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;constructor&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DurableObjectState&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Env&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;super&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sql&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;storage&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sql&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sayHello&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sql&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;exec&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;SELECT &apos;Hello, World!&apos; AS greeting&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;one&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;greeting&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;KV-backed Durable Objects remain for backwards compatibility, and a migration path from key-value storage to SQL storage for existing Durable Object classes will be offered in the future.&lt;/p&gt;
&lt;p&gt;For more details on SQLite storage, checkout &lt;a href=&quot;https://blog.cloudflare.com/sqlite-in-durable-objects/&quot; target=&quot;_blank&quot;&gt;Zero-latency SQLite storage in every Durable Object blog&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 07 Apr 2025 00:00:00 GMT</pubDate><product>Durable Objects</product><category>Durable Objects</category><category>Workers</category></item><item><title>Workers - Capture up to 256 KB of log events in each Workers Invocation</title><link>https://developers.cloudflare.com/changelog/post/2025-04-07-increase-trace-events-limit/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-04-07-increase-trace-events-limit/</guid><description>&lt;p&gt;You can now capture a maximum of 256 KB of log events per Workers invocation, helping you gain better visibility into application behavior.&lt;/p&gt;
&lt;p&gt;All console.log() statements, exceptions, request metadata, and headers are automatically captured during the Worker invocation and emitted
as &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/workers_trace_events&quot;&gt;JSON object&lt;/a&gt;. &lt;a href=&quot;https://developers.cloudflare.com/workers/observability/logs/workers-logs&quot;&gt;Workers Logs&lt;/a&gt; deserializes
this object before indexing the fields and storing them. You can also capture, transform, and export the JSON object in a
&lt;a href=&quot;https://developers.cloudflare.com/workers/observability/logs/tail-workers&quot;&gt;Tail Worker&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;256 KB is a 2x increase from the previous 128 KB limit. After you exceed this limit, further context associated with the request will not be
recorded in your logs.&lt;/p&gt;
&lt;p&gt;This limit is automatically applied to all Workers.&lt;/p&gt;</description><pubDate>Mon, 07 Apr 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workflows, Workers - Workflows is now Generally Available</title><link>https://developers.cloudflare.com/changelog/post/2025-04-07-workflows-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-04-07-workflows-ga/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workflows/&quot;&gt;Workflows&lt;/a&gt; is now &lt;em&gt;Generally Available&lt;/em&gt; (or &quot;GA&quot;): in short, it&apos;s ready for production workloads. Alongside marking Workflows as GA, we&apos;ve introduced a number of changes during the beta period, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A new &lt;code&gt;waitForEvent&lt;/code&gt; API that allows a Workflow to wait for an event to occur before continuing execution.&lt;/li&gt;
&lt;li&gt;Increased concurrency: you can &lt;a href=&quot;https://developers.cloudflare.com/changelog/2025-02-25-workflows-concurrency-increased/&quot;&gt;run up to 4,500 Workflow instances&lt;/a&gt; concurrently — and this will continue to grow.&lt;/li&gt;
&lt;li&gt;Improved observability, including new CPU time metrics that allow you to better understand which Workflow instances are consuming the most resources and/or contributing to your bill.&lt;/li&gt;
&lt;li&gt;Support for &lt;code&gt;vitest&lt;/code&gt; for testing Workflows locally and in CI/CD pipelines.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Workflows also supports the new &lt;a href=&quot;https://developers.cloudflare.com/changelog/2025-03-25-higher-cpu-limits/&quot;&gt;increased CPU limits&lt;/a&gt; that apply to Workers, allowing you to run more CPU-intensive tasks (up to 5 minutes of CPU time per instance), not including the time spent waiting on network calls, AI models, or other I/O bound tasks.&lt;/p&gt;
&lt;h4&gt;Human-in-the-loop&lt;/h4&gt;
&lt;p&gt;The new &lt;code&gt;step.waitForEvent&lt;/code&gt; API allows a Workflow instance to wait on events and data, enabling human-in-the-the-loop interactions, such as approving or rejecting a request, directly handling webhooks from other systems, or pushing event data to a Workflow while it&apos;s running.&lt;/p&gt;
&lt;p&gt;Because Workflows are just code, you can conditionally execute code based on the result of a &lt;code&gt;waitForEvent&lt;/code&gt; call, and/or call &lt;code&gt;waitForEvent&lt;/code&gt; multiple times in a single Workflow based on what the Workflow needs.&lt;/p&gt;
&lt;p&gt;For example, if you wanted to implement a human-in-the-loop approval process, you could use &lt;code&gt;waitForEvent&lt;/code&gt; to wait for a user to approve or reject a request, and then conditionally execute code based on the result.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;WorkflowEntrypoint&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;WorkflowStep&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;WorkflowEvent&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;cloudflare:workers&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyWorkflow&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;WorkflowEntrypoint&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;step&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Other steps in your Workflow&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stripeEvent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;step&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;waitForEvent&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;receive invoice paid webhook from Stripe&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;stripe-webhook&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; timeout&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;1 hour&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Rest of your Workflow&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;WorkflowEntrypoint&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;WorkflowStep&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;WorkflowEvent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;cloudflare:workers&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyWorkflow&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;WorkflowEntrypoint&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Env&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Params&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;WorkflowEvent&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Params&lt;/span&gt;&lt;span&gt;&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;step&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;WorkflowStep&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Other steps in your Workflow&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stripeEvent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;step&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;waitForEvent&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;IncomingStripeWebhook&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;receive invoice paid webhook from Stripe&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;stripe-webhook&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; timeout&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;1 hour&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Rest of your Workflow&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;You can then send a Workflow an event from an external service via HTTP or from within a Worker using the &lt;a href=&quot;https://developers.cloudflare.com/workflows/build/workers-api/&quot;&gt;Workers API&lt;/a&gt; for Workflows:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;req&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;instanceId&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;URL&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;req&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;searchParams&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;instanceId&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;webhookPayload&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;req&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;instance&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;MY_WORKFLOW&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;instanceId&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Send our event, with `type` matching the event type defined in&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// our step.waitForEvent call&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;instance&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sendEvent&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;stripe-webhook&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;payload&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;webhookPayload&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;status&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;instance&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;status&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;req&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Env&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;instanceId&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;URL&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;req&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;searchParams&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;instanceId&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;webhookPayload&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;req&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Payload&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;instance&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;MY_WORKFLOW&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;instanceId&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Send our event, with `type` matching the event type defined in&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// our step.waitForEvent call&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;instance&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sendEvent&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;stripe-webhook&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; payload&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;webhookPayload&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;status&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;instance&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;status&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;Read the &lt;a href=&quot;https://blog.cloudflare.com/workflows-is-now-generally-available/&quot; target=&quot;_blank&quot;&gt;GA announcement blog&lt;/a&gt; to learn more about what landed as part of the Workflows GA.&lt;/p&gt;</description><pubDate>Mon, 07 Apr 2025 00:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category><category>Workers</category></item><item><title>Browser Rendering - Playwright for Browser Rendering now available</title><link>https://developers.cloudflare.com/changelog/post/2025-04-04-playwright-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-04-04-playwright-beta/</guid><description>&lt;p&gt;We&apos;re excited to share that you can now use Playwright&apos;s browser automation &lt;a href=&quot;https://playwright.dev/docs/api/class-playwright&quot; target=&quot;_blank&quot;&gt;capabilities&lt;/a&gt; from Cloudflare &lt;a href=&quot;https://developers.cloudflare.com/workers/&quot;&gt;Workers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://playwright.dev/&quot; target=&quot;_blank&quot;&gt;Playwright&lt;/a&gt; is an open-source package developed by Microsoft that can do browser automation tasks; it&apos;s commonly used to write software tests, debug applications, create screenshots, and crawl pages. Like &lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/puppeteer/&quot;&gt;Puppeteer&lt;/a&gt;, we &lt;a href=&quot;https://github.com/cloudflare/playwright&quot; target=&quot;_blank&quot;&gt;forked&lt;/a&gt; Playwright and modified it to be compatible with Cloudflare Workers and &lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/&quot; target=&quot;_blank&quot;&gt;Browser Rendering&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Below is an example of how to use Playwright with Browser Rendering to test a TODO application using assertions:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;launch&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt; type &lt;/span&gt;&lt;span&gt;BrowserWorker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@cloudflare/playwright&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;expect&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;@cloudflare/playwright/test&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;interface&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Env&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;MYBROWSER&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;BrowserWorker&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Env&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;browser&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;launch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;MYBROWSER&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;page&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;browser&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;newPage&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;page&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;goto&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;https://demo.playwright.dev/todomvc&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;TODO_ITEMS&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;buy some cheese&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;feed the cat&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;book a doctors appointment&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;newTodo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;page&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getByPlaceholder&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;What needs to be done?&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;item&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;of&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;TODO_ITEMS&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;newTodo&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;fill&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;item&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;newTodo&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;press&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Enter&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;expect&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;page&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getByTestId&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;todo-title&quot;&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toHaveCount&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;TODO_ITEMS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;length&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Promise&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;all&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;TODO_ITEMS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;map&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;index&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;expect&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;page&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getByTestId&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;todo-title&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;nth&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;index&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toHaveText&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Playwright is available as an npm package at &lt;a href=&quot;https://www.npmjs.com/package/@cloudflare/playwright&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;@cloudflare/playwright&lt;/code&gt;&lt;/a&gt; and the code is at &lt;a href=&quot;https://github.com/cloudflare/playwright&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Learn more in our &lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/playwright/&quot;&gt;documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 04 Apr 2025 00:00:00 GMT</pubDate><product>Browser Rendering</product><category>Browser Rendering</category></item><item><title>Queues - New Pause &amp; Purge APIs for Queues</title><link>https://developers.cloudflare.com/changelog/post/2025-03-25-pause-purge-queues/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-03-25-pause-purge-queues/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/queues/&quot;&gt;Queues&lt;/a&gt; now supports the ability to pause message delivery and/or purge (delete) messages on a queue. These operations can be useful when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Your consumer has a bug or downtime, and you want to temporarily stop messages from being processed while you fix the bug&lt;/li&gt;
&lt;li&gt;You have pushed invalid messages to a queue due to a code change during development, and you want to clean up the backlog&lt;/li&gt;
&lt;li&gt;Your queue has a backlog that is stale and you want to clean it up to allow new messages to be consumed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To pause a queue using &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/&quot;&gt;Wrangler&lt;/a&gt;, run the &lt;code&gt;pause-delivery&lt;/code&gt; command. Paused queues continue to receive messages. And you can easily unpause a queue using the &lt;code&gt;resume-delivery&lt;/code&gt; command.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;queues&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pause-delivery&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-queue&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Pausing&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;delivery&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;queue&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-queue.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Paused&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;delivery&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;queue&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-queue.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;queues&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;resume-delivery&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-queue&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Resuming&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;delivery&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;queue&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-queue.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Resumed&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;delivery&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;queue&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-queue.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Purging a queue permanently deletes all messages in the queue. Unlike pausing, purging is an irreversible operation:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;queues&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;purge&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-queue&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;✔&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;This&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;operation&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;will&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;permanently&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;delete&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;all&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;messages&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;queue&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-queue.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Type&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-queue&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;proceed.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;…&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-queue&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Purged&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;queue&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;my-queue&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;You can also do these operations using the &lt;a href=&quot;https://developers.cloudflare.com/api/resources/queues/&quot;&gt;Queues REST API&lt;/a&gt;, or the dashboard page for a queue.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/pause-purge.SQ7B3RCF_2dqU5K.webp&quot; alt=&quot;Pause and purge using the dashboard&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;This feature is available on all new and existing queues. Head over to the &lt;a href=&quot;https://developers.cloudflare.com/queues/configuration/pause-purge&quot;&gt;pause and purge documentation&lt;/a&gt; to learn more. And if you haven&apos;t used Cloudflare Queues before, &lt;a href=&quot;https://developers.cloudflare.com/queues/get-started&quot;&gt;get started with the Cloudflare Queues guide&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 27 Mar 2025 12:00:00 GMT</pubDate><product>Queues</product><category>Queues</category></item><item><title>Workers - Run Workers for up to 5 minutes of CPU-time</title><link>https://developers.cloudflare.com/changelog/post/2025-03-25-higher-cpu-limits/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-03-25-higher-cpu-limits/</guid><description>&lt;p&gt;You can now run a Worker for up to 5 minutes of CPU time for each request.&lt;/p&gt;
&lt;p&gt;Previously, each Workers request ran for a maximum of 30 seconds of CPU time — that is the time that a Worker is actually performing a task (we still allowed unlimited wall-clock time, in case you were waiting on slow resources). This
meant that some compute-intensive tasks were impossible to do with a Worker. For instance,
you might want to take the cryptographic hash of a large file from R2. If
this computation ran for over 30 seconds, the Worker request would have timed out.&lt;/p&gt;
&lt;p&gt;By default, Workers are still limited to 30 seconds of CPU time. This protects developers
from incurring accidental cost due to buggy code.&lt;/p&gt;
&lt;p&gt;By changing the &lt;code&gt;cpu_ms&lt;/code&gt; value in your Wrangler configuration, you can opt in to
any value up to 300,000 (5 minutes).&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;wrangler.jsonc&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;jsonc&quot;&gt;&lt;code class=&quot;language-jsonc&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// ...rest of your configuration...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;limits&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;cpu_ms&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;300000&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// ...rest of your configuration...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;wrangler.toml&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;toml&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;limits&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;cpu_ms&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;300_000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;aside&gt;&lt;p&gt;Note&lt;/p&gt;&lt;div&gt;&lt;p&gt;CPU time is the amount of time the CPU actually spends doing work during a given request.
If a Worker&apos;s request makes a sub-request and waits for that request to come back before
doing additional work, this time spent waiting &lt;strong&gt;is not&lt;/strong&gt; counted towards CPU time.&lt;/p&gt;&lt;p&gt;Worker requests could run for more than 30 seconds of total time prior to this change — only
CPU time was limited.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;For more information on the updates limits, see the documentation on &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/configuration/#limits&quot;&gt;Wrangler configuration for &lt;code&gt;cpu_ms&lt;/code&gt;&lt;/a&gt;
and on &lt;a href=&quot;https://developers.cloudflare.com/workers/platform/limits/#cpu-time&quot;&gt;Workers CPU time limits&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For building long-running tasks on Cloudflare, we also recommend checking out &lt;a href=&quot;https://developers.cloudflare.com/workflows/&quot;&gt;Workflows&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/queues/&quot;&gt;Queues&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 26 Mar 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Source Maps are Generally Available</title><link>https://developers.cloudflare.com/changelog/post/2025-03-25-gzip-source-maps/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-03-25-gzip-source-maps/</guid><description>&lt;p&gt;Source maps are now Generally Available (GA). You can now be uploaded with a maximum gzipped size of 15 MB.
Previously, the maximum size limit was 15 MB uncompressed.&lt;/p&gt;
&lt;p&gt;Source maps help map between the original source code and the transformed/minified code that gets deployed
to production. By uploading your source map, you allow Cloudflare to map the stack trace from exceptions
onto the original source code making it easier to debug.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/without-source-map.ByYR83oU_Z1q7wOD.webp&quot; alt=&quot;Stack Trace without Source Map remapping&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;With &lt;strong&gt;no source maps uploaded&lt;/strong&gt;: notice how all the Javascript has been minified to one file, so the stack trace is missing information on file name, shows incorrect line numbers, and incorrectly references &lt;code&gt;js&lt;/code&gt; instead of &lt;code&gt;ts&lt;/code&gt;.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/with-source-map.PipytmVe_2dYiLI.webp&quot; alt=&quot;Stack Trace with Source Map remapping&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;With &lt;strong&gt;source maps uploaded&lt;/strong&gt;: all methods reference the correct files and line numbers.&lt;/p&gt;
&lt;p&gt;Uploading source maps and stack trace remapping happens out of band from the Worker execution,
so source maps do not affect upload speed, bundle size, or cold starts. The remapped stack
traces are accessible through Tail Workers, Workers Logs, and Workers Logpush.&lt;/p&gt;
&lt;p&gt;To enable source maps, add the following to your
&lt;a href=&quot;https://developers.cloudflare.com/pages/functions/source-maps/&quot;&gt;Pages Function&apos;s&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/workers/observability/source-maps/&quot;&gt;Worker&apos;s&lt;/a&gt; wrangler configuration:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;p&gt;wrangler.jsonc&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;jsonc&quot;&gt;&lt;code class=&quot;language-jsonc&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;upload_source_maps&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;wrangler.toml&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;toml&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;upload_source_maps&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;</description><pubDate>Tue, 25 Mar 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers, Pages, WAF - New Managed WAF rule for Next.js CVE-2025-29927.</title><link>https://developers.cloudflare.com/changelog/post/2025-03-22-next-js-vulnerability-waf/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-03-22-next-js-vulnerability-waf/</guid><description>&lt;p&gt;&lt;strong&gt;Update: Mon Mar 24th, 11PM UTC&lt;/strong&gt;: Next.js has made further changes to address a smaller vulnerability introduced in the patches made to its middleware handling. Users should upgrade to Next.js versions &lt;code&gt;15.2.4&lt;/code&gt;, &lt;code&gt;14.2.26&lt;/code&gt;, &lt;code&gt;13.5.10&lt;/code&gt; or &lt;code&gt;12.3.6&lt;/code&gt;. &lt;strong&gt;If you are unable to immediately upgrade or are running an older version of Next.js, you can enable the WAF rule described in this changelog as a mitigation&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update: Mon Mar 24th, 8PM UTC&lt;/strong&gt;: Next.js has now &lt;a href=&quot;https://github.com/advisories/GHSA-f82v-jwr5-mffw&quot; target=&quot;_blank&quot;&gt;backported the patch for this vulnerability&lt;/a&gt; to cover Next.js v12 and v13. Users on those versions will need to patch to &lt;code&gt;13.5.9&lt;/code&gt; and &lt;code&gt;12.3.5&lt;/code&gt; (respectively) to mitigate the vulnerability.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update: Sat Mar 22nd, 4PM UTC&lt;/strong&gt;: We have changed this WAF rule to opt-in only, as sites that use auth middleware with third-party auth vendors were observing failing requests.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;We strongly recommend updating your version of Next.js (if eligible)&lt;/strong&gt; to the patched versions, as your app will otherwise be vulnerable to an authentication bypass attack regardless of auth provider.&lt;/p&gt;
&lt;h4&gt;Enable the Managed Rule (strongly recommended)&lt;/h4&gt;
&lt;p&gt;This rule is opt-in only for sites on the Pro plan or above in the &lt;a href=&quot;https://developers.cloudflare.com/waf/managed-rules/&quot;&gt;WAF managed ruleset&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To enable the rule:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Head to Security &gt; WAF &gt; Managed rules in the Cloudflare dashboard for the zone (website) you want to protect.&lt;/li&gt;
&lt;li&gt;Click the three dots next to &lt;strong&gt;Cloudflare Managed Ruleset&lt;/strong&gt; and choose &lt;strong&gt;Edit&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Scroll down and choose &lt;strong&gt;Browse Rules&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Search for &lt;strong&gt;CVE-2025-29927&lt;/strong&gt; (ruleId: &lt;code&gt;34583778093748cc83ff7b38f472013e&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Change the &lt;strong&gt;Status&lt;/strong&gt; to &lt;strong&gt;Enabled&lt;/strong&gt; and the &lt;strong&gt;Action&lt;/strong&gt; to &lt;strong&gt;Block&lt;/strong&gt;. You can optionally set the rule to Log, to validate potential impact before enabling it. Log will not block requests.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Next&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Scroll down and choose &lt;strong&gt;Save&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This will enable the WAF rule and block requests with the &lt;code&gt;x-middleware-subrequest&lt;/code&gt; header regardless of Next.js version.&lt;/p&gt;
&lt;h4&gt;Create a WAF rule (manual)&lt;/h4&gt;
&lt;p&gt;For users on the Free plan, or who want to define a more specific rule, you can create a &lt;a href=&quot;https://developers.cloudflare.com/waf/custom-rules/create-dashboard/&quot;&gt;Custom WAF rule&lt;/a&gt; to block requests with the &lt;code&gt;x-middleware-subrequest&lt;/code&gt; header regardless of Next.js version.&lt;/p&gt;
&lt;p&gt;To create a custom rule:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Head to Security &gt; WAF &gt; Custom rules in the Cloudflare dashboard for the zone (website) you want to protect.&lt;/li&gt;
&lt;li&gt;Give the rule a name - e.g. &lt;code&gt;next-js-CVE-2025-29927&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Set the matching parameters for the rule match any request where the &lt;code&gt;x-middleware-subrequest&lt;/code&gt; header &lt;code&gt;exists&lt;/code&gt; per the rule expression below.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;len(http.request.headers[&lt;/span&gt;&lt;span&gt;&quot;x-middleware-subrequest&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Set the action to &apos;block&apos;. If you want to observe the impact before blocking requests, set the action to &apos;log&apos; (and edit the rule later).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deploy&lt;/strong&gt; the rule.&lt;/li&gt;
&lt;/ol&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/waf-rule-cve-2025-29927.0i0XiweZ_Z8mlyw.webp&quot; alt=&quot;Next.js CVE-2025-29927 WAF rule&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;h4&gt;Next.js CVE-2025-29927&lt;/h4&gt;
&lt;p&gt;We&apos;ve made a WAF (Web Application Firewall) rule available to all sites on Cloudflare to protect against the &lt;a href=&quot;https://github.com/advisories/GHSA-f82v-jwr5-mffw&quot; target=&quot;_blank&quot;&gt;Next.js authentication bypass vulnerability&lt;/a&gt; (&lt;code&gt;CVE-2025-29927&lt;/code&gt;) published on March 21st, 2025.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: This rule is not enabled by default as it blocked requests across sites for specific authentication middleware.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This managed rule protects sites using Next.js on Workers and Pages, as well as sites using Cloudflare to protect Next.js applications hosted elsewhere.&lt;/li&gt;
&lt;li&gt;This rule has been made available (but not enabled by default) to all sites as part of our &lt;a href=&quot;https://developers.cloudflare.com/waf/managed-rules/reference/cloudflare-managed-ruleset/&quot;&gt;WAF Managed Ruleset&lt;/a&gt; and blocks requests that attempt to bypass authentication in Next.js applications.&lt;/li&gt;
&lt;li&gt;The vulnerability affects almost all Next.js versions, and has been fully patched in Next.js &lt;code&gt;14.2.26&lt;/code&gt; and &lt;code&gt;15.2.4&lt;/code&gt;. Earlier, interim releases did not fully patch this vulnerability.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Users on older versions of Next.js (&lt;code&gt;11.1.4&lt;/code&gt; to &lt;code&gt;13.5.6&lt;/code&gt;) did not originally have a patch available&lt;/strong&gt;, but this the patch for this vulnerability and a subsequent additional patch have been backported to Next.js versions &lt;code&gt;12.3.6&lt;/code&gt; and &lt;code&gt;13.5.10&lt;/code&gt; as of Monday, March 24th. Users on Next.js v11 will need to deploy the stated workaround or enable the WAF rule.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The managed WAF rule mitigates this by blocking &lt;em&gt;external&lt;/em&gt; user requests with the &lt;code&gt;x-middleware-subrequest&lt;/code&gt; header regardless of Next.js version, but we recommend users using Next.js 14 and 15 upgrade to the patched versions of Next.js as an additional mitigation.&lt;/p&gt;</description><pubDate>Sat, 22 Mar 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category><category>Pages</category><category>WAF</category></item><item><title>Workers, Pages - Smart Placement is smarter about running Workers and Pages Functions in the best locations</title><link>https://developers.cloudflare.com/changelog/post/2025-03-22-smart-placement-stablization/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-03-22-smart-placement-stablization/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/placement/&quot;&gt;Smart Placement&lt;/a&gt; is a unique Cloudflare feature that can make decisions to move your Worker to run in a more optimal location (such as closer to a database). Instead of always running in the default location (the one closest to where the request is received), Smart Placement uses certain “heuristics” (rules and thresholds) to decide if a different location might be faster or more efficient.&lt;/p&gt;
&lt;p&gt;Previously, if these heuristics weren&apos;t consistently met, your Worker would revert to running in the default location—even after it had been optimally placed. This meant that if your Worker received minimal traffic for a period of time, the system would reset to the default location, rather than remaining in the optimal one.&lt;/p&gt;
&lt;p&gt;Now, once Smart Placement has identified and assigned an optimal location, temporarily dropping below the heuristic thresholds will not force a return to default locations. For example in the previous algorithm, a drop in requests for a few days might return to default locations and heuristics would have to be met again. This was problematic for workloads that made requests to a geographically located resource every few days or longer. In this scenario, your Worker would never get placed optimally. This is no longer the case.&lt;/p&gt;</description><pubDate>Sat, 22 Mar 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category><category>Pages</category></item><item><title>AI Gateway - AI Gateway launches Realtime WebSockets API</title><link>https://developers.cloudflare.com/changelog/post/2025-03-20-websockets/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-03-20-websockets/</guid><description>&lt;p&gt;We are excited to announce that &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/&quot;&gt;AI Gateway&lt;/a&gt; now supports real-time AI interactions with the new &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/usage/websockets-api/realtime-api/&quot;&gt;Realtime WebSockets API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This new capability allows developers to establish persistent, low-latency connections between their applications and AI models, enabling natural, real-time conversational AI experiences, including speech-to-speech interactions.&lt;/p&gt;
&lt;p&gt;The Realtime WebSockets API works with the &lt;a href=&quot;https://platform.openai.com/docs/guides/realtime#connect-with-websockets&quot; target=&quot;_blank&quot;&gt;OpenAI Realtime API&lt;/a&gt;, &lt;a href=&quot;https://ai.google.dev/gemini-api/docs/multimodal-live&quot; target=&quot;_blank&quot;&gt;Google Gemini Live API&lt;/a&gt;, and supports real-time text and speech interactions with models from &lt;a href=&quot;https://docs.cartesia.ai/api-reference/tts/tts&quot; target=&quot;_blank&quot;&gt;Cartesia&lt;/a&gt;, and &lt;a href=&quot;https://elevenlabs.io/docs/conversational-ai/api-reference/conversational-ai/websocket&quot; target=&quot;_blank&quot;&gt;ElevenLabs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here&apos;s how you can connect AI Gateway to &lt;a href=&quot;https://platform.openai.com/docs/guides/realtime#connect-with-websockets&quot; target=&quot;_blank&quot;&gt;OpenAI&apos;s Realtime API&lt;/a&gt; using WebSockets:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;WebSocket&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;ws&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;wss://gateway.ai.cloudflare.com/v1/&amp;#x3C;account_id&gt;/&amp;#x3C;gateway&gt;/openai?model=gpt-4o-realtime-preview-2024-12-17&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ws&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;WebSocket&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;cf-aig-authorization&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;process&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;CLOUDFLARE_API_KEY&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Authorization&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Bearer &quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;process&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;OpenAI-Beta&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;realtime=v1&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;ws&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;on&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;open&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Connected to server.&quot;&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;ws&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;on&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;message&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;JSON&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;parse&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toString&lt;/span&gt;&lt;span&gt;())))&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;ws&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;send&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;JSON&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;stringify&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;response.create&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; modalities&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;text&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; instructions&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Tell me a joke&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Get started by checking out the &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/usage/websockets-api/realtime-api/&quot;&gt;Realtime WebSockets API&lt;/a&gt; documentation.&lt;/p&gt;</description><pubDate>Fri, 21 Mar 2025 00:00:00 GMT</pubDate><product>AI Gateway</product><category>AI Gateway</category></item><item><title>Workers AI - Markdown conversion in Workers AI</title><link>https://developers.cloudflare.com/changelog/post/2025-03-20-markdown-conversion/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-03-20-markdown-conversion/</guid><description>&lt;p&gt;Document conversion plays an important role when designing and developing AI applications and agents. Workers AI now provides the &lt;code&gt;toMarkdown&lt;/code&gt; utility method that developers can use to for quick, easy, and convenient conversion and summary of documents in multiple formats to Markdown language.&lt;/p&gt;
&lt;p&gt;You can call this new tool using a binding by calling &lt;code&gt;env.AI.toMarkdown()&lt;/code&gt; or the using the &lt;a href=&quot;https://developers.cloudflare.com/api/resources/ai/&quot;&gt;REST API&lt;/a&gt; endpoint.&lt;/p&gt;
&lt;p&gt;In this example, we fetch a PDF document and an image from R2 and feed them both to &lt;code&gt;env.AI.toMarkdown()&lt;/code&gt;. The result is a list of converted documents. Workers AI models are used automatically to detect and summarize the image.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Env&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;./env&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Env&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ExecutionContext&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// https://pub-979cb28270cc461d94bc8a169d8f389d.r2.dev/somatosensory.pdf&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pdf&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;R2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;somatosensory.pdf&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// https://pub-979cb28270cc461d94bc8a169d8f389d.r2.dev/cat.jpeg&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cat&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;R2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;cat.jpeg&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AI&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toMarkdown&lt;/span&gt;&lt;span&gt;([&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;somatosensory.pdf&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;blob&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Blob&lt;/span&gt;&lt;span&gt;([&lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pdf&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;arrayBuffer&lt;/span&gt;&lt;span&gt;()]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;application/octet-stream&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;cat.jpeg&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;blob&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Blob&lt;/span&gt;&lt;span&gt;([&lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cat&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;arrayBuffer&lt;/span&gt;&lt;span&gt;()]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;application/octet-stream&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;])&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;This is the result:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;somatosensory.pdf&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;mimeType&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;application/pdf&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;format&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;markdown&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;tokens&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;# somatosensory.pdf&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;## Metadata&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;- PDFFormatVersion=1.4&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;- IsLinearized=false&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;- IsAcroFormPresent=false&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;- IsXFAPresent=false&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;- IsCollectionPresent=false&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;- IsSignaturesPresent=false&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;- Producer=Prince 20150210 (www.princexml.com)&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;- Title=Anatomy of the Somatosensory System&lt;/span&gt;&lt;span&gt;\n\n&lt;/span&gt;&lt;span&gt;## Contents&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;### Page 1&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;This is a sample document to showcase...&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;cat.jpeg&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;mimeType&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;image/jpeg&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;format&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;markdown&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;tokens&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;The image is a close-up photograph of Grumpy Cat, a cat with a distinctive grumpy expression and piercing blue eyes. The cat has a brown face with a white stripe down its nose, and its ears are pointed upright. Its fur is light brown and darker around the face, with a pink nose and mouth. The cat&apos;s eyes are blue and slanted downward, giving it a perpetually grumpy appearance. The background is blurred, but it appears to be a dark brown color. Overall, the image is a humorous and iconic representation of the popular internet meme character, Grumpy Cat. The cat&apos;s facial expression and posture convey a sense of displeasure or annoyance, making it a relatable and entertaining image for many people.&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;See &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/features/markdown-conversion/&quot;&gt;Markdown Conversion&lt;/a&gt; for more information on supported formats, REST API and pricing.&lt;/p&gt;</description><pubDate>Thu, 20 Mar 2025 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category></item><item><title>Agents, Workers - npm i agents</title><link>https://developers.cloudflare.com/changelog/post/2025-03-18-npm-i-agents/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-03-18-npm-i-agents/</guid><description>&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/npm-i-agents.CXCpJ1-7.apng&quot; alt=&quot;npm i agents&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;h4&gt;&lt;code&gt;agents-sdk&lt;/code&gt; -&gt; &lt;code&gt;agents&lt;/code&gt; &lt;span&gt;Updated&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;📝 &lt;strong&gt;We&apos;ve renamed the Agents package to &lt;code&gt;agents&lt;/code&gt;&lt;/strong&gt;!&lt;/p&gt;
&lt;p&gt;If you&apos;ve already been building with the Agents SDK, you can update your dependencies to use the new package name, and replace references to &lt;code&gt;agents-sdk&lt;/code&gt; with &lt;code&gt;agents&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Install the new package&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;agents&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Remove the old (deprecated) package&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;uninstall&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;agents-sdk&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Find instances of the old package name in your codebase&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;grep&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-r&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;agents-sdk&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Replace instances of the old package name with the new one&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# (or use find-replace in your editor)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sed&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-i&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;s/agents-sdk/agents/g&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$(&lt;/span&gt;&lt;span&gt;grep&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-rl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;agents-sdk&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;All future updates will be pushed to the new &lt;code&gt;agents&lt;/code&gt; package, and the older package has been marked as deprecated.&lt;/p&gt;
&lt;h4&gt;Agents SDK updates &lt;span&gt;New&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;We&apos;ve added a number of big new features to the Agents SDK over the past few weeks, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can now set &lt;code&gt;cors: true&lt;/code&gt; when using &lt;code&gt;routeAgentRequest&lt;/code&gt; to return permissive default CORS headers to Agent responses.&lt;/li&gt;
&lt;li&gt;The regular client now syncs state on the agent (just like the React version).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;useAgentChat&lt;/code&gt; bug fixes for passing headers/credentials, including properly clearing cache on unmount.&lt;/li&gt;
&lt;li&gt;Experimental &lt;code&gt;/schedule&lt;/code&gt; module with a prompt/schema for adding scheduling to your app (with evals!).&lt;/li&gt;
&lt;li&gt;Changed the internal &lt;code&gt;zod&lt;/code&gt; schema to be compatible with the limitations of Google&apos;s Gemini models by removing the discriminated union, allowing you to use Gemini models with the scheduling API.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We&apos;ve also fixed a number of bugs with state synchronization and the React hooks.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// via https://github.com/cloudflare/agents/tree/main/examples/cross-domain&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// Set { cors: true } to enable CORS headers.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;routeAgentRequest&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; cors&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)) &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Not found&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; status&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;404&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// via https://github.com/cloudflare/agents/tree/main/examples/cross-domain&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Env&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// Set { cors: true } to enable CORS headers.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;routeAgentRequest&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; cors&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)) &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Not found&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; status&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;404&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;satisfies&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ExportedHandler&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Env&lt;/span&gt;&lt;span&gt;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;h4&gt;Call Agent methods from your client code &lt;span&gt;New&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;We&apos;ve added a new &lt;a href=&quot;https://developers.cloudflare.com/agents/api-reference/agents-api/&quot;&gt;&lt;code&gt;@unstable_callable()&lt;/code&gt;&lt;/a&gt; decorator for defining methods that can be called directly from clients. This allows you call methods from within your client code: you can call methods (with arguments) and get native JavaScript objects back.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// server.ts&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;unstable_callable&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Agent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;agents&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Rpc&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Agent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Use the decorator to define a callable method&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;unstable_callable&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;rpc test&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getHistory&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sql&lt;/span&gt;&lt;span&gt;`SELECT * FROM history ORDER BY created_at DESC LIMIT 10`&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// server.ts&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;unstable_callable&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Agent&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt; type &lt;/span&gt;&lt;span&gt;StreamingResponse&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;agents&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import type &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Env&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;../server&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Rpc&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Agent&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Env&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Use the decorator to define a callable method&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;unstable_callable&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;rpc test&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getHistory&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sql&lt;/span&gt;&lt;span&gt;`SELECT * FROM history ORDER BY created_at DESC LIMIT 10`&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;h4&gt;agents-starter &lt;span&gt;Updated&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;We&apos;ve fixed a number of small bugs in the &lt;a href=&quot;https://github.com/cloudflare/agents-starter&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;agents-starter&lt;/code&gt;&lt;/a&gt; project — a real-time, chat-based example application with tool-calling &amp;#x26; human-in-the-loop built using the Agents SDK. The starter has also been upgraded to use the latest &lt;a href=&quot;https://developers.cloudflare.com/changelog/2025-03-13-wrangler-v4/&quot;&gt;wrangler v4&lt;/a&gt; release.&lt;/p&gt;
&lt;p&gt;If you&apos;re new to Agents, you can install and run the &lt;code&gt;agents-starter&lt;/code&gt; project in two commands:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Install it&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cloudflare@latest&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;agents-starter&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--template=&quot;cloudflare/agents-starter&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Run it&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;start&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;You can use the starter as a template for your own Agents projects: open up &lt;code&gt;src/server.ts&lt;/code&gt; and &lt;code&gt;src/client.tsx&lt;/code&gt; to see how the Agents SDK is used.&lt;/p&gt;
&lt;h4&gt;More documentation &lt;span&gt;Updated&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;We&apos;ve heard your feedback on the Agents SDK documentation, and we&apos;re shipping more API reference material and usage examples, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Expanded &lt;a href=&quot;https://developers.cloudflare.com/agents/api-reference/&quot;&gt;API reference documentation&lt;/a&gt;, covering the methods and properties exposed by the Agents SDK, as well as more usage examples.&lt;/li&gt;
&lt;li&gt;More &lt;a href=&quot;https://developers.cloudflare.com/agents/api-reference/agents-api/#client-api&quot;&gt;Client API&lt;/a&gt; documentation that documents &lt;code&gt;useAgent&lt;/code&gt;, &lt;code&gt;useAgentChat&lt;/code&gt; and the new &lt;code&gt;@unstable_callable&lt;/code&gt; RPC decorator exposed by the SDK.&lt;/li&gt;
&lt;li&gt;New documentation on how to &lt;a href=&quot;https://developers.cloudflare.com/agents/api-reference/routing/&quot;&gt;route requests to agents&lt;/a&gt; and (optionally) authenticate clients before they connect to your Agents.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that the Agents SDK is continually growing: the type definitions included in the SDK will always include the latest APIs exposed by the &lt;code&gt;agents&lt;/code&gt; package.&lt;/p&gt;
&lt;p&gt;If you&apos;re still wondering what Agents are, &lt;a href=&quot;https://blog.cloudflare.com/build-ai-agents-on-cloudflare/&quot; target=&quot;_blank&quot;&gt;read our blog on building AI Agents on Cloudflare&lt;/a&gt; and/or visit the &lt;a href=&quot;https://developers.cloudflare.com/agents/&quot;&gt;Agents documentation&lt;/a&gt; to learn more.&lt;/p&gt;</description><pubDate>Tue, 18 Mar 2025 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>Workers AI - New models in Workers AI</title><link>https://developers.cloudflare.com/changelog/post/2025-03-17-new-workers-ai-models/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-03-17-new-workers-ai-models/</guid><description>&lt;p&gt;Workers AI is excited to add 4 new models to the catalog, including 2 brand new classes of models with a text-to-speech and reranker model. Introducing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/bge-m3/&quot;&gt;@cf/baai/bge-m3&lt;/a&gt; - a multi-lingual embeddings model that supports over 100 languages. It can also simultaneously perform dense retrieval, multi-vector retrieval, and sparse retrieval, with the ability to process inputs of different granularities.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/bge-reranker-base/&quot;&gt;@cf/baai/bge-reranker-base&lt;/a&gt; - our first reranker model! Rerankers are a type of text classification model that takes a query and context, and outputs a similarity score between the two. When used in RAG systems, you can use a reranker after the initial vector search to find the most relevant documents to return to a user by reranking the outputs.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/whisper-large-v3-turbo/&quot;&gt;@cf/openai/whisper-large-v3-turbo&lt;/a&gt; - a faster, more accurate speech-to-text model. This model was added earlier but is graduating out of beta with pricing included today.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/melotts/&quot;&gt;@cf/myshell-ai/melotts&lt;/a&gt; - our first text-to-speech model that allows users to generate an MP3 with voice audio from inputted text.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pricing is available for each of these models on the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/platform/pricing/&quot;&gt;Workers AI pricing page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This docs update includes a few minor bug fixes to the model schema for llama-guard, llama-3.2-1b, which you can review on the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/changelog/&quot;&gt;product changelog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Try it out and let us know what you think! Stay tuned for more models in the coming days.&lt;/p&gt;</description><pubDate>Mon, 17 Mar 2025 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category></item><item><title>Workers - Import `env` to access bindings in your Worker&apos;s global scope</title><link>https://developers.cloudflare.com/changelog/post/2025-03-17-importable-env/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-03-17-importable-env/</guid><description>&lt;p&gt;You can now access &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/bindings/&quot;&gt;bindings&lt;/a&gt;
from anywhere in your Worker by importing the &lt;code&gt;env&lt;/code&gt; object from &lt;code&gt;cloudflare:workers&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Previously, &lt;code&gt;env&lt;/code&gt; could only be accessed during a request. This meant that
bindings could not be used in the top-level context of a Worker.&lt;/p&gt;
&lt;p&gt;Now, you can import &lt;code&gt;env&lt;/code&gt; and access bindings such as &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/secrets/&quot;&gt;secrets&lt;/a&gt;
or &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/environment-variables/&quot;&gt;environment variables&lt;/a&gt; in the
initial setup for your Worker:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;cloudflare:workers&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;ApiClient&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;example-api-client&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// API_KEY and LOG_LEVEL now usable in top-level scope&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apiClient&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ApiClient&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; apiKey&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;API_KEY&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;LOG_LEVEL&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;LOG_LEVEL&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;info&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;req&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// you can use apiClient or LOG_LEVEL, configured before any request is handled&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;aside&gt;&lt;p&gt;Note&lt;/p&gt;&lt;div&gt;&lt;p&gt;Workers do not allow I/O from outside a request context. This means that even
though &lt;code&gt;env&lt;/code&gt; is accessible from the top-level scope, you will not be able to access
every binding&apos;s methods.&lt;/p&gt;&lt;p&gt;For instance, environment variables and secrets are accessible, and you are able to
call &lt;code&gt;env.NAMESPACE.get&lt;/code&gt; to get a &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/api/stub/&quot;&gt;Durable Object stub&lt;/a&gt; in the
top-level context. However, calling methods on the Durable Object stub, making &lt;a href=&quot;https://developers.cloudflare.com/kv/api/&quot;&gt;calls to a KV store&lt;/a&gt;,
and &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings&quot;&gt;calling to other Workers&lt;/a&gt; will not work.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;Additionally, &lt;code&gt;env&lt;/code&gt; was normally accessed as a argument to a Worker&apos;s entrypoint handler,
such as &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/fetch/&quot;&gt;&lt;code&gt;fetch&lt;/code&gt;&lt;/a&gt;.
This meant that if you needed to access a binding from a deeply nested function,
you had to pass &lt;code&gt;env&lt;/code&gt; as an argument through many functions to get it to the
right spot. This could be cumbersome in complex codebases.&lt;/p&gt;
&lt;p&gt;Now, you can access the bindings from anywhere in your codebase
without passing &lt;code&gt;env&lt;/code&gt; as an argument:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// helpers.js&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;cloudflare:workers&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// env is *not* an argument to this function&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getValue&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;prefix&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;KV_PREFIX&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;KV&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;prefix&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For more information, see &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/bindings#how-to-access-env&quot;&gt;documentation on accessing &lt;code&gt;env&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 17 Mar 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers, Pages - Retry Pages &amp; Workers Builds Directly from GitHub</title><link>https://developers.cloudflare.com/changelog/post/2025-03-17-rerun-build/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-03-17-rerun-build/</guid><description>&lt;p&gt;You can now retry your Cloudflare Pages and Workers builds directly from GitHub. No need to switch to the Cloudflare Dashboard for a simple retry!&lt;/p&gt;
&lt;p&gt;Let\u2019s say you push a commit, but your build fails due to a spurious error like a network timeout. Instead of going to the Cloudflare Dashboard to manually retry, you can now rerun the build with just a few clicks inside GitHub, keeping you inside your workflow.&lt;/p&gt;
&lt;p&gt;For Pages and Workers projects connected to a GitHub repository:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;When a build fails, go to your GitHub repository or pull request&lt;/li&gt;
&lt;li&gt;Select the failed Check Run for the build&lt;/li&gt;
&lt;li&gt;Select &quot;Details&quot; on the Check Run&lt;/li&gt;
&lt;li&gt;Select &quot;Rerun&quot; to trigger a retry build for that commit&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://developers.cloudflare.com/pages/configuration/git-integration/github-integration/&quot;&gt;Pages Builds&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/git-integration/github-integration/&quot;&gt;Workers Builds&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 17 Mar 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category><category>Pages</category></item><item><title>Workers - Use the latest JavaScript features with Wrangler CLI v4</title><link>https://developers.cloudflare.com/changelog/post/2025-03-13-wrangler-v4/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-03-13-wrangler-v4/</guid><description>&lt;p&gt;We&apos;ve released the next major version of &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/&quot;&gt;Wrangler&lt;/a&gt;, the CLI for Cloudflare Workers — &lt;code&gt;wrangler@4.0.0&lt;/code&gt;. Wrangler v4 is a major release focused on updates to underlying systems and dependencies, along with improvements to keep Wrangler commands consistent and clear.&lt;/p&gt;
&lt;p&gt;You can run the following command to install it in your projects:&lt;/p&gt;
 &lt;div&gt; &lt;div&gt;  &lt;/div&gt; &lt;div&gt; &lt;div&gt;  &lt;pre&gt;&lt;code class=&quot;astro-qph66ij4&quot;&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; i wrangler@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;/div&gt; &lt;/div&gt;&lt;div&gt; &lt;div&gt;  &lt;pre&gt;&lt;code class=&quot;astro-qph66ij4&quot;&gt;&lt;span&gt;yarn&lt;/span&gt;&lt;span&gt; add wrangler@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;/div&gt; &lt;/div&gt;&lt;div&gt; &lt;div&gt;  &lt;pre&gt;&lt;code class=&quot;astro-qph66ij4&quot;&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; add wrangler@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;/div&gt; &lt;/div&gt;&lt;div&gt; &lt;div&gt;  &lt;pre&gt;&lt;code class=&quot;astro-qph66ij4&quot;&gt;&lt;span&gt;bun&lt;/span&gt;&lt;span&gt; add wrangler@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;/div&gt; &lt;/div&gt;  &lt;/div&gt;  
&lt;p&gt;Unlike previous major versions of Wrangler, which were &lt;a href=&quot;https://blog.cloudflare.com/wrangler-v2-beta/&quot; target=&quot;_blank&quot;&gt;foundational rewrites&lt;/a&gt; and &lt;a href=&quot;https://blog.cloudflare.com/wrangler3/&quot; target=&quot;_blank&quot;&gt;rearchitectures&lt;/a&gt; — Version 4 of Wrangler includes a much smaller set of changes. If you use Wrangler today, your workflow is very unlikely to change.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/migration/update-v3-to-v4&quot;&gt;detailed migration guide&lt;/a&gt; is available and if you find a bug or hit a roadblock when upgrading to Wrangler v4, &lt;a href=&quot;https://github.com/cloudflare/workers-sdk/issues/new?template=bug-template.yaml&quot; target=&quot;_blank&quot;&gt;open an issue on the &lt;code&gt;cloudflare/workers-sdk&lt;/code&gt; repository on GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Going forward, we&apos;ll continue supporting Wrangler v3 with bug fixes and security updates until Q1 2026, and with critical security updates until Q1 2027, at which point it will be out of support.&lt;/p&gt;</description><pubDate>Thu, 13 Mar 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Set breakpoints and debug your Workers tests with @cloudflare/vitest-pool-workers</title><link>https://developers.cloudflare.com/changelog/post/2025-03-14-breakpoint-debugging-with-vitest/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-03-14-breakpoint-debugging-with-vitest/</guid><description>&lt;p&gt;You can now debug your Workers tests with our &lt;a href=&quot;https://developers.cloudflare.com/workers/testing/vitest-integration/&quot;&gt;Vitest integration&lt;/a&gt; by running the following command:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;vitest&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--inspect&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--no-file-parallelism&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Attach a debugger to the port 9229 and you can start stepping through your Workers tests. This is available with &lt;code&gt;@cloudflare/vitest-pool-workers&lt;/code&gt; v0.7.5 or later.&lt;/p&gt;
&lt;p&gt;Learn more in our &lt;a href=&quot;https://developers.cloudflare.com/workers/testing/vitest-integration/debugging/&quot;&gt;documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 13 Mar 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Email Routing - Threaded replies now possible in Email Workers</title><link>https://developers.cloudflare.com/changelog/post/2025-03-12-reply-limits/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-03-12-reply-limits/</guid><description>&lt;p&gt;We’re removing some of the restrictions in Email Routing so that AI Agents and task automation can better handle email workflows, including how Workers can &lt;a href=&quot;https://developers.cloudflare.com/email-routing/email-workers/reply-email-workers/&quot;&gt;reply&lt;/a&gt; to incoming emails.&lt;/p&gt;
&lt;p&gt;It&apos;s now possible to keep a threaded email conversation with an &lt;a href=&quot;https://developers.cloudflare.com/email-routing/email-workers/&quot;&gt;Email Worker&lt;/a&gt; script as long as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The incoming email has to have valid &lt;a href=&quot;https://www.cloudflare.com/learning/dns/dns-records/dns-dmarc-record/&quot; target=&quot;_blank&quot;&gt;DMARC&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The email can only be replied to once in the same &lt;code&gt;EmailMessage&lt;/code&gt; event.&lt;/li&gt;
&lt;li&gt;The recipient in the reply must match the incoming sender.&lt;/li&gt;
&lt;li&gt;The outgoing sender domain must match the same domain that received the email.&lt;/li&gt;
&lt;li&gt;Every time an email passes through Email Routing or another MTA, an entry is added to the &lt;code&gt;References&lt;/code&gt; list. We stop accepting replies to emails with more than 100 &lt;code&gt;References&lt;/code&gt; entries to prevent abuse or accidental loops.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&apos;s an example of a Worker responding to Emails using a Workers AI model:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;PostalMime&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;postal-mime&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;createMimeMessage&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;mimetext&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;EmailMessage&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;cloudflare:email&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;email&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;email&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;PostalMime&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;parse&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;raw&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;res&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AI&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;@cf/meta/llama-2-7b-chat-fp16&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;messages&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;role&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;user&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;content&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;email&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;??&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// message-id is generated by mimetext&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;createMimeMessage&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setHeader&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;In-Reply-To&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Message-ID&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setSender&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;agent@example.com&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setRecipient&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setSubject&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Llama response&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;addMessage&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;contentType&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;text/plain&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;res&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;instanceof&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ReadableStream&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;res&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;res&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;replyMessage&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;EmailMessage&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&amp;#x3C;email&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;asRaw&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;reply&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;replyMessage&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;satisfies&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ExportedHandler&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Env&lt;/span&gt;&lt;span&gt;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;See &lt;a href=&quot;https://developers.cloudflare.com/email-routing/email-workers/reply-email-workers/&quot;&gt;Reply to emails from Workers&lt;/a&gt; for more information.&lt;/p&gt;</description><pubDate>Wed, 12 Mar 2025 00:00:00 GMT</pubDate><product>Email Routing</product><category>Email Routing</category></item><item><title>Workers - Access your Worker&apos;s environment variables from process.env</title><link>https://developers.cloudflare.com/changelog/post/2025-03-11-process-env-support/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-03-11-process-env-support/</guid><description>&lt;p&gt;You can now access &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/environment-variables/&quot;&gt;environment variables&lt;/a&gt; and
&lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/secrets/&quot;&gt;secrets&lt;/a&gt; on &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/nodejs/process/#processenv&quot;&gt;&lt;code&gt;process.env&lt;/code&gt;&lt;/a&gt;
when using the &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/compatibility-flags/#nodejs-compatibility-flag&quot;&gt;&lt;code&gt;nodejs_compat&lt;/code&gt; compatibility flag&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apiClient&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ApiClient&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; apiKey&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;process&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;API_KEY&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;LOG_LEVEL&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;process&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;LOG_LEVEL&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;info&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;In Node.js, environment variables are exposed via the global &lt;code&gt;process.env&lt;/code&gt; object. Some libraries
assume that this object will be populated, and many developers may be used to accessing variables
in this way.&lt;/p&gt;
&lt;p&gt;Previously, the &lt;code&gt;process.env&lt;/code&gt; object was always empty unless written to in Worker code. This could
cause unexpected errors or friction when developing Workers using code previously written for Node.js.&lt;/p&gt;
&lt;p&gt;Now, &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/environment-variables/&quot;&gt;environment variables&lt;/a&gt;,
&lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/secrets/&quot;&gt;secrets&lt;/a&gt;, and &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/bindings/version-metadata/&quot;&gt;version metadata&lt;/a&gt;
can all be accessed on &lt;code&gt;process.env&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;To opt-in to the new &lt;code&gt;process.env&lt;/code&gt; behaviour now, add the &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/compatibility-flags/#enable-auto-populating-processenv&quot;&gt;&lt;code&gt;nodejs_compat_populate_process_env&lt;/code&gt;&lt;/a&gt; compatibility flag to your
&lt;code&gt;wrangler.json&lt;/code&gt; configuration:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;wrangler.jsonc&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;jsonc&quot;&gt;&lt;code class=&quot;language-jsonc&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Rest of your configuration&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Add &quot;nodejs_compat_populate_process_env&quot; to your compatibility_flags array&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;compatibility_flags&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&quot;nodejs_compat&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;nodejs_compat_populate_process_env&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Rest of your configuration&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;wrangler.toml&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;toml&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;compatibility_flags&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;nodejs_compat&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;nodejs_compat_populate_process_env&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;After April 1, 2025, populating &lt;code&gt;process.env&lt;/code&gt; will become the default behavior when both &lt;code&gt;nodejs_compat&lt;/code&gt; is enabled and
your Worker&apos;s &lt;code&gt;compatibility_date&lt;/code&gt; is after &quot;2025-04-01&quot;.&lt;/p&gt;</description><pubDate>Tue, 11 Mar 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Hyperdrive - Hyperdrive reduces query latency by up to 90% and now supports IP access control lists</title><link>https://developers.cloudflare.com/changelog/post/2025-03-04-hyperdrive-pooling-near-database-and-ip-range-egress/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-03-04-hyperdrive-pooling-near-database-and-ip-range-egress/</guid><description>&lt;p&gt;Hyperdrive now pools database connections in one or more regions close to your database. This means that your uncached queries and new database connections have up to 90% less latency as measured from connection pools.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/hyperdrive-regional-pooling-query-latency-improvement.Bzz_xvHZ_rlYbl.webp&quot; alt=&quot;Hyperdrive query latency decreases by 90% during Hyperdrive&amp;#x27;s gradual rollout of regional pooling.&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;By improving placement of Hyperdrive database connection pools, Workers&apos; Smart Placement is now more effective when used with Hyperdrive, ensuring that your Worker can be placed as close to your database as possible.&lt;/p&gt;
&lt;p&gt;With this update, Hyperdrive also uses &lt;a href=&quot;https://www.cloudflare.com/ips/&quot; target=&quot;_blank&quot;&gt;Cloudflare&apos;s standard IP address ranges&lt;/a&gt; to connect to your database. This enables you to configure the firewall policies (IP access control lists) of your database to only allow access from Cloudflare and Hyperdrive.&lt;/p&gt;
&lt;p&gt;Refer to &lt;a href=&quot;https://developers.cloudflare.com/hyperdrive/concepts/how-hyperdrive-works/&quot;&gt;documentation on how Hyperdrive makes connecting to regional databases from Cloudflare Workers fast&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This improvement is enabled on all Hyperdrive configurations.&lt;/p&gt;</description><pubDate>Fri, 07 Mar 2025 00:00:00 GMT</pubDate><product>Hyperdrive</product><category>Hyperdrive</category></item><item><title>R2 - Set retention polices for your R2 bucket with bucket locks</title><link>https://developers.cloudflare.com/changelog/post/2025-03-06-r2-bucket-locks/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-03-06-r2-bucket-locks/</guid><description>&lt;p&gt;You can now use &lt;a href=&quot;https://developers.cloudflare.com/r2/buckets/bucket-locks/&quot;&gt;bucket locks&lt;/a&gt; to set retention policies on your &lt;a href=&quot;https://developers.cloudflare.com/r2/buckets/&quot;&gt;R2 buckets&lt;/a&gt; (or specific prefixes within your buckets) for a specified period — or indefinitely. This can help ensure compliance by protecting important data from accidental or malicious deletion.&lt;/p&gt;
&lt;p&gt;Locks give you a few ways to ensure your objects are retained (not deleted or overwritten). You can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lock objects for a specific duration, for example 90 days.&lt;/li&gt;
&lt;li&gt;Lock objects until a certain date, for example January 1, 2030.&lt;/li&gt;
&lt;li&gt;Lock objects indefinitely, until the lock is explicitly removed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Buckets can have up to 1,000 &lt;a href=&quot;https://developers.cloudflare.com/r2/buckets/&quot;&gt;bucket lock rules&lt;/a&gt;. Each rule specifies which objects it covers (via prefix) and how long those objects must remain retained.&lt;/p&gt;
&lt;p&gt;Here are a couple of examples showing how you can configure bucket lock rules using &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/&quot;&gt;Wrangler&lt;/a&gt;:&lt;/p&gt;
&lt;h4&gt;Ensure all objects in a bucket are retained for at least 180 days&lt;/h4&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;r2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bucket&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;lock&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;#x3C;bucket&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;180-days-all&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--retention-days&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;180&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Prevent deletion or overwriting of all logs indefinitely (via prefix)&lt;/h4&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;r2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bucket&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;lock&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;#x3C;bucket&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;indefinite-logs&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--prefix&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;logs/&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--retention-indefinite&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For more information on bucket locks and how to set retention policies for objects in your R2 buckets, refer to our &lt;a href=&quot;https://developers.cloudflare.com/r2/buckets/bucket-locks/&quot;&gt;documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 06 Mar 2025 00:00:00 GMT</pubDate><product>R2</product><category>R2</category></item><item><title>Stream - Introducing Media Transformations from Cloudflare Stream</title><link>https://developers.cloudflare.com/changelog/post/2025-03-06-media-transformations/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-03-06-media-transformations/</guid><description>&lt;p&gt;Today, we are thrilled to announce Media Transformations, a new service that
brings the magic of &lt;a href=&quot;https://developers.cloudflare.com/images/transform-images/&quot;&gt;Image Transformations&lt;/a&gt; to
&lt;em&gt;short-form video files,&lt;/em&gt; wherever they are stored!&lt;/p&gt;
&lt;p&gt;For customers with a huge volume of short video — generative AI output,
e-commerce product videos, social media clips, or short marketing content —
uploading those assets to Stream is not always practical. Sometimes, the
greatest friction to getting started was the thought of all that migrating.
Customers want a simpler solution that retains their current storage strategy to
deliver small, optimized MP4 files. Now you can do that with Media
Transformations.&lt;/p&gt;
&lt;p&gt;To transform a video or image,
&lt;a href=&quot;https://developers.cloudflare.com/stream/transform-videos/#getting-started&quot;&gt;enable transformations&lt;/a&gt; for your
zone, then make a simple request with a specially formatted URL. The result is
an MP4 that can be used in an HTML video element without a player library.
If your zone already has Image Transformations enabled, then it is ready to
optimize videos with Media Transformations, too.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;https://example.com/cdn-cgi/media/&amp;#x3C;OPTIONS&gt;/&amp;#x3C;SOURCE-VIDEO&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For example, we have a short video of the mobile in Austin&apos;s office. The
original is nearly 30 megabytes and wider than necessary for this layout.
Consider a simple width adjustment:&lt;/p&gt;

&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;https://example.com/cdn-cgi/media/width=640/&amp;#x3C;SOURCE-VIDEO&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;https://developers.cloudflare.com/cdn-cgi/media/width=640/https://pub-d9fcbc1abcd244c1821f38b99017347f.r2.dev/aus-mobile.mp4&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The result is less than 3 megabytes, properly sized, and delivered dynamically
so that customers do not have to manage the creation and storage of these
transformed assets.&lt;/p&gt;
&lt;p&gt;For more information, learn about &lt;a href=&quot;https://developers.cloudflare.com/stream/transform-videos/&quot;&gt;Transforming Videos&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 06 Mar 2025 00:00:00 GMT</pubDate><product>Stream</product><category>Stream</category></item><item><title>Workers - Use the latest JavaScript features with Wrangler CLI v4.0.0-rc.0</title><link>https://developers.cloudflare.com/changelog/post/2025-02-28-wrangler-v4-rc/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-02-28-wrangler-v4-rc/</guid><description>&lt;p&gt;We&apos;ve released a release candidate of the next major version of &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/&quot;&gt;Wrangler&lt;/a&gt;, the CLI for Cloudflare Workers — &lt;code&gt;wrangler@4.0.0-rc.0&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You can run the following command to install it and be one of the first to try it out:&lt;/p&gt;
 &lt;div&gt; &lt;div&gt;  &lt;/div&gt; &lt;div&gt; &lt;div&gt;  &lt;pre&gt;&lt;code class=&quot;astro-qph66ij4&quot;&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; i wrangler@v4-rc&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;/div&gt; &lt;/div&gt;&lt;div&gt; &lt;div&gt;  &lt;pre&gt;&lt;code class=&quot;astro-qph66ij4&quot;&gt;&lt;span&gt;yarn&lt;/span&gt;&lt;span&gt; add wrangler@v4-rc&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;/div&gt; &lt;/div&gt;&lt;div&gt; &lt;div&gt;  &lt;pre&gt;&lt;code class=&quot;astro-qph66ij4&quot;&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; add wrangler@v4-rc&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;/div&gt; &lt;/div&gt;&lt;div&gt; &lt;div&gt;  &lt;pre&gt;&lt;code class=&quot;astro-qph66ij4&quot;&gt;&lt;span&gt;bun&lt;/span&gt;&lt;span&gt; add wrangler@v4-rc&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;/div&gt; &lt;/div&gt;  &lt;/div&gt;  
&lt;p&gt;Unlike previous major versions of Wrangler, which were &lt;a href=&quot;https://blog.cloudflare.com/wrangler-v2-beta/&quot; target=&quot;_blank&quot;&gt;foundational rewrites&lt;/a&gt; and &lt;a href=&quot;https://blog.cloudflare.com/wrangler3/&quot; target=&quot;_blank&quot;&gt;rearchitectures&lt;/a&gt; — Version 4 of Wrangler includes a much smaller set of changes. If you use Wrangler today, your workflow is very unlikely to change. Before we release Wrangler v4 and advance past the release candidate stage, we&apos;ll share a detailed migration guide in the Workers developer docs. But for the vast majority of cases, you won&apos;t need to do anything to migrate — things will just work as they do today. We are sharing this release candidate in advance of the official release of v4, so that you can try it out early and share feedback.&lt;/p&gt;
&lt;h4&gt;New JavaScript language features that you can now use with Wrangler v4&lt;/h4&gt;
&lt;p&gt;Version 4 of Wrangler updates the version of &lt;a href=&quot;https://esbuild.github.io/&quot; target=&quot;_blank&quot;&gt;esbuild&lt;/a&gt; that Wrangler uses internally, allowing you to use modern JavaScript language features, including:&lt;/p&gt;
&lt;h5&gt;The &lt;code&gt;using&lt;/code&gt; keyword from Explicit Resource Management&lt;/h5&gt;
&lt;p&gt;The &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/rpc/lifecycle/#explicit-resource-management&quot;&gt;&lt;code&gt;using&lt;/code&gt; keyword from the Explicit Resource Management standard&lt;/a&gt; makes it easier to work with the &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/rpc/&quot;&gt;JavaScript-native RPC system built into Workers&lt;/a&gt;. This means that when you obtain a stub, you can ensure that it is automatically disposed when you exit scope it was created in:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sendEmail&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;using&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;user&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;USER_SERVICE&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;findUser&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;user&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sendEmail&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// user[Symbol.dispose]() is implicitly called at the end of the scope.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h5&gt;Import attributes&lt;/h5&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import/with&quot; target=&quot;_blank&quot;&gt;Import attributes&lt;/a&gt; allow you to denote the type or other attributes of the module that your code imports. For example, you can import a JSON module, using the following syntax:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;./data.json&quot;&lt;/span&gt;&lt;span&gt; with &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;json&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h4&gt;Other changes&lt;/h4&gt;
&lt;h5&gt;&lt;code&gt;--local&lt;/code&gt; is now the default for all CLI commands&lt;/h5&gt;
&lt;p&gt;All commands that access resources (for example, &lt;code&gt;wrangler kv&lt;/code&gt;, &lt;code&gt;wrangler r2&lt;/code&gt;, &lt;code&gt;wrangler d1&lt;/code&gt;) now access local datastores by default, ensuring consistent behavior.&lt;/p&gt;
&lt;h5&gt;Clearer policy for the minimum required version of Node.js required to run Wrangler&lt;/h5&gt;
&lt;p&gt;Moving forward, the &lt;a href=&quot;https://nodejs.org/en/about/previous-releases&quot; target=&quot;_blank&quot;&gt;active, maintenance, and current versions of Node.js&lt;/a&gt; will be officially supported by Wrangler. This means the minimum officially supported version of Node.js you must have installed for Wrangler v4 will be Node.js v18 or later. This policy mirrors how many other packages and CLIs support older versions of Node.js, and ensures that as long as you are using a version of Node.js that the Node.js project itself supports, this will be supported by Wrangler as well.&lt;/p&gt;
&lt;h5&gt;Features previously deprecated in Wrangler v3 are now removed in Wrangler v4&lt;/h5&gt;
&lt;p&gt;All previously deprecated features in &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/deprecations/#wrangler-v2&quot; target=&quot;_blank&quot;&gt;Wrangler v2&lt;/a&gt; and in &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/deprecations/#wrangler-v3&quot; target=&quot;_blank&quot;&gt;Wrangler v3&lt;/a&gt; have now been removed. Additionally, the following features that were deprecated during the Wrangler v3 release have been removed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Legacy Assets (using &lt;code&gt;wrangler dev/deploy --legacy-assets&lt;/code&gt; or the &lt;code&gt;legacy_assets&lt;/code&gt; config file property). Instead, we recommend you &lt;a href=&quot;https://developers.cloudflare.com/workers/static-assets/&quot; target=&quot;_blank&quot;&gt;migrate to Workers assets&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Legacy Node.js compatibility (using &lt;code&gt;wrangler dev/deploy --node-compat&lt;/code&gt; or the &lt;code&gt;node_compat&lt;/code&gt; config file property). Instead, use the &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/nodejs&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;nodejs_compat&lt;/code&gt; compatibility flag&lt;/a&gt;. This includes the functionality from legacy &lt;code&gt;node_compat&lt;/code&gt; polyfills and natively implemented Node.js APIs.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wrangler version&lt;/code&gt;. Instead, use &lt;code&gt;wrangler --version&lt;/code&gt; to check the current version of Wrangler.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;getBindingsProxy()&lt;/code&gt; (via &lt;code&gt;import { getBindingsProxy } from &quot;wrangler&quot;&lt;/code&gt;). Instead, use the &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/api/#getplatformproxy&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;getPlatformProxy()&lt;/code&gt; API&lt;/a&gt;, which takes exactly the same arguments.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;usage_model&lt;/code&gt;. This no longer has any effect, after the &lt;a href=&quot;https://blog.cloudflare.com/workers-pricing-scale-to-zero/&quot; target=&quot;_blank&quot;&gt;rollout of Workers Standard Pricing&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We&apos;d love your feedback! If you find a bug or hit a roadblock when upgrading to Wrangler v4, &lt;a href=&quot;https://github.com/cloudflare/workers-sdk/issues/new?template=bug-template.yaml&quot; target=&quot;_blank&quot;&gt;open an issue on the &lt;code&gt;cloudflare/workers-sdk&lt;/code&gt; repository on GitHub&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 28 Feb 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Browser Rendering - New REST API is in open beta!</title><link>https://developers.cloudflare.com/changelog/post/2025-02-27-br-rest-api-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-02-27-br-rest-api-beta/</guid><description>&lt;p&gt;We&apos;ve released a new REST API for &lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/&quot;&gt;Browser Rendering&lt;/a&gt; in open beta, making interacting with browsers easier than ever. This new API provides endpoints for common browser actions, with more to be added in the future.&lt;/p&gt;
&lt;p&gt;With the &lt;strong&gt;REST API&lt;/strong&gt; you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Capture screenshots&lt;/strong&gt; – Use &lt;code&gt;/screenshot&lt;/code&gt; to take a screenshot of a webpage from provided URL or HTML.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generate PDFs&lt;/strong&gt; – Use &lt;code&gt;/pdf&lt;/code&gt; to convert web pages into PDFs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extract HTML content&lt;/strong&gt; – Use &lt;code&gt;/content&lt;/code&gt; to retrieve the full HTML from a page.
&lt;strong&gt;Snapshot (HTML + Screenshot)&lt;/strong&gt; – Use &lt;code&gt;/snapshot&lt;/code&gt; to capture both the page&apos;s HTML and a screenshot in one request&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scrape Web Elements&lt;/strong&gt; – Use &lt;code&gt;/scrape&lt;/code&gt; to extract specific elements from a page.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For example, to capture a screenshot:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-X&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;POST&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;https://api.cloudflare.com/client/v4/accounts/&amp;#x3C;accountId&gt;/browser-rendering/screenshot&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-H&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;Authorization: Bearer &amp;#x3C;apiToken&gt;&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-H&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;Content-Type: application/json&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;html&quot;: &quot;Hello World!&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;screenshotOptions&quot;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;type&quot;: &quot;webp&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;omitBackground&quot;: true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--output&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;screenshot.webp&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Learn more in our &lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/rest-api/&quot;&gt;documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 27 Feb 2025 00:00:00 GMT</pubDate><product>Browser Rendering</product><category>Browser Rendering</category></item><item><title>AI Gateway - Introducing Guardrails in AI Gateway</title><link>https://developers.cloudflare.com/changelog/post/2025-02-26-guardrails/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-02-26-guardrails/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/&quot;&gt;AI Gateway&lt;/a&gt; now includes &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/features/guardrails/&quot;&gt;Guardrails&lt;/a&gt;, to help you monitor your AI apps for harmful or inappropriate content and deploy safely.&lt;/p&gt;
&lt;p&gt;Within the AI Gateway settings, you can configure:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Guardrails&lt;/strong&gt;: Enable or disable content moderation as needed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Evaluation scope&lt;/strong&gt;: Select whether to moderate user prompts, model responses, or both.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hazard categories&lt;/strong&gt;: Specify which categories to monitor and determine whether detected inappropriate content should be blocked or flagged.&lt;/li&gt;
&lt;/ul&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/Guardrails.BTNc0qeC_Z1HC20z.webp&quot; alt=&quot;Guardrails in AI Gateway&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;Learn more in the &lt;a href=&quot;https://blog.cloudflare.com/guardrails-in-ai-gateway/&quot; target=&quot;_blank&quot;&gt;blog&lt;/a&gt; or our &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/features/guardrails/&quot;&gt;documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 26 Feb 2025 00:00:00 GMT</pubDate><product>AI Gateway</product><category>AI Gateway</category></item><item><title>Agents, Workers - Introducing the Agents SDK</title><link>https://developers.cloudflare.com/changelog/post/2025-02-25-agents-sdk/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-02-25-agents-sdk/</guid><description>&lt;p&gt;We&apos;ve released the &lt;a href=&quot;http://blog.cloudflare.com/build-ai-agents-on-cloudflare/&quot; target=&quot;_blank&quot;&gt;Agents SDK&lt;/a&gt;, a package and set of tools that help you build and ship AI Agents.&lt;/p&gt;
&lt;p&gt;You can get up and running with a &lt;a href=&quot;https://github.com/cloudflare/agents-starter&quot; target=&quot;_blank&quot;&gt;chat-based AI Agent&lt;/a&gt; (and deploy it to Workers) that uses the Agents SDK, tool calling, and state syncing with a React-based front-end by running the following command:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cloudflare@latest&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;agents-starter&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--template=&quot;cloudflare/agents-starter&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# open up README.md and follow the instructions&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;You can also add an Agent to any existing Workers application by installing the &lt;code&gt;agents&lt;/code&gt; package directly&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;agents&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;... and then define your first Agent:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Agent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;agents&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;YourAgent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Agent&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Env&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Build it out&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Access state on this.state or query the Agent&apos;s database via this.sql&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Handle WebSocket events with onConnect and onMessage&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Run tasks on a schedule with this.schedule&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Call AI models&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// ... and/or call other Agents.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Head over to the &lt;a href=&quot;https://developers.cloudflare.com/agents/&quot;&gt;Agents documentation&lt;/a&gt; to learn more about the Agents SDK, the SDK APIs, as well as how to test and deploying agents to production.&lt;/p&gt;</description><pubDate>Tue, 25 Feb 2025 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>Workers AI - Workers AI now supports structured JSON outputs.</title><link>https://developers.cloudflare.com/changelog/post/2025-02-25-json-mode/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-02-25-json-mode/</guid><description>&lt;p&gt;Workers AI now supports structured JSON outputs with &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/features/json-mode/&quot;&gt;JSON mode&lt;/a&gt;, which allows you to request a structured output response when interacting with AI models.&lt;/p&gt;
&lt;p&gt;This makes it much easier to retrieve structured data from your AI models, and avoids the (error prone!) need to parse large unstructured text responses to extract your data.&lt;/p&gt;
&lt;p&gt;JSON mode in Workers AI is compatible with the OpenAI SDK&apos;s &lt;a href=&quot;https://platform.openai.com/docs/guides/structured-outputs&quot; target=&quot;_blank&quot;&gt;structured outputs&lt;/a&gt; &lt;code&gt;response_format&lt;/code&gt; API, which can be used directly in a Worker:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;OpenAI&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;openai&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Define your JSON schema for a calendar event&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;CalendarEventSchema&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;object&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;properties&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;string&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;string&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;participants&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;array&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; items&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;string&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;required&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;date&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;participants&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;OpenAI&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;apiKey&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// Optional: use AI Gateway to bring logs, evals &amp;#x26; caching to your AI requests&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// https://developers.cloudflare.com/ai-gateway/usage/providers/openai/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// baseUrl: &quot;https://gateway.ai.cloudflare.com/v1/{account_id}/{gateway_id}/openai&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;chat&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;completions&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;gpt-4o-2024-08-06&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;messages&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; role&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;system&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; content&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Extract the event information.&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;role&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;user&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;content&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Alice and Bob are going to a science fair on Friday.&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// Use the `response_format` option to request a structured JSON output&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;response_format&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// Set json_schema and provide ra schema, or json_object and parse it yourself&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;json_schema&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;schema&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;CalendarEventSchema&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// provide a schema&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// This will be of type CalendarEventSchema&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;choices&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;parsed&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;calendar_event&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;OpenAI&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;span&gt;&quot;openai&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;interface&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Env&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Define your JSON schema for a calendar event&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;CalendarEventSchema&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;object&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;properties&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;string&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;string&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;participants&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;array&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; items&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;string&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;required&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;date&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;participants&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Env&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;OpenAI&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;apiKey&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// Optional: use AI Gateway to bring logs, evals &amp;#x26; caching to your AI requests&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// https://developers.cloudflare.com/ai-gateway/usage/providers/openai/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// baseUrl: &quot;https://gateway.ai.cloudflare.com/v1/{account_id}/{gateway_id}/openai&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;chat&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;completions&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;gpt-4o-2024-08-06&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;messages&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; role&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;system&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; content&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Extract the event information.&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;role&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;user&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;content&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Alice and Bob are going to a science fair on Friday.&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// Use the `response_format` option to request a structured JSON output&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;response_format&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// Set json_schema and provide ra schema, or json_object and parse it yourself&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;json_schema&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;schema&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;CalendarEventSchema&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// provide a schema&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// This will be of type CalendarEventSchema&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;choices&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;parsed&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;calendar_event&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;To learn more about JSON mode and structured outputs, visit the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/features/json-mode/&quot;&gt;Workers AI documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 25 Feb 2025 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category></item><item><title>Workflows - Concurrent Workflow instances limits increased.</title><link>https://developers.cloudflare.com/changelog/post/2025-02-25-workflows-concurrency-increased/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-02-25-workflows-concurrency-increased/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workflows/&quot;&gt;Workflows&lt;/a&gt; now supports up to 4,500 concurrent (running) instances, up from the previous limit of 100. This limit will continue to increase during the Workflows open beta. This increase applies to all users on the Workers Paid plan, and takes effect immediately.&lt;/p&gt;
&lt;p&gt;Review the Workflows &lt;a href=&quot;https://developers.cloudflare.com/workflows/reference/limits&quot;&gt;limits documentation&lt;/a&gt; and/or dive into the &lt;a href=&quot;https://developers.cloudflare.com/workflows/get-started/guide/&quot;&gt;get started guide&lt;/a&gt; to start building on Workflows.&lt;/p&gt;</description><pubDate>Tue, 25 Feb 2025 00:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category></item><item><title>Cloudflare Images - Bind the Images API to your Worker</title><link>https://developers.cloudflare.com/changelog/post/2025-02-21-images-bindings-in-workers/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-02-21-images-bindings-in-workers/</guid><description>&lt;p&gt;You can now &lt;a href=&quot;https://developers.cloudflare.com/images/transform-images/bindings/&quot;&gt;interact with the Images API&lt;/a&gt; directly in your Worker.&lt;/p&gt;
&lt;p&gt;This allows more fine-grained control over transformation request flows and cache behavior. For example, you can resize, manipulate, and overlay images without requiring them to be accessible through a URL.&lt;/p&gt;
&lt;p&gt;The Images binding can be configured in the Cloudflare dashboard for your Worker or in the Wrangler configuration file in your project&apos;s directory:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;wrangler.jsonc&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;jsonc&quot;&gt;&lt;code class=&quot;language-jsonc&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;images&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;binding&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;IMAGES&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// i.e. available in your Worker on env.IMAGES&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;wrangler.toml&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;toml&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;images&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;binding&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;IMAGES&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;Within your Worker code, you can interact with this binding by using &lt;code&gt;env.IMAGES&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Here&apos;s how you can rotate, resize, and blur an image, then output the image as AVIF:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;info&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;IMAGES&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;info&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;stream&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// stream contains a valid image, and width/height is available on the info object&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;IMAGES&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;input&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;stream&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;transform&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; rotate&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;90&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;transform&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; width&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;128&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;transform&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; blur&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;20&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; format&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;image/avif&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/images/transform-images/bindings/&quot;&gt;Images Bindings&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 24 Feb 2025 00:00:00 GMT</pubDate><product>Cloudflare Images</product><category>Cloudflare Images</category></item><item><title>R2 - Super Slurper now supports migrations from all S3-compatible storage providers</title><link>https://developers.cloudflare.com/changelog/post/2025-02-24-r2-super-slurper-s3-compatible-support/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-02-24-r2-super-slurper-s3-compatible-support/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/r2/data-migration/super-slurper/&quot;&gt;Super Slurper&lt;/a&gt; can now migrate data from any S3-compatible object storage provider to &lt;a href=&quot;https://developers.cloudflare.com/r2/&quot;&gt;Cloudflare R2&lt;/a&gt;. This includes transfers from services like MinIO, Wasabi, Backblaze B2, and DigitalOcean Spaces.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/super-slurper-s3-compat-screenshot-border.D8Gd5eye_dt8CT.webp&quot; alt=&quot;Super Slurper S3-Compatible Source&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;For more information on Super Slurper and how to migrate data from your existing S3-compatible storage buckets to R2, refer to our &lt;a href=&quot;https://developers.cloudflare.com/r2/data-migration/super-slurper/&quot;&gt;documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 24 Feb 2025 00:00:00 GMT</pubDate><product>R2</product><category>R2</category></item><item><title>Workers AI - Workers AI larger context windows</title><link>https://developers.cloudflare.com/changelog/post/2025-02-24-context-windows/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-02-24-context-windows/</guid><description>&lt;p&gt;We&apos;ve updated the Workers AI text generation models to include context windows and limits definitions and changed our APIs to estimate and validate the number of tokens in the input prompt, not the number of characters.&lt;/p&gt;
&lt;p&gt;This update allows developers to use larger context windows when interacting with Workers AI models, which can lead to better and more accurate results.&lt;/p&gt;
&lt;p&gt;Our &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/&quot;&gt;catalog page&lt;/a&gt; provides more information about each model&apos;s supported context window.&lt;/p&gt;</description><pubDate>Mon, 24 Feb 2025 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category></item><item><title>Zaraz - Zaraz moves to the “Tag Management” category in the Cloudflare dashboard</title><link>https://developers.cloudflare.com/changelog/post/2025-02-24-zaraz-dash-placement/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-02-24-zaraz-dash-placement/</guid><description>&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/zaraz-account-level.L5Bz9oN0_151oOs.webp&quot; alt=&quot;Zaraz at zone level to Tag management at account level&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;Previously, you could only configure Zaraz by going to each individual zone under your Cloudflare account. Now, if you’d like to get started with Zaraz or manage your existing configuration, you can navigate to the &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/tag-management/zaraz&quot; target=&quot;_blank&quot;&gt;Tag Management&lt;/a&gt; section on the Cloudflare dashboard – this will make it easier to compare and configure the same settings across multiple zones.&lt;/p&gt;
&lt;p&gt;These changes will not alter any existing configuration or entitlements for zones you already have Zaraz enabled on. If you’d like to edit existing configurations, you can go to the &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/tag-management/zaraz&quot; target=&quot;_blank&quot;&gt;Tag Setup&lt;/a&gt; section of the dashboard, and select the zone you&apos;d like to edit.&lt;/p&gt;</description><pubDate>Mon, 24 Feb 2025 00:00:00 GMT</pubDate><product>Zaraz</product><category>Zaraz</category></item><item><title>Workers for Platforms - Workers for Platforms - Instant dispatch for newly created User Workers</title><link>https://developers.cloudflare.com/changelog/post/2025-02-20-synchronous-uploads/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-02-20-synchronous-uploads/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-for-platforms/&quot; target=&quot;_blank&quot;&gt;Workers for Platforms&lt;/a&gt; is an architecture wherein a centralized &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-for-platforms/workers-for-platforms/how-workers-for-platforms-works/#dynamic-dispatch-worker&quot;&gt;dispatch Worker&lt;/a&gt; processes incoming requests and routes them to isolated sub-Workers, called &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-for-platforms/workers-for-platforms/how-workers-for-platforms-works/#user-workers&quot;&gt;User Workers&lt;/a&gt;.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/wfp-request.CZmZLaYf_Z2o8aKs.webp&quot; alt=&quot;Workers for Platforms Requests&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;Previously, when a new User Worker was uploaded, there was a short delay before it became available for dispatch. This meant that even though an API request could return a 200 OK response, the script might not yet be ready to handle requests, causing unexpected failures for platforms that immediately dispatch to new Workers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;With this update, first-time uploads of User Workers are now deployed synchronously&lt;/strong&gt;. A 200 OK response guarantees the script is fully provisioned and ready to handle traffic immediately, ensuring more predictable deployments and reducing errors.&lt;/p&gt;</description><pubDate>Thu, 20 Feb 2025 17:00:00 GMT</pubDate><product>Workers for Platforms</product><category>Workers for Platforms</category></item><item><title>Workers AI - Workers AI updated pricing</title><link>https://developers.cloudflare.com/changelog/post/2025-02-20-updated-pricing-docs/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-02-20-updated-pricing-docs/</guid><description>&lt;p&gt;We&apos;ve updated the Workers AI &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/platform/pricing/&quot;&gt;pricing&lt;/a&gt; to include the latest models and how model usage maps to Neurons.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Each model&apos;s core input format(s) (tokens, audio seconds, images, etc) now include mappings to Neurons, making it easier to understand how your included Neuron volume is consumed and how you are charged at scale&lt;/li&gt;
&lt;li&gt;Per-model pricing, instead of the previous bucket approach, allows us to be more flexible on how models are charged based on their size, performance and capabilities. As we optimize each model, we can then pass on savings for that model.&lt;/li&gt;
&lt;li&gt;You will still only pay for what you consume: Workers AI inference is serverless, and not billed by the hour.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Going forward, models will be launched with their associated Neuron costs, and we&apos;ll be updating the Workers AI dashboard and API to reflect consumption in both raw units and Neurons. Visit the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/platform/pricing/&quot;&gt;Workers AI pricing&lt;/a&gt; page to learn more about Workers AI pricing.&lt;/p&gt;</description><pubDate>Thu, 20 Feb 2025 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category></item><item><title>Workers - Autofix Worker name configuration errors at build time</title><link>https://developers.cloudflare.com/changelog/post/2025-02-20-builds-name-conflict/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-02-20-builds-name-conflict/</guid><description>&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/gh-auto-pr-name.BHTtigEg_2smH.webp&quot; alt=&quot;Auto-fixing Workers Name in Git Repo&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;Small misconfigurations shouldn’t break your deployments. Cloudflare is introducing automatic error detection and fixes in &lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/&quot;&gt;Workers Builds&lt;/a&gt;, identifying common issues in your wrangler.toml or wrangler.jsonc and proactively offering fixes, so you spend less time debugging and more time shipping.&lt;/p&gt;
&lt;p&gt;Here&apos;s how it works:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Before running your build, Cloudflare checks your Worker&apos;s Wrangler configuration file (wrangler.toml or wrangler.jsonc) for common errors.&lt;/li&gt;
&lt;li&gt;Once you submit a build, if Cloudflare finds an error it can fix, it will submit a pull request to your repository that fixes it.&lt;/li&gt;
&lt;li&gt;Once you merge this pull request, Cloudflare will run another build.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We&apos;re starting with fixing name mismatches between your Wrangler file and the Cloudflare dashboard, a top cause of build failures.&lt;/p&gt;
&lt;p&gt;This is just the beginning, we want your feedback on what other errors we should catch and fix next. Let us know in the Cloudflare Developers Discord, &lt;a href=&quot;https://discord.com/channels/595317990191398933/1064502845061210152&quot; target=&quot;_blank&quot;&gt;#workers-and-pages-feature-suggestions&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 20 Feb 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Queues - Customize queue message retention periods</title><link>https://developers.cloudflare.com/changelog/post/2025-02-14-customize-queue-retention-period/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-02-14-customize-queue-retention-period/</guid><description>&lt;p&gt;You can now customize a queue&apos;s message retention period, from a minimum of 60 seconds to a maximum of 14 days. Previously, it was fixed to the default of 4 days.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/customize-retention-period.CpK7s10q_19dmJh.webp&quot; alt=&quot;Customize a queue&amp;#x27;s message retention period&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;You can customize the retention period on the settings page for your queue, or using Wrangler:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrangler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;queues&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-queue&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--message-retention-period-secs&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;600&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;This feature is available on all new and existing queues. If you haven&apos;t used Cloudflare Queues before, &lt;a href=&quot;https://developers.cloudflare.com/queues/get-started&quot;&gt;get started with the Cloudflare Queues guide&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 14 Feb 2025 12:00:00 GMT</pubDate><product>Queues</product><category>Queues</category></item><item><title>Agents, Workers, Workflows - Build AI Agents with Example Prompts</title><link>https://developers.cloudflare.com/changelog/post/2025-02-14-example-ai-prompts/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-02-14-example-ai-prompts/</guid><description>&lt;p&gt;We&apos;ve added an &lt;a href=&quot;https://developers.cloudflare.com/workers/get-started/prompting/&quot;&gt;example prompt&lt;/a&gt; to help you get started with building AI agents and applications on Cloudflare &lt;a href=&quot;https://developers.cloudflare.com/workers/&quot;&gt;Workers&lt;/a&gt;, including &lt;a href=&quot;https://developers.cloudflare.com/workflows/&quot;&gt;Workflows&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/&quot;&gt;Durable Objects&lt;/a&gt;, and &lt;a href=&quot;https://developers.cloudflare.com/kv/&quot;&gt;Workers KV&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can use this prompt with your favorite AI model, including Claude 3.5 Sonnet, OpenAI&apos;s o3-mini, Gemini 2.0 Flash, or Llama 3.3 on Workers AI. Models with large context windows will allow you to paste the prompt directly: provide your own prompt within the &lt;code&gt;&amp;#x3C;user_prompt&gt;&amp;#x3C;/user_prompt&gt;&lt;/code&gt; tags.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{paste_prompt_here}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;user_prompt&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;user:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Build&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;an&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AI&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;agent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;using&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Workflows.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;The&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Workflow&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;should&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;when&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GitHub&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;issue&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;is&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;opened&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;on&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;specific&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;project&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;with&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;help&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;or&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;bug&apos;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;and&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;attempt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;help&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;user&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;troubleshoot&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;issue&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;by&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;calling&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;OpenAI&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;API&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;with&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;issue&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;and&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;description,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;and&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clear,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;structured&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;prompt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;that&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;asks&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;suggest&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1-3&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;possible&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;solutions&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;issue.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Any&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;code&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;snippets&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;should&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;be&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formatted&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Markdown&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;code&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;blocks.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Documentation&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;and&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sources&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;should&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;be&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;referenced&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;at&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bottom&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;of&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;The&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;agent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;should&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;post&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GitHub&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;issue.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;The&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;agent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;should&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;provided&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GitHub&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bot&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;account.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;/user_prompt&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;This prompt is still experimental, but we encourage you to try it out and &lt;a href=&quot;https://github.com/cloudflare/cloudflare-docs/issues/new?template=content.edit.yml&quot; target=&quot;_blank&quot;&gt;provide feedback&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 14 Feb 2025 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category><category>Workflows</category></item><item><title>R2 - Super Slurper now transfers data to R2 up to 5x faster</title><link>https://developers.cloudflare.com/changelog/post/2025-02-14-r2-super-slurper-faster-migrations/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-02-14-r2-super-slurper-faster-migrations/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/r2/data-migration/super-slurper/&quot;&gt;Super Slurper&lt;/a&gt; now transfers data from cloud object storage providers like AWS S3 and Google Cloud Storage to &lt;a href=&quot;https://developers.cloudflare.com/r2/&quot;&gt;Cloudflare R2&lt;/a&gt; up to 5x faster than it did before.&lt;/p&gt;
&lt;p&gt;We moved from a centralized service to a distributed system built on the Cloudflare Developer Platform — using &lt;a href=&quot;https://developers.cloudflare.com/workers/&quot;&gt;Cloudflare Workers&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/&quot;&gt;Durable Objects&lt;/a&gt;, and &lt;a href=&quot;https://developers.cloudflare.com/queues/&quot;&gt;Queues&lt;/a&gt; — to both improve performance and increase system concurrency capabilities (and we&apos;ll share more details about how we did it soon!)&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/slurper-objects-over-time-border.BFDkMQUw_KFpzV.webp&quot; alt=&quot;Super Slurper Objects Migrated&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;&lt;em&gt;Time to copy 75,000 objects from AWS S3 to R2 decreased from 15 minutes 30 seconds (old) to 3 minutes 25 seconds (after performance improvements)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;For more information on Super Slurper and how to migrate data from existing object storage to R2, refer to our &lt;a href=&quot;https://developers.cloudflare.com/r2/data-migration/super-slurper/&quot;&gt;documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 14 Feb 2025 00:00:00 GMT</pubDate><product>R2</product><category>R2</category></item><item><title>Stream - Rewind, Replay, Resume: Introducing DVR for Stream Live</title><link>https://developers.cloudflare.com/changelog/post/2025-02-14-introducing-dvr-for-stream-live/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-02-14-introducing-dvr-for-stream-live/</guid><description>&lt;p&gt;Previously, all viewers watched &quot;the live edge,&quot; or the latest content of the
broadcast, synchronously. If a viewer paused for more than a few seconds,
the player would automatically &quot;catch up&quot; when playback started again. Seeking
through the broadcast was only available once the recording was available after
it concluded.&lt;/p&gt;
&lt;p&gt;Starting today, customers can make a small adjustment to the player
embed or manifest URL to enable the DVR experience for their viewers. By
offering this feature as an opt-in adjustment, our customers are empowered to
pick the best experiences for their applications.&lt;/p&gt;
&lt;p&gt;When building a player embed code or manifest URL, just add &lt;code&gt;dvrEnabled=true&lt;/code&gt; as
a query parameter. There are some things to be aware of when using this option.
For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/stream/stream-live/dvr-for-live/&quot;&gt;DVR for Live&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 14 Feb 2025 00:00:00 GMT</pubDate><product>Stream</product><category>Stream</category></item><item><title>Workers - Create and deploy Workers from Git repositories</title><link>https://developers.cloudflare.com/changelog/post/2025-02-07-new-ways-to-get-started-on-workers/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-02-07-new-ways-to-get-started-on-workers/</guid><description>&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/choose-template-import-repo.Ci4KQPnT_17oN4z.webp&quot; alt=&quot;Import repo or choose template&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;You can now create a Worker by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Importing a Git repository&lt;/strong&gt;: Choose an existing Git repo on your GitHub/GitLab account and set up &lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/configuration/&quot;&gt;Workers Builds&lt;/a&gt; to deploy your Worker.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deploying a template with Git&lt;/strong&gt;: Choose from a brand new selection of production ready &lt;a href=&quot;https://github.com/cloudflare/templates&quot; target=&quot;_blank&quot;&gt;examples&lt;/a&gt; to help you get started with popular frameworks like &lt;a href=&quot;https://astro.build/&quot; target=&quot;_blank&quot;&gt;Astro&lt;/a&gt;, &lt;a href=&quot;https://remix.run/&quot; target=&quot;_blank&quot;&gt;Remix&lt;/a&gt; and &lt;a href=&quot;https://nextjs.org/&quot; target=&quot;_blank&quot;&gt;Next&lt;/a&gt; or build stateful applications with Cloudflare resources like &lt;a href=&quot;https://developers.cloudflare.com/d1/&quot;&gt;D1 databases&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/&quot;&gt;Workers AI&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/&quot;&gt;Durable Objects&lt;/a&gt;! When you&apos;re ready to deploy, Cloudflare will set up your project by cloning the template to your GitHub/GitLab account, provisioning any required &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/bindings/&quot;&gt;resources&lt;/a&gt; and deploying your Worker.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With every push to your chosen branch, Cloudflare will automatically build and deploy your Worker.&lt;/p&gt;
&lt;p&gt;To get started, go to the &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers-and-pages/create&quot; target=&quot;_blank&quot;&gt;Workers dashboard&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;These new features are available today in the Cloudflare dashboard to a subset of Cloudflare customers, and will be coming to all customers in the next few weeks. Don&apos;t see it in your dashboard, but want early access? Add your Cloudflare Account ID to &lt;a href=&quot;https://forms.gle/U1qhkF2snNJDGJJa9&quot; target=&quot;_blank&quot;&gt;this form&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 07 Feb 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>AI Gateway - Request timeouts and retries with AI Gateway</title><link>https://developers.cloudflare.com/changelog/post/2025-02-05-aig-request-handling/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-02-05-aig-request-handling/</guid><description>&lt;p&gt;AI Gateway adds additional ways to handle requests - &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/configuration/request-handling/#request-timeouts&quot;&gt;Request Timeouts&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/configuration/request-handling/#request-retries&quot;&gt;Request Retries&lt;/a&gt;, making it easier to keep your applications responsive and reliable.&lt;/p&gt;
&lt;p&gt;Timeouts and retries can be used on both the &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/usage/universal/&quot;&gt;Universal Endpoint&lt;/a&gt; or directly to a &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/usage/providers/&quot;&gt;supported provider&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Request timeouts&lt;/strong&gt;
A &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/configuration/request-handling/#request-timeouts&quot;&gt;request timeout&lt;/a&gt; allows you to trigger &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/configuration/fallbacks/&quot;&gt;fallbacks&lt;/a&gt; or a retry if a provider takes too long to respond.&lt;/p&gt;
&lt;p&gt;To set a request timeout directly to a provider, add a &lt;code&gt;cf-aig-request-timeout&lt;/code&gt; header.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://gateway.ai.cloudflare.com/v1/{account_id}/{gateway_id}/workers-ai/@cf/meta/llama-3.1-8b-instruct&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--header&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;Authorization: Bearer {cf_api_token}&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--header&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;Content-Type: application/json&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--header&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;cf-aig-request-timeout: 5000&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--data&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;{&quot;prompt&quot;: &quot;What is Cloudflare?&quot;}&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Request retries&lt;/strong&gt;
A &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/configuration/request-handling/#request-retries&quot;&gt;request retry&lt;/a&gt; automatically retries failed requests, so you can recover from temporary issues without intervening.&lt;/p&gt;
&lt;p&gt;To set up request retries directly to a provider, add the following headers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cf-aig-max-attempts (number)&lt;/li&gt;
&lt;li&gt;cf-aig-retry-delay (number)&lt;/li&gt;
&lt;li&gt;cf-aig-backoff (&quot;constant&quot; | &quot;linear&quot; | &quot;exponential)&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Thu, 06 Feb 2025 00:00:00 GMT</pubDate><product>AI Gateway</product><category>AI Gateway</category></item><item><title>AI Gateway - AI Gateway adds Cerebras, ElevenLabs, and Cartesia as new providers</title><link>https://developers.cloudflare.com/changelog/post/2025-02-04-aig-provider-cartesia-eleven-cerebras/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-02-04-aig-provider-cartesia-eleven-cerebras/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/&quot;&gt;AI Gateway&lt;/a&gt; has added three new providers: &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/usage/providers/cartesia/&quot;&gt;Cartesia&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/usage/providers/cerebras/&quot;&gt;Cerebras&lt;/a&gt;, and &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/usage/providers/elevenlabs/&quot;&gt;ElevenLabs&lt;/a&gt;, giving you more even more options for providers you can use through AI Gateway. Here&apos;s a brief overview of each:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/usage/providers/cartesia/&quot;&gt;Cartesia&lt;/a&gt; provides text-to-speech models that produce natural-sounding speech with low latency.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/usage/providers/cerebras/&quot;&gt;Cerebras&lt;/a&gt; delivers low-latency AI inference to Meta&apos;s Llama 3.1 8B and Llama 3.3 70B models.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/usage/providers/elevenlabs/&quot;&gt;ElevenLabs&lt;/a&gt; offers text-to-speech models with human-like voices in 32 languages.&lt;/li&gt;
&lt;/ul&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/cerebras2.qHYP0ZnF_XMtnx.webp&quot; alt=&quot;Example of Cerebras log in AI Gateway&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;To get started with AI Gateway, just update the base URL. Here&apos;s how you can send a request to &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/usage/providers/cerebras/&quot;&gt;Cerebras&lt;/a&gt; using cURL:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-X&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;POST&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://gateway.ai.cloudflare.com/v1/ACCOUNT_TAG/GATEWAY/cerebras/chat/completions&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--header&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;content-type: application/json&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--header&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;Authorization: Bearer CEREBRAS_TOKEN&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--data&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;model&quot;: &quot;llama-3.3-70b&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;messages&quot;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;role&quot;: &quot;user&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;content&quot;: &quot;What is Cloudflare?&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;</description><pubDate>Wed, 05 Feb 2025 00:00:00 GMT</pubDate><product>AI Gateway</product><category>AI Gateway</category></item><item><title>Workers - Revamped Workers Metrics</title><link>https://developers.cloudflare.com/changelog/post/2025-02-03-workers-metrics-revamp/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-02-03-workers-metrics-revamp/</guid><description>&lt;p&gt;We&apos;ve revamped the &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers/services/view/:worker/production/metrics/&quot; target=&quot;_blank&quot;&gt;Workers Metrics dashboard&lt;/a&gt;.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/workers-metrics.IxYk9yF0_Z1h2eg9.webp&quot; alt=&quot;Workers Metrics dashboard&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;Now you can easily compare metrics across Worker versions, understand the current state of a &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/versions-and-deployments/gradual-deployments/&quot;&gt;gradual deployment&lt;/a&gt;, and review key Workers metrics in a single view. This new interface enables you to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Drag-and-select using a graphical timepicker for precise metric selection.&lt;/li&gt;
&lt;/ul&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/metrics-graphical-timepicker.tzLlEF5U_Z102O4.webp&quot; alt=&quot;Workers Metrics graphical timepicker&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;ul&gt;
&lt;li&gt;Use histograms to visualize cumulative metrics, allowing you to bucket and compare rates over time.&lt;/li&gt;
&lt;li&gt;Focus on Worker versions by directly interacting with the version numbers in the legend.&lt;/li&gt;
&lt;/ul&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/metrics-legend-selector.B2GY90Hn_27rpVV.webp&quot; alt=&quot;Workers Metrics legend selector&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;ul&gt;
&lt;li&gt;Monitor and compare active gradual deployments.&lt;/li&gt;
&lt;li&gt;Track error rates across versions with grouping both by version and by invocation status.&lt;/li&gt;
&lt;li&gt;Measure how &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/placement/&quot;&gt;Smart Placement&lt;/a&gt; improves request duration.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://developers.cloudflare.com/workers/observability/metrics-and-analytics&quot;&gt;metrics&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 03 Feb 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers for Platforms - Workers for Platforms now supports Static Assets</title><link>https://developers.cloudflare.com/changelog/post/2025-01-31-workers-platforms-static-assets/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-01-31-workers-platforms-static-assets/</guid><description>&lt;p&gt;Workers for Platforms customers can now attach static assets (HTML, CSS, JavaScript, images) directly to User Workers, removing the need to host separate infrastructure to serve the assets.&lt;/p&gt;
&lt;p&gt;This allows your platform to serve entire front-end applications from Cloudflare&apos;s global edge, utilizing caching for fast load times, while supporting dynamic logic within the same Worker. Cloudflare automatically scales its infrastructure to handle high traffic volumes, enabling you to focus on building features without managing servers.&lt;/p&gt;
&lt;h4&gt;What you can build&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Static Sites:&lt;/strong&gt; Host and serve HTML, CSS, JavaScript, and media files directly from Cloudflare&apos;s network, ensuring fast loading times worldwide. This is ideal for blogs, landing pages, and documentation sites because static assets can be efficiently cached and delivered closer to the user, reducing latency and enhancing the overall user experience.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Full-Stack Applications:&lt;/strong&gt; Combine asset hosting with Cloudflare Workers to power dynamic, interactive applications. If you&apos;re an e-commerce platform, you can serve your customers&apos; product pages and run inventory checks from within the same Worker.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;URL&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Check real-time inventory&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pathname&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;===&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;/api/inventory/check&quot;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;product&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;searchParams&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;product&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;inventory&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;INVENTORY_KV&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;product&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;inventory&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Serve static assets (HTML, CSS, images)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ASSETS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;URL&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Check real-time inventory&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pathname&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;===&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;/api/inventory/check&apos;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;product&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;searchParams&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;product&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;inventory&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;INVENTORY_KV&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;product&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;inventory&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Serve static assets (HTML, CSS, images)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ASSETS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;&lt;strong&gt;Get Started:&lt;/strong&gt;
Upload static assets using the Workers for Platforms API or Wrangler. For more information, visit our &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-for-platforms/workers-for-platforms/configuration/static-assets/&quot; target=&quot;_blank&quot;&gt;Workers for Platforms documentation.&lt;/a&gt;&lt;/p&gt;</description><pubDate>Fri, 31 Jan 2025 00:00:00 GMT</pubDate><product>Workers for Platforms</product><category>Workers for Platforms</category></item><item><title>Workers - Transform HTML quickly with streaming content</title><link>https://developers.cloudflare.com/changelog/post/2025-01-31-html-rewriter-streaming/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-01-31-html-rewriter-streaming/</guid><description>&lt;p&gt;You can now transform HTML elements with streamed content using &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/html-rewriter&quot;&gt;&lt;code&gt;HTMLRewriter&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Methods like &lt;code&gt;replace&lt;/code&gt;, &lt;code&gt;append&lt;/code&gt;, and &lt;code&gt;prepend&lt;/code&gt; now accept &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/response/&quot;&gt;&lt;code&gt;Response&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/streams/readablestream/&quot;&gt;&lt;code&gt;ReadableStream&lt;/code&gt;&lt;/a&gt;
values as &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/html-rewriter/#global-types&quot;&gt;&lt;code&gt;Content&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This can be helpful in a variety of situations. For instance, you may have a Worker in front of an origin,
and want to replace an element with content from a different source. Prior to this change, you would have to load
all of the content from the upstream URL and convert it into a string before replacing the element. This slowed
down overall response times.&lt;/p&gt;
&lt;p&gt;Now, you can pass the &lt;code&gt;Response&lt;/code&gt; object directly into the &lt;code&gt;replace&lt;/code&gt; method, and HTMLRewriter will immediately
start replacing the content as it is streamed in. This makes responses faster.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ElementRewriter&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;element&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;element&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// able to replace elements while streaming content&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// the fetched body is not buffered into memory as part&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// of the replace&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;res&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;https://upstream-content-provider.example&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;element&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;res&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;https://site-to-replace.com&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HTMLRewriter&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;on&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;[data-to-replace]&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ElementRewriter&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;transform&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ElementRewriter&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;element&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;element&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;any&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// able to replace elements while streaming content&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// the fetched body is not buffered into memory as part&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// of the replace&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;res&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;https://upstream-content-provider.example&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;element&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;res&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Promise&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;https://site-to-replace.com&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HTMLRewriter&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;on&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;[data-to-replace]&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ElementRewriter&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;transform&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;satisfies&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ExportedHandler&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Env&lt;/span&gt;&lt;span&gt;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;For more information, see the &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/html-rewriter&quot;&gt;&lt;code&gt;HTMLRewriter&lt;/code&gt; documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 31 Jan 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>AI Gateway - AI Gateway Introduces New Worker Binding Methods</title><link>https://developers.cloudflare.com/changelog/post/2025-01-26-worker-binding-methods/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-01-26-worker-binding-methods/</guid><description>&lt;p&gt;We have released new &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/integrations/worker-binding-methods/&quot;&gt;Workers bindings API methods&lt;/a&gt;, allowing you to connect Workers applications to AI Gateway directly. These methods simplify how Workers calls AI services behind your AI Gateway configurations, removing the need to use the REST API and manually authenticate.&lt;/p&gt;
&lt;p&gt;To add an AI binding to your Worker, include the following in your &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/configuration/&quot;&gt;Wrangler configuration file&lt;/a&gt;:&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/add-binding.BoYTiyon_ZjdDNx.webp&quot; alt=&quot;Add an AI binding to your Worker.&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;With the new AI Gateway binding methods, you can now:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Send feedback and update metadata with &lt;code&gt;patchLog&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Retrieve detailed log information using &lt;code&gt;getLog&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Execute &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/usage/universal/&quot;&gt;universal requests&lt;/a&gt; to any AI Gateway provider with &lt;code&gt;run&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For example, to send feedback and update metadata using &lt;code&gt;patchLog&lt;/code&gt;:&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/send-feedback.BGRzKmd9_NDVos.webp&quot; alt=&quot;Send feedback and update metadata using patchLog:&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;</description><pubDate>Thu, 30 Jan 2025 00:00:00 GMT</pubDate><product>AI Gateway</product><category>AI Gateway</category></item><item><title>Workers, Browser Rendering - Increased Browser Rendering limits!</title><link>https://developers.cloudflare.com/changelog/post/2025-01-30-browser-rendering-more-instances/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-01-30-browser-rendering-more-instances/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-rendering/&quot;&gt;Browser Rendering&lt;/a&gt; now supports 10 concurrent browser instances per account &lt;em&gt;and&lt;/em&gt; 10 new instances per minute, up from the previous limits of 2.&lt;/p&gt;
&lt;p&gt;This allows you to launch more browser tasks from &lt;a href=&quot;https://developers.cloudflare.com/workers&quot;&gt;Cloudflare Workers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To manage concurrent browser sessions, you can use &lt;a href=&quot;https://developers.cloudflare.com/queues/&quot;&gt;Queues&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/workflows/&quot;&gt;Workflows&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;queue&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;batch&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;of&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;batch&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;messages&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;browser&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;puppeteer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;launch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;BROWSER&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;page&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;browser&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;newPage&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;try&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;page&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;goto&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;waitUntil&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;waitUntil&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// Process page...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;finally&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;browser&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;close&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;interface&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;QueueMessage&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;waitUntil&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;number&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;interface&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Env&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;BROWSER_QUEUE&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Queue&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;QueueMessage&lt;/span&gt;&lt;span&gt;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;BROWSER&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Fetcher&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;queue&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;batch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MessageBatch&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;QueueMessage&lt;/span&gt;&lt;span&gt;&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Env&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Promise&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;of&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;batch&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;messages&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;browser&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;puppeteer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;launch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;BROWSER&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;page&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;browser&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;newPage&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;try&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;page&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;goto&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;waitUntil&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;waitUntil&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// Process page...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;finally&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;browser&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;close&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;</description><pubDate>Thu, 30 Jan 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category><category>Browser Rendering</category></item><item><title>Stream - Expanded language support for Stream AI Generated Captions</title><link>https://developers.cloudflare.com/changelog/post/2025-01-30-stream-generated-captions-new-languages/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-01-30-stream-generated-captions-new-languages/</guid><description>&lt;p&gt;Stream&apos;s &lt;a href=&quot;https://developers.cloudflare.com/stream/edit-videos/adding-captions/#generate-a-caption&quot;&gt;generated captions&lt;/a&gt;
leverage Workers AI to automatically transcribe audio and provide captions to
the player experience. We have added support for these languages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cs&lt;/code&gt; - Czech&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nl&lt;/code&gt; - Dutch&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fr&lt;/code&gt; - French&lt;/li&gt;
&lt;li&gt;&lt;code&gt;de&lt;/code&gt; - German&lt;/li&gt;
&lt;li&gt;&lt;code&gt;it&lt;/code&gt; - Italian&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ja&lt;/code&gt; - Japanese&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ko&lt;/code&gt; - Korean&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pl&lt;/code&gt; - Polish&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pt&lt;/code&gt; - Portuguese&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ru&lt;/code&gt; - Russian&lt;/li&gt;
&lt;li&gt;&lt;code&gt;es&lt;/code&gt; - Spanish&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information, learn about &lt;a href=&quot;https://developers.cloudflare.com/stream/edit-videos/adding-captions/&quot;&gt;adding captions to videos&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 30 Jan 2025 00:00:00 GMT</pubDate><product>Stream</product><category>Stream</category></item><item><title>Hyperdrive - Automatic configuration for private databases on Hyperdrive</title><link>https://developers.cloudflare.com/changelog/post/2025-01-28-hyperdrive-automated-private-database-configuration/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-01-28-hyperdrive-automated-private-database-configuration/</guid><description>&lt;p&gt;Hyperdrive now automatically configures your Cloudflare Tunnel to connect to your private database.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/hyperdrive-private-database-automatic-configuration.BT4_KLwW_2nAXi4.webp&quot; alt=&quot;Automatic configuration of Cloudflare Access and Service Token in the Cloudflare dashboard for Hyperdrive.&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;When creating a Hyperdrive configuration for a private database, you only need to provide your database credentials and set up a Cloudflare Tunnel within the private network where your database is accessible. Hyperdrive will automatically create the Cloudflare Access, Service Token, and Policies needed to secure and restrict your Cloudflare Tunnel to the Hyperdrive configuration.&lt;/p&gt;
&lt;p&gt;To create a Hyperdrive for a private database, you can follow the &lt;a href=&quot;https://developers.cloudflare.com/hyperdrive/configuration/connect-to-private-database/&quot;&gt;Hyperdrive documentation&lt;/a&gt;. You can still manually create the Cloudflare Access, Service Token, and Policies if you prefer.&lt;/p&gt;
&lt;p&gt;This feature is available from the Cloudflare dashboard.&lt;/p&gt;</description><pubDate>Tue, 28 Jan 2025 00:00:00 GMT</pubDate><product>Hyperdrive</product><category>Hyperdrive</category></item><item><title>KV - Workers KV namespace limits increased to 1000</title><link>https://developers.cloudflare.com/changelog/post/2025-01-27-kv-increased-namespaces-limits/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-01-27-kv-increased-namespaces-limits/</guid><description>&lt;p&gt;You can now have up to 1000 Workers KV namespaces per account.&lt;/p&gt;
&lt;p&gt;Workers KV namespace limits were increased from 200 to 1000 for all accounts. Higher limits for Workers KV namespaces enable better organization of key-value data, such as by category, tenant, or environment.&lt;/p&gt;
&lt;p&gt;Consult the &lt;a href=&quot;https://developers.cloudflare.com/kv/platform/limits/&quot;&gt;Workers KV limits documentation&lt;/a&gt; for the rest of the limits. This increased limit is available for both the Free and Paid &lt;a href=&quot;https://developers.cloudflare.com/workers/platform/pricing/&quot;&gt;Workers plans&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 28 Jan 2025 00:00:00 GMT</pubDate><product>KV</product><category>KV</category></item><item><title>Workers - Support for Node.js DNS, Net, and Timer APIs in Workers</title><link>https://developers.cloudflare.com/changelog/post/2025-01-28-nodejs-compat-improvements/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-01-28-nodejs-compat-improvements/</guid><description>&lt;p&gt;When using a Worker with the &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/nodejs/&quot;&gt;&lt;code&gt;nodejs_compat&lt;/code&gt;&lt;/a&gt; compatibility flag enabled, you can now use the following Node.js APIs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/nodejs/net/&quot;&gt;&lt;code&gt;node:net&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/nodejs/dns/&quot;&gt;&lt;code&gt;node:dns&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/nodejs/timers/&quot;&gt;&lt;code&gt;node:timers&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;node:net&lt;/h4&gt;
&lt;p&gt;You can use &lt;a href=&quot;https://nodejs.org/api/net.html&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;node:net&lt;/code&gt;&lt;/a&gt; to create a direct connection to servers via a TCP sockets
with &lt;a href=&quot;https://nodejs.org/api/net.html#class-netsocket&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;net.Socket&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;net&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;node:net&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;exampleIP&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;127.0.0.1&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;req&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;socket&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;net&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Socket&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;socket&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;connect&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;4000&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;exampleIP&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Connected&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;socket&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;write&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Hello, Server!&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;socket&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;end&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Wrote to server&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; status&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;200&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;net&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;node:net&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;exampleIP&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;127.0.0.1&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;req&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Promise&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;socket&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;net&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Socket&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;socket&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;connect&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;4000&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;exampleIP&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Connected&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;socket&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;write&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Hello, Server!&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;socket&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;end&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Wrote to server&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; status&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;200&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;satisfies&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ExportedHandler&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;Additionally, you can now use other APIs including &lt;a href=&quot;https://nodejs.org/api/net.html#class-netblocklist&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;net.BlockList&lt;/code&gt;&lt;/a&gt; and
&lt;a href=&quot;https://nodejs.org/api/net.html#class-netsocketaddress&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;net.SocketAddress&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Note that &lt;a href=&quot;https://nodejs.org/api/net.html#class-netserver&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;net.Server&lt;/code&gt;&lt;/a&gt; is not supported.&lt;/p&gt;
&lt;h4&gt;node:dns&lt;/h4&gt;
&lt;p&gt;You can use &lt;a href=&quot;https://nodejs.org/api/dns.html&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;node:dns&lt;/code&gt;&lt;/a&gt; for name resolution via &lt;a href=&quot;https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-https/&quot;&gt;DNS over HTTPS&lt;/a&gt; using
&lt;a href=&quot;https://www.cloudflare.com/application-services/products/dns/&quot; target=&quot;_blank&quot;&gt;Cloudflare DNS&lt;/a&gt; at 1.1.1.1.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;dns&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;node:dns&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dns&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;promises&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;resolve4&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;cloudflare.com&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;NS&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;dns&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;node:dns&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dns&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;promises&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;resolve4&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;cloudflare.com&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;NS&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;All &lt;code&gt;node:dns&lt;/code&gt; functions are available, except &lt;code&gt;lookup&lt;/code&gt;, &lt;code&gt;lookupService&lt;/code&gt;, and &lt;code&gt;resolve&lt;/code&gt; which throw &quot;Not implemented&quot; errors when called.&lt;/p&gt;
&lt;h4&gt;node:timers&lt;/h4&gt;
&lt;p&gt;You can use &lt;a href=&quot;https://nodejs.org/api/timers.html&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;node:timers&lt;/code&gt;&lt;/a&gt; to schedule functions to be called at some future period of time.&lt;/p&gt;
&lt;p&gt;This includes &lt;a href=&quot;https://nodejs.org/api/timers.html#settimeoutcallback-delay-args&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;setTimeout&lt;/code&gt;&lt;/a&gt; for calling a function after a delay,
&lt;a href=&quot;https://nodejs.org/api/timers.html#setintervalcallback-delay-args&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;setInterval&lt;/code&gt;&lt;/a&gt; for calling a function repeatedly,
and &lt;a href=&quot;https://nodejs.org/api/timers.html#setimmediatecallback-args&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;setImmediate&lt;/code&gt;&lt;/a&gt; for calling a function in the next iteration of the event loop.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;timers&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;node:timers&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;first&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;timers&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setTimeout&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;last&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;},&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;timers&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setTimeout&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;next&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;timers&lt;/span&gt;&lt;span&gt; from &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;node:timers&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;first&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;timers&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setTimeout&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;last&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;},&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;timers&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setTimeout&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;next&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;</description><pubDate>Tue, 28 Jan 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workflows - Increased Workflows limits and improved instance queueing.</title><link>https://developers.cloudflare.com/changelog/post/2025-01-15-workflows-more-steps/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-01-15-workflows-more-steps/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workflows/&quot;&gt;Workflows&lt;/a&gt; (beta) now allows you to define up to 1024 &lt;a href=&quot;https://developers.cloudflare.com/workflows/build/workers-api/#workflowstep&quot;&gt;steps&lt;/a&gt;. &lt;code&gt;sleep&lt;/code&gt; steps do not count against this limit.&lt;/p&gt;
&lt;p&gt;We&apos;ve also added:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;instanceId&lt;/code&gt; as property to the &lt;a href=&quot;https://developers.cloudflare.com/workflows/build/workers-api/#workflowevent&quot;&gt;&lt;code&gt;WorkflowEvent&lt;/code&gt;&lt;/a&gt; type, allowing you to retrieve the current instance ID from within a running Workflow instance&lt;/li&gt;
&lt;li&gt;Improved queueing logic for Workflow instances beyond the current maximum concurrent instances, reducing the cases where instances are stuck in the queued state.&lt;/li&gt;
&lt;li&gt;Support for &lt;a href=&quot;https://developers.cloudflare.com/workflows/build/workers-api/#pause&quot;&gt;&lt;code&gt;pause&lt;/code&gt; and &lt;code&gt;resume&lt;/code&gt;&lt;/a&gt; for Workflow instances in a queued state.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We&apos;re continuing to work on increases to the number of concurrent Workflow instances, steps, and support for a new &lt;code&gt;waitForEvent&lt;/code&gt; API over the coming weeks.&lt;/p&gt;</description><pubDate>Wed, 15 Jan 2025 00:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category></item><item><title>D1 - 40-60% Faster D1 Worker API Requests</title><link>https://developers.cloudflare.com/changelog/post/2025-01-07-d1-faster-query/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-01-07-d1-faster-query/</guid><description>&lt;p&gt;Users making &lt;a href=&quot;https://developers.cloudflare.com/d1/&quot;&gt;D1&lt;/a&gt; requests via the &lt;a href=&quot;https://developers.cloudflare.com/d1/worker-api/&quot;&gt;Workers API&lt;/a&gt; can see up to a 60% end-to-end latency improvement due to the removal of redundant network round trips needed for each request to a D1 database.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/faster-d1-worker-api.4S7VSUdP_1LmJ72.webp&quot; alt=&quot;D1 Worker API latency&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;&lt;em&gt;p50, p90, and p95 request latency aggregated across entire D1 service. These latencies are a reference point and should not be viewed as your exact workload improvement.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This performance improvement benefits all D1 Worker API traffic, especially cross-region requests where network latency is an outsized latency factor. For example, a user in Europe talking to a database in North America. D1 &lt;a href=&quot;https://developers.cloudflare.com/d1/configuration/data-location/#provide-a-location-hint&quot;&gt;location hints&lt;/a&gt; can be used to influence the geographic location of a database.&lt;/p&gt;
&lt;p&gt;For more details on how D1 removed redundant round trips, see the D1 specific release note &lt;a href=&quot;https://developers.cloudflare.com/d1/platform/release-notes/#2025-01-07&quot;&gt;entry&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 07 Jan 2025 00:00:00 GMT</pubDate><product>D1</product><category>D1</category></item><item><title>AI Gateway - AI Gateway adds DeepSeek as a Provider</title><link>https://developers.cloudflare.com/changelog/post/2025-01-07-aig-provider-deepseek/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-01-07-aig-provider-deepseek/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/&quot;&gt;&lt;strong&gt;AI Gateway&lt;/strong&gt;&lt;/a&gt; now supports &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/usage/providers/deepseek/&quot;&gt;&lt;strong&gt;DeepSeek&lt;/strong&gt;&lt;/a&gt;, including their cutting-edge DeepSeek-V3 model. With this addition, you have even more flexibility to manage and optimize your AI workloads using AI Gateway. Whether you&apos;re leveraging DeepSeek or other providers, like OpenAI, Anthropic, or &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/&quot;&gt;Workers AI&lt;/a&gt;, AI Gateway empowers you to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Monitor&lt;/strong&gt;: Gain actionable insights with analytics and logs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Control&lt;/strong&gt;: Implement caching, rate limiting, and fallbacks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Optimize&lt;/strong&gt;: Improve performance with feedback and evaluations.&lt;/li&gt;
&lt;/ul&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/deepseek.hirkr3rv_CgMEY.webp&quot; alt=&quot;AI Gateway adds DeepSeek as a provider&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;To get started, simply update the base URL of your DeepSeek API calls to route through AI Gateway. Here&apos;s how you can send a request using cURL:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://gateway.ai.cloudflare.com/v1/{account_id}/{gateway_id}/deepseek/chat/completions&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--header&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;content-type: application/json&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--header&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;Authorization: Bearer DEEPSEEK_TOKEN&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--data&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;model&quot;: &quot;deepseek-chat&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;messages&quot;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;role&quot;: &quot;user&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;content&quot;: &quot;What is Cloudflare?&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For detailed setup instructions, see our &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/usage/providers/deepseek/&quot;&gt;DeepSeek provider documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 02 Jan 2025 00:00:00 GMT</pubDate><product>AI Gateway</product><category>AI Gateway</category></item><item><title>Workers - Faster Workers Builds with Build Caching and Watch Paths</title><link>https://developers.cloudflare.com/changelog/post/2024-12-29-faster-builds/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2024-12-29-faster-builds/</guid><description>&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/workers-build-caching.DWEh3Tj1_Z1HXvDQ.webp&quot; alt=&quot;Build caching settings&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/workers-build-watch-paths.ClqD-iNq_ZUCGHo.webp&quot; alt=&quot;Build watch path settings&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/&quot;&gt;&lt;strong&gt;Workers Builds&lt;/strong&gt;&lt;/a&gt;, the integrated CI/CD system for Workers (currently in beta), now lets you cache artifacts across builds, speeding up build jobs by eliminating repeated work, such as downloading dependencies at the start of each build.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/build-caching/&quot;&gt;Build Caching&lt;/a&gt;&lt;/strong&gt;: Cache dependencies and build outputs between builds with a shared project-wide cache, ensuring faster builds for the entire team.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/build-watch-paths/&quot;&gt;Build Watch Paths&lt;/a&gt;&lt;/strong&gt;: Define paths to include or exclude from the build process, ideal for &lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/advanced-setups/#monorepos&quot;&gt;monorepos&lt;/a&gt; to target only the files that need to be rebuilt per Workers project.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To get started, select your Worker on the &lt;a href=&quot;https://dash.cloudflare.com&quot; target=&quot;_blank&quot;&gt;Cloudflare dashboard&lt;/a&gt; then go to &lt;strong&gt;Settings&lt;/strong&gt; &gt; &lt;strong&gt;Builds&lt;/strong&gt;, and connect a GitHub or GitLab repository. Once connected, you&apos;ll see options to configure Build Caching and Build Watch Paths.&lt;/p&gt;</description><pubDate>Sun, 29 Dec 2024 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Hyperdrive - Up to 10x faster cached queries for Hyperdrive</title><link>https://developers.cloudflare.com/changelog/post/2024-12-11-hyperdrive-caching-at-edge/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2024-12-11-hyperdrive-caching-at-edge/</guid><description>&lt;p&gt;Hyperdrive now caches queries in all Cloudflare locations, decreasing cache hit latency by up to 90%.&lt;/p&gt;
&lt;p&gt;When you make a query to your database and Hyperdrive has cached the query results, Hyperdrive will now return the results from the nearest cache. By caching data closer to your users, the latency for cache hits reduces by up to 90%.&lt;/p&gt;
&lt;p&gt;This reduction in cache hit latency is reflected in a reduction of the session duration for all queries (cached and uncached) from Cloudflare Workers to Hyperdrive, as illustrated below.&lt;/p&gt;
&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://developers.cloudflare.com/_astro/hyperdrive-edge-caching-metrics.BR7svphB_2kl758.webp&quot; alt=&quot;Hyperdrive edge caching improves average session duration for database queries&quot;&gt;&lt;/starlight-image-zoom-zoomable&gt;
&lt;p&gt;&lt;em&gt;P50, P75, and P90 Hyperdrive session latency for all client connection sessions (both cached and uncached queries) for Hyperdrive configurations with caching enabled during the rollout period.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This performance improvement is applied to all new and existing Hyperdrive configurations that have caching enabled.&lt;/p&gt;
&lt;p&gt;For more details on how Hyperdrive performs query caching, refer to the &lt;a href=&quot;https://developers.cloudflare.com/hyperdrive/concepts/how-hyperdrive-works/#3-query-caching&quot;&gt;Hyperdrive documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 11 Dec 2024 00:00:00 GMT</pubDate><product>Hyperdrive</product><category>Hyperdrive</category></item><item><title>Workers - Bypass caching for subrequests made from Cloudflare Workers, with Request.cache</title><link>https://developers.cloudflare.com/changelog/post/2024-11-11-cache-no-store/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2024-11-11-cache-no-store/</guid><description>&lt;p&gt;You can now use the &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/request/#options&quot;&gt;&lt;code&gt;cache&lt;/code&gt;&lt;/a&gt; property of the &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/request/&quot;&gt;&lt;code&gt;Request&lt;/code&gt;&lt;/a&gt; interface to bypass &lt;a href=&quot;https://developers.cloudflare.com/workers/reference/how-the-cache-works/&quot;&gt;Cloudflare&apos;s cache&lt;/a&gt; when making subrequests from &lt;a href=&quot;https://developers.cloudflare.com/workers&quot;&gt;Cloudflare Workers&lt;/a&gt;, by setting its value to &lt;code&gt;no-store&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;req&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Request&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;https://cloudflare.com&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cache&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;no-store&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;div&gt;  &lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;req&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Promise&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Request&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;https://cloudflare.com&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; cache&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;no-store&apos;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;satisfies&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ExportedHandler&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Environment&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  
&lt;p&gt;When you set the value to &lt;code&gt;no-store&lt;/code&gt; on a subrequest made from a Worker, the Cloudflare Workers runtime will not check whether a match exists in the cache, and not add the response to the cache, even if the response includes directives in the &lt;code&gt;Cache-Control&lt;/code&gt; HTTP header that otherwise indicate that the response is cacheable.&lt;/p&gt;
&lt;p&gt;This increases compatibility with NPM packages and JavaScript frameworks that rely on setting the &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/request/#options&quot;&gt;&lt;code&gt;cache&lt;/code&gt;&lt;/a&gt; property, which is a cross-platform standard part of the &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/request/&quot;&gt;&lt;code&gt;Request&lt;/code&gt;&lt;/a&gt; interface. Previously, if you set the &lt;code&gt;cache&lt;/code&gt; property on &lt;code&gt;Request&lt;/code&gt;, the Workers runtime threw an exception.&lt;/p&gt;
&lt;p&gt;If you&apos;ve tried to use &lt;code&gt;@planetscale/database&lt;/code&gt;, &lt;code&gt;redis-js&lt;/code&gt;, &lt;code&gt;stytch-node&lt;/code&gt;, &lt;code&gt;supabase&lt;/code&gt;, &lt;code&gt;axiom-js&lt;/code&gt; or have seen the error message &lt;code&gt;The cache field on RequestInitializerDict is not implemented in fetch&lt;/code&gt; — you should try again, making sure that the &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/compatibility-dates/&quot;&gt;Compatibility Date&lt;/a&gt; of your Worker is set to on or after &lt;code&gt;2024-11-11&lt;/code&gt;, or the &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/compatibility-flags/#enable-cache-no-store-http-standard-api&quot;&gt;&lt;code&gt;cache_option_enabled&lt;/code&gt; compatibility flag&lt;/a&gt; is enabled for your Worker.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Learn &lt;a href=&quot;https://developers.cloudflare.com/workers/reference/how-the-cache-works/&quot;&gt;how the Cache works with Cloudflare Workers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Enable &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/nodejs/&quot;&gt;Node.js compatibility&lt;/a&gt; for your Cloudflare Worker&lt;/li&gt;
&lt;li&gt;Explore &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/&quot;&gt;Runtime APIs&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/bindings/&quot;&gt;Bindings&lt;/a&gt; available in Cloudflare Workers&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Mon, 11 Nov 2024 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers, Workflows - Workflows is now in open beta</title><link>https://developers.cloudflare.com/changelog/post/2024-10-24-workflows-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2024-10-24-workflows-beta/</guid><description>&lt;p&gt;Workflows is now in open beta, and available to any developer a free or paid Workers plan.&lt;/p&gt;
&lt;p&gt;Workflows allow you to build multi-step applications that can automatically retry, persist state and run for minutes, hours, days, or weeks. Workflows introduces a programming model that makes it easier to build reliable, long-running tasks, observe as they progress, and programmatically trigger instances based on events across your services.&lt;/p&gt;
&lt;h4&gt;Get started&lt;/h4&gt;
&lt;p&gt;You can get started with Workflows by &lt;a href=&quot;https://developers.cloudflare.com/workflows/get-started/guide/&quot;&gt;following our get started guide&lt;/a&gt; and/or using &lt;code&gt;npm create cloudflare&lt;/code&gt; to pull down the starter project:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cloudflare@latest&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;workflows-starter&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--template&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;cloudflare/workflows-starter&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;You can open the &lt;code&gt;src/index.ts&lt;/code&gt; file, extend it, and use &lt;code&gt;wrangler deploy&lt;/code&gt; to deploy your first Workflow. From there, you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Learn the &lt;a href=&quot;https://developers.cloudflare.com/workflows/build/workers-api/&quot;&gt;Workflows API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workflows/build/trigger-workflows/&quot;&gt;Trigger Workflows&lt;/a&gt; via your Workers apps.&lt;/li&gt;
&lt;li&gt;Understand the &lt;a href=&quot;https://developers.cloudflare.com/workflows/build/rules-of-workflows/&quot;&gt;Rules of Workflows&lt;/a&gt; and how to adopt best practices&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Thu, 24 Oct 2024 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category><category>Workflows</category></item></channel></rss>