<?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://cloudflaredoc.ubitools.com/changelog/</link><item><title>Agents - Agents SDK 包支持 AI SDK v6 和 v7</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-07-23-ai-sdk-v6-v7-support/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-07-23-ai-sdk-v6-v7-support/</guid><description>
&lt;p&gt;&lt;code&gt;agents&lt;/code&gt;、&lt;code&gt;@cloudflare/ai-chat&lt;/code&gt;、&lt;code&gt;@cloudflare/codemode&lt;/code&gt; 和 &lt;code&gt;@cloudflare/think&lt;/code&gt; 包现在支持 AI SDK v6 和 v7。现有应用程序在更新这些包时可以保留在 v6 版本。应用程序也可以采用 v7，而无需更改它们使用的 Cloudflare Agents API。&lt;/p&gt;
&lt;p&gt;支持的同级依赖范围是 &lt;code&gt;ai@^6 || ^7&lt;/code&gt; 和 &lt;code&gt;@ai-sdk/react@^3 || ^4&lt;/code&gt;。请使用相匹配的主版本：将 AI SDK v6 与 &lt;code&gt;@ai-sdk/react&lt;/code&gt; v3 配对，或将 AI SDK v7 与 &lt;code&gt;@ai-sdk/react&lt;/code&gt; v4 配对。&lt;/p&gt;
&lt;p&gt;要安装包含 AI SDK v7 的最新包：&lt;/p&gt;
&lt;script&gt;
	if (!customElements.get(&quot;nb-pm-restore&quot;)) {
		customElements.define(
			&quot;nb-pm-restore&quot;,
			class extends HTMLElement {
				connectedCallback() {
					const card = this.closest(&quot;[data-nb-pm]&quot;);
					if (!card) return;
					let saved;
					try {
						saved = sessionStorage.getItem(&quot;ui-pm-tab&quot;);
					} catch {
						return;
					}
					if (!saved) return;
					const tabs = card.querySelectorAll(&quot;[data-nb-pm-tab]&quot;);
					let idx = -1;
					tabs.forEach(function (t, i) {
						if (t.textContent.trim() === saved) idx = i;
					});
					if (idx &lt; 1) return;
					tabs.forEach(function (t, i) {
						t.setAttribute(&quot;aria-selected&quot;, String(i === idx));
					});
					card.querySelectorAll(&quot;[data-nb-pm-panel]&quot;).forEach(function (p, i) {
						p.hidden = i !== idx;
					});
				}
			},
		);
	}
&lt;/script&gt;&lt;div data-nb-pm class=&quot;w-full&quot;&gt;&lt;div class=&quot;flex w-full flex-col overflow-hidden rounded-lg text-sm ring ring-border bg-card&quot;&gt;&lt;div class=&quot;flex items-center gap-2 px-3 py-2 text-[0.8125rem] font-medium leading-5 text-muted-foreground bg-[var(--nb-surface-sunken)]&quot; role=&quot;tablist&quot; aria-label=&quot;Package manager&quot;&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;true&quot; aria-controls=&quot;pm-panel-pm-82887482-4199-4750-8d56-b04456f55bce-npm&quot; id=&quot;pm-tab-pm-82887482-4199-4750-8d56-b04456f55bce-npm&quot; data-nb-pm-tab class=&quot;text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2&quot;&gt;npm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-82887482-4199-4750-8d56-b04456f55bce-yarn&quot; id=&quot;pm-tab-pm-82887482-4199-4750-8d56-b04456f55bce-yarn&quot; data-nb-pm-tab class=&quot;text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2&quot;&gt;yarn&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-82887482-4199-4750-8d56-b04456f55bce-pnpm&quot; id=&quot;pm-tab-pm-82887482-4199-4750-8d56-b04456f55bce-pnpm&quot; data-nb-pm-tab class=&quot;text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2&quot;&gt;pnpm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-82887482-4199-4750-8d56-b04456f55bce-bun&quot; id=&quot;pm-tab-pm-82887482-4199-4750-8d56-b04456f55bce-bun&quot; data-nb-pm-tab class=&quot;text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2&quot;&gt;bun&lt;/button&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-82887482-4199-4750-8d56-b04456f55bce-npm&quot; aria-labelledby=&quot;pm-tab-pm-82887482-4199-4750-8d56-b04456f55bce-npm&quot; data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; i agents@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/think@latest ai@^7 @ai-sdk/react@^4&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;npm i agents@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/think@latest ai@^7 @ai-sdk/react@^4&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;symbol id=&quot;ai:ph:copy&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:ph:copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;symbol id=&quot;ai:ph:check&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:ph:check&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-82887482-4199-4750-8d56-b04456f55bce-yarn&quot; aria-labelledby=&quot;pm-tab-pm-82887482-4199-4750-8d56-b04456f55bce-yarn&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;yarn&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/think@latest ai@^7 @ai-sdk/react@^4&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;yarn add agents@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/think@latest ai@^7 @ai-sdk/react@^4&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;use href=&quot;#ai:ph:copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;use href=&quot;#ai:ph:check&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-82887482-4199-4750-8d56-b04456f55bce-pnpm&quot; aria-labelledby=&quot;pm-tab-pm-82887482-4199-4750-8d56-b04456f55bce-pnpm&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;pnpm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/think@latest ai@^7 @ai-sdk/react@^4&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;pnpm add agents@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/think@latest ai@^7 @ai-sdk/react@^4&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;use href=&quot;#ai:ph:copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;use href=&quot;#ai:ph:check&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-82887482-4199-4750-8d56-b04456f55bce-bun&quot; aria-labelledby=&quot;pm-tab-pm-82887482-4199-4750-8d56-b04456f55bce-bun&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;bun&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/think@latest ai@^7 @ai-sdk/react@^4&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;bun add agents@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/think@latest ai@^7 @ai-sdk/react@^4&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;use href=&quot;#ai:ph:copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;use href=&quot;#ai:ph:check&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;nb-pm-restore style=&quot;display:contents&quot;&gt;&lt;/nb-pm-restore&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://cloudflaredoc.ubitools.com/Users/jt.gui/workspace/astro/cloudflare-docs/src/components/ui/package-managers/PackageManagers.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;Think 会规范化两个 AI SDK 版本的流式传输、工具完成事件和遥测数据。现有的 v6 应用程序在更新 Think 之前无需迁移这些集成。&lt;/p&gt;
&lt;p&gt;有关设置和使用的详细信息，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/agents/harnesses/think/&quot;&gt;Think 文档&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Thu, 23 Jul 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category></item><item><title>Agents, Workers - Agents SDK 减少了 MCP Schema 转换，为 Think 中的 MCP 添加了暴露控制，并且 Code Mode SDK 添加了直接的主机 API</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-07-22-mcp-codemode-updates/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-07-22-mcp-codemode-updates/</guid><description>
&lt;p&gt;此版本减少了重复的 MCP schema 转换，并为 Think 的自动 MCP 工具暴露添加了选择停用（opt-out）机制。它还允许非 AI-SDK 主机直接调用持久的 Code Mode 运行时。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;控制-think-中直接的-mcp-工具暴露&quot;&gt;控制 Think 中直接的 MCP 工具暴露&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#控制-think-中直接的-mcp-工具暴露&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;现在，当实时连接保持相同的工具目录时，Agents SDK MCP 客户端会重用已转换的输入和输出 schema。这避免了在每个模型轮次中再次将每个 MCP JSON Schema 转换为 Zod。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;@cloudflare/think&lt;/code&gt; 还添加了 &lt;code&gt;includeMcpTools&lt;/code&gt;。当您通过 Code Mode 或 Think 自动工具集之外的其他机制暴露 MCP 工具时，可将其设置为 &lt;code&gt;false&lt;/code&gt;：&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { Think } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/think&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Think&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	includeMcpTools&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	waitForMcpConnections&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { Think } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/think&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Think&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	includeMcpTools&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	waitForMcpConnections&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://cloudflaredoc.ubitools.com/Users/jt.gui/workspace/astro/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;此设置将跳过 Think 的自动 &lt;code&gt;getAITools()&lt;/code&gt; 调用。MCP 注册、恢复、发现、原始目录访问、直接调用和 Code Mode 连接器仍然正常工作。&lt;/p&gt;
&lt;p&gt;当您只需要原始 MCP 目录时，请使用 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/agents/model-context-protocol/apis/client-api/#thismcplisttools&quot;&gt;&lt;code&gt;listTools()&lt;/code&gt;&lt;/a&gt;。对于连接器设置，请参阅&lt;a href=&quot;https://cloudflaredoc.ubitools.com/agents/tools/codemode/mcp/&quot;&gt;在 Code Mode 中使用 MCP 工具&lt;/a&gt;。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;无需-ai-sdk-即可调用-code-mode-运行时&quot;&gt;无需 AI SDK 即可调用 Code Mode 运行时&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#无需-ai-sdk-即可调用-code-mode-运行时&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;@cloudflare/codemode@latest&lt;/code&gt; 在持久的运行时句柄中添加了 &lt;code&gt;execute()&lt;/code&gt;、&lt;code&gt;search()&lt;/code&gt; 和 &lt;code&gt;describe()&lt;/code&gt;。MCP 服务器和其他主机现在可以执行代码并发现连接器方法，而无需将运行时适配到 AI SDK 工具。&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; matches&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; runtime.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;create issue&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; docs&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; runtime.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;describe&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(matches.results[&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;].path);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; outcome&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; runtime.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;execute&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	code: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`async () =&gt; github.create_issue({ title: &quot;Bug&quot; })`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; matches&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; runtime.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;create issue&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; docs&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; runtime.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;describe&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(matches.results[&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;].path);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; outcome&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; runtime.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;execute&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	code: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`async () =&amp;gt; github.create_issue({ title: &quot;Bug&quot; })`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;搜索和描述结果为受保护的连接器方法包含 &lt;code&gt;requiresApproval: true&lt;/code&gt;。使用现有的 &lt;code&gt;approve()&lt;/code&gt; 和 &lt;code&gt;reject()&lt;/code&gt; 方法可以恢复处于暂停状态的执行。&lt;/p&gt;
&lt;p&gt;有关设置和确切的方法类型，请参阅&lt;a href=&quot;https://cloudflaredoc.ubitools.com/agents/tools/codemode/durable-runtime/&quot;&gt;创建持久 Code Mode 运行时&lt;/a&gt;和 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/agents/tools/codemode/api-reference/&quot;&gt;Code Mode API 参考&lt;/a&gt;。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;升级&quot;&gt;升级&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#升级&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;script&gt;
	if (!customElements.get(&quot;nb-pm-restore&quot;)) {
		customElements.define(
			&quot;nb-pm-restore&quot;,
			class extends HTMLElement {
				connectedCallback() {
					const card = this.closest(&quot;[data-nb-pm]&quot;);
					if (!card) return;
					let saved;
					try {
						saved = sessionStorage.getItem(&quot;ui-pm-tab&quot;);
					} catch {
						return;
					}
					if (!saved) return;
					const tabs = card.querySelectorAll(&quot;[data-nb-pm-tab]&quot;);
					let idx = -1;
					tabs.forEach(function (t, i) {
						if (t.textContent.trim() === saved) idx = i;
					});
					if (idx &lt; 1) return;
					tabs.forEach(function (t, i) {
						t.setAttribute(&quot;aria-selected&quot;, String(i === idx));
					});
					card.querySelectorAll(&quot;[data-nb-pm-panel]&quot;).forEach(function (p, i) {
						p.hidden = i !== idx;
					});
				}
			},
		);
	}
&lt;/script&gt;&lt;div data-nb-pm class=&quot;w-full&quot;&gt;&lt;div class=&quot;flex w-full flex-col overflow-hidden rounded-lg text-sm ring ring-border bg-card&quot;&gt;&lt;div class=&quot;flex items-center gap-2 px-3 py-2 text-[0.8125rem] font-medium leading-5 text-muted-foreground bg-[var(--nb-surface-sunken)]&quot; role=&quot;tablist&quot; aria-label=&quot;Package manager&quot;&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;true&quot; aria-controls=&quot;pm-panel-pm-63e8d73a-9db5-425c-9f86-7087abc38799-npm&quot; id=&quot;pm-tab-pm-63e8d73a-9db5-425c-9f86-7087abc38799-npm&quot; data-nb-pm-tab class=&quot;text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2&quot;&gt;npm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-63e8d73a-9db5-425c-9f86-7087abc38799-yarn&quot; id=&quot;pm-tab-pm-63e8d73a-9db5-425c-9f86-7087abc38799-yarn&quot; data-nb-pm-tab class=&quot;text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2&quot;&gt;yarn&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-63e8d73a-9db5-425c-9f86-7087abc38799-pnpm&quot; id=&quot;pm-tab-pm-63e8d73a-9db5-425c-9f86-7087abc38799-pnpm&quot; data-nb-pm-tab class=&quot;text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2&quot;&gt;pnpm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-63e8d73a-9db5-425c-9f86-7087abc38799-bun&quot; id=&quot;pm-tab-pm-63e8d73a-9db5-425c-9f86-7087abc38799-bun&quot; data-nb-pm-tab class=&quot;text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2&quot;&gt;bun&lt;/button&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-63e8d73a-9db5-425c-9f86-7087abc38799-npm&quot; aria-labelledby=&quot;pm-tab-pm-63e8d73a-9db5-425c-9f86-7087abc38799-npm&quot; data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; i agents@latest @cloudflare/think@latest @cloudflare/codemode@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;npm i agents@latest @cloudflare/think@latest @cloudflare/codemode@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;symbol id=&quot;ai:ph:copy&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:ph:copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;symbol id=&quot;ai:ph:check&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:ph:check&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-63e8d73a-9db5-425c-9f86-7087abc38799-yarn&quot; aria-labelledby=&quot;pm-tab-pm-63e8d73a-9db5-425c-9f86-7087abc38799-yarn&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;yarn&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest @cloudflare/think@latest @cloudflare/codemode@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;yarn add agents@latest @cloudflare/think@latest @cloudflare/codemode@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;use href=&quot;#ai:ph:copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;use href=&quot;#ai:ph:check&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-63e8d73a-9db5-425c-9f86-7087abc38799-pnpm&quot; aria-labelledby=&quot;pm-tab-pm-63e8d73a-9db5-425c-9f86-7087abc38799-pnpm&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;pnpm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest @cloudflare/think@latest @cloudflare/codemode@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;pnpm add agents@latest @cloudflare/think@latest @cloudflare/codemode@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;use href=&quot;#ai:ph:copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;use href=&quot;#ai:ph:check&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-63e8d73a-9db5-425c-9f86-7087abc38799-bun&quot; aria-labelledby=&quot;pm-tab-pm-63e8d73a-9db5-425c-9f86-7087abc38799-bun&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;bun&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest @cloudflare/think@latest @cloudflare/codemode@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;bun add agents@latest @cloudflare/think@latest @cloudflare/codemode@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;use href=&quot;#ai:ph:copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;use href=&quot;#ai:ph:check&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;nb-pm-restore style=&quot;display:contents&quot;&gt;&lt;/nb-pm-restore&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://cloudflaredoc.ubitools.com/Users/jt.gui/workspace/astro/cloudflare-docs/src/components/ui/package-managers/PackageManagers.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;</description><pubDate>Wed, 22 Jul 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>Sandbox SDK - 使用 Devin Outposts 在 Cloudflare 上运行 Devin</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-07-21-devin-outposts/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-07-21-devin-outposts/</guid><description>&lt;p&gt;&lt;a href=&quot;https://docs.devin.ai/onboard-devin/outposts&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Devin Outposts&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 允许您在 Cloudflare 上运行 Devin Agent。每个 Devin 会话在由 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/containers/&quot;&gt;Cloudflare Containers&lt;/a&gt; 支持的独立沙箱中运行，因此 Agent 可以在隔离环境中执行代码并使用开发工具。&lt;/p&gt;
&lt;p&gt;当您希望 Devin 会话在 Cloudflare 托管的基础设施上运行，且每个会话相互隔离时，请使用 Devin Outposts。&lt;/p&gt;
&lt;img src=&quot;https://cloudflaredoc.ubitools.com/_astro/devin-outposts.B3xjmfR5_Z1DS1oR.webp&quot; alt=&quot;Devin 界面显示已选择 Cloudflare 作为 Outposts 虚拟环境&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1712&quot; height=&quot;914&quot;&gt;
&lt;p&gt;如需快速入门，请参阅&lt;a href=&quot;https://cloudflaredoc.ubitools.com/sandbox/tutorials/devin-outposts/&quot;&gt;使用 Devin Outposts 在 Cloudflare 上运行 Devin&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate><product>Sandbox SDK</product><category>Sandbox SDK</category></item><item><title>Billing, Workers - 预算提醒现在默认为按需付费账户开启</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-15-budget-alerts-default-on/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-15-budget-alerts-default-on/</guid><description>&lt;p&gt;我们正在为符合条件的按需付费账户默认开启预算提醒。如果您的账户尚未设置预算提醒，Cloudflare 将为您创建一个账户级别阈值为 $10 的提醒。您的默认提醒将在下一个计费周期开始时启用，因此不会基于您已产生的使用量触发。&lt;/p&gt;
&lt;p&gt;我们将在未来几周内分批推出，因此符合条件的账户可能会在不同时间看到其默认提醒出现。&lt;/p&gt;
&lt;p&gt;默认提醒的行为与您自行创建的提醒完全相同。当您本计费周期的累计基于使用量的支出达到阈值时，您将收到一封电子邮件通知。该提醒仅供参考，不会限制您的使用量，也不会对您的账户产生任何影响。&lt;/p&gt;
&lt;p&gt;使用量每天处理一次，计算前一天的活动，因此预算提醒会在达到阈值后的次日触发，而非实时触发。&lt;/p&gt;
&lt;p&gt;预算提醒仅考虑基于使用量的产品支出。定期订阅费用（例如 Workers Paid 计划费用或其他月度计划费用）不包含在阈值计算中。&lt;/p&gt;
&lt;p&gt;您可以从 &lt;strong&gt;Manage Account（管理账户）&lt;/strong&gt; &amp;gt; &lt;strong&gt;Billing（计费）&lt;/strong&gt; &amp;gt; **Billable Usage（计费使用量）**或通知设置中更改阈值、添加其他提醒或完全移除默认提醒。如果您已配置自己的预算提醒，则不会有任何变化。&lt;/p&gt;
&lt;p&gt;企业合约账户不在此范围内。&lt;/p&gt;
&lt;p&gt;如需更多信息，请参阅&lt;a href=&quot;https://cloudflaredoc.ubitools.com/billing/manage/budget-alerts/&quot;&gt;预算提醒文档&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Mon, 20 Jul 2026 00:00:00 GMT</pubDate><product>Billing</product><category>Billing</category><category>Workers</category></item><item><title>Durable Objects, Workers - 查看 Durable Object 命名空间的总 SQLite 存储指标</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-07-20-durable-objects-total-storage-metrics/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-07-20-durable-objects-total-storage-metrics/</guid><description>
&lt;p&gt;现在，您可以在 Cloudflare 仪表板中监控 Durable Object 命名空间随时间变化所使用的 SQLite 总存储量。全新的&lt;strong&gt;总存储&lt;/strong&gt;图表显示了每小时报告的最大存储量。这有助于您识别存储增长、验证数据清理并调查异常使用情况。&lt;/p&gt;
&lt;img src=&quot;https://cloudflaredoc.ubitools.com/_astro/durable-objects-total-storage.Cr_F72Yz_ZPhShF.webp&quot; alt=&quot;总存储图表，显示了一个 Durable Object 命名空间随着时间的推移增长到 260.1 MB 的存储。&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1436&quot; height=&quot;846&quot;&gt;&lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers/durable-objects&quot; data-nb-button class=&quot;group inline-flex w-max shrink-0 items-center justify-center rounded-full font-medium whitespace-nowrap no-underline shadow-xs transition-colors cursor-pointer select-none focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-2 disabled:cursor-not-allowed disabled:opacity-50 bg-primary text-primary-foreground hover:bg-primary-hover h-9 gap-1.5 px-3 text-sm&quot; target=&quot;_blank&quot;&gt;Go to &lt;strong&gt;Durable Objects&lt;/strong&gt;&amp;nbsp;&amp;#8599;&lt;/a&gt;
&lt;p&gt;该图表仅适用于基于 SQLite 的 Durable Object 命名空间。对于使用旧版键值存储后端的命名空间，它不会显示。不支持按 ID 或名称查看单个 Durable Object 的存储量。&lt;/p&gt;
&lt;p&gt;欲了解更多信息，请参阅&lt;a href=&quot;https://cloudflaredoc.ubitools.com/durable-objects/observability/metrics-and-analytics/#total-storage&quot;&gt;指标和分析&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Mon, 20 Jul 2026 00:00:00 GMT</pubDate><product>Durable Objects</product><category>Durable Objects</category><category>Workers</category></item><item><title>Email Service - 在 Activity 记录中预览已发送的电子邮件</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-07-17-email-message-preview/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-07-17-email-message-preview/</guid><description>&lt;p&gt;您现在可以直接从 Email Service Activity 记录中预览已发送电子邮件的内容。展开已发送的电子邮件，然后打开全新的 &lt;strong&gt;Preview（预览）&lt;/strong&gt; 部分，通过呈现的 &lt;strong&gt;HTML&lt;/strong&gt; 正文、&lt;strong&gt;Text（文本）&lt;/strong&gt; 正文、&lt;strong&gt;Headers（标头）&lt;/strong&gt;、&lt;strong&gt;Attachments（附件）&lt;/strong&gt; 以及完整的 &lt;strong&gt;Raw（原始）&lt;/strong&gt; &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc5322&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;RFC 5322&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 源码标签页，检查发送出去的邮件。&lt;/p&gt;
&lt;img src=&quot;https://cloudflaredoc.ubitools.com/_astro/email-message-preview.Bj6Lk8Y6_ZQJVjF.webp&quot; alt=&quot;在 Email Service Activity 记录中已发送电子邮件的渲染 HTML 预览&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2864&quot; height=&quot;1172&quot;&gt;
&lt;p&gt;此前，Activity 记录仅显示递送和身份验证的元数据，而不显示邮件内容，这使得渲染和内容问题难以调试。邮件预览功能弥补了这一空白。&lt;/p&gt;
&lt;p&gt;要启用邮件预览功能，请在您发送域的设置中开启 &lt;strong&gt;Email preview（邮件预览）&lt;/strong&gt;。预览范围包括在开启此设置期间发送的邮件，预览内容将保留大约七天。在 2026 年 7 月 2 日或之后接入的发送域将自动开启 &lt;strong&gt;Email preview（邮件预览）&lt;/strong&gt;。&lt;/p&gt;
&lt;img src=&quot;https://cloudflaredoc.ubitools.com/_astro/email-preview-setting.XEd1WIiO_Z1Vc9Dv.webp&quot; alt=&quot;发送域设置中的 Email preview 设置&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2256&quot; height=&quot;264&quot;&gt;
&lt;p&gt;有关详细信息，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/email-service/observability/logs/#message-preview&quot;&gt;电子邮件日志&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate><product>Email Service</product><category>Email Service</category></item><item><title>Flagship - 通过 Wrangler 从命令行管理 Flagship</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-07-16-wrangler-commands/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-07-16-wrangler-commands/</guid><description>&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/wrangler/&quot;&gt;Wrangler&lt;/a&gt;&lt;/strong&gt; 现在包含 &lt;code&gt;wrangler flagship&lt;/code&gt;，这是一套用于在终端中管理 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/flagship/&quot;&gt;Flagship&lt;/a&gt; 应用和功能标志的命令套件。&lt;/p&gt;
&lt;p&gt;创建一个应用，如果您在 Worker 中使用它，可将其作为绑定（binding）添加到 &lt;code&gt;wrangler.json&lt;/code&gt; 或 &lt;code&gt;wrangler.jsonc&lt;/code&gt; 文件中：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; flagship&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; apps&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; create&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;My Worker App&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --binding&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; FLAGS&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --update-config&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;然后为您要控制的行为创建标志。标志可以是布尔值、字符串、数字或 JSON 值：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; flagship&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; flags&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; create&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;APP_I&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;D&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; new-checkout&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; flagship&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; flags&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; create&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;APP_I&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;D&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; checkout-flow&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --variation&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; control=old-checkout&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --variation&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; treatment=new-checkout&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --default&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; control&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --type&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; string&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;标志创建后，可以更改其默认变体，或使用启用和禁用命令作为开关。除非您明确更改或清除，否则现有的定向规则将继续适用：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; flagship&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; flags&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; update&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;APP_I&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;D&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; checkout-flow&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --default&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; treatment&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; flagship&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; flags&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; disable&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;APP_I&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;D&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; checkout-flow&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; flagship&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; flags&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; enable&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;APP_I&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;D&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; checkout-flow&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;对于发布工作流，使用 &lt;code&gt;rollout&lt;/code&gt;、&lt;code&gt;split&lt;/code&gt; 和 &lt;code&gt;rules&lt;/code&gt; 在不重新部署 Worker 的情况下更改曝光量：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; flagship&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; flags&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; rollout&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;APP_I&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;D&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; new-checkout&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --to&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; on&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --percentage&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 25&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --by&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; user_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; flagship&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; flags&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; split&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;APP_I&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;D&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; checkout-flow&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --weight&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; control=&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;80&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --weight&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; treatment=&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --by&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; user_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; flagship&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; flags&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; rules&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; update&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;APP_I&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;D&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; checkout-flow&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --priority&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --when&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;country equals US&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;这些命令也可以在 CI/CD 流水线、脚本和 AI Agent 中使用，通过 Wrangler 检查 Flagship 状态、更新标志行为或回滚更改。&lt;/p&gt;
&lt;p&gt;请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/flagship/reference/wrangler-commands/&quot;&gt;&lt;code&gt;wrangler flagship&lt;/code&gt; 命令参考&lt;/a&gt; 获取完整的命令指南。&lt;/p&gt;</description><pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate><product>Flagship</product><category>Flagship</category></item><item><title>Email Service, Queues - 使用 Queues 订阅 Email Sending 事件</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-07-15-event-subscriptions/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-07-15-event-subscriptions/</guid><description>&lt;p&gt;您现在可以通过 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/queues/event-subscriptions/&quot;&gt;Queues 事件订阅&lt;/a&gt; 订阅 &lt;strong&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/email-service/api/send-emails/&quot;&gt;Email Sending&lt;/a&gt; 事件&lt;/strong&gt;，并在队列中接收出站交易性电子邮件的生命周期事件。每个订阅的作用域仅限于一个发送域——可以是区域顶点（如 &lt;code&gt;example.com&lt;/code&gt;），也可以是已验证的发送子域（如 &lt;code&gt;send.example.com&lt;/code&gt;）。&lt;/p&gt;
&lt;p&gt;发布了六种事件类型：&lt;code&gt;message.delivered&lt;/code&gt;、&lt;code&gt;message.deferred&lt;/code&gt;、&lt;code&gt;message.bounced&lt;/code&gt;、&lt;code&gt;message.failed&lt;/code&gt;、&lt;code&gt;message.rejected&lt;/code&gt; 和 &lt;code&gt;message.complained&lt;/code&gt;。使用它们来跟踪送达率、对退信和投诉做出反应，并驱动抑制或重试逻辑。Email Routing 事件不会发布在此数据源上。&lt;/p&gt;
&lt;p&gt;每个事件都包含邮件详细信息、递送状态和 SMTP 响应：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;json&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot; data-nb-lang=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;cf.email.sending.message.delivered&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;source&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;email.sending&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;zoneId&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;023e105f4ecef8ad9ca31a8372d0c353&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;domain&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;example.com&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;payload&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;messageId&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;0101018f7d0c4d9a-msg-deadbeef&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;recipient&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;user@example.net&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;terminal&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;delivery&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;delivered&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;smtpStatusCode&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;250&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/email-service/platform/event-subscriptions/&quot;&gt;事件订阅&lt;/a&gt; 以查看所有事件类型和示例有效负载。&lt;/p&gt;</description><pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate><product>Email Service</product><category>Email Service</category><category>Queues</category></item><item><title>KV - 已弃用旧版 Workers KV 命名空间 API 路由</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-07-15-kv-legacy-namespace-routes-deprecation/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-07-15-kv-legacy-namespace-routes-deprecation/</guid><description>&lt;p&gt;截至 2026 年 7 月 15 日，&lt;code&gt;/accounts/{account_id}/workers/namespaces/*&lt;/code&gt; 下的旧版 Workers KV API 路由已弃用，并将于 2026 年 10 月 15 日停止工作。请在此日期之前迁移到文档化的 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/api/resources/kv/&quot;&gt;Workers KV API&lt;/a&gt; 路由 &lt;code&gt;/accounts/{account_id}/storage/kv/namespaces/*&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;旧版路由和替换后的路由是可互换的。它们接受相同的请求参数并返回相同的响应负载。要进行迁移，请将 URL 路径从 &lt;code&gt;/workers/namespaces/&lt;/code&gt; 更新为 &lt;code&gt;/storage/kv/namespaces/&lt;/code&gt;。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;您需要做什么&quot;&gt;您需要做什么&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#您需要做什么&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;更新任何调用 &lt;code&gt;/accounts/{account_id}/workers/namespaces/&lt;/code&gt; 下路由的集成，以使用 &lt;code&gt;/accounts/{account_id}/storage/kv/namespaces/&lt;/code&gt; 下的等效路由。此迁移是直接的 URL 路径替换 —— 请求参数和响应负载完全相同：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GET&lt;/code&gt; 和 &lt;code&gt;POST /accounts/{account_id}/workers/namespaces&lt;/code&gt; → &lt;code&gt;GET&lt;/code&gt; 和 &lt;code&gt;POST /accounts/{account_id}/storage/kv/namespaces&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET&lt;/code&gt;、&lt;code&gt;PUT&lt;/code&gt; 和 &lt;code&gt;DELETE /accounts/{account_id}/workers/namespaces/{namespace_id}&lt;/code&gt; → &lt;code&gt;GET&lt;/code&gt;、&lt;code&gt;PUT&lt;/code&gt; 和 &lt;code&gt;DELETE /accounts/{account_id}/storage/kv/namespaces/{namespace_id}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /accounts/{account_id}/workers/namespaces/{namespace_id}/keys&lt;/code&gt; → &lt;code&gt;GET /accounts/{account_id}/storage/kv/namespaces/{namespace_id}/keys&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /accounts/{account_id}/workers/namespaces/{namespace_id}/metadata/{key_name}&lt;/code&gt; → &lt;code&gt;GET /accounts/{account_id}/storage/kv/namespaces/{namespace_id}/metadata/{key_name}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET&lt;/code&gt;、&lt;code&gt;PUT&lt;/code&gt; 和 &lt;code&gt;DELETE /accounts/{account_id}/workers/namespaces/{namespace_id}/values/{key_name}&lt;/code&gt; → &lt;code&gt;GET&lt;/code&gt;、&lt;code&gt;PUT&lt;/code&gt; 和 &lt;code&gt;DELETE /accounts/{account_id}/storage/kv/namespaces/{namespace_id}/values/{key_name}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;有关弃用时间线的更多信息，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/fundamentals/api/reference/deprecations/&quot;&gt;API 弃用&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate><product>KV</product><category>KV</category></item><item><title>Workers - 平台现在可以通过 Cloudflare API 创建临时账户</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-07-14-temporary-accounts-api/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-07-14-temporary-accounts-api/</guid><description>&lt;p&gt;平台现在可以通过 Cloudflare REST API 创建临时预览账户。这允许您的平台在用户登录 Cloudflare 之前部署一个在线的 Worker。&lt;/p&gt;
&lt;p&gt;借助临时账户（Temporary Accounts）API，编码智能体、AI 应用构建器和其他平台可以为生成的 Workers 和支持的资源构建类似的流程。&lt;/p&gt;
&lt;p&gt;您的平台可以在用户生成、部署和测试应用程序时，让他们保持在平台的引导流程中。用户不需要现有的 Cloudflare 账户，您的平台也不需要该账户的写入权限。&lt;/p&gt;
&lt;img src=&quot;https://cloudflaredoc.ubitools.com/_astro/claim-deployments-flow.Co0tUHG4_g1dGj.webp&quot; alt=&quot;图表显示 AI 智能体在临时账户中部署、验证并重新部署 Worker，然后用户进行身份验证并认领该账户以保留其资源&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1748&quot; height=&quot;368&quot;&gt;
&lt;p&gt;API 返回一个认领 URL，允许用户将临时账户及其资源转为永久账户和资源。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudflare.com/drop/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare Drop&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 展示了这种针对静态网站的“预览并认领”模式。用户可以上传网站，进行一小时的测试和分享，只有在想要保留它时才登录或创建账户。&lt;/p&gt;
&lt;p&gt;该 API 扩展了最初通过 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/changelog/post/2026-06-19-temporary-accounts-for-agents/&quot;&gt;&lt;code&gt;wrangler deploy --temporary&lt;/code&gt;&lt;/a&gt; 引入的流程。您的后端现在可以直接控制配置和部署体验：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在您的产品中向用户展示 Cloudflare 的服务条款和隐私政策，并要求用户接受它们。&lt;/li&gt;
&lt;li&gt;请求并解决工作量证明（proof-of-work）挑战。&lt;/li&gt;
&lt;li&gt;创建临时预览账户。&lt;/li&gt;
&lt;li&gt;使用返回的临时账户 ID 和 API 令牌进行部署。&lt;/li&gt;
&lt;li&gt;向用户显示已部署的 Worker URL 和认领 URL。&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;https://api.cloudflare.com/client/v4/provisioning/previews/challenge&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -X&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --data&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{}&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;https://api.cloudflare.com/client/v4/provisioning/previews&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -X&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --data&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;termsOfService&quot;: &quot;https://www.cloudflare.com/terms/&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;privacyPolicy&quot;: &quot;https://www.cloudflare.com/privacypolicy/&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;acceptTermsOfService&quot;: &quot;yes&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;challengeToken&quot;: &quot;&amp;lt;CHALLENGE_TOKEN&amp;gt;&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;solution&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      &quot;checkpoints&quot;: &quot;&amp;lt;BASE64_CHECKPOINTS&amp;gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;  }&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;有关完整的 API 流程、工作量证明要求、支持的产品和限制，请参阅&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/platform/claim-deployments/#integrate-with-the-rest-api&quot;&gt;认领部署（临时账户）&lt;/a&gt;。有关此流程背后的背景和设计目标，请参阅 &lt;a href=&quot;https://blog.cloudflare.com/temporary-accounts/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Temporary Cloudflare Accounts for AI agents&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Tue, 14 Jul 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Agents, Workers - Agent 可以响应 MCP 引导式输入（elicitation）请求</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-07-13-mcp-client-elicitation/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-07-13-mcp-client-elicitation/</guid><description>
&lt;p&gt;现在，使用 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/agents/model-context-protocol/apis/client-api/&quot;&gt;&lt;code&gt;addMcpServer&lt;/code&gt;&lt;/a&gt; 连接到 Model Context Protocol (MCP) 服务器的 Agent 可以处理 &lt;a href=&quot;https://modelcontextprotocol.io/specification/2025-11-25/client/elicitation&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;引导式输入（elicitation）&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;请求。&lt;/p&gt;
&lt;p&gt;引导式输入允许 MCP 服务器在处理工具调用时请求用户输入。表单（Form）模式收集结构化、非敏感的数据。URL 模式在打开带外（out-of-band）流（如第三方授权或支付）之前会征得同意。&lt;/p&gt;
&lt;pre class=&quot;mermaid&quot;&gt;sequenceDiagram
    participant 用户
    participant Agent as Agent (MCP 客户端)
    participant 服务器 as MCP 服务器
    participant 浏览器

    服务器-&amp;gt;&amp;gt;Agent: elicitation/create
    Agent-&amp;gt;&amp;gt;用户: 显示服务器、原因以及输入或 URL
    用户-&amp;gt;&amp;gt;Agent: 提交、打开、拒绝或取消
    Agent-&amp;gt;&amp;gt;浏览器: 征得同意后打开 URL（URL 模式）
    Agent-&amp;gt;&amp;gt;服务器: accept, decline, or cancel
    服务器--&amp;gt;&amp;gt;Agent: 可选的 URL 完成通知
&lt;/pre&gt;
&lt;p&gt;在 &lt;code&gt;onStart()&lt;/code&gt; 中为您 Agent 支持的每种模式注册一个处理器：&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { Agent } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;agents&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	onStart&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.mcp.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;configureElicitationHandlers&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;			form&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;serverId&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;forwardToUser&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request, serverId),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;			url&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;serverId&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;forwardToUser&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request, serverId),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	forwardToUser&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;serverId&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Show the request in your UI and resolve after the user responds.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		throw&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Error&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;			`Implement elicitation for ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;serverId&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}: ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { Agent } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;agents&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; type&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { ElicitRequest, ElicitResult } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;agents/mcp&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	onStart&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.mcp.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;configureElicitationHandlers&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;			form&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;serverId&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;forwardToUser&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request, serverId),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;			url&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;serverId&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;forwardToUser&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request, serverId),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	private&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; forwardToUser&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		request&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ElicitRequest&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		serverId&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	)&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Promise&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;ElicitResult&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Show the request in your UI and resolve after the user responds.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		throw&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Error&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;			`Implement elicitation for ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;serverId&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}: ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://cloudflaredoc.ubitools.com/Users/jt.gui/workspace/astro/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;连接仅通告配置了处理器的模式。没有处理器的 Agent 不通告任何引导式输入能力，这允许服务器使用其回退方案。SDK 会在每次 MCP 服务器注册时存储通告的模式，以便它们在 Durable Object 休眠后仍能存活。回调函数将保留在内存中，并在 &lt;code&gt;onStart()&lt;/code&gt; 运行时重新附着。&lt;/p&gt;
&lt;p&gt;有关实现细节和浏览器转发模式，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/agents/model-context-protocol/apis/client-api/#elicitation&quot;&gt;MCP 客户端引导式输入&lt;/a&gt;。&lt;a href=&quot;https://github.com/cloudflare/agents/tree/main/examples/mcp-client&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;mcp-client&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 和 &lt;a href=&quot;https://github.com/cloudflare/agents/tree/main/examples/mcp-elicitation&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;mcp-elicitation&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 示例实现双端对接。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;升级&quot;&gt;升级&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#升级&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;要更新到此版本：&lt;/p&gt;
&lt;script&gt;
	if (!customElements.get(&quot;nb-pm-restore&quot;)) {
		customElements.define(
			&quot;nb-pm-restore&quot;,
			class extends HTMLElement {
				connectedCallback() {
					const card = this.closest(&quot;[data-nb-pm]&quot;);
					if (!card) return;
					let saved;
					try {
						saved = sessionStorage.getItem(&quot;ui-pm-tab&quot;);
					} catch {
						return;
					}
					if (!saved) return;
					const tabs = card.querySelectorAll(&quot;[data-nb-pm-tab]&quot;);
					let idx = -1;
					tabs.forEach(function (t, i) {
						if (t.textContent.trim() === saved) idx = i;
					});
					if (idx &lt; 1) return;
					tabs.forEach(function (t, i) {
						t.setAttribute(&quot;aria-selected&quot;, String(i === idx));
					});
					card.querySelectorAll(&quot;[data-nb-pm-panel]&quot;).forEach(function (p, i) {
						p.hidden = i !== idx;
					});
				}
			},
		);
	}
&lt;/script&gt;&lt;div data-nb-pm class=&quot;w-full&quot;&gt;&lt;div class=&quot;flex w-full flex-col overflow-hidden rounded-lg text-sm ring ring-border bg-card&quot;&gt;&lt;div class=&quot;flex items-center gap-2 px-3 py-2 text-[0.8125rem] font-medium leading-5 text-muted-foreground bg-[var(--nb-surface-sunken)]&quot; role=&quot;tablist&quot; aria-label=&quot;Package manager&quot;&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;true&quot; aria-controls=&quot;pm-panel-pm-37662ca1-0ac1-437d-bae1-5f9195b53d79-npm&quot; id=&quot;pm-tab-pm-37662ca1-0ac1-437d-bae1-5f9195b53d79-npm&quot; data-nb-pm-tab class=&quot;text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2&quot;&gt;npm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-37662ca1-0ac1-437d-bae1-5f9195b53d79-yarn&quot; id=&quot;pm-tab-pm-37662ca1-0ac1-437d-bae1-5f9195b53d79-yarn&quot; data-nb-pm-tab class=&quot;text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2&quot;&gt;yarn&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-37662ca1-0ac1-437d-bae1-5f9195b53d79-pnpm&quot; id=&quot;pm-tab-pm-37662ca1-0ac1-437d-bae1-5f9195b53d79-pnpm&quot; data-nb-pm-tab class=&quot;text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2&quot;&gt;pnpm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-37662ca1-0ac1-437d-bae1-5f9195b53d79-bun&quot; id=&quot;pm-tab-pm-37662ca1-0ac1-437d-bae1-5f9195b53d79-bun&quot; data-nb-pm-tab class=&quot;text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2&quot;&gt;bun&lt;/button&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-37662ca1-0ac1-437d-bae1-5f9195b53d79-npm&quot; aria-labelledby=&quot;pm-tab-pm-37662ca1-0ac1-437d-bae1-5f9195b53d79-npm&quot; data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; i agents@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;npm i agents@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;symbol id=&quot;ai:ph:copy&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:ph:copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;symbol id=&quot;ai:ph:check&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:ph:check&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-37662ca1-0ac1-437d-bae1-5f9195b53d79-yarn&quot; aria-labelledby=&quot;pm-tab-pm-37662ca1-0ac1-437d-bae1-5f9195b53d79-yarn&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;yarn&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;yarn add agents@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;use href=&quot;#ai:ph:copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;use href=&quot;#ai:ph:check&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-37662ca1-0ac1-437d-bae1-5f9195b53d79-pnpm&quot; aria-labelledby=&quot;pm-tab-pm-37662ca1-0ac1-437d-bae1-5f9195b53d79-pnpm&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;pnpm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;pnpm add agents@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;use href=&quot;#ai:ph:copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;use href=&quot;#ai:ph:check&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-37662ca1-0ac1-437d-bae1-5f9195b53d79-bun&quot; aria-labelledby=&quot;pm-tab-pm-37662ca1-0ac1-437d-bae1-5f9195b53d79-bun&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;bun&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;bun add agents@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;use href=&quot;#ai:ph:copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;use href=&quot;#ai:ph:check&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;nb-pm-restore style=&quot;display:contents&quot;&gt;&lt;/nb-pm-restore&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://cloudflaredoc.ubitools.com/Users/jt.gui/workspace/astro/cloudflare-docs/src/components/ui/package-managers/PackageManagers.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;</description><pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>R2 - R2 Data Catalog 现在支持只读 API 令牌</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-07-09-r2-data-catalog-read-only-tokens/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-07-09-r2-data-catalog-read-only-tokens/</guid><description>&lt;p&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2/data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt; 现在接受只读 API 令牌，因此仅读取数据的查询引擎和客户端不再需要读写令牌。此前，每个目录操作都需要&lt;strong&gt;管理员读写&lt;/strong&gt;令牌，这意味着只读客户端被授予了超出实际需要的访问权限。&lt;/p&gt;
&lt;p&gt;您现在可以根据工作负载对 Iceberg 引擎进行身份验证：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;只读&lt;/strong&gt;操作（例如列出命名空间、加载表和查询数据）可使用&lt;strong&gt;管理员只读&lt;/strong&gt;令牌（R2 Data Catalog 读取和 R2 存储读取）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;写入&lt;/strong&gt;操作（例如创建或删除表以及提交事务）继续需要&lt;strong&gt;管理员读写&lt;/strong&gt;令牌。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这让您可以遵循最小权限原则——例如，为向表写入数据的管道使用读写令牌，为 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2-sql/&quot;&gt;R2 SQL&lt;/a&gt;、&lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2/data-catalog/config-examples/duckdb/&quot;&gt;DuckDB&lt;/a&gt; 或 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2/data-catalog/config-examples/pyiceberg/&quot;&gt;PyIceberg&lt;/a&gt; 等查询引擎使用只读令牌。&lt;/p&gt;
&lt;p&gt;请注意，目录颁发的凭证继承用于身份验证的令牌的 R2 存储权限。为确保对底层数据的只读访问，请将 R2 存储权限也限定为只读。&lt;/p&gt;
&lt;p&gt;有关选择和创建正确令牌的详细信息，请参阅&lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2/data-catalog/manage-catalogs/#authenticate-your-iceberg-engine&quot;&gt;对 Iceberg 引擎进行身份验证&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate><product>R2</product><category>R2</category></item><item><title>R2 Data Catalog, R2 - R2 Data Catalog 压缩现在优化清单文件</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-07-13-r2-data-catalog-manifest-optimization/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-07-13-r2-data-catalog-manifest-optimization/</guid><description>&lt;p&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2/data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt; 是直接内置于 R2 的托管 &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Apache Iceberg&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 目录，现在作为&lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2/data-catalog/table-maintenance/&quot;&gt;压缩&lt;/a&gt;的一部分自动优化清单文件。&lt;/p&gt;
&lt;p&gt;清单文件跟踪组成 Iceberg 表的数据文件。随着表积累了许多小型或碎片化的清单，查询引擎在查询规划期间必须读取更多元数据，这会导致查询变慢，甚至在扫描任何数据之前就已如此。&lt;/p&gt;
&lt;p&gt;当压缩运行时，R2 Data Catalog 现在会按分区重写和聚簇清单文件作为尽力而为的预处理步骤。这可以整合碎片化的清单，减少查询引擎必须打开的清单数量，并降低元数据 I/O 开销。已经聚簇良好的表将被跳过，因此该操作仅在能带来收益时才运行。&lt;/p&gt;
&lt;p&gt;对于已启用压缩的表，此功能自动生效——无需任何配置更改。&lt;/p&gt;
&lt;p&gt;如需更多信息，请参阅&lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2/data-catalog/table-maintenance/&quot;&gt;表维护&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate><product>R2 Data Catalog</product><category>R2 Data Catalog</category><category>R2</category></item><item><title>Workers AI - Markdown 转换的纯文本输出</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-07-13-markdown-conversion-text-output/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-07-13-markdown-conversion-text-output/</guid><description>
&lt;p&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers-ai/features/markdown-conversion/&quot;&gt;Markdown 转换&lt;/a&gt;服务现在支持一个新的 &lt;code&gt;output&lt;/code&gt; 转换选项，用于控制转换后内容的格式。&lt;/p&gt;
&lt;p&gt;将 &lt;code&gt;output.format&lt;/code&gt; 设置为 &lt;code&gt;text&lt;/code&gt; 以接收移除了 Markdown 语法的纯文本。默认值为 &lt;code&gt;markdown&lt;/code&gt;，因此现有转换不受影响。&lt;/p&gt;
&lt;p&gt;使用 &lt;a href=&quot;https://cloudflaredoc.ubitools.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;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;toMarkdown&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{ name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;page.html&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, blob: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Blob&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;([html]) },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		conversionOptions: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			output: { format: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;text&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;typescript&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot; data-nb-lang=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;toMarkdown&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{ name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;page.html&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, blob: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Blob&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;([html]) },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		conversionOptions: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			output: { format: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;text&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://cloudflaredoc.ubitools.com/Users/jt.gui/workspace/astro/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;或者调用 REST API：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; https://api.cloudflare.com/client/v4/accounts/{ACCOUNT_ID}/ai/tomarkdown&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;Authorization: Bearer {API_TOKEN}&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -F&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;files=@index.html&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -F&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;conversionOptions={&quot;output&quot;: {&quot;format&quot;: &quot;text&quot;}}&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;当您请求文本输出时，每个结果的 &lt;code&gt;format&lt;/code&gt; 字段会被设置为 &lt;code&gt;text&lt;/code&gt;。有关更多详细信息，请参阅&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers-ai/features/markdown-conversion/conversion-options/#output&quot;&gt;转换选项&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Fri, 10 Jul 2026 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category></item><item><title>Workflows - Workflows 现在在重试时支持延迟函数</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-07-09-dynamic-retry-delays/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-07-09-dynamic-retry-delays/</guid><description>
&lt;p&gt;通过 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workflows/&quot;&gt;Workflows&lt;/a&gt;，您可以为每个步骤配置内置的重试行为。以前，您可以配置具有固定延迟时长（例如秒、分钟或小时）的步骤重试，以及诸如 &lt;code&gt;constant&lt;/code&gt;、&lt;code&gt;linear&lt;/code&gt; 或 &lt;code&gt;exponential&lt;/code&gt; 之类的退避策略。&lt;/p&gt;
&lt;p&gt;步骤重试现在支持动态延迟函数。您无需仅选择基本延迟和退避策略，而是可以向 &lt;code&gt;retries.delay&lt;/code&gt; 传递一个函数，并根据失败的尝试和抛出的错误计算下一次延迟。&lt;/p&gt;
&lt;p&gt;当重试需要取决于故障类型时，这非常有用。您的 Workflow 可能需要在遇到速率限制错误后等待更长时间，但在发生短暂的网络故障后能更快地进行重试。如果下游 API 在其错误消息中返回了 &lt;code&gt;Retry-After&lt;/code&gt; 值，延迟函数也可以适应提供商的指导。&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;	&quot;sync customer&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		retries: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			limit: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;			delay&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: ({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;				if&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (error.message.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;includes&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;rate limit&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;					return&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; `${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;attempt&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 30&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;} seconds`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;				return&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;10 seconds&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; syncCustomer&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;	&quot;sync customer&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		retries: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			limit: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;			delay&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: ({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;				if&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (error.message.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;includes&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;rate limit&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;					return&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; `${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;attempt&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 30&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;} seconds`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;				return&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;10 seconds&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; syncCustomer&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://cloudflaredoc.ubitools.com/Users/jt.gui/workspace/astro/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;动态延迟函数可以返回一个持续时间字符串、一个数字或一个解析为持续时间的 Promise。使用它们可以添加自适应重试行为，而无需编写单独的队列或调度逻辑。有关更多信息，请参阅&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workflows/build/sleeping-and-retrying/&quot;&gt;休眠和重试&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Thu, 09 Jul 2026 12:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category></item><item><title>Durable Objects, Workers - 新的 Durable Object 命名空间必须使用 SQLite 存储后端</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-07-09-restrict-new-kv-backed-namespaces/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-07-09-restrict-new-kv-backed-namespaces/</guid><description>
&lt;p&gt;如果您的账户中尚无基于键值 (KV) 后端的 Durable Object 命名空间，您将无法再创建新的此类命名空间。新的 Durable Object 命名空间必须使用 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/durable-objects/best-practices/access-durable-objects-storage/#create-sqlite-backed-durable-object-class&quot;&gt;SQLite 存储后端&lt;/a&gt;。自 2024 年该后端&lt;a href=&quot;https://blog.cloudflare.com/sqlite-in-durable-objects/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;正式商用 (GA)&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 以来，我们一直推荐所有新的 Durable Objects 使用该后端。&lt;/p&gt;
&lt;p&gt;通过 &lt;code&gt;new_sqlite_classes&lt;/code&gt; 迁移创建一个新类：&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;$schema&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;./node_modules/wrangler/config-schema.json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;migrations&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;tag&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;v1&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;new_sqlite_classes&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;MyDurableObject&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;      ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;migrations&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;tag = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;v1&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;new_sqlite_classes = [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;MyDurableObject&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://cloudflaredoc.ubitools.com/Users/jt.gui/workspace/astro/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;基于 SQLite 的 Durable Objects 与键值后端具有同等的功能特性——包括&lt;a href=&quot;https://cloudflaredoc.ubitools.com/durable-objects/api/sqlite-storage-api/#synchronous-kv-api&quot;&gt;键值存储 API&lt;/a&gt;——并且还支持关系型 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/durable-objects/api/sqlite-storage-api/#sql-api&quot;&gt;SQL 查询&lt;/a&gt;以及 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/durable-objects/api/sqlite-storage-api/#pitr-point-in-time-recovery-api&quot;&gt;时间点恢复 (PITR)&lt;/a&gt;，可将对象存储恢复到过去 30 天内的任意时间点。&lt;/p&gt;
&lt;p&gt;如果您尝试在受影响的账户上创建新的基于键值的命名空间（使用 &lt;code&gt;new_classes&lt;/code&gt; 迁移），部署将失败并显示以下错误：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;Creating new key-value backed Durable Object namespaces is no longer supported on this account. Please create a namespace using a `new_sqlite_classes` migration instead.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;此更改仅影响尚未开始使用键值存储后端的账户。拥有至少一个现有基于键值命名空间的账户目前仍可创建新的命名空间，而 Workers 免费计划一直以来仅支持基于 SQLite 的 Durable Objects。这是向将 SQLite 作为 Durable Objects 单一存储后端迈出的更广泛一步，为未来现有基于键值对象的迁移路径做准备。&lt;/p&gt;
&lt;p&gt;欲了解更多信息，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/durable-objects/reference/durable-objects-migrations/&quot;&gt;Durable Objects 迁移&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Thu, 09 Jul 2026 00:00:00 GMT</pubDate><product>Durable Objects</product><category>Durable Objects</category><category>Workers</category></item><item><title>Workers - 随 Worker 上传发送 npm 包依赖项元数据</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-07-07-wrangler-deploy-upload-dependencies-metadata/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-07-07-wrangler-deploy-upload-dependencies-metadata/</guid><description>
&lt;p&gt;Wrangler 现在在执行 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/wrangler/commands/general/#deploy&quot;&gt;&lt;code&gt;wrangler deploy&lt;/code&gt;&lt;/a&gt; 和 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/wrangler/commands/general/#upload&quot;&gt;&lt;code&gt;wrangler versions upload&lt;/code&gt;&lt;/a&gt; 期间，从您项目的 &lt;code&gt;package.json&lt;/code&gt; 中收集 npm 包依赖项信息，并将其包含在发送到 Cloudflare API 的上传元数据中。这些数据包括每个依赖项的名称、声明的版本范围以及实际安装的确切版本，有助于实现依赖项分析以及未来的供应链安全功能（如漏洞警报）。&lt;/p&gt;
&lt;p&gt;要选择停用，请在您的 Wrangler 配置文件中将 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/wrangler/configuration/#top-level-only-keys&quot;&gt;&lt;code&gt;dependencies_instrumentation.enabled&lt;/code&gt;&lt;/a&gt; 设置为 &lt;code&gt;false&lt;/code&gt;：&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;dependencies_instrumentation&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;enabled&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;dependencies_instrumentation&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;enabled = &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;false&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://cloudflaredoc.ubitools.com/Users/jt.gui/workspace/astro/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;有关更多详细信息，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/wrangler/configuration/#top-level-only-keys&quot;&gt;Wrangler 配置&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Thu, 09 Jul 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>AI Search - 按精确对象键筛选 AI Search 列表项</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-07-08-ai-search-list-items-key-filter/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-07-08-ai-search-list-items-key-filter/</guid><description>&lt;p&gt;在 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/ai-search/&quot;&gt;AI Search&lt;/a&gt; 中，您可以将文件上传到实例，或连接诸如 R2 存储桶之类的&lt;a href=&quot;https://cloudflaredoc.ubitools.com/ai-search/configuration/data-source/&quot;&gt;数据源&lt;/a&gt;，从而让您能够使用自然语言搜索您的内容。每个文件都成为由对象 **key（其文件名或路径）**标识的 &lt;strong&gt;项（item）&lt;/strong&gt;。&lt;a href=&quot;https://cloudflaredoc.ubitools.com/ai-search/api/items/rest-api/&quot;&gt;列表项端点&lt;/a&gt;会返回实例中的项。&lt;/p&gt;
&lt;p&gt;该端点现在接受 &lt;code&gt;key&lt;/code&gt; 查询参数，因此您可以通过精确的对象键查找单个项，而无需翻页浏览整个列表。这为您知道键但不知道 ID 的情况补充了现有的 &lt;code&gt;item_id&lt;/code&gt; 筛选器。&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;https://api.cloudflare.com/client/v4/accounts/&amp;lt;ACCOUNT_ID&amp;gt;/ai-search/instances/&amp;lt;INSTANCE_NAME&amp;gt;/items?key=docs/readme.md&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer &amp;lt;API_TOKEN&amp;gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;键在每个数据源中是唯一的，因此当多个数据源中存在相同的键时，请将 &lt;code&gt;key&lt;/code&gt; 与 &lt;code&gt;source&lt;/code&gt; 结合使用（例如 &lt;code&gt;source=builtin&lt;/code&gt;）以消除歧义。&lt;/p&gt;
&lt;p&gt;有关更多信息，请参阅&lt;a href=&quot;https://cloudflaredoc.ubitools.com/ai-search/api/items/rest-api/&quot;&gt;管理项&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Wed, 08 Jul 2026 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>Workers AI, AI Search - Workers AI toMarkdown 和 AI Search 现在支持 GIF 和 BMP 图像转换</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-07-08-gif-bmp-image-support/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-07-08-gif-bmp-image-support/</guid><description>&lt;p&gt;除了已支持的 JPEG、PNG、WebP 和 SVG 格式外，Workers AI &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers-ai/features/markdown-conversion/&quot;&gt;Markdown 转换&lt;/a&gt; (&lt;code&gt;toMarkdown&lt;/code&gt;) 现在还支持 &lt;code&gt;.gif&lt;/code&gt; 和 &lt;code&gt;.bmp&lt;/code&gt; 图像文件。&lt;/p&gt;
&lt;p&gt;GIF 和 BMP 文件与其他格式运行相同的&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers-ai/features/markdown-conversion/how-it-works/#images&quot;&gt;图像流水线&lt;/a&gt;。根据需要调整每张图像的大小（对于动态 GIF，仅使用第一帧），然后传递给目标检测模型以识别其包含的内容。这些检测到的目标会提示视觉模型编写图像的自然语言描述，该描述将变成可搜索、机器可读的 Markdown。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/ai-search/&quot;&gt;AI Search&lt;/a&gt; 会自动使用 &lt;code&gt;toMarkdown&lt;/code&gt; 来处理它引入的文件，因此下一次您的索引同步时会自动包含任何 &lt;code&gt;.gif&lt;/code&gt; 和 &lt;code&gt;.bmp&lt;/code&gt; 文件，无需更改任何配置。当您的内容混合了多种格式时，例如充满屏幕截图的支持知识库或 BMP 扫描件的存档，这将非常有用。&lt;/p&gt;
&lt;p&gt;详细了解 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers-ai/features/markdown-conversion/&quot;&gt;Markdown 转换&lt;/a&gt; 以及 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/ai-search/configuration/data-source/#supported-file-types&quot;&gt;AI Search 支持的文件类型&lt;/a&gt;的完整列表。&lt;/p&gt;</description><pubDate>Wed, 08 Jul 2026 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category><category>AI Search</category></item><item><title>R2 SQL - 从仪表板使用 R2 SQL 查询 R2 Data Catalog 表</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-07-08-query-r2-sql-from-dashboard/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-07-08-query-r2-sql-from-dashboard/</guid><description>
&lt;p&gt;您现在可以直接从 Cloudflare 仪表板使用 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2-sql/&quot;&gt;R2 SQL&lt;/a&gt; 查询您的 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2/data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt; 表，而无需安装 CLI 或接入客户端。这使得在同一个地方探索 &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Apache Iceberg&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 数据、验证查询并检查结果变得非常容易。&lt;/p&gt;
&lt;img src=&quot;https://cloudflaredoc.ubitools.com/_astro/r2-sql-studio.DCmHJaqy_Z1PiDx0.webp&quot; alt=&quot;R2 SQL 查询编辑器&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3080&quot; height=&quot;1696&quot;&gt;
&lt;p&gt;要开始使用，请转到 Cloudflare 仪表板中的 &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/data-catalog/overview&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;R2 Data Catalog&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 并选择 **Query data（查询数据）**以启动内置的 SQL 编辑器。从那里您可以：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;交互式编写和运行查询&lt;/strong&gt; — 直接在浏览器中对 R2 SQL 进行迭代，提供语法高亮和自动完成功能，而无需通过 Wrangler 或 REST API 重新运行命令。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;探索您的数据&lt;/strong&gt; — 在编辑器旁探索您的命名空间和表，这样您无需离开页面或使用其他工具即可发现哪些内容是可查询的。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;了解结果和性能&lt;/strong&gt; — 查看包含每个查询统计信息的结果集，导出它们，并获取有用的 &lt;code&gt;EXPLAIN&lt;/code&gt; 输出以确切了解查询如何运行。&lt;/li&gt;
&lt;/ul&gt;
&lt;aside role=&quot;note&quot; aria-label=&quot;说明&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-info); --_t: var(--nb-info-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:info&quot;&gt;&lt;symbol id=&quot;ai:ph:info&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:ph:info&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;说明&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;您的 R2 SQL 凭证是为您生成并存储的，可以在 R2 Data Catalog 设置页面中进行轮换。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;</description><pubDate>Wed, 08 Jul 2026 00:00:00 GMT</pubDate><product>R2 SQL</product><category>R2 SQL</category></item><item><title>Workers AI - Moondream 3.1 现已在 Workers AI 上可用</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-07-08-moondream3.1-workers-ai/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-07-08-moondream3.1-workers-ai/</guid><description>&lt;p&gt;我们与 &lt;a href=&quot;https://moondream.ai/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Moondream&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 合作，将其最新模型 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers-ai/models/moondream3.1-9B-A2B/&quot;&gt;&lt;code&gt;@cf/moondream/moondream3.1-9B-A2B&lt;/code&gt;&lt;/a&gt; 引入 Workers AI。Moondream 3.1 是一款基于混合专家（mixture-of-experts）架构构建的快速视觉语言模型，总参数量为 9B，活跃参数量为 2B，可在保持快速、高性价比推理的同时提供前沿级别的视觉推理。&lt;/p&gt;
&lt;p&gt;Moondream 3.1 专为实际视觉任务而设计，具备 32K token 上下文窗口，用于处理复杂查询和结构化输出。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;关键能力&quot;&gt;关键能力&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#关键能力&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Query（查询）&lt;/strong&gt; — 针对图像提出开放式问题，带有一个可选的推理参数&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Caption（描述）&lt;/strong&gt; — 生成图像的简短、正常或长描述&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Point（指向）&lt;/strong&gt; — 返回与目标词组匹配的对象坐标&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Detect（检测）&lt;/strong&gt; — 返回与目标词组匹配的对象边界框&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;边缘实时视觉&quot;&gt;边缘实时视觉&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#边缘实时视觉&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;像实时摄像头馈送、机器人、内容审核和交互式智能体之类的视觉工作负载，需要毫秒级而不是秒级的响应。Moondream 3.1 较小的活跃占用（2B 活跃参数）与 Workers AI 的无服务器、全球分布式推理完美结合：请求可在靠近您用户的地方运行，且流式响应几乎可以立即开始返回 token。&lt;/p&gt;
&lt;p&gt;在我们的测试中，首个 token 在大约 20–30 毫秒内流式返回，并且在每项任务中结果都非常迅速。以下示例端到端时间（客户端观察到的中位数，包括网络往返时间）是针对一张简单的、单一主体的图像。实际延迟很大程度上取决于图像以及您所要求的详细程度。&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;任务&lt;/th&gt;
&lt;th&gt;端到端 (p50)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;query&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~770 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;caption&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~480 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;point&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~145 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;detect&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~160 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;在这样的速度下，您可以在处理请求时以内联方式调用模型，而无需将工作推送到后台队列或单独的服务。这开启了那些“如果响应缓慢就会破坏体验”的使用场景：在存储用户上传的图像前对其进行审核、在视频帧中定位对象以驱动实时叠加层、在提交表单时从文档中提取字段，或者让智能体在单轮内检查屏幕截图并决定其下一步操作。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;快速入门&quot;&gt;快速入门&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#快速入门&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;通过 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers-ai/configuration/bindings/&quot;&gt;Workers AI 绑定（binding）&lt;/a&gt; (&lt;code&gt;env.AI.run()&lt;/code&gt;) 或 &lt;code&gt;/ai/run&lt;/code&gt; 处的 REST API 来使用 Moondream 3.1。您还可以在这些端点中搭配使用 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/ai-gateway/&quot;&gt;AI Gateway&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;欲了解更多信息，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers-ai/models/moondream3.1-9B-A2B/&quot;&gt;Moondream 3.1 模型页面&lt;/a&gt;和&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers-ai/platform/pricing/&quot;&gt;定价&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Wed, 08 Jul 2026 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category></item><item><title>Workers - Cloudflare Drop</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-07-08-cloudflare-drag-and-drop/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-07-08-cloudflare-drag-and-drop/</guid><description>&lt;p&gt;&lt;a href=&quot;https://cloudflare.com/drop&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare Drop&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 允许您向 Cloudflare 部署静态网站，而无需先拥有 Cloudflare 账户。&lt;/p&gt;
&lt;img src=&quot;https://cloudflaredoc.ubitools.com/_astro/cloudflare-drag-and-drop-upload.KujM69eS_2q5iiu.webp&quot; alt=&quot;Cloudflare 拖放上传界面，用于浏览文件夹或 ZIP 文件&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2498&quot; height=&quot;1294&quot;&gt;
&lt;p&gt;上传包含静态资产（静态 HTML、CSS、JavaScript、图像和字体）的文件夹或 ZIP 文件，即可获得保持在线 1 小时临时的实时预览。在此时间窗内，您可以测试网站、共享预览 URL 或&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/platform/claim-deployments/&quot;&gt;认领该部署&lt;/a&gt;以保留它。&lt;/p&gt;
&lt;img src=&quot;https://cloudflaredoc.ubitools.com/_astro/cloudflare-drag-and-drop-preview.BQ1__XRX_2eteg3.webp&quot; alt=&quot;Cloudflare 拖放临时实时预览界面，带有认领和复制认领链接操作&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2936&quot; height=&quot;1594&quot;&gt;
&lt;p&gt;当您准备好使部署永久生效时，请点击 &lt;strong&gt;Claim（认领）&lt;/strong&gt; 以登录或创建 Cloudflare 账户。您可以将网站认领到现有的 Cloudflare 账户中，也可以为该部署创建一个新账户。&lt;/p&gt;
&lt;aside role=&quot;note&quot; aria-label=&quot;说明&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-info); --_t: var(--nb-info-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:info&quot;&gt;&lt;symbol id=&quot;ai:ph:info&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:ph:info&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;说明&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;如果您正在创建新账户，则需要先验证您的电子邮件地址才能继续。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;&lt;img src=&quot;https://cloudflaredoc.ubitools.com/_astro/cloudflare-drag-and-drop-claim.8Zv6px9B_Z1vMkhk.webp&quot; alt=&quot;Cloudflare 拖放认领账户界面，显示认领链接过期前的倒计时&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1712&quot; height=&quot;812&quot;&gt;
&lt;p&gt;认领网站后，您可以：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;添加域名&lt;/strong&gt;：&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/configuration/routing/custom-domains/&quot;&gt;连接&lt;/a&gt;现有域名或为您的网站购买新域名。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;启用&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/observability/&quot;&gt;可观测性&lt;/a&gt;&lt;/strong&gt;：监控您网站的性能和使用情况。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;启用 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/fundamentals/reference/markdown-for-agents/&quot;&gt;Markdown for Agents&lt;/a&gt;&lt;/strong&gt;：允许 AI 智能体以 Markdown 格式访问您网站的内容。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;控制访问&lt;/strong&gt;：将您的网站设为&lt;a href=&quot;https://cloudflaredoc.ubitools.com/cloudflare-one/access-controls/policies/&quot;&gt;私有&lt;/a&gt;并选择谁可以查看它。&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://cloudflaredoc.ubitools.com/_astro/cloudflare-drag-and-drop-post-claim.DvlaNmI7_Zmbdcj.webp&quot; alt=&quot;已认领的 Cloudflare 拖放网站设置界面，显示添加域名、控制访问、启用可观测性以及为智能体启用 Markdown 的选项&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1812&quot; height=&quot;1266&quot;&gt;</description><pubDate>Wed, 08 Jul 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workflows - Workflows 定价增加按步骤计费。步骤和存储计费将不早于 2026 年 8 月 10 日开始。</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-07-07-workflows-billing-updates/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-07-07-workflows-billing-updates/</guid><description>&lt;p&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workflows/&quot;&gt;Workflows&lt;/a&gt; 定价现在包括按步骤计费。自最初的公开 Beta 版以来已启用请求和 CPU 时间计费，且不会发生变化。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;workflows-增加步骤计费&quot;&gt;Workflows 增加步骤计费&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#workflows-增加步骤计费&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;步骤是 Workflow 执行的每个工作单元，包括诸如&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workflows/build/sleeping-and-retrying/&quot;&gt;休眠&lt;/a&gt;或&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workflows/build/events-and-parameters/&quot;&gt;等待事件&lt;/a&gt;之类的步骤操作。&lt;/p&gt;
&lt;p&gt;您可以使用 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workflows/observability/metrics-analytics/#query-via-the-graphql-api&quot;&gt;GraphQL Analytics API&lt;/a&gt; 查询 Workflows 分析，包括 Workflow 实例的 &lt;code&gt;stepCount&lt;/code&gt;。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;步骤和存储计费将于-2026-年-8-月-10-日生效&quot;&gt;步骤和存储计费将于 2026 年 8 月 10 日生效&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#步骤和存储计费将于-2026-年-8-月-10-日生效&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;自 2026 年 8 月 10 日起（不早于该日期），Cloudflare 将开始对 Workers Paid 计划的步骤和存储使用进行计费。&lt;/p&gt;
&lt;p&gt;存储定价自 Workflows 正式发布以来就已公布，且不会发生变化。存储以 GB-月为单位度量持久化的 Workflow 状态。&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;维度&lt;/th&gt;
&lt;th&gt;Workers Free&lt;/th&gt;
&lt;th&gt;Workers Paid&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;步骤&lt;/td&gt;
&lt;td&gt;每天包含 3,000 步&lt;/td&gt;
&lt;td&gt;每月包含 500,000 步，之后每增加 100,000 步为 0.80 美元&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;存储&lt;/td&gt;
&lt;td&gt;包含 1 GB-月&lt;/td&gt;
&lt;td&gt;包含 1 GB-月，之后每增加 1 GB-月为 0.20 美元&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Workers Free 计划的开发者无需为超出包含数量的步骤或存储付费。&lt;/p&gt;
&lt;p&gt;Cloudflare 在 2026 年 8 月 10 日之前不会对步骤和存储使用量进行计费。&lt;/p&gt;
&lt;p&gt;在此更改生效之前，您可以在 &lt;a href=&quot;https://dash.cloudflare.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare 仪表板&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;中查看 Workflows 使用情况。为了降低成本，可以考虑减少每个 Workflow 的步骤数量，或提高存储状态的内存效率。&lt;/p&gt;
&lt;p&gt;有关完整详细信息，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workflows/reference/pricing/&quot;&gt;Workflows 定价&lt;/a&gt;页面。&lt;/p&gt;</description><pubDate>Tue, 07 Jul 2026 12:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category></item><item><title>Browser Run - Browser Run 无障碍树新端点</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-07-07-browser-run-accessibility-tree-endpoint/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-07-07-browser-run-accessibility-tree-endpoint/</guid><description>&lt;p&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/browser-run/&quot;&gt;Browser Run&lt;/a&gt; 现在支持独立的 &lt;code&gt;/accessibilityTree&lt;/code&gt; 端点，为 Agent 和自动化工作流提供对已渲染网页浏览器无障碍树的直接访问。&lt;/p&gt;
&lt;p&gt;无障碍树是浏览器对已渲染页面的结构化视图：角色、名称、状态、值和层级关系。它对无障碍工具很有用，同时也对需要页面结构而无需处理原始 HTML 噪音或截图成本的 AI Agent 和自动化工作流非常实用。&lt;/p&gt;
&lt;p&gt;对于 AI Agent 而言，这意味着减少了从像素推断信息以及解析 HTML 的工作。您可以直接提供页面结构，帮助 Agent 识别可用元素并判断其可执行的操作。&lt;/p&gt;
&lt;p&gt;使用新的 &lt;code&gt;/accessibilityTree&lt;/code&gt; 端点，当您只需要页面的语义结构时，可以直接请求无障碍树。如果需要在单次 API 调用中获取多种页面格式，可以使用 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/browser-run/quick-actions/snapshot/&quot;&gt;&lt;code&gt;/snapshot&lt;/code&gt;&lt;/a&gt; 端点，该端点同时返回 Markdown、HTML 和截图。&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -X&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;https://api.cloudflare.com/client/v4/accounts/&amp;lt;accountId&amp;gt;/browser-run/accessibilityTree&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;Authorization: Bearer &amp;lt;apiToken&amp;gt;&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;Content-Type: application/json&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -d&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;url&quot;: &quot;https://example.com/&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;json&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot; data-nb-lang=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;success&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;result&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;accessibilityTree&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;role&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;RootWebArea&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Example Domain&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;children&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;					&quot;role&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;heading&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;					&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Example Domain&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;					&quot;level&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;					&quot;role&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;link&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;					&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Learn more&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;使用 &lt;code&gt;interestingOnly&lt;/code&gt; 仅返回语义上有意义的节点，或使用 &lt;code&gt;root&lt;/code&gt; 捕获特定子树的无障碍树。&lt;/p&gt;
&lt;p&gt;请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/browser-run/quick-actions/accessibility-tree-endpoint/&quot;&gt;&lt;code&gt;/accessibilityTree&lt;/code&gt; 文档&lt;/a&gt; 以获取使用示例和支持的参数。&lt;/p&gt;</description><pubDate>Tue, 07 Jul 2026 00:00:00 GMT</pubDate><product>Browser Run</product><category>Browser Run</category></item><item><title>R2 - R2 Data Catalog 在手动删除数据前发出警告</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-07-06-r2-data-catalog-delete-warnings/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-07-06-r2-data-catalog-delete-warnings/</guid><description>&lt;p&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2/data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt; 是直接内置于 R2 存储桶的托管 &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Apache Iceberg&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 目录。Iceberg 通过元数据文件树追踪您的数据，因此每次插入、更新和删除都必须通过目录事务进行。在目录外手动添加、修改或删除对象可能会留下指向不再存在的文件的指针，使表损坏成难以恢复的不一致状态。&lt;/p&gt;
&lt;p&gt;为帮助防止此类情况，R2 仪表板和 Wrangler 现在会在您尝试对启用 Data Catalog 的存储桶执行手动删除操作时发出警告。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;仪表板&quot;&gt;仪表板&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#仪表板&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;当您尝试从启用 R2 Data Catalog 的存储桶中删除对象时，仪表板会显示一个警告，解释该操作可能使目录处于无效状态，并提供正确删除数据的文档链接。您可以取消操作或选择继续执行。&lt;/p&gt;
&lt;img src=&quot;https://cloudflaredoc.ubitools.com/_astro/data-catalog-delete-warning.DoBR0sFO_1wfGWd.webp&quot; alt=&quot;在启用 Data Catalog 的存储桶中删除对象之前显示的 R2 仪表板警告&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1886&quot; height=&quot;684&quot;&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;wrangler&quot;&gt;Wrangler&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#wrangler&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Wrangler 现在在运行删除操作前会检查存储桶是否启用了 Data Catalog，并在继续之前发出警告：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;Data Catalog is enabled for this bucket. &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;Proceeding may leave the data catalog in an invalid state. Continue?&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;要了解如何安全管理和删除表中的数据，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2/data-catalog/&quot;&gt;R2 Data Catalog 文档&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Tue, 07 Jul 2026 00:00:00 GMT</pubDate><product>R2</product><category>R2</category></item><item><title>Durable Objects, Workers - 使用 `exports` 声明 Durable Object 类生命周期</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-30-declarative-do-class-exports/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-30-declarative-do-class-exports/</guid><description>&lt;p&gt;Wrangler 配置文件中全新的声明式 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/durable-objects/reference/durable-objects-migrations/&quot;&gt;&lt;code&gt;exports&lt;/code&gt;&lt;/a&gt; 字段取代了用于管理 Durable Object 类生命周期的命令式 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/durable-objects/reference/durable-object-class-migrations-legacy/&quot;&gt;&lt;code&gt;migrations&lt;/code&gt;&lt;/a&gt; 数组。您无需再编写带有唯一标签的有序迁移步骤列表，而是声明 Worker 导出的每个 Durable Object 类，Cloudflare 会将其与已部署的内容进行对比，以确定需要创建、重命名还是删除哪些 Durable Object 状态。&lt;/p&gt;
&lt;p&gt;在使用旧版迁移时，将 &lt;code&gt;ChatRoom&lt;/code&gt; 重命名为 &lt;code&gt;Room&lt;/code&gt; 需要保留这两个标记的步骤：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;Before — legacy migrations&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;jsonc&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;migrations&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{ &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;tag&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;v1&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;new_sqlite_classes&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;ChatRoom&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;] },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;tag&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;v2&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;renamed_classes&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [{ &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;from&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;ChatRoom&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;to&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Room&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;而使用 &lt;code&gt;exports&lt;/code&gt;，您只需将 &lt;code&gt;Room&lt;/code&gt; 声明为当前类，并将 &lt;code&gt;ChatRoom&lt;/code&gt; 标记为已重命名：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;After — declarative exports&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;jsonc&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;exports&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;ChatRoom&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;durable-object&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;state&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;renamed&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;renamed_to&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Room&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;Room&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: { &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;durable-object&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;storage&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;sqlite&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;每个条目都以类名作为键。&lt;code&gt;state&lt;/code&gt; 字段承载生命周期（默认为 &lt;code&gt;created&lt;/code&gt;——活动类——以及墓碑（tombstone）状态 &lt;code&gt;deleted&lt;/code&gt;、&lt;code&gt;renamed&lt;/code&gt;、&lt;code&gt;transferred&lt;/code&gt;，和用于跨 Worker 传输的接收状态 &lt;code&gt;expecting-transfer&lt;/code&gt;）。&lt;/p&gt;
&lt;p&gt;与旧版 &lt;code&gt;migrations&lt;/code&gt; 数组相比的关键改进：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;无需迁移标签。&lt;/strong&gt; 当前的 &lt;code&gt;exports&lt;/code&gt; 映射是唯一的真实数据源——无需维护 &lt;code&gt;v1&lt;/code&gt;、&lt;code&gt;v2&lt;/code&gt;、&lt;code&gt;v3&lt;/code&gt; 条目的历史链。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结构化的部署输出。&lt;/strong&gt; Wrangler 会在创建、更新、删除、重命名或传输 Durable Object 类时进行报告。它还会识别可安全删除的陈旧配置条目。没有更改或通知的部署不会打印此输出。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;零停机重命名和传输模式是一等公民。&lt;/strong&gt; 墓碑（Tombstones）可以与代码中仍然存在的源类共存，从而实现 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/durable-objects/reference/durable-objects-migrations/#avoid-downtime-during-a-rename&quot;&gt;三次部署重命名&lt;/a&gt; 和 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/durable-objects/reference/durable-objects-migrations/#transfer-a-durable-object-class-between-workers&quot;&gt;四次部署跨 Worker 传输&lt;/a&gt;，在滚动部署期间不会出现运行时错误。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;跨 Worker 安全性。&lt;/strong&gt; 当您删除或重命名类时，Cloudflare 会列出您账户中其绑定（binding）仍引用该命名空间的其他所有 Worker，以便您在更改生效前重新部署它们。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;使用旧版 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/durable-objects/reference/durable-object-class-migrations-legacy/&quot;&gt;&lt;code&gt;migrations&lt;/code&gt;&lt;/a&gt; 数组的现有 Workers 仍可照常工作，无需任何更改。要过渡到 &lt;code&gt;exports&lt;/code&gt;，请参阅&lt;a href=&quot;https://cloudflaredoc.ubitools.com/durable-objects/reference/durable-objects-migrations/#migrate-from-the-legacy-migrations-flow&quot;&gt;迁移指南&lt;/a&gt;。在单个 Worker 中，&lt;code&gt;exports&lt;/code&gt; 和 &lt;code&gt;migrations&lt;/code&gt; 是互斥的。&lt;/p&gt;
&lt;p&gt;欲了解完整的参考信息，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/durable-objects/reference/durable-objects-migrations/&quot;&gt;Durable Object 类导出&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Sat, 04 Jul 2026 00:00:00 GMT</pubDate><product>Durable Objects</product><category>Durable Objects</category><category>Workers</category></item><item><title>Workers - 借助 @cloudflare/workers-types v5 实现更简单的运行时类型</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-07-03-workers-types-v5/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-07-03-workers-types-v5/</guid><description>
&lt;p&gt;我们已经发布了 &lt;a href=&quot;https://www.npmjs.com/package/@cloudflare/workers-types&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;@cloudflare/workers-types&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 的第 5 版。此版本简化了该包，使其仅公开最新的运行时类型。&lt;/p&gt;
&lt;p&gt;我们仍然建议您使用 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/wrangler/commands/general/#types&quot;&gt;&lt;code&gt;wrangler types&lt;/code&gt;&lt;/a&gt; 为您的 Worker 生成类型，但如果您想直接使用该包，您可以使用您选择的包管理器进行安装：&lt;/p&gt;
&lt;script&gt;
	if (!customElements.get(&quot;nb-pm-restore&quot;)) {
		customElements.define(
			&quot;nb-pm-restore&quot;,
			class extends HTMLElement {
				connectedCallback() {
					const card = this.closest(&quot;[data-nb-pm]&quot;);
					if (!card) return;
					let saved;
					try {
						saved = sessionStorage.getItem(&quot;ui-pm-tab&quot;);
					} catch {
						return;
					}
					if (!saved) return;
					const tabs = card.querySelectorAll(&quot;[data-nb-pm-tab]&quot;);
					let idx = -1;
					tabs.forEach(function (t, i) {
						if (t.textContent.trim() === saved) idx = i;
					});
					if (idx &lt; 1) return;
					tabs.forEach(function (t, i) {
						t.setAttribute(&quot;aria-selected&quot;, String(i === idx));
					});
					card.querySelectorAll(&quot;[data-nb-pm-panel]&quot;).forEach(function (p, i) {
						p.hidden = i !== idx;
					});
				}
			},
		);
	}
&lt;/script&gt;&lt;div data-nb-pm class=&quot;w-full&quot;&gt;&lt;div class=&quot;flex w-full flex-col overflow-hidden rounded-lg text-sm ring ring-border bg-card&quot;&gt;&lt;div class=&quot;flex items-center gap-2 px-3 py-2 text-[0.8125rem] font-medium leading-5 text-muted-foreground bg-[var(--nb-surface-sunken)]&quot; role=&quot;tablist&quot; aria-label=&quot;Package manager&quot;&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;true&quot; aria-controls=&quot;pm-panel-pm-e70b5e3b-a330-46d0-a1ac-c1774396b8fe-npm&quot; id=&quot;pm-tab-pm-e70b5e3b-a330-46d0-a1ac-c1774396b8fe-npm&quot; data-nb-pm-tab class=&quot;text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2&quot;&gt;npm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-e70b5e3b-a330-46d0-a1ac-c1774396b8fe-yarn&quot; id=&quot;pm-tab-pm-e70b5e3b-a330-46d0-a1ac-c1774396b8fe-yarn&quot; data-nb-pm-tab class=&quot;text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2&quot;&gt;yarn&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-e70b5e3b-a330-46d0-a1ac-c1774396b8fe-pnpm&quot; id=&quot;pm-tab-pm-e70b5e3b-a330-46d0-a1ac-c1774396b8fe-pnpm&quot; data-nb-pm-tab class=&quot;text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2&quot;&gt;pnpm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-e70b5e3b-a330-46d0-a1ac-c1774396b8fe-bun&quot; id=&quot;pm-tab-pm-e70b5e3b-a330-46d0-a1ac-c1774396b8fe-bun&quot; data-nb-pm-tab class=&quot;text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2&quot;&gt;bun&lt;/button&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-e70b5e3b-a330-46d0-a1ac-c1774396b8fe-npm&quot; aria-labelledby=&quot;pm-tab-pm-e70b5e3b-a330-46d0-a1ac-c1774396b8fe-npm&quot; data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; i -D @cloudflare/workers-types@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;npm i -D @cloudflare/workers-types@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;symbol id=&quot;ai:ph:copy&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:ph:copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;symbol id=&quot;ai:ph:check&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:ph:check&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-e70b5e3b-a330-46d0-a1ac-c1774396b8fe-yarn&quot; aria-labelledby=&quot;pm-tab-pm-e70b5e3b-a330-46d0-a1ac-c1774396b8fe-yarn&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;yarn&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add -D @cloudflare/workers-types@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;yarn add -D @cloudflare/workers-types@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;use href=&quot;#ai:ph:copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;use href=&quot;#ai:ph:check&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-e70b5e3b-a330-46d0-a1ac-c1774396b8fe-pnpm&quot; aria-labelledby=&quot;pm-tab-pm-e70b5e3b-a330-46d0-a1ac-c1774396b8fe-pnpm&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;pnpm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add -D @cloudflare/workers-types@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;pnpm add -D @cloudflare/workers-types@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;use href=&quot;#ai:ph:copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;use href=&quot;#ai:ph:check&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-e70b5e3b-a330-46d0-a1ac-c1774396b8fe-bun&quot; aria-labelledby=&quot;pm-tab-pm-e70b5e3b-a330-46d0-a1ac-c1774396b8fe-bun&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;bun&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add -d @cloudflare/workers-types@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;bun add -d @cloudflare/workers-types@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;use href=&quot;#ai:ph:copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;use href=&quot;#ai:ph:check&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;nb-pm-restore style=&quot;display:contents&quot;&gt;&lt;/nb-pm-restore&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://cloudflaredoc.ubitools.com/Users/jt.gui/workspace/astro/cloudflare-docs/src/components/ui/package-managers/PackageManagers.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;该包现在公开了两个入口点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@cloudflare/workers-types&lt;/code&gt; 反映了最新的兼容性日期，使用最新的稳定兼容性标志。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cloudflare/workers-types/experimental&lt;/code&gt; 反映了处于实验性兼容性标志之下的 API。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;删除了带有日期的入口点，例如 &lt;code&gt;@cloudflare/workers-types/2022-11-30&lt;/code&gt; 和 &lt;code&gt;@cloudflare/workers-types/2023-03-01&lt;/code&gt;。借助 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/wrangler/&quot;&gt;Wrangler v4&lt;/a&gt; 中的运行时类型生成功能，您可以使用 &lt;code&gt;wrangler types&lt;/code&gt; 命令来生成这些类型，以创建锁定到您的 Worker 兼容日期的类型。&lt;/p&gt;
&lt;p&gt;有关更多信息，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/languages/typescript/&quot;&gt;TypeScript 语言支持&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Fri, 03 Jul 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>AI Search - 使用 Wrangler CLI 管理 AI Search 同步作业</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-07-02-manage-sync-jobs/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-07-02-manage-sync-jobs/</guid><description>&lt;p&gt;当您将&lt;a href=&quot;https://cloudflaredoc.ubitools.com/ai-search/configuration/data-source/&quot;&gt;数据源&lt;/a&gt;连接到您的 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/ai-search/&quot;&gt;AI Search&lt;/a&gt; 实例时，AI Search 会运行同步作业以使您的索引与您的内容保持最新。您现在可以直接从 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/ai-search/wrangler-commands/&quot;&gt;Wrangler&lt;/a&gt; 管理这些作业。&lt;/p&gt;
&lt;p&gt;例如，您可以使用 &lt;code&gt;jobs create&lt;/code&gt; 命令从您的 CI/CD 或自动化流水线触发同步作业，以便在推送更改时刷新索引：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; ai-search&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; jobs&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; create&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; my-instance&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;这将创建一个异步同步作业，该作业会检查数据源中的更改，并发送新增、修改或删除的文件以进行索引。
以下命令可用：&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;命令&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wrangler ai-search jobs create&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;触发新的同步作业&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wrangler ai-search jobs list&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;列出实例的同步作业&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wrangler ai-search jobs get&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;获取作业详情&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wrangler ai-search jobs cancel&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;取消正在运行的作业&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wrangler ai-search jobs logs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查看作业的日志条目&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;所有命令都接受 &lt;code&gt;--namespace&lt;/code&gt;/&lt;code&gt;-n&lt;/code&gt;（默认为 &lt;code&gt;default&lt;/code&gt;）和 &lt;code&gt;--json&lt;/code&gt;，以输出自动化和 AI 代理可以直接解析的结构化数据。&lt;code&gt;list&lt;/code&gt; 和 &lt;code&gt;logs&lt;/code&gt; 命令还支持用于分页的 &lt;code&gt;--page&lt;/code&gt; 和 &lt;code&gt;--per-page&lt;/code&gt;，并且除非您传递 &lt;code&gt;-y&lt;/code&gt;/&lt;code&gt;--force&lt;/code&gt;，否则 &lt;code&gt;cancel&lt;/code&gt; 会提示确认。&lt;/p&gt;
&lt;p&gt;有关完整的用法详细信息，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/ai-search/wrangler-commands/&quot;&gt;AI Search Wrangler 命令文档&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>Workers - 使用 Wrangler 身份验证配置文件（auth profiles）跨多个账户工作</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-07-02-wrangler-auth-profiles/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-07-02-wrangler-auth-profiles/</guid><description>&lt;p&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/wrangler/&quot;&gt;Wrangler CLI&lt;/a&gt; 现在支持身份验证配置文件（auth profiles）：命名登录，您可以将其范围限制为特定的 Cloudflare 账户，并根据您正在工作的目录自动在它们之间进行切换。&lt;/p&gt;
&lt;p&gt;配置文件（profile）是绑定到目录的命名 OAuth 登录。在该目录及其子目录中运行的命令将使用匹配的账户 —— 这样您就可以在账户之间切换，而无需重新运行 &lt;code&gt;wrangler login&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;当您在代理机构工作时，使用配置文件为每个客户保留单独的登录，或者将暂存（staging）和生产（production）环境分隔到不同的账户中。在您的 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/wrangler/configuration/&quot;&gt;Wrangler 配置文件&lt;/a&gt; 中将配置文件与 &lt;code&gt;account_id&lt;/code&gt; 配对，这样命令就不会访问到错误的账户。&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# 为每个账户创建一个配置文件，选择它能访问的账户&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; auth&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; create&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; client-a&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; auth&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; activate&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; client-a&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; ~/clients/client-a&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; auth&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; create&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; client-b&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; auth&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; activate&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; client-b&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; ~/clients/client-b&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;使用 &lt;code&gt;--profile&lt;/code&gt; 标志以特定配置文件运行单个命令：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; deploy&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --profile&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; personal&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;在 CI 和其他自动化环境中，&lt;code&gt;CLOUDFLARE_API_TOKEN&lt;/code&gt; 仍然优先于所有配置文件。&lt;/p&gt;
&lt;p&gt;有关设置、解析顺序和完整命令参考，请参阅&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/wrangler/profiles/&quot;&gt;身份验证配置文件（Authentication profiles）&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Containers - 在 Containers 中使用 Google Artifact Registry 镜像</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-07-01-google-artifact-registry-images/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-07-01-google-artifact-registry-images/</guid><description>
&lt;p&gt;Containers 现在支持 &lt;a href=&quot;https://cloud.google.com/artifact-registry&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Google Artifact Registry&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 镜像。配置凭据后，您可以在 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/wrangler/configuration/#containers&quot;&gt;Wrangler 配置&lt;/a&gt;中使用完全限定的 Google Artifact Registry 镜像引用，而无需先将镜像推送到 Cloudflare Registry。&lt;/p&gt;
&lt;p&gt;使用 &lt;code&gt;--gar-email&lt;/code&gt; 提供服务账户电子邮件，并通过 &lt;code&gt;stdin&lt;/code&gt; 用管道传输服务账户 JSON 密钥：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;cat&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;PATH_TO_KE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;Y&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; npx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; containers&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; registries&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; configure&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;REGIO&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;N&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;-docker.pkg.dev&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --gar-email=&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;SERVICE_ACCOUNT_EMAIL&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --secret-name=&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;SECRET_NAME&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;$schema&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;./node_modules/wrangler/config-schema.json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;containers&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;image&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&amp;#x3C;REGION&gt;-docker.pkg.dev/&amp;#x3C;PROJECT_ID&gt;/&amp;#x3C;REPOSITORY&gt;/&amp;#x3C;IMAGE&gt;:&amp;#x3C;TAG&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# 示例: us-central1-docker.pkg.dev/my-project/my-repo/my-image:latest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;containers&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;image = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&amp;#x3C;REGION&gt;-docker.pkg.dev/&amp;#x3C;PROJECT_ID&gt;/&amp;#x3C;REPOSITORY&gt;/&amp;#x3C;IMAGE&gt;:&amp;#x3C;TAG&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://cloudflaredoc.ubitools.com/Users/jt.gui/workspace/astro/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;仅支持 &lt;code&gt;*-docker.pkg.dev&lt;/code&gt; 主机。要配置凭据，请参阅&lt;a href=&quot;https://cloudflaredoc.ubitools.com/containers/platform-details/image-management/#use-private-google-artifact-registry-images&quot;&gt;使用私有 Google Artifact Registry 镜像&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;欲了解更多信息，请参阅&lt;a href=&quot;https://cloudflaredoc.ubitools.com/containers/platform-details/image-management/&quot;&gt;镜像管理&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Wed, 01 Jul 2026 00:00:00 GMT</pubDate><product>Containers</product><category>Containers</category></item><item><title>Cloudflare Images - Images 绑定现按唯一转换计费</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-07-01-binding-unique-transformations/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-07-01-binding-unique-transformations/</guid><description>&lt;p&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/images/optimization/binding/&quot;&gt;Images 绑定（binding）&lt;/a&gt;现在按唯一转换计费，这与已用于基于 URL 转换的计费模型一致。在同一个日历月内对相同源图像和参数组合的重复请求仅计算一次。&lt;/p&gt;
&lt;p&gt;在此之前，无论图像或参数是否唯一，对绑定的每次调用都被计为一次单独的转换。有了这项改进，您可以在热点路径上调用绑定，而无需为每个单独的请求付费。&lt;/p&gt;
&lt;p&gt;对 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/images/optimization/binding/#infostream&quot;&gt;&lt;code&gt;.info()&lt;/code&gt;&lt;/a&gt; 的调用不再计费。&lt;/p&gt;
&lt;p&gt;欲了解更多信息，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/images/pricing/#images-transformed&quot;&gt;Images 定价&lt;/a&gt;和 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/images/optimization/binding/&quot;&gt;Images 绑定文档&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Wed, 01 Jul 2026 00:00:00 GMT</pubDate><product>Cloudflare Images</product><category>Cloudflare Images</category></item><item><title>Vectorize - 降低向量变更的端到端延迟</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-30-improved-wal-throughput/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-30-improved-wal-throughput/</guid><description>&lt;p&gt;我们大幅提升了 Vectorize &lt;a href=&quot;https://blog.cloudflare.com/building-vectorize-a-distributed-vector-database-on-cloudflare-developer-platform/#the-wal&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;预写日志（WAL）&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;的吞吐量。因此，向量变更变为可查询的端到端延迟显著降低：中位延迟从 2 分钟降至 30 秒以内，p99 延迟从 5 分钟降至 2 分钟以内。&lt;/p&gt;
&lt;img src=&quot;https://cloudflaredoc.ubitools.com/_astro/vectorize-p99-wal-batch-end-to-end-latency-improvement.k8gtzlG7_Z21AKmQ.webp&quot; alt=&quot;Vectorize p99 WAL 批次端到端延迟改善&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2542&quot; height=&quot;1184&quot;&gt;
&lt;p&gt;这意味着插入、upsert 和删除操作将更快地反映在查询结果中，提升语义搜索、推荐和检索增强生成（RAG）工作负载的数据新鲜度。您无需更改代码或配置即可受益于此改进。&lt;/p&gt;
&lt;p&gt;有关更多信息，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/vectorize/&quot;&gt;Vectorize 文档&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Wed, 01 Jul 2026 00:00:00 GMT</pubDate><product>Vectorize</product><category>Vectorize</category></item><item><title>Workers, Durable Objects - 在仪表板中跟踪 Workers 和 Durable Objects 的内存使用情况</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-30-memory-usage-metrics/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-30-memory-usage-metrics/</guid><description>&lt;p&gt;您现在可以使用 Workers 指标（Metrics）选项卡中新增的 &lt;strong&gt;Memory Usage（内存使用情况）&lt;/strong&gt; 图表，监控您的 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/&quot;&gt;Workers&lt;/a&gt; 和 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/durable-objects/&quot;&gt;Durable Objects&lt;/a&gt; 在多次调用中消耗了多少内存，图表按 P50、P90、P99 和 P999 百分位数进行了细分。&lt;/p&gt;
&lt;img src=&quot;https://cloudflaredoc.ubitools.com/_astro/2026-06-26-memory-usage.B20y2uNp_2e7cPL.webp&quot; alt=&quot;内存使用情况图表显示了带有部署标记的 P50、P90、P99 和 P999 百分位数&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1210&quot; height=&quot;782&quot;&gt;
&lt;p&gt;内存使用情况测量的是每次调用时的 V8 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/reference/how-workers-works/#isolates&quot;&gt;isolate&lt;/a&gt; 内存，受限于 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/platform/limits/#memory&quot;&gt;每个 isolate 128 MB 的限制&lt;/a&gt; —— 单个 isolate 可以处理许多并发请求并在它们之间共享内存。&lt;/p&gt;
&lt;p&gt;使用内存使用情况图表可以：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;跟踪内存趋势&lt;/strong&gt; —— 在导致 &lt;code&gt;Exceeded Memory&lt;/code&gt;（超出内存）错误之前，发现可能表明存在内存泄漏的渐进式内存增加。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;与部署关联&lt;/strong&gt; —— 图表上的部署标记可帮助您确定新版本是否引入了内存回归。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;合理调整您的 Worker 规模&lt;/strong&gt; —— 了解您的基准内存占用量，以及在达到 128 MB 限制之前您还有多少余量。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对于 Durable Objects，内存使用情况反映了对象保存的内存中状态（类属性、缓存、活动的 WebSocket 连接），该状态在多次调用之间保持不变，直到对象被&lt;a href=&quot;https://cloudflaredoc.ubitools.com/durable-objects/concepts/durable-object-lifecycle/&quot;&gt;休眠或逐出&lt;/a&gt;。在逐出、休眠或崩溃时，此状态不会保留，因此请将任何重要内容持久化保存到&lt;a href=&quot;https://cloudflaredoc.ubitools.com/durable-objects/best-practices/access-durable-objects-storage/&quot;&gt;存储&lt;/a&gt;中。&lt;/p&gt;
&lt;p&gt;要查看内存使用情况，请打开您的 &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers/services/view/:worker/production/metrics&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Worker&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 或 &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers/durable-objects&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Durable Object 命名空间&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 的 &lt;strong&gt;Metrics（指标）&lt;/strong&gt; 选项卡。对于 Durable Objects，您可以按 DO ID 或名称进行过滤，以深入查看特定对象的内存使用情况。您还可以通过 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/analytics/graphql-api/tutorials/querying-workers-metrics/&quot;&gt;GraphQL Analytics API&lt;/a&gt; 使用 &lt;code&gt;workersInvocationsAdaptive&lt;/code&gt; 数据集以编程方式查询内存使用情况 —— 从 &lt;code&gt;quantiles.memoryUsageBytesP50&lt;/code&gt; 到 &lt;code&gt;quantiles.memoryUsageBytesP999&lt;/code&gt; 的字段以字节为单位返回百分位数。&lt;/p&gt;
&lt;p&gt;对于本地内存调试，您还可以&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/observability/dev-tools/memory-usage/&quot;&gt;使用 DevTools 剖析内存&lt;/a&gt;以获取堆快照并识别导致高内存占用的特定对象。&lt;/p&gt;</description><pubDate>Tue, 30 Jun 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category><category>Durable Objects</category></item><item><title>Workers - Workers fetch 请求现在支持 cf.vary</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-28-cf-vary-request-option/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-28-cf-vary-request-option/</guid><description>
&lt;p&gt;Workers &lt;code&gt;fetch()&lt;/code&gt; 请求现在支持 &lt;code&gt;cf.vary&lt;/code&gt; 请求选项。使用 &lt;code&gt;cf.vary&lt;/code&gt; 可以控制 Cloudflare 如何为单个子请求缓存具有 &lt;code&gt;Vary&lt;/code&gt; 标头的源服务器响应。&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;js&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;src/index.js&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			cf: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				vary: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;					default: { action: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;bypass&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;					headers: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;						accept: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;							action: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;normalize&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;							media_types: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;text/html&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;application/json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;						},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;						&quot;accept-language&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;							action: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;normalize&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;							languages: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;en&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;fr&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;de&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;						},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;					},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;src/index.ts&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Promise&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			cf: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				vary: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;					default: { action: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;bypass&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;					headers: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;						accept: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;							action: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;normalize&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;							media_types: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;text/html&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;application/json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;						},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;						&quot;accept-language&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;							action: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;normalize&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;							languages: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;en&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;fr&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;de&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;						},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;					},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;} &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;satisfies&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ExportedHandler&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://cloudflaredoc.ubitools.com/Users/jt.gui/workspace/astro/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;有关更多信息，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/runtime-apis/request/#the-cfvary-property&quot;&gt;&lt;code&gt;cf.vary&lt;/code&gt;&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Sun, 28 Jun 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Agents, Workers - Agents SDK 添加了后台子 agent 和统一的轮次入口点</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-26-agents-sdk-v0.17.0/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-26-agents-sdk-v0.17.0/</guid><description>
&lt;p&gt;&lt;a href=&quot;https://github.com/cloudflare/agents&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Agents SDK&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 的最新版本使得在后台运行长时间工作、通过一个入口点驱动轮次以及让聊天 agent 在部署、驱逐和重新连接期间保持正常工作变得更加容易。&lt;/p&gt;
&lt;p&gt;此版本添加了一等的独立（后台）子 agent 运行（具有实时进度和持久里程碑）、单个 &lt;code&gt;runTurn&lt;/code&gt; 轮次准入入口点，以及大量的恢复和可靠性修复，这些修复继续将 &lt;code&gt;@cloudflare/think&lt;/code&gt; 和 &lt;code&gt;@cloudflare/ai-chat&lt;/code&gt; 收敛到同一个模型上。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;具有进度和里程碑的后台子-agent&quot;&gt;具有进度和里程碑的后台子 agent&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#具有进度和里程碑的后台子-agent&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;runAgentTool&lt;/code&gt; 现在可以派发一个子 agent，而不会阻塞调用轮次。独立的运行会立即返回一个句柄，并由一个持久的、在驱逐中存活的骨干（backbone）所拥有，而不是在派发轮次结束时被放弃。&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; OrdersAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Think&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; startImport&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Fire-and-forget, or wire a durable completion callback&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// (by method name, like schedule()):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runAgentTool&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(ImportAgent, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			input,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			detached: { onFinish: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;onImportDone&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, maxBudgetMs: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 60&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 1000&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;	// result.status: &quot;completed&quot; | &quot;error&quot; | &quot;aborted&quot; | &quot;interrupted&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; onImportDone&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; OrdersAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Think&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; startImport&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Fire-and-forget, or wire a durable completion callback&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// (by method name, like schedule()):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runAgentTool&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(ImportAgent, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			input,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			detached: { onFinish: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;onImportDone&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, maxBudgetMs: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 60&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 1000&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;	// result.status: &quot;completed&quot; | &quot;error&quot; | &quot;aborted&quot; | &quot;interrupted&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; onImportDone&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://cloudflaredoc.ubitools.com/Users/jt.gui/workspace/astro/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;亮点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;持久的、在正常路径上仅执行一次的完成&lt;/strong&gt;：通过热快速路径以及一个在驱逐和部署中存活的自调度对齐骨干。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;有边界。&lt;/strong&gt; 绝对的 &lt;code&gt;maxBudgetMs&lt;/code&gt; 上限（默认 24 小时）和 &lt;code&gt;cancelAgentTool(runId)&lt;/code&gt; 可以防止被放弃的运行永远占用并发槽位。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;detached: { notify: true }&lt;/code&gt;&lt;/strong&gt; 允许已完成的后台运行将消息注入回聊天中，以便模型对结果做出反应 —— 无需手动连接 &lt;code&gt;onFinish&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;子 agent 还可以报告运行中进度，这些进度会通过它们自己的轮次流返回到父级连接的客户端：&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Inside the child sub-agent:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;reportProgress&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	fraction: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;0.6&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	phase: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;deploying&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	message: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Generating menu page…&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Inside the child sub-agent:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;reportProgress&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	fraction: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;0.6&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	phase: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;deploying&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	message: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Generating menu page…&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;进度通过 &lt;code&gt;useAgentToolEvents&lt;/code&gt; 呈现在 &lt;code&gt;AgentToolRunState.progress&lt;/code&gt; 上，因此后台运行托盘（tray）可以渲染实时进度条而无需深入查看，并且最新快照会被持久化以便在驱逐后进行检查。命名一个 &lt;code&gt;milestone&lt;/code&gt;（里程碑）会将一个信号提升为持久的、可重放的行，并且 &lt;code&gt;detached: { onMilestones }&lt;/code&gt; 可以将里程碑呈现为合成聊天消息（对于简单的状态行使用 &lt;code&gt;&quot;narrate&quot;&lt;/code&gt;，或者使用 &lt;code&gt;&quot;react&quot;&lt;/code&gt; 来驱动模型轮次）。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;轮次的单一入口点runturn&quot;&gt;轮次的单一入口点：&lt;code&gt;runTurn&lt;/code&gt;&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#轮次的单一入口点runturn&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;@cloudflare/think&lt;/code&gt; 添加了一个公共 &lt;code&gt;runTurn(options)&lt;/code&gt; 外观（facade），将轮次准入统一在单个 &lt;code&gt;mode&lt;/code&gt; 后面：&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runTurn&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ mode: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;wait&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, messages }); &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// saveMessages / continueLastTurn&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runTurn&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ mode: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;submit&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, messages }); &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// durable submitMessages&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runTurn&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ mode: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;stream&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, messages }); &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// chat()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runTurn&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ mode: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;wait&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, messages }); &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// saveMessages / continueLastTurn&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runTurn&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ mode: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;submit&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, messages }); &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// durable submitMessages&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runTurn&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ mode: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;stream&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, messages }); &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// chat()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;stream&lt;/code&gt; 模式接受数组和函数输入以匹配 &lt;code&gt;wait&lt;/code&gt; 模式，所有入口点现在都通过共享的内部准入路径进行路由，该路径在之前可能导致死锁的嵌套阻塞准入上会抛出清晰的错误。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;恢复和可靠性&quot;&gt;恢复和可靠性&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#恢复和可靠性&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;此版本的很大一部分继续强化恢复，并将 &lt;code&gt;@cloudflare/think&lt;/code&gt; 和 &lt;code&gt;@cloudflare/ai-chat&lt;/code&gt; 收敛到同一个模型上：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;流停滞看门狗。&lt;/strong&gt; &lt;code&gt;AIChatAgent&lt;/code&gt; 可以通过选择启用的 &lt;code&gt;chatStreamStallTimeoutMs&lt;/code&gt; 看门狗检测并从挂起的模型/传输流中恢复。启用 &lt;code&gt;chatRecovery&lt;/code&gt; 后，停滞将路由到部署或驱逐使用的相同有界恢复机制中；否则，它会作为终端流错误显现，以便清除加载指示器。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;中断的工具调用修复。&lt;/strong&gt; &lt;code&gt;AIChatAgent&lt;/code&gt; 现在在重新进入推理之前会修复带有已死服务器工具调用的脚本（与 &lt;code&gt;@cloudflare/think&lt;/code&gt; 保持一致），因此恢复的轮次不再因 &lt;code&gt;AI_MissingToolResultsError&lt;/code&gt; 而失败。可重写的 &lt;code&gt;repairInterruptedToolPart(part)&lt;/code&gt; Hook 允许应用程序自定义修复后的形状。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重连后状态卡住。&lt;/strong&gt; 修复了当重连与已接受但尚未开始流式传输的轮次发生竞态时，AI SDK &lt;code&gt;status&lt;/code&gt; 卡住的问题，因此 UI 现在会渲染进行中的轮次，而不是卡在 &lt;code&gt;ready&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;连接时的实时 “recovering…”。&lt;/strong&gt; &lt;code&gt;AIChatAgent&lt;/code&gt; 现在会将恢复状态回放到在恢复途中连接的客户端，因此 &lt;code&gt;useAgentChat&lt;/code&gt; 的 &lt;code&gt;isRecovering&lt;/code&gt; 会立即反映进行中的恢复，而不是显得冻结。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;终端连接失败。&lt;/strong&gt; 客户端在终端 WebSocket 关闭事件上停止重新连接，并通过 &lt;code&gt;AgentClient&lt;/code&gt;、&lt;code&gt;useAgent&lt;/code&gt; 和 &lt;code&gt;useAgentChat&lt;/code&gt; 上的 &lt;code&gt;connectionError&lt;/code&gt; / &lt;code&gt;onConnectionError&lt;/code&gt; 暴露它们。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent-tool 子节点恢复。&lt;/strong&gt; 在部署后，健康的长期运行子 agent 运行不再被作为 &lt;code&gt;interrupted&lt;/code&gt;（中断）放弃（对于 &lt;code&gt;@cloudflare/think&lt;/code&gt; 和 &lt;code&gt;AIChatAgent&lt;/code&gt; 皆是如此）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;来自子 agent 侧面（facets）的 Workflow。&lt;/strong&gt; Agent Workflows 现在可以从子 agent 侧面（facets）开始，回调和 Workflow RPC 会被路由回源侧面。&lt;/li&gt;
&lt;li&gt;此外还有前向进度信用收敛、广播优先放弃顺序、事件驱动的自动继续屏障，以及 &lt;code&gt;AIChatAgent&lt;/code&gt; 中的结构化行大小压缩。&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;其他改进&quot;&gt;其他改进&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#其他改进&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;共享聊天 React 核心。&lt;/strong&gt; 新的 &lt;code&gt;agents/chat/react&lt;/code&gt; 入口暴露了 &lt;code&gt;useAgentChat&lt;/code&gt;、传输辅助函数和共享线缆（wire）类型，具有用于服务器权威脚本存储的 &lt;code&gt;syncMessagesToServer&lt;/code&gt;。&lt;code&gt;@cloudflare/think/react&lt;/code&gt; and &lt;code&gt;@cloudflare/ai-chat/react&lt;/code&gt; 现在只是它的薄包装器。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可选的 &lt;code&gt;ai&lt;/code&gt; 同级依赖。&lt;/strong&gt; 根 &lt;code&gt;agents&lt;/code&gt; and &lt;code&gt;@cloudflare/codemode&lt;/code&gt; 运行时不再引用 AI SDK 类型，因此它们可以在不安装 &lt;code&gt;ai&lt;/code&gt; / &lt;code&gt;zod&lt;/code&gt; 的情况下打包；特定于 AI 的入口点在导入时仍然需要同级依赖。&lt;code&gt;just-bash&lt;/code&gt; 同样移动到了仅由 skills bash 运行器使用的可选同级依赖中。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Code Mode。&lt;/strong&gt; 默认的 &lt;code&gt;DynamicWorkerExecutor&lt;/code&gt; 超时时间从 30 秒增加到 60 秒，每次运行后现在会销毁动态加载的 Worker 及其 RPC 存根（stub）（修复了不稳定的隔离区关闭断言），连接器导入已被清理，并且外部 MCP 工具调用上下文会被传递给 &lt;code&gt;openApiMcpServer&lt;/code&gt; 请求回调。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Voice。&lt;/strong&gt; Voice 轮次现在支持 AI SDK &lt;code&gt;fullStream&lt;/code&gt; 响应（并在使用 &lt;code&gt;textStream&lt;/code&gt; 时发出警告）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MCP。&lt;/strong&gt; &lt;code&gt;McpAgent&lt;/code&gt; 服务器到客户端的请求现在可以从不继承 agent 异步上下文的回调中发送，包括通过 Worker Loader RPC 到达的回调。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;实验性：服务器操作和通道。&lt;/strong&gt; 此版本为受保护的服务器操作（带有持久重放账本和批准的 &lt;code&gt;action()&lt;/code&gt; / &lt;code&gt;getActions()&lt;/code&gt;）和统一的通道表面（&lt;code&gt;configureChannels()&lt;/code&gt;、&lt;code&gt;deliverNotice()&lt;/code&gt;）奠定了基础。两者都是实验性的，它们的 API 可能会发生变化，因此我们目前不建议依赖它们。&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;升级&quot;&gt;升级&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#升级&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;要更新到最新版本：&lt;/p&gt;
&lt;script&gt;
	if (!customElements.get(&quot;nb-pm-restore&quot;)) {
		customElements.define(
			&quot;nb-pm-restore&quot;,
			class extends HTMLElement {
				connectedCallback() {
					const card = this.closest(&quot;[data-nb-pm]&quot;);
					if (!card) return;
					let saved;
					try {
						saved = sessionStorage.getItem(&quot;ui-pm-tab&quot;);
					} catch {
						return;
					}
					if (!saved) return;
					const tabs = card.querySelectorAll(&quot;[data-nb-pm-tab]&quot;);
					let idx = -1;
					tabs.forEach(function (t, i) {
						if (t.textContent.trim() === saved) idx = i;
					});
					if (idx &lt; 1) return;
					tabs.forEach(function (t, i) {
						t.setAttribute(&quot;aria-selected&quot;, String(i === idx));
					});
					card.querySelectorAll(&quot;[data-nb-pm-panel]&quot;).forEach(function (p, i) {
						p.hidden = i !== idx;
					});
				}
			},
		);
	}
&lt;/script&gt;&lt;div data-nb-pm class=&quot;w-full&quot;&gt;&lt;div class=&quot;flex w-full flex-col overflow-hidden rounded-lg text-sm ring ring-border bg-card&quot;&gt;&lt;div class=&quot;flex items-center gap-2 px-3 py-2 text-[0.8125rem] font-medium leading-5 text-muted-foreground bg-[var(--nb-surface-sunken)]&quot; role=&quot;tablist&quot; aria-label=&quot;Package manager&quot;&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;true&quot; aria-controls=&quot;pm-panel-pm-10f709ee-1774-4e18-9e39-61e502d6bc2e-npm&quot; id=&quot;pm-tab-pm-10f709ee-1774-4e18-9e39-61e502d6bc2e-npm&quot; data-nb-pm-tab class=&quot;text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2&quot;&gt;npm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-10f709ee-1774-4e18-9e39-61e502d6bc2e-yarn&quot; id=&quot;pm-tab-pm-10f709ee-1774-4e18-9e39-61e502d6bc2e-yarn&quot; data-nb-pm-tab class=&quot;text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2&quot;&gt;yarn&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-10f709ee-1774-4e18-9e39-61e502d6bc2e-pnpm&quot; id=&quot;pm-tab-pm-10f709ee-1774-4e18-9e39-61e502d6bc2e-pnpm&quot; data-nb-pm-tab class=&quot;text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2&quot;&gt;pnpm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-10f709ee-1774-4e18-9e39-61e502d6bc2e-bun&quot; id=&quot;pm-tab-pm-10f709ee-1774-4e18-9e39-61e502d6bc2e-bun&quot; data-nb-pm-tab class=&quot;text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2&quot;&gt;bun&lt;/button&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-10f709ee-1774-4e18-9e39-61e502d6bc2e-npm&quot; aria-labelledby=&quot;pm-tab-pm-10f709ee-1774-4e18-9e39-61e502d6bc2e-npm&quot; data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; i agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/voice@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;npm i agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/voice@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;symbol id=&quot;ai:ph:copy&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:ph:copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;symbol id=&quot;ai:ph:check&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:ph:check&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-10f709ee-1774-4e18-9e39-61e502d6bc2e-yarn&quot; aria-labelledby=&quot;pm-tab-pm-10f709ee-1774-4e18-9e39-61e502d6bc2e-yarn&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;yarn&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/voice@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;yarn add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/voice@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;use href=&quot;#ai:ph:copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;use href=&quot;#ai:ph:check&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-10f709ee-1774-4e18-9e39-61e502d6bc2e-pnpm&quot; aria-labelledby=&quot;pm-tab-pm-10f709ee-1774-4e18-9e39-61e502d6bc2e-pnpm&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;pnpm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/voice@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;pnpm add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/voice@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;use href=&quot;#ai:ph:copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;use href=&quot;#ai:ph:check&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-10f709ee-1774-4e18-9e39-61e502d6bc2e-bun&quot; aria-labelledby=&quot;pm-tab-pm-10f709ee-1774-4e18-9e39-61e502d6bc2e-bun&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;bun&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/voice@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;bun add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/voice@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;use href=&quot;#ai:ph:copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;use href=&quot;#ai:ph:check&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;nb-pm-restore style=&quot;display:contents&quot;&gt;&lt;/nb-pm-restore&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://cloudflaredoc.ubitools.com/Users/jt.gui/workspace/astro/cloudflare-docs/src/components/ui/package-managers/PackageManagers.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;有关更多信息，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/agents/harnesses/think/&quot;&gt;Think 文档&lt;/a&gt;、&lt;a href=&quot;https://cloudflaredoc.ubitools.com/agents/tools/codemode/&quot;&gt;Code Mode 文档&lt;/a&gt;和 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/agents/&quot;&gt;Agents 文档&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Fri, 26 Jun 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>Durable Objects, Workers - Durable Objects 新增 `us` 管辖区（Jurisdiction）</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-26-durable-objects-us-jurisdiction/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-26-durable-objects-us-jurisdiction/</guid><description>&lt;p&gt;Durable Objects 现在支持 &lt;code&gt;us&lt;/code&gt; &lt;a href=&quot;https://cloudflaredoc.ubitools.com/durable-objects/reference/data-location/#restrict-durable-objects-to-a-jurisdiction&quot;&gt;管辖区（jurisdiction）&lt;/a&gt;，允许您创建仅在美国境内运行并存储数据的 Durable Objects。当您需要将 Durable Object 的计算和存储保留在美国境内以满足数据驻留要求时，请使用 &lt;code&gt;us&lt;/code&gt; 管辖区。&lt;/p&gt;
&lt;p&gt;像使用任何其他管辖区一样，创建一个受限于 &lt;code&gt;us&lt;/code&gt; 管辖区的命名空间：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Worker&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; usSubnamespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;MY_DURABLE_OBJECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;jurisdiction&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;us&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; stub&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; usSubnamespace.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;getByName&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;general&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; stub.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Workers 仍可从世界任何地方访问受限于 &lt;code&gt;us&lt;/code&gt; 管辖区的 Durable Objects。管辖区限制仅控制 Durable Object 本身在何处运行和持久化数据。&lt;/p&gt;
&lt;p&gt;如需查看支持的管辖区的完整列表，请参阅&lt;a href=&quot;https://cloudflaredoc.ubitools.com/durable-objects/reference/data-location/#restrict-durable-objects-to-a-jurisdiction&quot;&gt;数据位置 — 限制 Durable Objects 至特定管辖区&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Fri, 26 Jun 2026 00:00:00 GMT</pubDate><product>Durable Objects</product><category>Durable Objects</category><category>Workers</category></item><item><title>Durable Objects, Workers - 使用新的 cloudflare:test 辅助函数测试 Durable Object 逐出（eviction）</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-25-durable-object-eviction-test-helpers/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-25-durable-object-eviction-test-helpers/</guid><description>&lt;p&gt;&lt;code&gt;@cloudflare/vitest-pool-workers&lt;/code&gt; 包现在包含了从 &lt;code&gt;cloudflare:test&lt;/code&gt; 导出的 &lt;code&gt;evictDurableObject&lt;/code&gt; 和 &lt;code&gt;evictAllDurableObjects&lt;/code&gt; 测试辅助函数。&lt;/p&gt;
&lt;p&gt;这些辅助函数允许您测试 Durable Object 在逐出发生时的行为，模拟闲置 Durable Object 从内存中逐出的实际生产生命周期。&lt;/p&gt;
&lt;p&gt;有关更多背景信息，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/durable-objects/concepts/durable-object-lifecycle/&quot;&gt;Durable Object 的生命周期&lt;/a&gt;。&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { evictDurableObject, evictAllDurableObjects } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;cloudflare:test&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { env } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;cloudflare:workers&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;COUNTER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;idFromName&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-counter&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; stub&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;COUNTER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(id);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// 逐出特定 stub 所指向的 Durable Object 实例&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; evictDurableObject&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(stub);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// 关闭 WebSockets 而不是将它们休眠&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; evictDurableObject&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(stub, { webSockets: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;close&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// 逐出当前在可逐出命名空间中运行的所有 Durable Objects&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; evictAllDurableObjects&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;这些辅助函数在 &lt;code&gt;@cloudflare/vitest-pool-workers@0.16.20&lt;/code&gt; 及更高版本中可用。&lt;/p&gt;
&lt;p&gt;请在 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/testing/vitest-integration/test-apis/#durable-objects&quot;&gt;测试 API 参考&lt;/a&gt;和&lt;a href=&quot;https://cloudflaredoc.ubitools.com/durable-objects/examples/testing-with-durable-objects/#testing-eviction&quot;&gt;测试 Durable Objects 指南&lt;/a&gt;中了解更多信息。&lt;/p&gt;</description><pubDate>Thu, 25 Jun 2026 00:00:00 GMT</pubDate><product>Durable Objects</product><category>Durable Objects</category><category>Workers</category></item><item><title>AI Search - 控制 AI Search 相似性缓存新鲜度</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-24-ai-search-similarity-cache-controls/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-24-ai-search-similarity-cache-controls/</guid><description>&lt;p&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/ai-search/&quot;&gt;AI Search&lt;/a&gt; 现在让您能够更好地控制&lt;a href=&quot;https://cloudflaredoc.ubitools.com/ai-search/configuration/retrieval/cache/&quot;&gt;相似性缓存&lt;/a&gt;新鲜度。相似性缓存通过重用语义相似查询的响应，有助于降低延迟和推理成本。&lt;/p&gt;
&lt;p&gt;通过这些更新，您可以选择允许重用响应的时间长度，并在缓存的响应可能过时时将其清除。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;缓存持续时间现在默认为-48-小时&quot;&gt;缓存持续时间现在默认为 48 小时&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#缓存持续时间现在默认为-48-小时&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;以前，AI Search 缓存响应的固定时间为 30 天。缓存的响应现在使用实例的 &lt;code&gt;cache_ttl&lt;/code&gt; 设置，默认值为 &lt;strong&gt;48 小时&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;您可以在创建或更新实例时设置 &lt;code&gt;cache_ttl&lt;/code&gt;，以选择从 10 分钟到 6 天不等的缓存持续时间。&lt;/p&gt;
&lt;p&gt;当您的源内容变化频繁且新鲜度更重要时，请使用较短的 TTL。当您的内容稳定且您希望更多地重用缓存时，请使用较长的 TTL。&lt;/p&gt;
&lt;p&gt;例如，将 &lt;code&gt;cache_ttl&lt;/code&gt; 设置为 &lt;code&gt;518400&lt;/code&gt; 以将缓存的响应保留 6 天：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;json&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot; data-nb-lang=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;cache_ttl&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;518400&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;清除缓存响应&quot;&gt;清除缓存响应&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#清除缓存响应&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;您还可以按需清除实例的所有缓存响应。清除缓存响应不会删除已索引的内容或源文件。&lt;/p&gt;
&lt;p&gt;这会阻止 AI Search 重用以前缓存的响应，因此后续的相似查询会生成新鲜的答案并重新填充缓存。&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -X&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;https://api.cloudflare.com/client/v4/accounts/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$ACCOUNT_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/ai-search/instances/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$INSTANCE_NAME&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/purge_cache&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer &lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$CLOUDFLARE_API_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;您还可以从 Cloudflare 仪表板中的实例设置页面清除缓存响应。&lt;/p&gt;
&lt;p&gt;请参阅&lt;a href=&quot;https://cloudflaredoc.ubitools.com/ai-search/configuration/retrieval/cache/&quot;&gt;相似性缓存&lt;/a&gt;以获取支持的 &lt;code&gt;cache_ttl&lt;/code&gt; 值的完整列表以及有关缓存行为的更多详细信息。&lt;/p&gt;</description><pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>Workflows - Workflows 回滚处理程序现在包含步骤上下文</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-16-rollback-options/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-16-rollback-options/</guid><description>&lt;p&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workflows/&quot;&gt;Workflows&lt;/a&gt; 使构建可靠的多步骤应用程序变得更加容易，这些应用程序能够在下游系统故障时恢复。回滚处理程序现在通过 &lt;code&gt;ctx&lt;/code&gt; 对象接收正在回滚的步骤的原始&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workflows/build/step-context/&quot;&gt;步骤上下文&lt;/a&gt;。这包括 &lt;code&gt;ctx.step.name&lt;/code&gt;、&lt;code&gt;ctx.step.count&lt;/code&gt;、&lt;code&gt;ctx.attempt&lt;/code&gt; 以及应用了默认值的步骤 &lt;code&gt;config&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workflows/build/workers-api/#workflowstepconfig&quot;&gt;步骤配置&lt;/a&gt;包含用于该步骤的重试和超时设置，因此您可以根据这些字段自定义步骤恢复逻辑。&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;	&quot;create charge&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; charge&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; createCharge&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { chargeId: charge.id };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;		rollback&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;output&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;			// `output` 是被回滚步骤返回的值。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			const&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;chargeId&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; output &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;chargeId&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; refundCharge&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(chargeId, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;				// `ctx` 是原始步骤上下文，包括步骤名称、计数、尝试次数和配置。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				reason: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;step&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}: ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		rollbackConfig: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;			// `rollbackConfig` 控制回滚处理程序的重试和超时。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			retries: { limit: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, delay: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;30 seconds&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, backoff: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;linear&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			timeout: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;5 minutes&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;请参阅&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workflows/build/workers-api/#rollback-options&quot;&gt;回滚选项&lt;/a&gt;了解更多信息。&lt;/p&gt;</description><pubDate>Tue, 23 Jun 2026 12:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category></item><item><title>R2 SQL - R2 SQL 现在支持窗口函数、DISTINCT 和集合操作</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-21-window-functions-distinct-set-operations/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-21-window-functions-distinct-set-operations/</guid><description>&lt;p&gt;R2 SQL 现在支持窗口函数、&lt;code&gt;SELECT DISTINCT&lt;/code&gt;、集合操作和更多聚合，使得编写分析查询变得更加容易，而无需在其他地方预处理数据。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2-sql/&quot;&gt;R2 SQL&lt;/a&gt; 是 Cloudflare 的无服务器分布式 SQL 引擎，用于查询存储在 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2/data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt; 中的 &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Apache Iceberg&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 表。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;新功能&quot;&gt;新功能&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#新功能&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;窗口函数&lt;/strong&gt; — &lt;code&gt;ROW_NUMBER&lt;/code&gt;、&lt;code&gt;RANK&lt;/code&gt;、&lt;code&gt;DENSE_RANK&lt;/code&gt;、&lt;code&gt;PERCENT_RANK&lt;/code&gt;、&lt;code&gt;CUME_DIST&lt;/code&gt;、&lt;code&gt;NTILE&lt;/code&gt;、&lt;code&gt;LAG&lt;/code&gt;、&lt;code&gt;LEAD&lt;/code&gt;、&lt;code&gt;FIRST_VALUE&lt;/code&gt;、&lt;code&gt;LAST_VALUE&lt;/code&gt;、&lt;code&gt;NTH_VALUE&lt;/code&gt;，以及带有 &lt;code&gt;OVER (...)&lt;/code&gt; 子句的聚合，包括 &lt;code&gt;PARTITION BY&lt;/code&gt; 和显式窗口范围（frames）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;QUALIFY&lt;/strong&gt; — 根据窗口函数结果过滤行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DISTINCT&lt;/strong&gt; — &lt;code&gt;SELECT DISTINCT&lt;/code&gt;、&lt;code&gt;DISTINCT ON (...)&lt;/code&gt; 以及聚合上的 &lt;code&gt;DISTINCT&lt;/code&gt; 修饰符（例如 &lt;code&gt;COUNT(DISTINCT ...)&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;集合操作&lt;/strong&gt; — &lt;code&gt;UNION&lt;/code&gt;、&lt;code&gt;UNION ALL&lt;/code&gt;、&lt;code&gt;INTERSECT&lt;/code&gt; 和 &lt;code&gt;EXCEPT&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分组扩展&lt;/strong&gt; — &lt;code&gt;GROUPING SETS&lt;/code&gt;、&lt;code&gt;ROLLUP&lt;/code&gt; 和 &lt;code&gt;CUBE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;精确聚合&lt;/strong&gt; — &lt;code&gt;MEDIAN&lt;/code&gt;、&lt;code&gt;PERCENTILE_CONT&lt;/code&gt;、&lt;code&gt;ARRAY_AGG&lt;/code&gt; 和 &lt;code&gt;STRING_AGG&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;示例&quot;&gt;示例&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#示例&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;使用窗口函数对行进行排名&quot;&gt;使用窗口函数对行进行排名&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#使用窗口函数对行进行排名&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; customer_id, region,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;       ROW_NUMBER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;OVER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;PARTITION&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; region &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;ORDER BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; total_amount &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;DESC&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; rank_in_region&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;sales_data&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;使用-qualify-进行过滤&quot;&gt;使用 QUALIFY 进行过滤&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#使用-qualify-进行过滤&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; customer_id, region, total_amount&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;sales_data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;QUALIFY &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;ROW_NUMBER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;OVER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;PARTITION&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; region &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;ORDER BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; total_amount &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;DESC&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;lt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 3&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;使用集合操作组合表&quot;&gt;使用集合操作组合表&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#使用集合操作组合表&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; customer_id &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;sales_data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;EXCEPT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; customer_id &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;archived_sales&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;不支持具名 &lt;code&gt;WINDOW&lt;/code&gt; 子句 — 请在每个调用点内联 &lt;code&gt;OVER (...)&lt;/code&gt; 规范。有关完整语法参考，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2-sql/sql-reference/&quot;&gt;SQL 参考&lt;/a&gt;。有关支持的功能和性能指南，请参阅&lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2-sql/reference/limitations-best-practices/&quot;&gt;限制与最佳实践&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Mon, 22 Jun 2026 00:00:00 GMT</pubDate><product>R2 SQL</product><category>R2 SQL</category></item><item><title>Durable Objects, Workers - 新增亚太地区位置提示：apac-ne 和 apac-se</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-19-apac-ne-apac-se-location-hints/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-19-apac-ne-apac-se-location-hints/</guid><description>&lt;p&gt;Durable Objects 现在支持两个针对亚太地区的新位置提示：&lt;code&gt;apac-ne&lt;/code&gt;（东北亚）和 &lt;code&gt;apac-se&lt;/code&gt;（东南亚）。当您希望在亚太地区内进行更细粒度的托管放置，而不是使用更宽泛的 &lt;code&gt;apac&lt;/code&gt; 提示时，请使用 &lt;code&gt;apac-ne&lt;/code&gt; 或 &lt;code&gt;apac-se&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;像使用任何其他 &lt;code&gt;locationHint&lt;/code&gt; 一样使用这些新提示：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// 东北亚（日本、韩国等）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; stubNE&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;MY_DURABLE_OBJECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(id, { locationHint: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;apac-ne&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// 东南亚（新加坡、印度尼西亚等）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; stubSE&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;MY_DURABLE_OBJECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(id, { locationHint: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;apac-se&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;如果您的用户分布在整个亚太地区，现有的 &lt;code&gt;apac&lt;/code&gt; 提示仍是正确的选择。只有当您的流量明显集中在某一个子区域，且您希望将该受众的往返时间降至最低时，才使用 &lt;code&gt;apac-ne&lt;/code&gt; 或 &lt;code&gt;apac-se&lt;/code&gt;。默认行为以及我们通常建议的做法是，除非绝对需要，否则不添加位置提示，这将在尽可能靠近发起请求的地方创建 Durable Object 以减少延迟。&lt;/p&gt;
&lt;p&gt;与所有位置提示一样，这些都是尽力而为的建议。Cloudflare 会将 Durable Object 放置在附近的数据中心，而不一定是提示的确切位置。&lt;/p&gt;
&lt;p&gt;如需查看支持的提示的完整列表，请参阅&lt;a href=&quot;https://cloudflaredoc.ubitools.com/durable-objects/reference/data-location/#provide-a-location-hint&quot;&gt;数据位置 — 提供位置提示&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Fri, 19 Jun 2026 00:00:00 GMT</pubDate><product>Durable Objects</product><category>Durable Objects</category><category>Workers</category></item><item><title>Durable Objects - 出站连接使 Durable Objects 保持存活</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-19-outbound-connections-keep-dos-alive/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-19-outbound-connections-keep-dos-alive/</guid><description>&lt;p&gt;现在，通过 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/runtime-apis/tcp-sockets/&quot;&gt;&lt;code&gt;connect()&lt;/code&gt;&lt;/a&gt; 或出站 WebSocket 创建的活动出站连接在持续期间，Durable Objects 将保持存活。此前，即使对象具有打开的出站连接，Durable Object 也会在 70-140 秒无入站流量后被逐出，而这在使用 TCP 或出站 WebSocket 从大型语言模型 (LLM) 流式传输响应时是一种常见模式。&lt;/p&gt;
&lt;p&gt;通过此更改，每个活动的出站连接都可以防止被逐出。一旦所有出站连接关闭，在 Durable Object 被逐出之前将适用标准的 70-140 秒空闲窗口。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;更改前流式传输连接因逐出而中断&quot;&gt;更改前：流式传输连接因逐出而中断&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#更改前流式传输连接因逐出而中断&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;img src=&quot;https://cloudflaredoc.ubitools.com/_astro/outbound-connection-before.DpePflZI_VwYag.svg&quot; alt=&quot;时间线显示 Durable Object 在最后一次入站请求后 70-140 秒被逐出，在出站连接仍处于打开状态时中断了进行中的 LLM 流&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;820&quot; height=&quot;360&quot;&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;更改后活动的出站连接使-durable-object-保持存活&quot;&gt;更改后：活动的出站连接使 Durable Object 保持存活&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#更改后活动的出站连接使-durable-object-保持存活&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;img src=&quot;https://cloudflaredoc.ubitools.com/_astro/outbound-connection-after.Bn9BVcYz_VwYag.svg&quot; alt=&quot;时间线显示由于活动连接使 Durable Object 保持存活，相同的出站流顺利完成，空闲窗口仅在连接关闭后才开始&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;820&quot; height=&quot;360&quot;&gt;
&lt;p&gt;如果您正在 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/agents/&quot;&gt;Cloudflare 上构建智能体（Agent）&lt;/a&gt;，这一点尤为重要。在&lt;a href=&quot;https://cloudflaredoc.ubitools.com/agents/concepts/calling-llms/&quot;&gt;调用模型&lt;/a&gt;时从 LLM 流式传输 Token 的智能体，或者通过出站连接执行&lt;a href=&quot;https://cloudflaredoc.ubitools.com/agents/concepts/agentic-patterns/long-running-agents/&quot;&gt;长时间运行的任务&lt;/a&gt;的智能体，现在会在该连接持续期间保持存活，而不是在中途被逐出。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;限制：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每个出站连接最多可使 Durable Object 保持存活 &lt;strong&gt;15 分钟&lt;/strong&gt;。15 分钟后，该连接将不再防止逐出（连接本身将继续运行），并恢复&lt;a href=&quot;https://cloudflaredoc.ubitools.com/durable-objects/concepts/durable-object-lifecycle/&quot;&gt;标准逐出规则&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;Durable Object 现有的&lt;a href=&quot;https://cloudflaredoc.ubitools.com/durable-objects/platform/limits/&quot;&gt;每个账户实例限制&lt;/a&gt;仍然适用。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;欲了解更多信息，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/durable-objects/concepts/durable-object-lifecycle/&quot;&gt;Durable Object 的生命周期&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Fri, 19 Jun 2026 00:00:00 GMT</pubDate><product>Durable Objects</product><category>Durable Objects</category></item><item><title>Workers - 适用于 AI 智能体（agent）部署的临时账户</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-19-temporary-accounts-for-agents/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-19-temporary-accounts-for-agents/</guid><description>&lt;p&gt;AI 智能体（agent）现在可以直接向 Cloudflare 部署 Workers，而无需用户先进行注册、打开基于浏览器的 OAuth 流程、点击仪表板或创建 API 令牌（API token）。当智能体尝试在没有 Cloudflare 凭证的情况下进行部署时，Wrangler 可以指示其使用 &lt;code&gt;--temporary&lt;/code&gt; 重新运行，然后将 Worker 部署到临时预览账户中。&lt;/p&gt;
&lt;p&gt;要在您的智能体中尝试此操作，请更新到 Wrangler 4.102.0 或更高版本，确保您已退出登录（&lt;code&gt;wrangler logout&lt;/code&gt;），然后让您的智能体构建某些内容并将其部署到 Cloudflare。该智能体应当遵循 Wrangler 的输出并使用 &lt;code&gt;--temporary&lt;/code&gt; 标志进行部署。&lt;/p&gt;
&lt;img src=&quot;https://cloudflaredoc.ubitools.com/_astro/claim-deployments-flow.Co0tUHG4_g1dGj.webp&quot; alt=&quot;图表显示 AI 智能体部署、验证并重新部署 Worker 到临时账户，然后在身份验证后认领它并将其移动到永久账户&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1748&quot; height=&quot;368&quot;&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; deploy&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --temporary&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;临时部署将保持在线 60 分钟。在此窗口期间，智能体可以验证 Worker、重新部署更改，并返回在线 Worker URL 和认领 URL。打开认领 URL 允许您登录或创建 Cloudflare 账户，并将临时账户转为永久账户。&lt;/p&gt;
&lt;p&gt;临时预览账户目前支持有限的一组产品，包括 Workers、Workers Static Assets、Workers KV、D1、Durable Objects、Hyperdrive、Queues 和 SSL/TLS 证书。有关支持的产品、限制和认领行为，请参阅&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/platform/claim-deployments/&quot;&gt;认领部署（临时账户）&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;有关更多背景信息，请参阅 &lt;a href=&quot;https://blog.cloudflare.com/temporary-accounts/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Temporary Cloudflare Accounts for Agents&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Fri, 19 Jun 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Containers - Containers 现已支持 exec()</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-18-container-exec/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-18-container-exec/</guid><description>
&lt;p&gt;&lt;code&gt;exec()&lt;/code&gt; 现已用于 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/containers/&quot;&gt;Containers&lt;/a&gt;。使用 &lt;code&gt;this.ctx.container.exec()&lt;/code&gt; 在正在运行的 Container 中启动进程、流式传输标准输入和输出、检查退出状态码以及向每个进程发送信号。&lt;/p&gt;
&lt;p&gt;在继承 &lt;code&gt;Container&lt;/code&gt; 的类中，或在另一个 Durable Object 中通过 &lt;code&gt;this.ctx.container&lt;/code&gt; 调用 &lt;code&gt;exec()&lt;/code&gt;。关联的 Container 必须已在运行。&lt;/p&gt;
&lt;p&gt;此示例在需要时启动 Container，然后读取其 Node.js 版本：&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;js&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;src/index.js&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { Container } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/containers&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyContainer&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Container&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; readVersion&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		if&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.ctx.container.running) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; process&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.ctx.container.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;exec&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;node&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;--version&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; output&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; process.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;output&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; decoder&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; TextDecoder&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			exitCode: output.exitCode,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			stdout: decoder.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;decode&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(output.stdout),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			stderr: decoder.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;decode&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(output.stderr),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;src/index.ts&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { Container } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/containers&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyContainer&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Container&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; readVersion&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		if&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.ctx.container.running) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; process&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.ctx.container.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;exec&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;node&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;--version&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; output&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; process.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;output&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; decoder&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; TextDecoder&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			exitCode: output.exitCode,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			stdout: decoder.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;decode&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(output.stdout),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			stderr: decoder.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;decode&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(output.stderr),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://cloudflaredoc.ubitools.com/Users/jt.gui/workspace/astro/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;命令数组直接启动可执行文件，没有隐式的 shell。如果需要管道、重定向或变量展开，请显式调用 shell。&lt;/p&gt;
&lt;p&gt;一个 RPC 方法可以在一次调用者到 Durable Object 的往返中协调多个 &lt;code&gt;exec()&lt;/code&gt; 调用。它还可以传递面向字节的 &lt;code&gt;ReadableStream&lt;/code&gt; 输入或返回具有流量控制的流式输出。&lt;/p&gt;
&lt;p&gt;有关选项和流式传输示例，请参阅&lt;a href=&quot;https://cloudflaredoc.ubitools.com/containers/execute-commands/&quot;&gt;执行命令&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate><product>Containers</product><category>Containers</category></item><item><title>Hyperdrive, Workers - 创建 PlanetScale Postgres 和 MySQL 数据库，统一记入您的 Cloudflare 账户账单</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-18-planetscale-databases-cloudflare-billing/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-18-planetscale-databases-cloudflare-billing/</guid><description>
&lt;p&gt;作为一个按需付费（pay-as-you-go）客户，您可以从 Cloudflare 创建 PlanetScale Postgres 和 MySQL 数据库，并通过您的 Cloudflare 账户结算 PlanetScale 数据库的使用费用。Cloudflare 合约客户将能够在 7 月份将 PlanetScale 的使用额度添加到其合约中，因此如果有兴趣，请联系您的 Cloudflare 账户团队。&lt;/p&gt;
&lt;p&gt;从 Cloudflare 仪表板创建 PlanetScale 数据库，以体验针对区域数据访问进行了优化的全球分布式 Workers。&lt;/p&gt;
&lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers/hyperdrive?modal=1&amp;amp;type=planetscale&amp;amp;step=1&quot; data-nb-button class=&quot;group inline-flex w-max shrink-0 items-center justify-center rounded-full font-medium whitespace-nowrap no-underline shadow-xs transition-colors cursor-pointer select-none focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-2 disabled:cursor-not-allowed disabled:opacity-50 bg-primary text-primary-foreground hover:bg-primary-hover h-9 gap-1.5 px-3 text-sm&quot; target=&quot;_blank&quot;&gt;Go to &lt;strong&gt;Create a PlanetScale database&lt;/strong&gt;&amp;nbsp;&amp;#8599;&lt;/a&gt;&lt;img src=&quot;https://cloudflaredoc.ubitools.com/_astro/planetscale-request-flow.CchJ2m4p_oDDMJ.svg&quot; alt=&quot;用户到 Workers、Hyperdrive 缓存、连接池和 PlanetScale 的请求流。&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1280&quot; height=&quot;240&quot;&gt;
&lt;p&gt;从 Cloudflare 创建的 PlanetScale 数据库通过 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/hyperdrive/&quot;&gt;Hyperdrive&lt;/a&gt; 与 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/&quot;&gt;Workers&lt;/a&gt; 协同工作。Hyperdrive 管理数据库连接池和查询缓存，因此您可以将 PlanetScale 用作 Workers 应用程序的集中式关系数据库，而无需更改数据库驱动程序、对象关系映射 (ORM) 库或 SQL 工具。&lt;/p&gt;
&lt;p&gt;PlanetScale 的使用情况将在每个计费周期以美元总额的形式显示在您的 Cloudflare 发票上，价格遵循 PlanetScale 的标准&lt;a href=&quot;https://planetscale.com/pricing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;定价&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;。您可以通过 PlanetScale 的&lt;a href=&quot;https://planetscale.com/docs/billing#organization-usage-and-billing-page&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;仪表板&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;自检每个数据库的计费使用情况。&lt;/p&gt;
&lt;p&gt;当您从 Cloudflare 仪表板创建 PlanetScale 数据库时，您将获得相同的 PlanetScale 开发人员体验，包括开发分支、查询洞察以及针对 Agent 的 Model Context Protocol (MCP) 服务端支持。&lt;/p&gt;
&lt;p&gt;要开始使用，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/hyperdrive/planetscale/&quot;&gt;PlanetScale Postgres and MySQL with Hyperdrive&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate><product>Hyperdrive</product><category>Hyperdrive</category><category>Workers</category></item><item><title>Artifacts - 从 Cloudflare 仪表板管理 Artifacts</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-17-dashboard-management/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-17-dashboard-management/</guid><description>&lt;p&gt;您现在可以直接从 Cloudflare 仪表板配置 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/artifacts/concepts/how-artifacts-works/&quot;&gt;Artifacts&lt;/a&gt; 命名空间、仓库和令牌。&lt;/p&gt;
&lt;p&gt;Artifacts 是兼容 Git 的存储，允许您将仓库存储在 Cloudflare 上，并使用标准 Git 工作流与它们进行交互。&lt;/p&gt;
&lt;p&gt;您可以查看和创建&lt;a href=&quot;https://cloudflaredoc.ubitools.com/artifacts/concepts/namespaces/#use-namespaces-as-containers&quot;&gt;命名空间&lt;/a&gt;，它们是仓库的顶级容器：&lt;/p&gt;
&lt;img src=&quot;https://cloudflaredoc.ubitools.com/_astro/dashboard-namespaces.0BJelWZh_Z1uJ1iD.webp&quot; alt=&quot;Artifacts 命名空间仪表板，显示命名空间搜索和创建命名空间控件&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1804&quot; height=&quot;598&quot;&gt;
&lt;p&gt;您可以查看、创建、派生和搜索命名空间内的仓库：&lt;/p&gt;
&lt;img src=&quot;https://cloudflaredoc.ubitools.com/_astro/dashboard-repositories.M9P9JUL__Agf9h.webp&quot; alt=&quot;Artifacts 仓库仪表板，显示仓库来源、访问权限和创建时间列&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1874&quot; height=&quot;592&quot;&gt;
&lt;p&gt;您可以打开仓库以查看其文件并复制其 Git 远程 URL。&lt;/p&gt;
&lt;img src=&quot;https://cloudflaredoc.ubitools.com/_astro/dashboard-repo-overview.CSHxrCW2_81obq.webp&quot; alt=&quot;Artifacts 仓库概览，显示文件、提交、令牌管理和快速操作&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2194&quot; height=&quot;806&quot;&gt;
&lt;p&gt;您还可以直接从仪表板配置令牌，以将 Git 访问权限范围限定为单个仓库，包括用于 clone、fetch 和 pull 工作流的只读令牌，或者当客户端需要推送更改时所需的写入令牌。&lt;/p&gt;
&lt;p&gt;要开始使用，请转到 &lt;a href=&quot;https://dash.cloudflare.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare 仪表板&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;，然后选择 &lt;strong&gt;Storage &amp;amp; databases（存储和数据库）&lt;/strong&gt; &amp;gt; &lt;strong&gt;Artifacts&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;如果您已加入 Artifacts Beta 测试，您可以使用该仪表板来设置 Artifacts。如果您想加入 Beta 测试，请填写&lt;a href=&quot;https://forms.gle/DwBoPRa3CWQ8ajFp7&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;申请表&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Wed, 17 Jun 2026 12:00:00 GMT</pubDate><product>Artifacts</product><category>Artifacts</category></item><item><title>Agents, Workers - Agents SDK 改进了浏览器自动化、代码执行和恢复功能</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-16-agents-sdk-v0.16.1/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-16-agents-sdk-v0.16.1/</guid><description>
&lt;p&gt;&lt;a href=&quot;https://github.com/cloudflare/agents&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Agents SDK&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 的最新版本使得构建能够安全地与真实系统交互且在中断时能够继续工作的 agent 变得更加容易。&lt;/p&gt;
&lt;p&gt;Agent 现在可以通过 Browser Run 浏览网站、通过 Code Mode 针对外部工具编写代码、在委托给 Think 子 agent 时使用客户端提供的工具，并在从部署、Durable Object 驱逐以及连接流失中恢复时更加可靠。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;更安全的浏览器自动化&quot;&gt;更安全的浏览器自动化&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#更安全的浏览器自动化&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Agent 现在可以通过单个持久化的 &lt;code&gt;browser_execute&lt;/code&gt; 工具来使用 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/browser-run/&quot;&gt;Browser Run&lt;/a&gt;。模型无需从固定的操作列表中进行选择，而是可以针对 Chrome DevTools Protocol (CDP) 编写代码，并可以检查页面、捕获屏幕截图、读取渲染的内容、调试前端行为以及与实时浏览器会话进行交互。&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; browserTools&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; createBrowserTools&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	ctx: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.ctx,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	browser: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;BROWSER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	loader: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;LOADER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	session: { mode: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;dynamic&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; browserTools&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; createBrowserTools&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	ctx: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.ctx,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	browser: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;BROWSER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	loader: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;LOADER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	session: { mode: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;dynamic&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://cloudflaredoc.ubitools.com/Users/jt.gui/workspace/astro/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;浏览器会话可以是一次性的、重用的，或者在运行期间从一次性提升为持久化的。当 agent 需要人工登录、完成多因素身份验证（MFA）或批准敏感操作时，这非常有用。运行可以暂停，保持相同的标签页和 Cookie，并在批准后恢复。&lt;/p&gt;
&lt;p&gt;浏览器工具还为单次浏览任务添加了 Live View URL、可选的会话记录以及 &lt;code&gt;browser_markdown&lt;/code&gt;、&lt;code&gt;browser_extract&lt;/code&gt;、&lt;code&gt;browser_links&lt;/code&gt; 和 &lt;code&gt;browser_scrape&lt;/code&gt; 等快速操作。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;具有批准的可恢复代码执行&quot;&gt;具有批准的可恢复代码执行&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#具有批准的可恢复代码执行&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Code Mode 现在使用 &lt;code&gt;createCodemodeRuntime&lt;/code&gt;、连接器和持久化的执行日志。这让您只需为模型提供一个 &lt;code&gt;codemode&lt;/code&gt; 工具，而不是满是工具定义的庞大 Prompt。模型可以发现它需要的功能、针对类型化的全局变量编写代码并重用保存的代码片段。&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; runtime&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; createCodemodeRuntime&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	ctx: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.ctx,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	executor: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; DynamicWorkerExecutor&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ loader: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;LOADER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	connectors: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; GithubConnector&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.ctx, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.env, connection)],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; streamText&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	model,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	messages,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	tools: { codemode: runtime.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;tool&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; runtime&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; createCodemodeRuntime&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	ctx: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.ctx,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	executor: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; DynamicWorkerExecutor&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ loader: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;LOADER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	connectors: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; GithubConnector&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.ctx, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.env, connection)],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; streamText&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	model,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	messages,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	tools: { codemode: runtime.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;tool&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;当代码执行到受批准限制的操作时，运行时会暂停执行并返回一个待处理的批准。批准后，已完成的调用将从持久化日志中回放，运行获得批准的操作，然后继续执行相同的代码。这使得构建创建议题（issues）、更新外部系统或执行其他副作用的 agent 变得非常实用，而无需为每个工具都编写自定义的暂停和恢复逻辑。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;更好的-think-委托&quot;&gt;更好的 Think 委托&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#更好的-think-委托&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Think 子 agent 现在可以通过 RPC &lt;code&gt;chat()&lt;/code&gt; 路径使用客户端定义的工具。父 agent 可以通过 &lt;code&gt;clientTools&lt;/code&gt; 传递工具 schema，并通过 &lt;code&gt;onClientToolCall&lt;/code&gt; 解析工具调用。这使得被委托的 agent 能够使用调用者提供的功能，而无需浏览器 WebSocket。&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; child.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;chat&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(message, callback, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	signal,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	clientTools: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;get_user_timezone&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			description: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Get the caller&apos;s timezone&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			parameters: { type: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;object&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	onClientToolCall&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;toolName&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; runClientTool&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(toolName, input);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; child.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;chat&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(message, callback, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	signal,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	clientTools: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;get_user_timezone&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			description: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Get the caller&apos;s timezone&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			parameters: { type: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;object&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	onClientToolCall&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;toolName&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; runClientTool&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(toolName, input);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Think Workflows 还改进了 &lt;code&gt;step.prompt()&lt;/code&gt;。Prompt 步骤现在会在返回结构化输出之前运行一个完整的 agent 轮次，因此 agent 可以在产生类型化结果之前调用工具。这使得 Workflow 步骤在持久的分流、研究和审批流中更加有用。&lt;/p&gt;
&lt;p&gt;在绑定 Browser Run 时，统一的 Think 执行工具还可以包含 &lt;code&gt;cdp.*&lt;/code&gt; 浏览器功能，以及 &lt;code&gt;state.*&lt;/code&gt; 和 &lt;code&gt;tools.*&lt;/code&gt;。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;voice-输出设备选择&quot;&gt;Voice 输出设备选择&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#voice-输出设备选择&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Voice 客户端可以将助手音频路由到特定的输出设备。在 &lt;code&gt;useVoiceAgent&lt;/code&gt; 中使用 &lt;code&gt;outputDeviceId&lt;/code&gt;，或者从与框架无关的客户端调用 &lt;code&gt;client.setOutputDevice()&lt;/code&gt;。&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; voice&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; useVoiceAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	agent: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;MyVoiceAgent&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	outputDeviceId: selectedSpeakerId,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;tsx&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;tsx&quot; data-nb-lang=&quot;tsx&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; voice&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; useVoiceAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	agent: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;MyVoiceAgent&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	outputDeviceId: selectedSpeakerId,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;不支持扬声器选择的浏览器将继续通过默认的输出设备播放，并报告非致命的 &lt;code&gt;outputDeviceError&lt;/code&gt;。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;可靠性修复&quot;&gt;可靠性修复&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#可靠性修复&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;此版本包括针对生产环境 agent 的多项修复：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;useAgent&lt;/code&gt; 和 &lt;code&gt;AgentClient&lt;/code&gt; 在重连和配置更改期间更可靠地处理 WebSocket 替换。&lt;/li&gt;
&lt;li&gt;聊天流回放在重连、部署和提供商错误后更加可靠。&lt;/li&gt;
&lt;li&gt;纤程（Fiber）恢复可以跨多通道扫描继续，并在恢复 Hook 持续失败时进行退避。&lt;/li&gt;
&lt;li&gt;即使启动拆卸的请求被取消，Agent 拆卸仍会继续。&lt;/li&gt;
&lt;li&gt;大型会话历史记录使用按字节预算的读取，以减少启动期间的内存压力。&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;升级&quot;&gt;升级&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#升级&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;要更新到最新版本：&lt;/p&gt;
&lt;script&gt;
	if (!customElements.get(&quot;nb-pm-restore&quot;)) {
		customElements.define(
			&quot;nb-pm-restore&quot;,
			class extends HTMLElement {
				connectedCallback() {
					const card = this.closest(&quot;[data-nb-pm]&quot;);
					if (!card) return;
					let saved;
					try {
						saved = sessionStorage.getItem(&quot;ui-pm-tab&quot;);
					} catch {
						return;
					}
					if (!saved) return;
					const tabs = card.querySelectorAll(&quot;[data-nb-pm-tab]&quot;);
					let idx = -1;
					tabs.forEach(function (t, i) {
						if (t.textContent.trim() === saved) idx = i;
					});
					if (idx &lt; 1) return;
					tabs.forEach(function (t, i) {
						t.setAttribute(&quot;aria-selected&quot;, String(i === idx));
					});
					card.querySelectorAll(&quot;[data-nb-pm-panel]&quot;).forEach(function (p, i) {
						p.hidden = i !== idx;
					});
				}
			},
		);
	}
&lt;/script&gt;&lt;div data-nb-pm class=&quot;w-full&quot;&gt;&lt;div class=&quot;flex w-full flex-col overflow-hidden rounded-lg text-sm ring ring-border bg-card&quot;&gt;&lt;div class=&quot;flex items-center gap-2 px-3 py-2 text-[0.8125rem] font-medium leading-5 text-muted-foreground bg-[var(--nb-surface-sunken)]&quot; role=&quot;tablist&quot; aria-label=&quot;Package manager&quot;&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;true&quot; aria-controls=&quot;pm-panel-pm-997ea2c1-d862-4a9e-8053-ed408b30ff5b-npm&quot; id=&quot;pm-tab-pm-997ea2c1-d862-4a9e-8053-ed408b30ff5b-npm&quot; data-nb-pm-tab class=&quot;text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2&quot;&gt;npm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-997ea2c1-d862-4a9e-8053-ed408b30ff5b-yarn&quot; id=&quot;pm-tab-pm-997ea2c1-d862-4a9e-8053-ed408b30ff5b-yarn&quot; data-nb-pm-tab class=&quot;text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2&quot;&gt;yarn&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-997ea2c1-d862-4a9e-8053-ed408b30ff5b-pnpm&quot; id=&quot;pm-tab-pm-997ea2c1-d862-4a9e-8053-ed408b30ff5b-pnpm&quot; data-nb-pm-tab class=&quot;text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2&quot;&gt;pnpm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-997ea2c1-d862-4a9e-8053-ed408b30ff5b-bun&quot; id=&quot;pm-tab-pm-997ea2c1-d862-4a9e-8053-ed408b30ff5b-bun&quot; data-nb-pm-tab class=&quot;text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2&quot;&gt;bun&lt;/button&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-997ea2c1-d862-4a9e-8053-ed408b30ff5b-npm&quot; aria-labelledby=&quot;pm-tab-pm-997ea2c1-d862-4a9e-8053-ed408b30ff5b-npm&quot; data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; i agents@latest @cloudflare/think@latest @cloudflare/codemode@latest @cloudflare/ai-chat@latest @cloudflare/voice@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;npm i agents@latest @cloudflare/think@latest @cloudflare/codemode@latest @cloudflare/ai-chat@latest @cloudflare/voice@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;symbol id=&quot;ai:ph:copy&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:ph:copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;symbol id=&quot;ai:ph:check&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:ph:check&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-997ea2c1-d862-4a9e-8053-ed408b30ff5b-yarn&quot; aria-labelledby=&quot;pm-tab-pm-997ea2c1-d862-4a9e-8053-ed408b30ff5b-yarn&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;yarn&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest @cloudflare/think@latest @cloudflare/codemode@latest @cloudflare/ai-chat@latest @cloudflare/voice@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;yarn add agents@latest @cloudflare/think@latest @cloudflare/codemode@latest @cloudflare/ai-chat@latest @cloudflare/voice@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;use href=&quot;#ai:ph:copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;use href=&quot;#ai:ph:check&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-997ea2c1-d862-4a9e-8053-ed408b30ff5b-pnpm&quot; aria-labelledby=&quot;pm-tab-pm-997ea2c1-d862-4a9e-8053-ed408b30ff5b-pnpm&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;pnpm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest @cloudflare/think@latest @cloudflare/codemode@latest @cloudflare/ai-chat@latest @cloudflare/voice@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;pnpm add agents@latest @cloudflare/think@latest @cloudflare/codemode@latest @cloudflare/ai-chat@latest @cloudflare/voice@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;use href=&quot;#ai:ph:copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;use href=&quot;#ai:ph:check&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-997ea2c1-d862-4a9e-8053-ed408b30ff5b-bun&quot; aria-labelledby=&quot;pm-tab-pm-997ea2c1-d862-4a9e-8053-ed408b30ff5b-bun&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;bun&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest @cloudflare/think@latest @cloudflare/codemode@latest @cloudflare/ai-chat@latest @cloudflare/voice@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;bun add agents@latest @cloudflare/think@latest @cloudflare/codemode@latest @cloudflare/ai-chat@latest @cloudflare/voice@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;use href=&quot;#ai:ph:copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;use href=&quot;#ai:ph:check&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;nb-pm-restore style=&quot;display:contents&quot;&gt;&lt;/nb-pm-restore&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://cloudflaredoc.ubitools.com/Users/jt.gui/workspace/astro/cloudflare-docs/src/components/ui/package-managers/PackageManagers.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;有关更多信息，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/agents/tools/codemode/&quot;&gt;Code Mode 文档&lt;/a&gt;、&lt;a href=&quot;https://cloudflaredoc.ubitools.com/agents/tools/browser/&quot;&gt;浏览器工具文档&lt;/a&gt;、&lt;a href=&quot;https://cloudflaredoc.ubitools.com/agents/harnesses/think/tools/&quot;&gt;Think 工具文档&lt;/a&gt;以及 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/agents/communication-channels/voice/&quot;&gt;Voice 文档&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>Cloudflare Images - Images 中的新优化功能</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-16-new-optimization-features/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-16-new-optimization-features/</guid><description>&lt;p&gt;这些更新为使用 Images 进行优化和操作引入了新功能：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;全新 &lt;code&gt;composite&lt;/code&gt; 选项&lt;/strong&gt;：控制&lt;a href=&quot;https://cloudflaredoc.ubitools.com/images/optimization/draw-overlays/#composite&quot;&gt;叠加层如何与底图混合&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;百分比宽度&lt;/strong&gt;：将叠加层的尺寸设置为&lt;a href=&quot;https://cloudflaredoc.ubitools.com/images/optimization/draw-overlays/#width-and-height&quot;&gt;底图尺寸的分数比例&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;全新 &lt;code&gt;fit&lt;/code&gt; 模式&lt;/strong&gt;：使用 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/images/optimization/features/#aspect-crop&quot;&gt;&lt;code&gt;aspect-crop&lt;/code&gt;&lt;/a&gt; 始终保留目标宽高比，或使用 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/images/optimization/features/#scale-up&quot;&gt;&lt;code&gt;scale-up&lt;/code&gt;&lt;/a&gt; 始终放大图像。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;全新 &lt;code&gt;upscale&lt;/code&gt; 参数&lt;/strong&gt;：应用 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/images/optimization/features/#upscale&quot;&gt;AI 放大（upscaling）&lt;/a&gt;，在放大图像时产生更清晰、更细致的结果。&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate><product>Cloudflare Images</product><category>Cloudflare Images</category></item><item><title>Workers, Agents, Workers AI - 在 Workers AI 上推出 GLM-5.2</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-16-glm-5.2-workers-ai/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-16-glm-5.2-workers-ai/</guid><description>&lt;p&gt;我们很高兴宣布在 Workers AI 上推出 &lt;strong&gt;GLM-5.2&lt;/strong&gt;，这是 Z.ai 的旗舰代理（agentic）编码模型。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers-ai/models/glm-5.2/&quot;&gt;&lt;code&gt;@cf/zai-org/glm-5.2&lt;/code&gt;&lt;/a&gt; 是一款专为代理型编码工作流构建的文本生成模型。凭借函数调用和推理支持，它可以处理长代码库、多步规划和工具增强型智能体。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关键特性和使用场景：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;代理编码&lt;/strong&gt;：专为自主编码任务、长周期规划和复杂的软件工程工作流而设计&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;大型上下文窗口&lt;/strong&gt;：GLM-5.2 最多支持 1,048,576 个 token 的上下文窗口。Workers AI 推出该模型时提供 262,144 个 token 的上下文窗口，并计划在未来增加此限制&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;函数调用&lt;/strong&gt;：构建可在多个对话轮次中调用工具和 API 的智能体&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;推理&lt;/strong&gt;：解决复杂的问题求解和分步推理任务&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;通过 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers-ai/configuration/bindings/&quot;&gt;Workers AI 绑定（binding）&lt;/a&gt; (&lt;code&gt;env.AI.run()&lt;/code&gt;)、REST API &lt;code&gt;/run&lt;/code&gt; 或 &lt;code&gt;/v1/chat/completions&lt;/code&gt;，或 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/ai-gateway/&quot;&gt;AI Gateway&lt;/a&gt; 来使用 GLM-5.2。&lt;/p&gt;
&lt;p&gt;定价可在&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers-ai/models/glm-5.2/&quot;&gt;模型页面&lt;/a&gt;或&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers-ai/platform/pricing/&quot;&gt;定价页面&lt;/a&gt;上找到。&lt;/p&gt;</description><pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category><category>Agents</category><category>Workers AI</category></item><item><title>Workers VPC - 通过 VPC 网络上的 connect() 进行 TCP 连接</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-16-tcp-connect-vpc-networks/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-16-tcp-connect-vpc-networks/</guid><description>
&lt;p&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers-vpc/configuration/vpc-networks/&quot;&gt;VPC 网络（VPC Network）&lt;/a&gt; 绑定（binding）现在除了支持通过 &lt;code&gt;fetch()&lt;/code&gt; 进行 HTTP 流量传输外，还支持用于指向私有目标的原始 TCP 连接的 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/runtime-apis/tcp-sockets/&quot;&gt;&lt;code&gt;connect()&lt;/code&gt;&lt;/a&gt; Socket API。&lt;/p&gt;
&lt;p&gt;这意味着 Workers 现在可以向通过绑定的 Cloudflare Tunnel、Cloudflare Mesh 或 Cloudflare WAN 接入端（on-ramp）可达的任何私有服务打开 TCP 套接字 —— 包括 Redis、Memcached、MQTT、自定义二进制协议或任何其他基于 TCP 的服务。&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;$schema&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;./node_modules/wrangler/config-schema.json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;vpc_networks&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;binding&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;PRIVATE_NETWORK&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;network_id&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;cf1:network&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;remote&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;vpc_networks&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;binding = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;PRIVATE_NETWORK&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;network_id = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;cf1:network&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;remote = &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://cloudflaredoc.ubitools.com/Users/jt.gui/workspace/astro/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;在运行时，在绑定上使用 &lt;code&gt;connect()&lt;/code&gt; 以向私有目标打开 TCP 套接字：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Open a TCP connection to a private Redis instance&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; socket&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;PRIVATE_NETWORK&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;connect&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;10.0.1.50:6379&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Write a Redis PING command&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; writer&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; socket.writable.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;getWriter&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; writer.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;write&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; TextEncoder&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;encode&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;PING&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;\r\n&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; writer.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(socket.readable);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;aside role=&quot;note&quot; aria-label=&quot;说明&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-info); --_t: var(--nb-info-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:info&quot;&gt;&lt;symbol id=&quot;ai:ph:info&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:ph:info&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;说明&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;目前在 VPC 网络上进行的 &lt;code&gt;connect()&lt;/code&gt; 仅支持明文 TCP。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;有关更多详细信息，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers-vpc/configuration/vpc-networks/&quot;&gt;VPC 网络（VPC Networks）&lt;/a&gt; 和 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers-vpc/api/&quot;&gt;Workers 绑定（Binding）API&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate><product>Workers VPC</product><category>Workers VPC</category></item><item><title>Workers - Workers 追踪现在支持自定义 span</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-16-custom-spans/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-16-custom-spans/</guid><description>&lt;p&gt;您现在可以使用 &lt;code&gt;tracing.enterSpan()&lt;/code&gt; 在您的 Workers 代码中创建自定义追踪 span。自定义 span 与自动平台检测（fetch 调用、KV 读取、D1 查询以及其他平台操作）一起显示在您的追踪和 OpenTelemetry 导出中，并具有正确的父子嵌套关系。&lt;/p&gt;
&lt;p&gt;该 API 可以通过 &lt;code&gt;import { tracing } from &quot;cloudflare:workers&quot;&lt;/code&gt; 或通过处理程序上下文 &lt;code&gt;ctx.tracing&lt;/code&gt; 访问：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { tracing } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;cloudflare:workers&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; tracing.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;enterSpan&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;handleRequest&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;      span.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;url.path&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; URL&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request.url).pathname);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;      const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; data&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;MY_KV&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;key&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;      return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(data);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Span 根据 JavaScript 异步上下文自动嵌套，并在回调返回或其返回的 Promise 解决时自动结束。&lt;code&gt;Span&lt;/code&gt; 对象提供了 &lt;code&gt;setAttribute(key, value)&lt;/code&gt; 用于附加元数据，以及 &lt;code&gt;isTraced&lt;/code&gt; 属性用于检查当前请求是否正在被采样。&lt;/p&gt;
&lt;img src=&quot;https://cloudflaredoc.ubitools.com/_astro/wobs_custom_spans_screenshot.B-hsHjyv_ZGVlIY.webp&quot; alt=&quot;追踪瀑布图，显示与自动 KV 和 fetch 检测嵌套在一起的自定义 span&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1988&quot; height=&quot;670&quot;&gt;
&lt;p&gt;必须在您的 Wrangler 配置中&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/observability/traces/#how-to-enable-tracing&quot;&gt;启用追踪&lt;/a&gt;才能记录 span。&lt;/p&gt;
&lt;p&gt;有关完整的 API 详细信息和示例，请参阅&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/observability/traces/custom-spans/&quot;&gt;自定义 span&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>AI Gateway - 在 AI Gateway 日志中查看请求的用户代理（User Agent）</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-12-user-agent-logging/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-12-user-agent-logging/</guid><description>&lt;p&gt;AI Gateway 日志现在能够捕获发起每个请求的客户端的用户代理（User Agent），从而更容易识别是哪个 SDK、库或应用程序发送了流经您网关的流量。例如，您可以区分来自 &lt;code&gt;openai-python&lt;/code&gt; 的请求与来自自定义应用程序或 Cloudflare Worker 的请求。&lt;/p&gt;
&lt;p&gt;用户代理会与每个日志条目中的其他详细信息一起显示，并且您可以在仪表板中按用户代理（等于、不等于或包含）对日志进行筛选。&lt;/p&gt;
&lt;p&gt;欲了解更多信息，请参阅&lt;a href=&quot;https://cloudflaredoc.ubitools.com/ai-gateway/observability/logging/&quot;&gt;日志记录&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><product>AI Gateway</product><category>AI Gateway</category></item><item><title>Durable Objects, Workers - 按对象 ID 或名称筛选 Durable Objects 指标</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-12-durable-objects-metrics-filter-by-id-name/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-12-durable-objects-metrics-filter-by-id-name/</guid><description>
&lt;p&gt;现在，您可以在 Cloudflare 仪表板中，按单个 Durable Object 的 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/durable-objects/api/id/&quot;&gt;ID&lt;/a&gt; 或 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/durable-objects/api/id/#name&quot;&gt;名称&lt;/a&gt; 筛选 Durable Objects 命名空间的 &lt;strong&gt;指标&lt;/strong&gt; 选项卡。此前，指标图表仅显示聚合的命名空间级数据，因此很难隔离特定对象的行为。&lt;/p&gt;
&lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers/durable-objects&quot; data-nb-button class=&quot;group inline-flex w-max shrink-0 items-center justify-center rounded-full font-medium whitespace-nowrap no-underline shadow-xs transition-colors cursor-pointer select-none focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-2 disabled:cursor-not-allowed disabled:opacity-50 bg-primary text-primary-foreground hover:bg-primary-hover h-9 gap-1.5 px-3 text-sm&quot; target=&quot;_blank&quot;&gt;Go to &lt;strong&gt;Durable Objects&lt;/strong&gt;&amp;nbsp;&amp;#8599;&lt;/a&gt;&lt;img src=&quot;https://cloudflaredoc.ubitools.com/_astro/durable-objects-metrics-dashboard.BFZTyhWU_Z2e46Sb.webp&quot; alt=&quot;已按 ID 筛选为单个对象的 Durable Objects 指标选项卡，按调用状态显示每个对象的请求和错误。&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2936&quot; height=&quot;1482&quot;&gt;
&lt;p&gt;开始在筛选器中输入 ID 或名称，然后从自动完成下拉列表中选择匹配项。自动完成仅显示在选定时间范围内有调用的对象，因此未出现的对象在该时间窗内未被调用。这并不一定意味着该对象已被删除。页面上的每个图表都会更新，以仅反映所选的对象。这使得在调试高流量对象、错误激增或意外存储使用时，更容易识别和调查单个 Durable Object。清除筛选器可返回命名空间级指标。&lt;/p&gt;
&lt;p&gt;指标由 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/analytics/graphql-api/&quot;&gt;GraphQL Analytics API&lt;/a&gt; 提供支持，因此适用标准的分析行为，例如摄取延迟和&lt;a href=&quot;https://cloudflaredoc.ubitools.com/analytics/faq/graphql-api-inconsistent-results/&quot;&gt;采样&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;欲了解更多信息，请参阅&lt;a href=&quot;https://cloudflaredoc.ubitools.com/durable-objects/observability/metrics-and-analytics/&quot;&gt;指标和分析&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><product>Durable Objects</product><category>Durable Objects</category><category>Workers</category></item><item><title>Workers AI - Moonshot AI Kimi K2.7 Code 现已在 Workers AI 上可用</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-12-kimi-k2-7-code-workers-ai/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-12-kimi-k2-7-code-workers-ai/</guid><description>&lt;p&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers-ai/models/kimi-k2.7-code/&quot;&gt;&lt;code&gt;@cf/moonshotai/kimi-k2.7-code&lt;/code&gt;&lt;/a&gt; 现已在 Workers AI 上可用。Kimi K2.7 Code 是 Kimi K2 系列中针对代码进行了优化的变体，基于混合专家（Mixture-of-Experts）架构构建，总参数量为 1T，每个 token 的活跃参数量为 32B。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;改进的编码和智能体性能&quot;&gt;改进的编码和智能体性能&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#改进的编码和智能体性能&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;K2.7 Code 在编码和智能体基准测试中相比 K2.6 实现了显著提升：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;+21.8%&lt;/strong&gt;，在 Kimi Code Bench v2 上&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;+11.0%&lt;/strong&gt;，在 Program Bench 上&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;+31.5%&lt;/strong&gt;，在 MLS Bench Lite 上&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;推理效率&quot;&gt;推理效率&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#推理效率&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;K2.7 Code 与 K2.6 相比，使用的推理 token 减少了 30%，从而减少了“过度思考”并降低了重推理工作负载的推理成本。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;关键能力&quot;&gt;关键能力&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#关键能力&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;262.1k token 上下文窗口&lt;/strong&gt;，用于在长期运行的智能体任务中保留完整的对话历史记录、工具定义和代码库&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;长周期编码&lt;/strong&gt;，具有改进的指令遵循和更高的端到端编码任务成功率&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;视觉输入&lt;/strong&gt;，用于随文本一起处理图像&lt;/li&gt;
&lt;li&gt;可通过 &lt;code&gt;chat_template_kwargs.thinking&lt;/code&gt; 配置推理深度的&lt;strong&gt;思维模式&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多轮工具调用&lt;/strong&gt;，用于构建在多个对话轮次中调用工具的智能体&lt;/li&gt;
&lt;li&gt;支持 JSON schema 的&lt;strong&gt;结构化输出&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;与-kimi-k26-的区别&quot;&gt;与 Kimi K2.6 的区别&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#与-kimi-k26-的区别&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;如果您正在从 Kimi K2.6 迁移，请注意以下几点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;K2.7 Code 针对编码任务进行了优化，具备改进的基准测试性能和推理效率&lt;/li&gt;
&lt;li&gt;缓存的输入 token 定价为每百万（M）token 0.19 美元（而 K2.6 为 0.16 美元）&lt;/li&gt;
&lt;li&gt;API 使用方式完全相同 —— 无需更改参数&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;快速入门&quot;&gt;快速入门&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#快速入门&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;通过 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers-ai/configuration/bindings/&quot;&gt;Workers AI 绑定（binding）&lt;/a&gt; (&lt;code&gt;env.AI.run()&lt;/code&gt;)、&lt;code&gt;/ai/run&lt;/code&gt; 处的 REST API，或者 &lt;code&gt;/v1/chat/completions&lt;/code&gt; 处的兼容 OpenAI 的端点来使用 Kimi K2.7 Code。您还可以在这些端点中搭配使用 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/ai-gateway/&quot;&gt;AI Gateway&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;欲了解更多信息，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers-ai/models/kimi-k2.7-code/&quot;&gt;Kimi K2.7 Code 模型页面&lt;/a&gt;和&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers-ai/platform/pricing/&quot;&gt;定价&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category></item><item><title>Browser Run - Browser Run /snapshot 端点新增 formats 参数</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-11-browser-run-snapshot-formats/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-11-browser-run-snapshot-formats/</guid><description>
&lt;p&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/browser-run/&quot;&gt;Browser Run&lt;/a&gt; 的 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/browser-run/quick-actions/snapshot/&quot;&gt;&lt;code&gt;/snapshot&lt;/code&gt; 端点&lt;/a&gt; 现在支持 &lt;code&gt;formats&lt;/code&gt; 参数，允许您在单次 API 调用中返回多种页面格式。此前，&lt;code&gt;/snapshot&lt;/code&gt; 仅返回 HTML 内容和截图。您现在还可以在同一响应中包含 Markdown 和无障碍树。&lt;/p&gt;
&lt;p&gt;这些格式对 AI Agent 工作流特别有用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Markdown 提供了页面内容的高效 token 表示形式，LLM 可直接处理，无需解析 HTML 标记。&lt;/li&gt;
&lt;li&gt;无障碍树提供了页面元素的结构化表示，包括角色、标签和层级关系，帮助 LLM 理解页面结构并导航其内容。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以下示例在一次调用中返回截图、Markdown 和无障碍树：&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;curl&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -X&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;https://api.cloudflare.com/client/v4/accounts/&amp;lt;accountId&amp;gt;/browser-rendering/snapshot&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;Authorization: Bearer &amp;lt;apiToken&amp;gt;&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;Content-Type: application/json&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -d&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;url&quot;: &quot;https://example.com/&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;formats&quot;: [&quot;screenshot&quot;, &quot;markdown&quot;, &quot;accessibilityTree&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;  }&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript SDK&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;typescript&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot; data-nb-lang=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; Cloudflare &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;cloudflare&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; client&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Cloudflare&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	apiToken: process.env[&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;CLOUDFLARE_API_TOKEN&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; snapshot&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; client.browserRendering.snapshot.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;create&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	account_id: process.env[&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;CLOUDFLARE_ACCOUNT_ID&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	url: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;https://example.com/&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	formats: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;screenshot&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;markdown&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;accessibilityTree&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(snapshot.markdown);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(snapshot.accessibilityTree);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;Workers Bindings&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;typescript&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot; data-nb-lang=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;interface&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	BROWSER&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; BrowserRun&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Promise&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;BROWSER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;quickAction&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;snapshot&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			url: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;https://example.com/&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			formats: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;screenshot&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;markdown&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;accessibilityTree&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;} &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;satisfies&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ExportedHandler&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://cloudflaredoc.ubitools.com/Users/jt.gui/workspace/astro/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;您必须至少请求两种格式。如果只需要一种格式，请使用相应的单格式端点，例如 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/browser-run/quick-actions/screenshot-endpoint/&quot;&gt;&lt;code&gt;/screenshot&lt;/code&gt;&lt;/a&gt; 或 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/browser-run/quick-actions/markdown-endpoint/&quot;&gt;&lt;code&gt;/markdown&lt;/code&gt;&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/browser-run/quick-actions/snapshot/&quot;&gt;&lt;code&gt;/snapshot&lt;/code&gt; 文档&lt;/a&gt; 以获取完整的支持值列表。&lt;/p&gt;</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate><product>Browser Run</product><category>Browser Run</category></item><item><title>Workers - 从仪表板和 GraphQL API 跟踪 Dynamic Workers 的使用情况</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-11-dynamic-workers-count/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-11-dynamic-workers-count/</guid><description>&lt;img src=&quot;https://cloudflaredoc.ubitools.com/_astro/dynamic-workers-count.BcGsgQ0m_ZBdT2X.webp&quot; alt=&quot;Workers 概览页面上的 Dynamic Workers 使用情况&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1476&quot; height=&quot;1102&quot;&gt;
&lt;p&gt;客户现在可以从 Cloudflare 仪表板的 Workers 概览页面查看在其计费周期内调用的 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/dynamic-workers/&quot;&gt;Dynamic Workers&lt;/a&gt; 数量。&lt;/p&gt;
&lt;p&gt;此计数反映了 Cloudflare 在所选计费周期内将计费的 Dynamic Workers 数量。Dynamic Workers 的使用数据仅追溯到 2026 年 6 月 1 日。&lt;/p&gt;
&lt;p&gt;您还可以通过 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/analytics/graphql-api/&quot;&gt;GraphQL Analytics API&lt;/a&gt; 查询此计数，方法是使用 &lt;code&gt;workersInvocationsByOwnerAndScriptGroups&lt;/code&gt; 并选择 &lt;code&gt;distinctDynamicWorkerCount&lt;/code&gt;：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;graphql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;graphql&quot; data-nb-lang=&quot;graphql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; getDynamicWorkersCount&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	$accountTag&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	$filter&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AccountWorkersInvocationsByOwnerAndScriptGroupsFilter_InputObject&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	viewer&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		accounts&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: { &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;accountTag&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;$accountTag&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;			workersInvocationsByOwnerAndScriptGroups&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;limit&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;10000&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;$filter&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;				uniq&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;					distinctDynamicWorkerCount&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;使用变量来设置账户和计费周期日期范围：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;json&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot; data-nb-lang=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;accountTag&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&amp;lt;ACCOUNT_ID&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;filter&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;date_geq&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;2026-06-01&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;date_leq&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;2026-06-30&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;有关更多信息，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/dynamic-workers/pricing/&quot;&gt;Dynamic Workers 定价&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>AI Search - 使用 Wrangler CLI 管理 AI Search 命名空间</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-10-ai-search-namespace-wrangler-commands/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-10-ai-search-namespace-wrangler-commands/</guid><description>&lt;p&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/ai-search/&quot;&gt;AI Search&lt;/a&gt; 现在支持命名空间级别的 Wrangler 命令，这使得从您的终端、脚本和代理工作流程中管理&lt;a href=&quot;https://cloudflaredoc.ubitools.com/ai-search/concepts/namespaces/&quot;&gt;命名空间（namespaces）&lt;/a&gt;变得更加容易。&lt;/p&gt;
&lt;p&gt;以下命令可用：&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;命令&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wrangler ai-search namespace list&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;列出 AI Search 命名空间&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wrangler ai-search namespace create&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;创建新的 AI Search 命名空间&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wrangler ai-search namespace get&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;获取命名空间的详细信息&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wrangler ai-search namespace update&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;更新命名空间描述&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wrangler ai-search namespace delete&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;删除 AI Search 命名空间&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;直接从 CLI 为新应用程序或租户创建命名空间：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; ai-search&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; create&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; docs-production&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --description&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Production documentation search&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;通过分页列出命名空间，或按名称或描述进行过滤：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; ai-search&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; list&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --search&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; docs&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --page&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --per-page&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 10&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;将 &lt;code&gt;--json&lt;/code&gt; 与 &lt;code&gt;list&lt;/code&gt;、&lt;code&gt;create&lt;/code&gt;、&lt;code&gt;get&lt;/code&gt; 和 &lt;code&gt;update&lt;/code&gt; 结合使用，以返回自动化和 AI 代理可以直接解析的结构化输出。&lt;/p&gt;
&lt;p&gt;实例级别的命令现在也支持 &lt;code&gt;--namespace&lt;/code&gt; 标志，因此您可以从 CLI 与特定命名空间内的实例进行交互：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; ai-search&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; list&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; docs-production&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;有关完整的用法详情，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/ai-search/wrangler-commands/&quot;&gt;AI Search Wrangler 命令文档&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>Flagship - Flagship API 参考现已上线</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-10-api-reference/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-10-api-reference/</guid><description>&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/api/resources/flagship/&quot;&gt;Flagship API 参考&lt;/a&gt;&lt;/strong&gt; 现已上线。您可以使用 Cloudflare API 创建和更新应用，以及在不使用仪表板的情况下创建、更新、删除和列出功能标志。&lt;/p&gt;
&lt;p&gt;例如，使用 API 创建一个新的布尔标志：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; https://api.cloudflare.com/client/v4/accounts/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$ACCOUNT_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/flagship/apps/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$APP_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/flags&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer &lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$CLOUDFLARE_API_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -d&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;key&quot;: &quot;new-checkout&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;enabled&quot;: true,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;default_variation&quot;: &quot;off&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;variations&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      &quot;off&quot;: false,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      &quot;on&quot;: true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;rules&quot;: []&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;  }&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;要创建 API token，请前往 Cloudflare 仪表板中的&lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/api-tokens&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;账户 API Tokens&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 并搜索 Flagship。&lt;/p&gt;
&lt;p&gt;API 参考包含 Flagship 应用、标志、更新日志条目和标志评估的端点。Agent 还可以使用 &lt;a href=&quot;https://github.com/cloudflare/skills/tree/main/skills/cloudflare/references/flagship&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare skill 中的 Flagship 参考&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 创建和管理 Flagship 资源。&lt;/p&gt;
&lt;p&gt;请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/flagship/&quot;&gt;Flagship 文档&lt;/a&gt; 以了解有关从应用程序评估功能标志的更多信息。&lt;/p&gt;</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><product>Flagship</product><category>Flagship</category></item><item><title>Cloudflare Images - 使用 Images 绑定管理托管的图像</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-10-hosted-images-binding/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-10-hosted-images-binding/</guid><description>&lt;p&gt;使用 Images 绑定（binding）可以直接从您的 Worker 上传、列出、检索、更新和删除存储在 Images 中的图像，而无需管理 API 令牌（tokens）或发送 HTTP 请求。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;env.IMAGES.hosted&lt;/code&gt; 命名空间支持以下存储和管理操作：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/images/storage/binding/#uploadimage-options&quot;&gt;&lt;code&gt;.upload(image, options)&lt;/code&gt;&lt;/a&gt; — 向您的账户上传一个新图像。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/images/storage/binding/#listoptions&quot;&gt;&lt;code&gt;.list(options)&lt;/code&gt;&lt;/a&gt; — 通过分页列出图像。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/images/storage/binding/#imageimageiddetails&quot;&gt;&lt;code&gt;.image(imageId).details()&lt;/code&gt;&lt;/a&gt; — 获取图像元数据。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/images/storage/binding/#imageimageidbytes&quot;&gt;&lt;code&gt;.image(imageId).bytes()&lt;/code&gt;&lt;/a&gt; — 流式传输原始图像字节。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/images/storage/binding/#imageimageidupdateoptions&quot;&gt;&lt;code&gt;.image(imageId).update(options)&lt;/code&gt;&lt;/a&gt; — 更新元数据或访问控制。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/images/storage/binding/#imageimageiddelete&quot;&gt;&lt;code&gt;.image(imageId).delete()&lt;/code&gt;&lt;/a&gt; — 删除图像。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例如，您可以从请求主体中上传图像并返回其元数据：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; image&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;IMAGES&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.hosted.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;upload&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request.body, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	filename: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;upload.jpg&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	metadata: { source: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;worker&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; Response.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(image);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;或者检索并提供托管图像的原始字节：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; bytes&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;IMAGES&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.hosted.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;IMAGE_ID&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;bytes&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(bytes);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;欲了解更多信息，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/images/storage/binding/&quot;&gt;Images 绑定&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><product>Cloudflare Images</product><category>Cloudflare Images</category></item><item><title>Sandbox SDK - 已弃用 Sandbox SDK 功能</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-09-deprecating-sandbox-sdk-features/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-09-deprecating-sandbox-sdk-features/</guid><description>&lt;p&gt;今天我们宣布弃用 Sandbox SDK 的若干功能。自首次发布以来，SDK 已大幅成长和成熟。随着 Agent 工作流的发展，我们已发布了许多新功能和实验性内容，让开发者能够轻松地将安全的隔离代码执行集成到其工作流中。&lt;/p&gt;
&lt;p&gt;我们希望 SDK 在快速迭代代码库的同时，继续为 Agent 工作流提供稳定的基础。这些已弃用的功能要么已被更新的功能所取代，要么采用率较低。它们将保留在代码库中直至 2026 年 7 月 9 日，之后将不再出现在未来的 Sandbox SDK 版本中。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;http-和-websocket-传输&quot;&gt;HTTP 和 WebSocket 传输&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#http-和-websocket-传输&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;2026 年 4 月，我们发布了新的 RPC 传输并弃用了 WebSocket 传输。此设置控制沙箱容器与 Workers 生态系统的通信方式。RPC 传输消除了 HTTP 和 WebSocket 传输的两种限制。自 2026 年 6 月 9 日起，它是推荐的默认选项。HTTP 和 WebSocket 传输将不再出现在 2026 年 7 月 9 日后发布的 Sandbox SDK 版本中。&lt;/p&gt;
&lt;p&gt;如需在 2026 年 7 月 9 日之前迁移，请将 &lt;code&gt;SANDBOX_TRANSPORT&lt;/code&gt; 变量更新为 &lt;code&gt;rpc&lt;/code&gt;，或在调用 &lt;code&gt;getSandbox()&lt;/code&gt; 时设置 &lt;code&gt;transport&lt;/code&gt; 选项。更多信息，请参阅&lt;a href=&quot;https://cloudflaredoc.ubitools.com/sandbox/configuration/transport/&quot;&gt;传输配置文档&lt;/a&gt;。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;desktop&quot;&gt;Desktop&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#desktop&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Desktop 功能作为 Sandbox SDK 功能演示而推出——可在沙箱中控制完整的浏览器环境。随着 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/browser-run/&quot;&gt;Cloudflare Browser Run&lt;/a&gt; 的推出，该功能使用率极低。我们已在 &lt;code&gt;0.10.2&lt;/code&gt; 中将其移除。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;公开端口&quot;&gt;公开端口&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#公开端口&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;我们最近在 Sandbox SDK 中发布了对 Cloudflare Tunnel 的支持。它为将沙箱中运行的服务公开到公共互联网提供了强大的 API，解决了许多人在本地开发和部署到 &lt;code&gt;workers.dev&lt;/code&gt; 域名时遇到的问题。如需从 &lt;code&gt;exposePort()&lt;/code&gt; 迁移到隧道，请参阅&lt;a href=&quot;https://cloudflaredoc.ubitools.com/sandbox/api/tunnels/&quot;&gt;隧道 API 文档&lt;/a&gt;和&lt;a href=&quot;https://cloudflaredoc.ubitools.com/sandbox/guides/expose-services/&quot;&gt;公开服务指南&lt;/a&gt;。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;默认会话&quot;&gt;默认会话&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#默认会话&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;默认情况下，Sandbox SDK 中的 &lt;code&gt;exec()&lt;/code&gt; 方法在所有调用之间维护一个默认会话，因此某次调用中的 &lt;code&gt;cd&lt;/code&gt; 会在下一次调用中生效。这种便利性对手动编写 &lt;code&gt;exec&lt;/code&gt; 语句的开发者有帮助，但会让 Agent 感到困惑，并导致难以追踪的 Bug。自 &lt;code&gt;0.10.3&lt;/code&gt; 起，我们在 &lt;code&gt;getSandbox()&lt;/code&gt; 接口上引入了 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/sandbox/configuration/sandbox-options/&quot;&gt;&lt;code&gt;enableDefaultSession&lt;/code&gt;&lt;/a&gt; 标志来关闭此功能。默认会话这一概念——以及该标志——将在后续版本中移除。&lt;/p&gt;
&lt;p&gt;我们建议今天就将 &lt;code&gt;enableDefaultSession: false&lt;/code&gt; 设置为当前值，并在需要之前行为时使用 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/sandbox/api/sessions/&quot;&gt;&lt;code&gt;sandbox.createSession()&lt;/code&gt; API&lt;/a&gt;。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;其他变更&quot;&gt;其他变更&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#其他变更&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;我们还在整合所有缓冲数据的 API，以默认支持流式传输。这包括 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/sandbox/api/files/&quot;&gt;&lt;code&gt;readFile&lt;/code&gt;、&lt;code&gt;writeFile&lt;/code&gt;&lt;/a&gt; 和 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/sandbox/api/commands/&quot;&gt;&lt;code&gt;exec&lt;/code&gt;&lt;/a&gt;。流式等效方法将被移除。&lt;/p&gt;
&lt;p&gt;我们正在探索将非核心功能（如&lt;a href=&quot;https://cloudflaredoc.ubitools.com/sandbox/guides/code-execution/&quot;&gt;代码解释器&lt;/a&gt;、&lt;a href=&quot;https://cloudflaredoc.ubitools.com/sandbox/api/terminal/&quot;&gt;终端&lt;/a&gt;和 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/sandbox/guides/git-workflows/&quot;&gt;git API&lt;/a&gt;）移入辅助工具。这些功能将保留现有 API，因此迁移应该很简单。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;后续步骤&quot;&gt;后续步骤&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#后续步骤&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;如果您使用了上述任何功能，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/sandbox/guides/2026-deprecation/&quot;&gt;2026 年弃用迁移指南&lt;/a&gt;。我们还提供了一个 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/sandbox/guides/2026-deprecation/SKILL.md&quot;&gt;Agent skill&lt;/a&gt; 来协助迁移。&lt;/p&gt;
&lt;p&gt;如有任何问题，请在 &lt;a href=&quot;https://discord.gg/cloudflaredev&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare 开发者 Discord&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 中提问。&lt;/p&gt;</description><pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate><product>Sandbox SDK</product><category>Sandbox SDK</category></item><item><title>Email Service - 身份验证的 SMTP 提交功能现已在 beta 阶段可用</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-08-smtp-submission/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-08-smtp-submission/</guid><description>&lt;p&gt;您现在可以使用 &lt;code&gt;smtp.mx.cloudflare.net:465&lt;/code&gt; 上的身份验证 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/email-service/api/send-emails/smtp/&quot;&gt;SMTP 提交&lt;/a&gt;，通过 &lt;strong&gt;Cloudflare Email Service&lt;/strong&gt; 发送电子邮件。SMTP 与 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/email-service/api/send-emails/rest-api/&quot;&gt;REST API&lt;/a&gt; 和 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/email-service/api/send-emails/workers-api/&quot;&gt;Workers 绑定&lt;/a&gt; 一起构成了发送交易性电子邮件的第三种方式——这对于已经采用 SMTP 协议的现有应用程序以及语言原生 SMTP 库（如 Nodemailer、&lt;code&gt;smtplib&lt;/code&gt;、PHPMailer、JavaMail）非常有用。&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;设置&lt;/th&gt;
&lt;th&gt;值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;主机 (Host)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;smtp.mx.cloudflare.net&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;端口 (Port)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;465&lt;/code&gt; (隐式 TLS)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AUTH&lt;/td&gt;
&lt;td&gt;&lt;code&gt;PLAIN&lt;/code&gt; 或 &lt;code&gt;LOGIN&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;用户名 (Username)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;api_token&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;密码 (Password)&lt;/td&gt;
&lt;td&gt;具有 &lt;strong&gt;Email Sending: Edit&lt;/strong&gt; 权限的 Cloudflare API 令牌（账户所有或用户所有）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;提交将进入与 REST API 和 Workers 绑定相同的递送管道：相同的&lt;a href=&quot;https://cloudflaredoc.ubitools.com/email-service/platform/limits/&quot;&gt;限制&lt;/a&gt;、自动 DKIM 和 ARC 签名，以及共享的仪表板日志。&lt;/p&gt;
&lt;p&gt;使用单条命令发送您的第一封电子邮件：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --ssl-reqd&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --url&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;smtps://smtp.mx.cloudflare.com:465&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --user&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;api_token:&amp;lt;API_TOKEN&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --mail-from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;welcome@yourdomain.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --mail-rcpt&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;user@example.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --upload-file&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; mail.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;有关身份验证详细信息、响应代码和特定语言的示例，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/email-service/api/send-emails/smtp/&quot;&gt;SMTP 参考&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate><product>Email Service</product><category>Email Service</category></item><item><title>R2 SQL - R2 SQL 现在支持 UNION、INTERSECT、EXCEPT 和 SELECT DISTINCT</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-05-union-intersect-except-select-distinct/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-05-union-intersect-except-select-distinct/</guid><description>&lt;p&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2-sql/&quot;&gt;R2 SQL&lt;/a&gt; 现在支持集合操作（&lt;code&gt;UNION&lt;/code&gt;、&lt;code&gt;INTERSECT&lt;/code&gt;、&lt;code&gt;EXCEPT&lt;/code&gt;）和 &lt;code&gt;SELECT DISTINCT&lt;/code&gt;，从而扩展了您可直接对 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2/data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt; 中 &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Apache Iceberg&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 表运行的分析查询范围。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;集合操作&quot;&gt;集合操作&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#集合操作&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;组合多个 &lt;code&gt;SELECT&lt;/code&gt; 语句的结果：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;UNION&lt;/code&gt;&lt;/strong&gt; — 返回两个查询的所有行，并移除重复项。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;UNION ALL&lt;/code&gt;&lt;/strong&gt; — 返回两个查询的所有行，保留重复项。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;INTERSECT&lt;/code&gt;&lt;/strong&gt; — 仅返回在两个查询中都出现的行。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;EXCEPT&lt;/code&gt;&lt;/strong&gt; — 返回存在于第一个查询中但不存在于第二个查询中的行。&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;-- Find zones that had either firewall blocks OR high-risk requests&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; zone_id &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;firewall_events&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; action&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;block&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;UNION&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; zone_id &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;http_requests&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; risk_score &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;-- Find zones with both firewall blocks AND high traffic&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; zone_id &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;firewall_events&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; action&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;block&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;INTERSECT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; zone_id &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;http_requests&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;GROUP BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; zone_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;HAVING&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; COUNT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 10000&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;-- Find enterprise zones that have not been compacted&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; zone_id &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;zones&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; plan &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;enterprise&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;EXCEPT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; zone_id &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;compaction_history&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;select-distinct&quot;&gt;SELECT DISTINCT&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#select-distinct&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;从查询结果中消除重复行：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT DISTINCT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; region, department&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;sales_data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; total_amount &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 1000&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;ORDER BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; region, department&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;LIMIT&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 100&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;对于可以接受近似结果的大型数据集，&lt;code&gt;approx_distinct()&lt;/code&gt; 仍是计算唯一值数量的更快替代方法。&lt;/p&gt;
&lt;p&gt;有关完整语法参考，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2-sql/sql-reference/&quot;&gt;SQL 参考&lt;/a&gt;。有关性能指南，请参阅&lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2-sql/reference/limitations-best-practices/&quot;&gt;限制与最佳实践&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate><product>R2 SQL</product><category>R2 SQL</category></item><item><title>Realtime - RealtimeKit 会后转录现已正式发布</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-08-realtimekit-post-meeting-transcription-ga/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-08-realtimekit-post-meeting-transcription-ga/</guid><description>&lt;p&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/realtime/realtimekit/&quot;&gt;RealtimeKit&lt;/a&gt; 让您可以在 Cloudflare 的&lt;a href=&quot;https://cloudflaredoc.ubitools.com/realtime/sfu/calls-vs-sfus/&quot;&gt;全球 WebRTC 基础设施&lt;/a&gt;上构建人们通过实时音视频进行会议的产品，例如医疗健康科技、教育科技、监考以及其他实时平台。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/realtime/realtimekit/ai/transcription/#post-meeting-transcription&quot;&gt;会后转录&lt;/a&gt;现已正式发布，已完成的 RealtimeKit 会议可在结束后自动生成完整的转录文件。这些转录文件还可为&lt;a href=&quot;https://cloudflaredoc.ubitools.com/realtime/realtimekit/ai/summary/&quot;&gt;AI 生成摘要&lt;/a&gt;提供支持，用于会议记录、审查工作流以及转录文件可用后的跟进任务。&lt;/p&gt;
&lt;p&gt;会后转录是由 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers-ai/&quot;&gt;Workers AI&lt;/a&gt; 使用 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers-ai/models/whisper-large-v3-turbo/&quot;&gt;Whisper Large v3 Turbo&lt;/a&gt; 驱动的托管服务。RealtimeKit 处理转录过程，并可通过 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/realtime/realtimekit/webhooks/&quot;&gt;webhook&lt;/a&gt; 或 REST API 返回转录和摘要文件，因此您无需运行自己的转录基础设施。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;生成转录和摘要&quot;&gt;生成转录和摘要&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#生成转录和摘要&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;要在会议结束后生成转录，请在&lt;a href=&quot;https://cloudflaredoc.ubitools.com/api/resources/realtime_kit/subresources/meetings/methods/create/&quot;&gt;创建会议&lt;/a&gt;时设置 &lt;code&gt;transcribe_on_end: true&lt;/code&gt;。要在转录可用后也自动生成 AI 摘要，请设置 &lt;code&gt;summarize_on_end: true&lt;/code&gt;：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -X&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;https://api.cloudflare.com/client/v4/accounts/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$ACCOUNT_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/realtime/kit/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$APP_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/meetings&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer &lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$CLOUDFLARE_API_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -d&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;title&quot;: &quot;Weekly product review&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;transcribe_on_end&quot;: true,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;summarize_on_end&quot;: true,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;ai_config&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      &quot;transcription&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;language&quot;: &quot;en&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      &quot;summarization&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;word_limit&quot;: 500,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;text_format&quot;: &quot;markdown&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;summary_type&quot;: &quot;team_meeting&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;  }&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;获取结果&quot;&gt;获取结果&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#获取结果&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;当 RealtimeKit 完成会议处理后，会为转录文件创建下载 URL，如果设置了 &lt;code&gt;summarize_on_end&lt;/code&gt;，则还会为摘要创建下载 URL。您可以通过 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/realtime/realtimekit/webhooks/&quot;&gt;webhook&lt;/a&gt; 自动接收这些 URL，或通过 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/realtime/realtimekit/ai/summary/#rest-api&quot;&gt;REST API&lt;/a&gt; 稍后为特定会话获取。&lt;/p&gt;
&lt;p&gt;要在结果准备好后立即接收，请配置 &lt;code&gt;meeting.transcript&lt;/code&gt; 和 &lt;code&gt;meeting.summary&lt;/code&gt; webhook 事件：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -X&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;https://api.cloudflare.com/client/v4/accounts/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$ACCOUNT_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/realtime/kit/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$APP_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/webhooks&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer &lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$CLOUDFLARE_API_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -d&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;name&quot;: &quot;AI results webhook&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;url&quot;: &quot;https://example.com/webhook&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;events&quot;: [&quot;meeting.transcript&quot;, &quot;meeting.summary&quot;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;enabled&quot;: true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;  }&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;要稍后获取结果，请调用相应会话的&lt;a href=&quot;https://cloudflaredoc.ubitools.com/api/resources/realtime_kit/subresources/sessions/methods/get_session_transcripts/&quot;&gt;转录&lt;/a&gt;或&lt;a href=&quot;https://cloudflaredoc.ubitools.com/api/resources/realtime_kit/subresources/sessions/methods/get_session_summary/&quot;&gt;摘要&lt;/a&gt;端点：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -X&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; GET&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;https://api.cloudflare.com/client/v4/accounts/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$ACCOUNT_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/realtime/kit/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$APP_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/sessions/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$SESSION_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/transcript&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer &lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$CLOUDFLARE_API_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -X&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; GET&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;https://api.cloudflare.com/client/v4/accounts/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$ACCOUNT_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/realtime/kit/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$APP_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/sessions/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$SESSION_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/summary&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer &lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$CLOUDFLARE_API_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;仅当未设置 &lt;code&gt;summarize_on_end&lt;/code&gt; 且您希望在转录可用后手动生成摘要时，才使用&lt;a href=&quot;https://cloudflaredoc.ubitools.com/api/resources/realtime_kit/subresources/sessions/methods/generate_summary_of_transcripts/&quot;&gt;为会话转录生成摘要&lt;/a&gt; API：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -X&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;https://api.cloudflare.com/client/v4/accounts/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$ACCOUNT_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/realtime/kit/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$APP_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/sessions/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$SESSION_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/summary&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer &lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$CLOUDFLARE_API_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;会后转录支持 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/realtime/realtimekit/ai/transcription/#output-formats&quot;&gt;CSV、JSON、SRT 和 VTT 转录输出格式&lt;/a&gt;、&lt;a href=&quot;https://cloudflaredoc.ubitools.com/realtime/realtimekit/ai/transcription/#post-meeting-supported-languages&quot;&gt;自动语言检测和 Whisper 语言代码&lt;/a&gt;。RealtimeKit 还支持使用 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers-ai/models/nova-3/&quot;&gt;Deepgram Nova-3&lt;/a&gt; 进行&lt;a href=&quot;https://cloudflaredoc.ubitools.com/realtime/realtimekit/ai/transcription/#real-time-transcription&quot;&gt;实时转录&lt;/a&gt;，用于实时字幕、会议内无障碍功能和实时记录。&lt;/p&gt;
&lt;p&gt;在 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/realtime/realtimekit/ai/transcription/&quot;&gt;RealtimeKit 转录文档&lt;/a&gt;和&lt;a href=&quot;https://cloudflaredoc.ubitools.com/realtime/realtimekit/ai/summary/&quot;&gt;摘要文档&lt;/a&gt;中了解更多信息。&lt;/p&gt;</description><pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate><product>Realtime</product><category>Realtime</category></item><item><title>Workflows - Workflows 现已支持回滚</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-05-saga-rollbacks/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-05-saga-rollbacks/</guid><description>
&lt;p&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workflows/&quot;&gt;Workflows&lt;/a&gt; 现已支持 saga 风格的回滚，允许您向每个 &lt;code&gt;step.do()&lt;/code&gt; 添加补偿逻辑，以应对下游故障。如果实例失败，回滚处理程序将按照 &lt;code&gt;step-start&lt;/code&gt; 顺序的逆序执行。&lt;/p&gt;
&lt;p&gt;这对于涉及外部系统的多步骤操作非常有用，例如库存预留、付款授权、工单创建或基础设施配置。与其将所有清理逻辑编写在顶级 &lt;code&gt;catch&lt;/code&gt; 中，不如将每个补偿操作放在其所撤销的步骤旁边。&lt;/p&gt;
&lt;p&gt;回滚处理程序支持自己的重试和超时配置，Workflows 现在在实例状态响应中公开回滚结果。Workflows 分析还会发送回滚生命周期事件，使在调试生产工作流时更容易区分正向执行失败和回滚失败。&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;	&quot;provision resource&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; resource&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; provisionResource&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { resourceId: resource.id };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;		rollback&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;output&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			const&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;resourceId&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; output;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; deleteResource&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(resourceId);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		rollbackConfig: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			retries: { limit: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, delay: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;15 seconds&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, backoff: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;linear&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			timeout: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;2 minutes&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;	&quot;provision resource&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; resource&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; provisionResource&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { resourceId: resource.id };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;		rollback&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;output&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			const&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;resourceId&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; output &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;resourceId&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; deleteResource&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(resourceId);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		rollbackConfig: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			retries: { limit: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, delay: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;15 seconds&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, backoff: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;linear&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			timeout: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;2 minutes&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://cloudflaredoc.ubitools.com/Users/jt.gui/workspace/astro/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;请参阅&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workflows/build/workers-api/#rollback-options&quot;&gt;回滚选项&lt;/a&gt;了解更多信息。&lt;/p&gt;</description><pubDate>Fri, 05 Jun 2026 15:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category></item><item><title>AI Gateway - 使用支出限制控制 AI 成本</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-05-spend-limits/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-05-spend-limits/</guid><description>&lt;p&gt;AI Gateway 现在支持支出限制（spend limits）——基于成本的预算，可追踪累计美元支出，并在超出预算时拦截请求。与限制请求次数的速率限制不同，支出限制是基于 Token 使用量和模型定价来追踪实际成本。&lt;/p&gt;
&lt;p&gt;您可以按模型、提供商或自定义元数据维度来限定限制范围。例如，为每个用户分配每日 200 美元的预算，将网关总支出限制在每日 10,000 美元以内，或者限制每个用户对特定模型的每日支出上限为 50 美元。每条规则都使用可配置的时间窗口，可采用固定或滑动执行策略。&lt;/p&gt;
&lt;p&gt;支出限制适用于具有已知定价模型的 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/ai-gateway/features/unified-billing/&quot;&gt;统一计费（Unified Billing）&lt;/a&gt; 和 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/ai-gateway/configuration/bring-your-own-keys/&quot;&gt;BYOK（自带密钥）&lt;/a&gt; 请求。&lt;/p&gt;
&lt;p&gt;欲了解更多细节，请参阅&lt;a href=&quot;https://cloudflaredoc.ubitools.com/ai-gateway/features/spend-limits/&quot;&gt;支出限制文档&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate><product>AI Gateway</product><category>AI Gateway</category></item><item><title>Gateway, Cloudflare Mesh, Workers VPC - 使用 Gateway 策略过滤 Workers 的公共互联网流量</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-05-gateway-egress/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-05-gateway-egress/</guid><description>
&lt;p&gt;使用 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers-vpc/configuration/vpc-networks/&quot;&gt;VPC 网络（VPC Network）&lt;/a&gt; 绑定（binding）与 &lt;code&gt;network_id: &quot;cf1:network&quot;&lt;/code&gt; 的 Workers 现在可以通过 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/cloudflare-one/traffic-policies/&quot;&gt;Cloudflare Gateway&lt;/a&gt; 出口到公共互联网目标。这意味着您现有的 Zero Trust 流量策略 —— DNS、HTTP、网络和出口（egress）—— 将延伸到源自您的 Workers 的流量，就像今天对 WARP 用户所做的那样。&lt;/p&gt;
&lt;figure class=&quot;vpc-egress-diagram not-content&quot; aria-label=&quot;Workers VPC public Internet egress through Cloudflare Mesh and Cloudflare Gateway&quot; data-astro-cid-lmo6yva7&gt;&lt;ol class=&quot;flow&quot; data-astro-cid-lmo6yva7&gt;&lt;li class=&quot;flow-step&quot; data-astro-cid-lmo6yva7&gt;&lt;div class=&quot;node-card worker-card&quot; data-astro-cid-lmo6yva7&gt;&lt;div class=&quot;node-header&quot; data-astro-cid-lmo6yva7&gt;&lt;span class=&quot;node-icon worker-icon&quot; aria-hidden=&quot;true&quot; data-astro-cid-lmo6yva7&gt;&lt;svg width=&quot;0.98em&quot; height=&quot;1em&quot; data-astro-cid-lmo6yva7=&quot;true&quot; data-icon=&quot;workers&quot;&gt;&lt;symbol id=&quot;ai:local:workers&quot; viewBox=&quot;0 0 48 49&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;m18.63 37.418-9.645-12.9 9.592-12.533-1.852-2.527L5.917 23.595l-.015 1.808 10.86 14.542z&quot;/&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M21.997 6.503h-3.712l13.387 18.3-13.072 17.7h3.735L35.4 24.81z&quot;/&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M29.175 6.503h-3.758l13.598 18.082-13.598 17.918h3.765l12.908-17.01v-1.808z&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:local:workers&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;a class=&quot;node-title&quot; href=&quot;https://cloudflaredoc.ubitools.com/workers/&quot; data-astro-cid-lmo6yva7&gt;Worker&lt;/a&gt;&lt;/div&gt;&lt;p class=&quot;node-caption&quot; data-astro-cid-lmo6yva7&gt;Calls &lt;code data-astro-cid-lmo6yva7&gt;env.EGRESS.fetch()&lt;/code&gt;&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class=&quot;flow-connector&quot; data-astro-cid-lmo6yva7&gt;&lt;a class=&quot;connector-label&quot; href=&quot;https://cloudflaredoc.ubitools.com/workers-vpc/&quot; data-astro-cid-lmo6yva7&gt;VPC binding&lt;/a&gt;&lt;span class=&quot;connector-arrow&quot; aria-hidden=&quot;true&quot; data-astro-cid-lmo6yva7&gt;↓&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;flow-step&quot; data-astro-cid-lmo6yva7&gt;&lt;div class=&quot;node-card mesh-card&quot; data-astro-cid-lmo6yva7&gt;&lt;div class=&quot;node-header&quot; data-astro-cid-lmo6yva7&gt;&lt;span class=&quot;node-icon mesh-icon&quot; aria-hidden=&quot;true&quot; data-astro-cid-lmo6yva7&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; data-astro-cid-lmo6yva7=&quot;true&quot; data-icon=&quot;cloudflare-mesh&quot;&gt;&lt;symbol id=&quot;ai:local:cloudflare-mesh&quot; viewBox=&quot;0 0 32 32&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M10 6a2 2 0 1 1-4 0 2 2 0 0 1 4 0m6-2a2 2 0 1 0 0 4 2 2 0 0 0 0-4m8 4a2 2 0 1 0 0-4 2 2 0 0 0 0 4M8 11a2 2 0 1 0 0 4 2 2 0 0 0 0-4m8 0a2 2 0 1 0 0 4 2 2 0 0 0 0-4m8 0a2 2 0 1 0 0 4 2 2 0 0 0 0-4M8 18a2 2 0 1 0 0 4 2 2 0 0 0 0-4m8 0a2 2 0 1 0 0 4 2 2 0 0 0 0-4m0 7a2 2 0 1 0 0 4 2 2 0 0 0 0-4m8-7a2 2 0 1 0 0 4 2 2 0 0 0 0-4&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:local:cloudflare-mesh&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;a class=&quot;node-title&quot; href=&quot;https://cloudflaredoc.ubitools.com/cloudflare-one/networks/connectors/cloudflare-mesh/&quot; data-astro-cid-lmo6yva7&gt;Cloudflare Mesh&lt;/a&gt;&lt;/div&gt;&lt;p class=&quot;node-caption&quot; data-astro-cid-lmo6yva7&gt;Bind via &lt;a class=&quot;inline-pill mesh-pill&quot; href=&quot;https://cloudflaredoc.ubitools.com/workers-vpc/configuration/vpc-networks/&quot; data-astro-cid-lmo6yva7&gt;&lt;code data-astro-cid-lmo6yva7&gt;cf1:network&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class=&quot;flow-connector&quot; aria-hidden=&quot;true&quot; data-astro-cid-lmo6yva7&gt;&lt;span class=&quot;connector-arrow&quot; data-astro-cid-lmo6yva7&gt;↓&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;flow-step&quot; data-astro-cid-lmo6yva7&gt;&lt;div class=&quot;node-card gateway-card&quot; data-astro-cid-lmo6yva7&gt;&lt;div class=&quot;node-header&quot; data-astro-cid-lmo6yva7&gt;&lt;span class=&quot;node-icon gateway-icon&quot; aria-hidden=&quot;true&quot; data-astro-cid-lmo6yva7&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; data-astro-cid-lmo6yva7=&quot;true&quot; data-icon=&quot;gateway&quot;&gt;&lt;symbol id=&quot;ai:local:gateway&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M15.45 7.125h-2.577V3.508l-.41-.408H3.925l-.41.41v3.08h.922V4.023h7.513v7.555H4.438v-1.553h-.923v2.065l.41.41h8.538l.41-.41V8.048H16z&quot;/&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M8.453 7.238H0l.517.87H8.97zM9.21 8.51H.755l.517.868h8.453z&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:local:gateway&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;a class=&quot;node-title&quot; href=&quot;https://cloudflaredoc.ubitools.com/cloudflare-one/traffic-policies/&quot; data-astro-cid-lmo6yva7&gt;Cloudflare Gateway&lt;/a&gt;&lt;/div&gt;&lt;p class=&quot;node-caption&quot; data-astro-cid-lmo6yva7&gt;Policies applied:&lt;/p&gt;&lt;div class=&quot;pill-row&quot; data-astro-cid-lmo6yva7&gt;&lt;a class=&quot;policy-pill&quot; href=&quot;https://cloudflaredoc.ubitools.com/cloudflare-one/traffic-policies/dns-policies/&quot; data-astro-cid-lmo6yva7&gt;DNS&lt;/a&gt;&lt;a class=&quot;policy-pill&quot; href=&quot;https://cloudflaredoc.ubitools.com/cloudflare-one/traffic-policies/http-policies/&quot; data-astro-cid-lmo6yva7&gt;HTTP&lt;/a&gt;&lt;a class=&quot;policy-pill&quot; href=&quot;https://cloudflaredoc.ubitools.com/cloudflare-one/traffic-policies/network-policies/&quot; data-astro-cid-lmo6yva7&gt;Network&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class=&quot;flow-connector&quot; aria-hidden=&quot;true&quot; data-astro-cid-lmo6yva7&gt;&lt;span class=&quot;connector-arrow&quot; data-astro-cid-lmo6yva7&gt;↓&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;flow-step&quot; data-astro-cid-lmo6yva7&gt;&lt;div class=&quot;node-card internet-card&quot; data-astro-cid-lmo6yva7&gt;&lt;div class=&quot;node-header&quot; data-astro-cid-lmo6yva7&gt;&lt;span class=&quot;node-icon internet-icon&quot; aria-hidden=&quot;true&quot; data-astro-cid-lmo6yva7&gt;↗&lt;/span&gt;&lt;span class=&quot;node-title&quot; data-astro-cid-lmo6yva7&gt;Public Internet&lt;/span&gt;&lt;/div&gt;&lt;p class=&quot;node-caption&quot; data-astro-cid-lmo6yva7&gt;Any public hostname or IP&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;a class=&quot;logs-card&quot; href=&quot;https://cloudflaredoc.ubitools.com/cloudflare-one/insights/logs/dashboard-logs/gateway-logs/&quot; aria-label=&quot;Gateway logs&quot; data-astro-cid-lmo6yva7&gt;&lt;span class=&quot;logs-title&quot; data-astro-cid-lmo6yva7&gt;Gateway logs&lt;/span&gt;&lt;span class=&quot;logs-pills&quot; data-astro-cid-lmo6yva7&gt;&lt;span class=&quot;logs-pill&quot; data-astro-cid-lmo6yva7&gt;DNS&lt;/span&gt;&lt;span class=&quot;logs-pill&quot; data-astro-cid-lmo6yva7&gt;HTTP&lt;/span&gt;&lt;span class=&quot;logs-pill&quot; data-astro-cid-lmo6yva7&gt;Network&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;您默认获得的内容：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;可见性。&lt;/strong&gt; Worker 出口流量与您的其他流量一起显示在 Gateway &lt;a href=&quot;https://cloudflaredoc.ubitools.com/cloudflare-one/traffic-policies/dns-policies/&quot;&gt;DNS&lt;/a&gt;、&lt;a href=&quot;https://cloudflaredoc.ubitools.com/cloudflare-one/traffic-policies/http-policies/&quot;&gt;HTTP&lt;/a&gt; 和 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/cloudflare-one/traffic-policies/network-policies/&quot;&gt;网络&lt;/a&gt; 日志中，以便您可以审计您的 Workers 在何时调用了什么。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;强制执行。&lt;/strong&gt; 任何其选择器与 Worker 请求相匹配的现有 Gateway 策略都将适用 —— 包括允许/阻止列表、DNS 类别过滤和 HTTP 目标规则。如果您已经为您的员工屏蔽了某个类别，您的 Workers 将继承该屏蔽。&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;vpc_networks&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;binding&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;EGRESS&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;network_id&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;cf1:network&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;remote&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;vpc_networks&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;binding = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;EGRESS&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;network_id = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;cf1:network&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;remote = &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://cloudflaredoc.ubitools.com/Users/jt.gui/workspace/astro/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Egress to a public destination — subject to your Gateway policies and logged&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; response&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;EGRESS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;https://api.example.com/data&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Egress to a public destination — subject to your Gateway policies and logged&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; response&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;EGRESS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;https://api.example.com/data&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;有关配置选项，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers-vpc/configuration/vpc-networks/&quot;&gt;VPC 网络（VPC Networks）&lt;/a&gt;。有关策略编写，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/cloudflare-one/traffic-policies/&quot;&gt;Cloudflare Gateway 流量策略&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate><product>Gateway</product><category>Gateway</category><category>Cloudflare Mesh</category><category>Workers VPC</category></item><item><title>Cloudflare Fundamentals, Workers, D1, R2, KV, Queues, Vectorize, Durable Objects, Containers - 计费使用量和预算警报现已集成到产品侧边栏中</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-04-billable-usage-product-sidebar/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-04-billable-usage-product-sidebar/</guid><description>&lt;p&gt;按需付费（Pay-as-you-go）客户现在可以直接从 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/&quot;&gt;Workers &amp;amp; Pages&lt;/a&gt;、&lt;a href=&quot;https://cloudflaredoc.ubitools.com/d1/&quot;&gt;D1&lt;/a&gt;、&lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2/&quot;&gt;R2&lt;/a&gt;、&lt;a href=&quot;https://cloudflaredoc.ubitools.com/kv/&quot;&gt;Workers KV&lt;/a&gt;、&lt;a href=&quot;https://cloudflaredoc.ubitools.com/queues/&quot;&gt;Queues&lt;/a&gt;、&lt;a href=&quot;https://cloudflaredoc.ubitools.com/vectorize/&quot;&gt;Vectorize&lt;/a&gt;、&lt;a href=&quot;https://cloudflaredoc.ubitools.com/durable-objects/&quot;&gt;Durable Objects&lt;/a&gt; 和 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/containers/&quot;&gt;Containers&lt;/a&gt; 的产品概览页面查看计费使用量并创建&lt;a href=&quot;https://cloudflaredoc.ubitools.com/changelog/post/2026-04-13-billable-usage-dashboard-and-budget-alerts/&quot;&gt;预算警报&lt;/a&gt;。新的侧边栏小组件显示了当前时期的支出和账单周期日期范围，同时还提供了一个用于创建预算警报的按钮。&lt;/p&gt;
&lt;p&gt;该小组件提取与&lt;a href=&quot;https://cloudflaredoc.ubitools.com/changelog/post/2026-04-13-billable-usage-dashboard-and-budget-alerts/&quot;&gt;计费使用量仪表板&lt;/a&gt;相同的数据，并与您的账单周期（或免费计划中的当前日期）保持一致，因此数据与您的发票相符。目前尚不支持 Enterprise 合约账户。&lt;/p&gt;
&lt;img src=&quot;https://cloudflaredoc.ubitools.com/_astro/2026-06-04-billable-usage-product-sidebar.BUuIokn__ZAx1o6.webp&quot; alt=&quot;Durable Objects 产品侧边栏中的计费使用量小组件，显示当前时期的支出和按服务细分的明细&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2872&quot; height=&quot;1614&quot;&gt;
&lt;p&gt;选择 **Create budget alert（创建预算警报）**会以内联方式打开预算警报流程，以便您在查看使用量的同一位置设置美元阈值。预算警报适用于您在所有产品上的账户级别总支出，而不仅仅是您创建该警报的产品页面。&lt;/p&gt;
&lt;p&gt;有关更多信息，请参阅&lt;a href=&quot;https://cloudflaredoc.ubitools.com/billing/&quot;&gt;基于使用量的计费文档&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Thu, 04 Jun 2026 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category><category>Workers</category><category>D1</category><category>R2</category><category>KV</category><category>Queues</category><category>Vectorize</category><category>Durable Objects</category><category>Containers</category></item><item><title>Pipelines, Workers - Pipeline 绑定（binding）配置字段重命名为 stream</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-05-27-pipeline-binding-stream-field/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-05-27-pipeline-binding-stream-field/</guid><description>
&lt;p&gt;您的 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/wrangler/configuration/&quot;&gt;Wrangler 配置文件&lt;/a&gt; 中 &lt;code&gt;pipelines&lt;/code&gt; 绑定（binding）配置里的 &lt;code&gt;pipeline&lt;/code&gt; 字段已重命名为 &lt;code&gt;stream&lt;/code&gt;。旧字段已弃用但仍被接受。&lt;/p&gt;
&lt;p&gt;请更新您的配置以使用 &lt;code&gt;stream&lt;/code&gt;，从而避免弃用警告。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;之前（已弃用）：&lt;/strong&gt;&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;$schema&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;./node_modules/wrangler/config-schema.json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;pipelines&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;binding&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;MY_PIPELINE&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;pipeline&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&amp;#x3C;STREAM_ID&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;pipelines&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;binding = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;MY_PIPELINE&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;pipeline = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&amp;#x3C;STREAM_ID&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://cloudflaredoc.ubitools.com/Users/jt.gui/workspace/astro/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;&lt;strong&gt;之后：&lt;/strong&gt;&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;$schema&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;./node_modules/wrangler/config-schema.json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;pipelines&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;binding&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;MY_PIPELINE&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;stream&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&amp;#x3C;STREAM_ID&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;pipelines&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;binding = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;MY_PIPELINE&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;stream = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&amp;#x3C;STREAM_ID&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;无需进行其他更改。绑定（binding）名称、TypeScript 类型和运行时 API (&lt;code&gt;env.MY_PIPELINE.send(...)&lt;/code&gt;) 保持不变。&lt;/p&gt;
&lt;p&gt;有关配置 pipeline 绑定（binding）的更多信息，请参阅&lt;a href=&quot;https://cloudflaredoc.ubitools.com/pipelines/streams/writing-to-streams/#configure-pipeline-binding&quot;&gt;写入流&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Thu, 04 Jun 2026 00:00:00 GMT</pubDate><product>Pipelines</product><category>Pipelines</category><category>Workers</category></item><item><title>Workers - 新增 Workers 批量机密（secrets）API 端点</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-03-bulk-secrets-api/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-03-bulk-secrets-api/</guid><description>&lt;p&gt;您现在可以使用 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/api/resources/workers/subresources/scripts/subresources/secrets/methods/bulk_update/&quot;&gt;批量机密端点&lt;/a&gt; 在单个请求中为您的 Worker 创建、更新或删除多个机密（secrets）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;包含具有值的机密以进行创建或更新。&lt;/li&gt;
&lt;li&gt;将机密设置为 &lt;code&gt;null&lt;/code&gt; 以进行删除。&lt;/li&gt;
&lt;li&gt;请求中未包含的机密将保持不变。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以下示例创建 &lt;code&gt;API_KEY&lt;/code&gt;，更新已存在的 &lt;code&gt;DB_PASSWORD&lt;/code&gt;，并删除 &lt;code&gt;OLD_SECRET&lt;/code&gt;：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;json&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot; data-nb-lang=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;secrets&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    &quot;API_KEY&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: { &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;secret_text&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;API_KEY&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;text&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-api-key&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    &quot;DB_PASSWORD&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: { &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;secret_text&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;DB_PASSWORD&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;text&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-db-password&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    &quot;OLD_SECRET&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;您可以使用 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/wrangler/commands/workers/#secret-bulk&quot;&gt;&lt;code&gt;wrangler secret bulk&lt;/code&gt;&lt;/a&gt; 在命令行中执行相同的操作：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; secret&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; bulk&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; secrets.json&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;要删除某个键，请在 JSON 文件中将其值设置为 &lt;code&gt;null&lt;/code&gt;。&lt;code&gt;.env&lt;/code&gt; 文件不支持删除操作。&lt;/p&gt;
&lt;p&gt;每个请求最多支持 &lt;strong&gt;100 次总操作（包括创建、更新和删除的组合）&lt;/strong&gt;。&lt;/p&gt;</description><pubDate>Wed, 03 Jun 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - 在您操作系统的钥匙串中存储 Wrangler 的 OAuth 凭证</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-03-wrangler-keyring-credential-storage/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-03-wrangler-keyring-credential-storage/</guid><description>&lt;p&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/wrangler/&quot;&gt;Wrangler&lt;/a&gt; 现在可以将 &lt;code&gt;wrangler login&lt;/code&gt; 返回的 OAuth 凭证存储在 &lt;a href=&quot;https://en.wikipedia.org/wiki/Galois/Counter_Mode&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AES-256-GCM&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 加密的文件中，加密密钥保存在您的操作系统钥匙串中。默认行为没有改变 —— 除非您选择启用，否则凭证仍保存在明文 TOML 文件中。&lt;/p&gt;
&lt;p&gt;要选择启用，请运行：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; login&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --use-keyring&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;该选择会在 Wrangler 调用之间持久保存。使用 &lt;code&gt;npx wrangler login --no-use-keyring&lt;/code&gt; 可以取消选择，或者使用 &lt;code&gt;CLOUDFLARE_AUTH_USE_KEYRING&lt;/code&gt; 环境变量覆盖单个命令的首选项。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;wrangler whoami&lt;/code&gt; 现在会报告凭证的存储位置：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;🔐&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Credentials&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; are&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; stored&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; in:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Encrypted&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; file&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (~/.config/.wrangler/config/default.enc) with key in macOS Keychain (service&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;wrangler,&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; account&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;各平台后端：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;macOS&lt;/strong&gt; 通过 &lt;code&gt;/usr/bin/security&lt;/code&gt; 使用内置的 Keychain。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Linux&lt;/strong&gt; 通过 &lt;code&gt;libsecret-tools&lt;/code&gt; 包中的 &lt;code&gt;secret-tool&lt;/code&gt; CLI 使用 &lt;a href=&quot;https://wiki.gnome.org/Projects/Libsecret&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;libsecret&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Windows&lt;/strong&gt; 通过 &lt;a href=&quot;https://www.npmjs.com/package/@napi-rs/keyring&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;@napi-rs/keyring&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 使用 凭据管理器 (Credential Manager)，该包在您首次选择启用时按需安装。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;有关完整详细信息，请参阅&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/wrangler/commands/general/#storing-oauth-credentials-in-the-os-keychain&quot;&gt;在操作系统钥匙串中存储 OAuth 凭证&lt;/a&gt;，包括启用/禁用时的迁移行为以及 &lt;code&gt;CLOUDFLARE_AUTH_USE_KEYRING&lt;/code&gt; 环境变量。&lt;/p&gt;</description><pubDate>Wed, 03 Jun 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workflows, Workers - 直接从 Workflow 绑定调度 Workflow 实例</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-02-cron-workflows/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-02-cron-workflows/</guid><description>&lt;p&gt;您现在可以在 &lt;code&gt;wrangler.jsonc&lt;/code&gt; 中直接将 cron 计划附加到 Workflow 绑定（binding）。每次计划运行都会自动创建一个新的 Workflow 实例，因此您无需定义单独的带有 &lt;code&gt;scheduled&lt;/code&gt; 处理程序的 Worker 来按间隔触发您的 Workflow。&lt;/p&gt;
&lt;p&gt;例如，您可以在同一个 Workflow 上配置每小时、每 15 分钟或工作日计划：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;workflows&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-scheduled-workflow&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;binding&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;MY_WORKFLOW&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;class_name&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;MyScheduledWorkflow&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;schedules&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;0 * * * *&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;*/15 * * * *&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;0 9 * * MON-FRI&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Cron 工作负载获得 Workflows 的所有相同优势，包括内置重试、多步骤持久执行以及 Workflows 的可配置超时。&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	WorkflowEntrypoint,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	WorkflowEvent,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	WorkflowStep,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;} &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;cloudflare:workers&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// 根据 wrangler.jsonc 中为 MY_WORKFLOW 绑定定义的每个 cron 计划自动运行。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyScheduledWorkflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; WorkflowEntrypoint&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; run&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; WorkflowEvent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;step&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; WorkflowStep&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; data&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;fetch source data&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetchSourceData&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// 如果此步骤失败，则仅使用以下自定义逻辑重试此步骤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;			&quot;process and store results&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				retries: { limit: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, delay: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;30 seconds&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, backoff: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;exponential&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				timeout: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;10 minutes&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;				await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; processAndStore&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(data);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;这使得构建定期计划的作业（例如数据库备份、发票生成、报告聚合和清理任务）变得更加容易，而无需配置单独的 Cron Trigger 入口点。&lt;/p&gt;
&lt;p&gt;有关更多信息，请参阅&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workflows/build/trigger-workflows/&quot;&gt;触发 Workflows&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Tue, 02 Jun 2026 15:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category><category>Workers</category></item><item><title>Agents, Workers - Agents SDK v0.14.0：Agent 技能、信使（messengers）、计划任务、Workflows 以及强化的聊天恢复</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-02-agents-sdk-v0.14.0/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-02-agents-sdk-v0.14.0/</guid><description>
&lt;p&gt;&lt;a href=&quot;https://github.com/cloudflare/agents&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Agents SDK&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 的最新版本添加了四种使用 &lt;code&gt;@cloudflare/think&lt;/code&gt; 进行构建的新方式：按需 Agent 技能（Agent Skills）、聊天信使（chat messengers，从 Telegram 开始）、声明式计划任务以及 Workflows 内部的持久推理步骤。此版本还显著强化了持久聊天恢复，因此轮次能够可靠地度过生产环境中的部署、驱逐和停滞的模型流。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;agent-技能agent-skills实验性&quot;&gt;Agent 技能（Agent Skills）（实验性）&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#agent-技能agent-skills实验性&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;给 agent 一个按需指令、资源和脚本的目录。技能源将目录添加到系统 Prompt 中，而模型仅在任务匹配时才激活技能 —— 因此庞大的功能库不会膨胀每个 Prompt。&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { Think, skills } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/think&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; bundledSkills &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;agents:skills&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; SkillsAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Think&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	getSkills&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			bundledSkills,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			skills.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;r2&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;SKILLS_BUCKET&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, { prefix: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;skills/&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { Think, skills } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/think&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; bundledSkills &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;agents:skills&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; SkillsAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Think&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	getSkills&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			bundledSkills,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			skills.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;r2&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;SKILLS_BUCKET&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, { prefix: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;skills/&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://cloudflaredoc.ubitools.com/Users/jt.gui/workspace/astro/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;agents:skills&lt;/code&gt; 导入通过 Agents Vite 插件打包本地的 &lt;code&gt;./skills&lt;/code&gt; 目录（每个技能一个目录，每个目录包含一个 &lt;code&gt;SKILL.md&lt;/code&gt;）。技能也可以从 R2 或清单（manifest）中加载。当技能可用时，Think 会暴露 &lt;code&gt;activate_skill&lt;/code&gt;、&lt;code&gt;read_skill_resource&lt;/code&gt; 和一个可选的 &lt;code&gt;run_skill_script&lt;/code&gt; 工具。技能加载是弹性的：重复或失败的源将被跳过并发出警告，而不会损坏 agent。&lt;/p&gt;
&lt;p&gt;Agent 技能处于&lt;strong&gt;实验性&lt;/strong&gt;阶段，尤其是脚本执行还处于早期阶段。API 可能会在未来的版本中发生变化。我们非常期待您的反馈 —— 请在 &lt;a href=&quot;https://github.com/cloudflare/agents/discussions&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Agents 仓库&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;中告诉我们您正在构建什么以及缺少了什么。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;信使messengers&quot;&gt;信使（Messengers）&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#信使messengers&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;将 Think agent 直接连接到聊天平台。Think 拥有 Webhook 路由、会话路由、持久回复纤程（durable reply fiber）以及流式传送回提供商。Telegram 作为第一个提供商发布。&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { Think } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/think&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	defineMessengers,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	ThinkMessengerStateAgent,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;} &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/think/messengers&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; telegramMessenger &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/think/messengers/telegram&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { ThinkMessengerStateAgent };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; SupportAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Think&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	getMessengers&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; defineMessengers&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			telegram: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;telegramMessenger&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				token: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;TELEGRAM_BOT_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				userName: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;support_bot&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				secretToken: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;TELEGRAM_WEBHOOK_SECRET_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			}),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { Think } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/think&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	defineMessengers,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	ThinkMessengerStateAgent,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;} &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/think/messengers&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; telegramMessenger &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/think/messengers/telegram&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { ThinkMessengerStateAgent };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; SupportAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Think&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	getMessengers&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; defineMessengers&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			telegram: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;telegramMessenger&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				token: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;TELEGRAM_BOT_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				userName: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;support_bot&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				secretToken: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;TELEGRAM_WEBHOOK_SECRET_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			}),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;默认情况下，每个 Chat SDK 线程都映射到其自己的 Think 子 agent，因此群聊和直接消息不会共享内存。支持多个机器人、自定义会话路由和自定义提供商。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;计划任务&quot;&gt;计划任务&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#计划任务&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;使用类型化的领域特定语言 (DSL) 声明循环的、具有时区感知的 Prompt 和处理器。Think 在启动时协调声明，并在每次运行后重新设定下一次发生，由持久幂等提交提供支持。&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { Think, defineScheduledTasks } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/think&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; DigestAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Think&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	getScheduledTasks&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; defineScheduledTasks&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			weeklyCommitReport: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				schedule: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;every week on monday at 09:00&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				prompt:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;					&quot;Compile my GitHub commits for the last week and summarize them.&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			workout: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				schedule: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;every day at 08:00 in Europe/London&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				prompt: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Start my workout.&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { Think, defineScheduledTasks } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/think&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; DigestAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Think&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	getScheduledTasks&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; defineScheduledTasks&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			weeklyCommitReport: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				schedule: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;every week on monday at 09:00&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				prompt:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;					&quot;Compile my GitHub commits for the last week and summarize them.&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			workout: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				schedule: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;every day at 08:00 in Europe/London&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				prompt: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Start my workout.&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;think-workflows&quot;&gt;Think Workflows&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#think-workflows&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;使用 &lt;code&gt;ThinkWorkflow&lt;/code&gt; 和 &lt;code&gt;step.prompt()&lt;/code&gt; 在 Cloudflare Workflow 内部运行模型驱动的推理步骤，具有持久的类型化结构化输出、长时间等待和审批门槛。&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { z } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;zod&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { ThinkWorkflow } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/think/workflows&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; draftSchema&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	title: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	summary: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	labels: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;()),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; TriageWorkflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ThinkWorkflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; run&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;step&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; draft&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;prompt&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;triage-issue&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			prompt: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`Triage issue #${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;payload&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;issueNumber&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			output: draftSchema,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			timeout: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;3 days&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;apply-labels&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.agent.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;applyLabels&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(draft.labels);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { z } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;zod&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { ThinkWorkflow } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/think/workflows&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; type&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { ThinkWorkflowStep } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/think/workflows&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; type&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { AgentWorkflowEvent } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;agents/workflows&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; draftSchema&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	title: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	summary: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	labels: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;()),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; TriageWorkflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ThinkWorkflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;TriageAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Params&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; run&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; AgentWorkflowEvent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Params&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;step&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ThinkWorkflowStep&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; draft&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;prompt&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;triage-issue&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			prompt: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`Triage issue #${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;payload&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;issueNumber&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			output: draftSchema,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			timeout: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;3 days&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;apply-labels&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.agent.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;applyLabels&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(draft.labels);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;针对持久聊天恢复的生产硬化&quot;&gt;针对持久聊天恢复的生产硬化&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#针对持久聊天恢复的生产硬化&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;持久聊天轮次一直被设计为在轮次途中部署或 Durable Object 驱逐后存活。此版本是针对该机制进行生产硬化的重大更新。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;在部署期间具有更好的恢复能力。&lt;/strong&gt; 轮次现在可以度过持续部署和驱逐，而不会丢失已完成的工作，也不会重新运行已经运行过的工具。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;实时的 “recovering…” 信号。&lt;/strong&gt; &lt;code&gt;useAgentChat&lt;/code&gt; 暴露了一个新的 &lt;code&gt;isRecovering&lt;/code&gt; 标志，因此恢复中的轮次会显示进度，而不是看起来像冻结了一样。大多数 UI 将 &lt;code&gt;isStreaming || isRecovering&lt;/code&gt; 渲染为“忙碌（busy）”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;停滞的流恢复。&lt;/strong&gt; 设置 &lt;code&gt;chatStreamStallTimeoutMs&lt;/code&gt; 可以将挂起的提供商流路由到相同的恢复路径中，而不是留下一个无限旋转的加载指示器（spinner）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;子 agent 重新挂载。&lt;/strong&gt; 在父节点恢复时，正在运行的 &lt;code&gt;agentTool()&lt;/code&gt; 子节点会重新挂载到其结果上，而不是被放弃并重新运行，因此长期运行的子节点在部署下不再丢失工作。&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;mcp-传输改进&quot;&gt;MCP 传输改进&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#mcp-传输改进&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;可恢复的流&lt;/strong&gt; — 基于服务器发送事件（SSE）的正在运行的工具调用可在连接中断时存活。客户端使用 &lt;code&gt;Last-Event-ID&lt;/code&gt; 重新连接并回放它们遗漏的任何内容。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可读的服务器 ID&lt;/strong&gt; — &lt;code&gt;addMcpServer&lt;/code&gt; 接受一个可选的 &lt;code&gt;id&lt;/code&gt;，因此工具会呈现为可读的键（例如 &lt;code&gt;tool_github_create_pull_request&lt;/code&gt;），而不是不透明的连接 ID。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;更好地处理并发请求&lt;/strong&gt; — 重叠的 JSON-RPC 请求现在可以跨 HTTP 和 RPC 传输正确关联到其响应。&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;其他改进&quot;&gt;其他改进&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#其他改进&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;压缩&lt;/strong&gt; — &lt;code&gt;Session&lt;/code&gt; 的 &lt;code&gt;tokenCounter&lt;/code&gt; 现在还驱动压缩边界决策（“压缩什么”），而不仅仅是触发/不触发。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;@cloudflare/worker-bundler&lt;/code&gt;&lt;/strong&gt; — 为 &lt;code&gt;createWorker&lt;/code&gt; 添加了 &lt;code&gt;virtualModules&lt;/code&gt; 选项，以便在打包（bundling）期间提供内存中模块源。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;客户端工具继续运行&lt;/strong&gt; — 并行工具结果现在合并为一个单一的继续，立即恢复请求会附加到挂起的继续上，并且服务器端 &lt;code&gt;needsApproval&lt;/code&gt; 继续会在批准后可靠地恢复。&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;升级&quot;&gt;升级&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#升级&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;要更新到最新版本：&lt;/p&gt;
&lt;script&gt;
	if (!customElements.get(&quot;nb-pm-restore&quot;)) {
		customElements.define(
			&quot;nb-pm-restore&quot;,
			class extends HTMLElement {
				connectedCallback() {
					const card = this.closest(&quot;[data-nb-pm]&quot;);
					if (!card) return;
					let saved;
					try {
						saved = sessionStorage.getItem(&quot;ui-pm-tab&quot;);
					} catch {
						return;
					}
					if (!saved) return;
					const tabs = card.querySelectorAll(&quot;[data-nb-pm-tab]&quot;);
					let idx = -1;
					tabs.forEach(function (t, i) {
						if (t.textContent.trim() === saved) idx = i;
					});
					if (idx &lt; 1) return;
					tabs.forEach(function (t, i) {
						t.setAttribute(&quot;aria-selected&quot;, String(i === idx));
					});
					card.querySelectorAll(&quot;[data-nb-pm-panel]&quot;).forEach(function (p, i) {
						p.hidden = i !== idx;
					});
				}
			},
		);
	}
&lt;/script&gt;&lt;div data-nb-pm class=&quot;w-full&quot;&gt;&lt;div class=&quot;flex w-full flex-col overflow-hidden rounded-lg text-sm ring ring-border bg-card&quot;&gt;&lt;div class=&quot;flex items-center gap-2 px-3 py-2 text-[0.8125rem] font-medium leading-5 text-muted-foreground bg-[var(--nb-surface-sunken)]&quot; role=&quot;tablist&quot; aria-label=&quot;Package manager&quot;&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;true&quot; aria-controls=&quot;pm-panel-pm-5deb1060-6118-4fd0-9b11-7919fe67c99c-npm&quot; id=&quot;pm-tab-pm-5deb1060-6118-4fd0-9b11-7919fe67c99c-npm&quot; data-nb-pm-tab class=&quot;text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2&quot;&gt;npm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-5deb1060-6118-4fd0-9b11-7919fe67c99c-yarn&quot; id=&quot;pm-tab-pm-5deb1060-6118-4fd0-9b11-7919fe67c99c-yarn&quot; data-nb-pm-tab class=&quot;text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2&quot;&gt;yarn&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-5deb1060-6118-4fd0-9b11-7919fe67c99c-pnpm&quot; id=&quot;pm-tab-pm-5deb1060-6118-4fd0-9b11-7919fe67c99c-pnpm&quot; data-nb-pm-tab class=&quot;text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2&quot;&gt;pnpm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-5deb1060-6118-4fd0-9b11-7919fe67c99c-bun&quot; id=&quot;pm-tab-pm-5deb1060-6118-4fd0-9b11-7919fe67c99c-bun&quot; data-nb-pm-tab class=&quot;text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2&quot;&gt;bun&lt;/button&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-5deb1060-6118-4fd0-9b11-7919fe67c99c-npm&quot; aria-labelledby=&quot;pm-tab-pm-5deb1060-6118-4fd0-9b11-7919fe67c99c-npm&quot; data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; i agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;npm i agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;symbol id=&quot;ai:ph:copy&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:ph:copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;symbol id=&quot;ai:ph:check&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:ph:check&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-5deb1060-6118-4fd0-9b11-7919fe67c99c-yarn&quot; aria-labelledby=&quot;pm-tab-pm-5deb1060-6118-4fd0-9b11-7919fe67c99c-yarn&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;yarn&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;yarn add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;use href=&quot;#ai:ph:copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;use href=&quot;#ai:ph:check&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-5deb1060-6118-4fd0-9b11-7919fe67c99c-pnpm&quot; aria-labelledby=&quot;pm-tab-pm-5deb1060-6118-4fd0-9b11-7919fe67c99c-pnpm&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;pnpm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;pnpm add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;use href=&quot;#ai:ph:copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;use href=&quot;#ai:ph:check&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-5deb1060-6118-4fd0-9b11-7919fe67c99c-bun&quot; aria-labelledby=&quot;pm-tab-pm-5deb1060-6118-4fd0-9b11-7919fe67c99c-bun&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;bun&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;bun add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;use href=&quot;#ai:ph:copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;use href=&quot;#ai:ph:check&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;nb-pm-restore style=&quot;display:contents&quot;&gt;&lt;/nb-pm-restore&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://cloudflaredoc.ubitools.com/Users/jt.gui/workspace/astro/cloudflare-docs/src/components/ui/package-managers/PackageManagers.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;有关更多信息，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/agents/runtime/&quot;&gt;Agents API 参考&lt;/a&gt;和&lt;a href=&quot;https://cloudflaredoc.ubitools.com/agents/communication-channels/chat/chat-agents/&quot;&gt;聊天 Agent 文档&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Tue, 02 Jun 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>Agents - 通过 Cloudflare Tunnel 分享 sandbox 预览</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-05-29-sandbox-named-tunnels/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-05-29-sandbox-named-tunnels/</guid><description>
&lt;p&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/sandbox/&quot;&gt;Sandboxes&lt;/a&gt; 可以通过 &lt;code&gt;sandbox.tunnels&lt;/code&gt; 命名空间将容器内运行的服务暴露到公共预览 URL。SDK 在 sandbox 内部使用 &lt;code&gt;cloudflared&lt;/code&gt;，因此你可以在不配置 &lt;code&gt;exposePort()&lt;/code&gt; 或自定义域名的情况下共享正在运行的服务。&lt;/p&gt;
&lt;p&gt;默认情况下，&lt;code&gt;sandbox.tunnels.get(port)&lt;/code&gt; 会在零配置的 &lt;code&gt;*.trycloudflare.com&lt;/code&gt; URL 上创建一个&lt;a href=&quot;https://try.cloudflare.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;快速隧道&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;——无需 Cloudflare 账户、DNS 记录或自定义域名。这非常适合快速开发以及 &lt;code&gt;.workers.dev&lt;/code&gt; 部署。&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { getSandbox } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/sandbox&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; sandbox&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; getSandbox&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(env.Sandbox, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-sandbox&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; sandbox.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;startProcess&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;python -m http.server 8080&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; tunnel&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; sandbox.tunnels.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;8080&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(tunnel.url); &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// → https://random-words-here.trycloudflare.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { getSandbox } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/sandbox&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; sandbox&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; getSandbox&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(env.Sandbox, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-sandbox&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; sandbox.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;startProcess&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;python -m http.server 8080&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; tunnel&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; sandbox.tunnels.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;8080&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(tunnel.url); &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// → https://random-words-here.trycloudflare.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://cloudflaredoc.ubitools.com/Users/jt.gui/workspace/astro/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;命名隧道&quot;&gt;命名隧道&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#命名隧道&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;如需更多控制，你可以通过 &lt;code&gt;sandbox.tunnels.get(port, { name })&lt;/code&gt; 创建命名隧道。命名隧道绑定一个由 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/cloudflare-one/networks/connectors/cloudflare-tunnel/&quot;&gt;Cloudflare Tunnel&lt;/a&gt; 支持的主机名（&lt;code&gt;&amp;lt;name&amp;gt;.&amp;lt;your-zone&amp;gt;&lt;/code&gt;），并在你的区域上创建 CNAME 记录，最终生成类似 &lt;a href=&quot;https://my-app-preview.example.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://my-app-preview.example.com&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 的地址。&lt;/p&gt;
&lt;p&gt;与每次都生成新随机 URL 的快速隧道不同，命名隧道生成的持久 URL 在容器重启后仍然有效。这使命名隧道适用于需要对隧道及其源站进行控制的生产用途。&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; tunnel&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; sandbox.tunnels.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;8080&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, { name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-app-preview&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(tunnel.url); &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// → https://my-app-preview.example.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; tunnel&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; sandbox.tunnels.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;8080&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, { name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-app-preview&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(tunnel.url); &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// → https://my-app-preview.example.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;调用 &lt;code&gt;sandbox.destroy()&lt;/code&gt; 会在销毁容器的同时拆除 Cloudflare Tunnel 和关联的 DNS 记录，因此不会留下悬空的隧道或记录。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;升级&quot;&gt;升级&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#升级&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;升级到最新版本：&lt;/p&gt;
&lt;script&gt;
	if (!customElements.get(&quot;nb-pm-restore&quot;)) {
		customElements.define(
			&quot;nb-pm-restore&quot;,
			class extends HTMLElement {
				connectedCallback() {
					const card = this.closest(&quot;[data-nb-pm]&quot;);
					if (!card) return;
					let saved;
					try {
						saved = sessionStorage.getItem(&quot;ui-pm-tab&quot;);
					} catch {
						return;
					}
					if (!saved) return;
					const tabs = card.querySelectorAll(&quot;[data-nb-pm-tab]&quot;);
					let idx = -1;
					tabs.forEach(function (t, i) {
						if (t.textContent.trim() === saved) idx = i;
					});
					if (idx &lt; 1) return;
					tabs.forEach(function (t, i) {
						t.setAttribute(&quot;aria-selected&quot;, String(i === idx));
					});
					card.querySelectorAll(&quot;[data-nb-pm-panel]&quot;).forEach(function (p, i) {
						p.hidden = i !== idx;
					});
				}
			},
		);
	}
&lt;/script&gt;&lt;div data-nb-pm class=&quot;w-full&quot;&gt;&lt;div class=&quot;flex w-full flex-col overflow-hidden rounded-lg text-sm ring ring-border bg-card&quot;&gt;&lt;div class=&quot;flex items-center gap-2 px-3 py-2 text-[0.8125rem] font-medium leading-5 text-muted-foreground bg-[var(--nb-surface-sunken)]&quot; role=&quot;tablist&quot; aria-label=&quot;Package manager&quot;&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;true&quot; aria-controls=&quot;pm-panel-pm-159fb4b2-4222-48f3-9528-2b583053b0ae-npm&quot; id=&quot;pm-tab-pm-159fb4b2-4222-48f3-9528-2b583053b0ae-npm&quot; data-nb-pm-tab class=&quot;text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2&quot;&gt;npm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-159fb4b2-4222-48f3-9528-2b583053b0ae-yarn&quot; id=&quot;pm-tab-pm-159fb4b2-4222-48f3-9528-2b583053b0ae-yarn&quot; data-nb-pm-tab class=&quot;text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2&quot;&gt;yarn&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-159fb4b2-4222-48f3-9528-2b583053b0ae-pnpm&quot; id=&quot;pm-tab-pm-159fb4b2-4222-48f3-9528-2b583053b0ae-pnpm&quot; data-nb-pm-tab class=&quot;text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2&quot;&gt;pnpm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-159fb4b2-4222-48f3-9528-2b583053b0ae-bun&quot; id=&quot;pm-tab-pm-159fb4b2-4222-48f3-9528-2b583053b0ae-bun&quot; data-nb-pm-tab class=&quot;text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2&quot;&gt;bun&lt;/button&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-159fb4b2-4222-48f3-9528-2b583053b0ae-npm&quot; aria-labelledby=&quot;pm-tab-pm-159fb4b2-4222-48f3-9528-2b583053b0ae-npm&quot; data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; i @cloudflare/sandbox@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;npm i @cloudflare/sandbox@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;symbol id=&quot;ai:ph:copy&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:ph:copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;symbol id=&quot;ai:ph:check&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:ph:check&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-159fb4b2-4222-48f3-9528-2b583053b0ae-yarn&quot; aria-labelledby=&quot;pm-tab-pm-159fb4b2-4222-48f3-9528-2b583053b0ae-yarn&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;yarn&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add @cloudflare/sandbox@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;yarn add @cloudflare/sandbox@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;use href=&quot;#ai:ph:copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;use href=&quot;#ai:ph:check&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-159fb4b2-4222-48f3-9528-2b583053b0ae-pnpm&quot; aria-labelledby=&quot;pm-tab-pm-159fb4b2-4222-48f3-9528-2b583053b0ae-pnpm&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;pnpm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add @cloudflare/sandbox@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;pnpm add @cloudflare/sandbox@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;use href=&quot;#ai:ph:copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;use href=&quot;#ai:ph:check&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-159fb4b2-4222-48f3-9528-2b583053b0ae-bun&quot; aria-labelledby=&quot;pm-tab-pm-159fb4b2-4222-48f3-9528-2b583053b0ae-bun&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;bun&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add @cloudflare/sandbox@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;bun add @cloudflare/sandbox@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;use href=&quot;#ai:ph:copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;use href=&quot;#ai:ph:check&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;nb-pm-restore style=&quot;display:contents&quot;&gt;&lt;/nb-pm-restore&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://cloudflaredoc.ubitools.com/Users/jt.gui/workspace/astro/cloudflare-docs/src/components/ui/package-managers/PackageManagers.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;有关完整的 API 详情，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/sandbox/api/tunnels/&quot;&gt;Sandbox 隧道参考&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category></item><item><title>D1 - D1 迁移通过 `migrations_pattern` 支持嵌套布局</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-06-04-migrations-pattern/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-06-04-migrations-pattern/</guid><description>&lt;p&gt;现在，您可以使用新的 &lt;code&gt;migrations_pattern&lt;/code&gt; D1 绑定（binding）配置，将 &lt;code&gt;wrangler d1 migrations apply&lt;/code&gt; 指向嵌套的迁移布局——例如由 &lt;a href=&quot;https://orm.drizzle.team/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Drizzle&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 生成的布局（&lt;code&gt;migrations/0001_init/migration.sql&lt;/code&gt;）：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;d1_databases&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;binding&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;DB&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;database_name&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-database&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;database_id&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&amp;lt;UUID&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;migrations_dir&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;migrations&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;migrations_pattern&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;migrations/*/migration.sql&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;&lt;code&gt;migrations_pattern&lt;/code&gt; 是一个用于发现迁移文件的 Glob 模式（相对于您的 Wrangler 配置文件）。它的默认值是 &lt;code&gt;${migrations_dir}/*.sql&lt;/code&gt;，因此现有项目无需任何修改即可继续运行。每个迁移的名称都会以相对于 &lt;code&gt;migrations_dir&lt;/code&gt; 的路径记录在 migrations 表中。&lt;/p&gt;
&lt;p&gt;欲了解更多信息，请访问 D1 的 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/d1/reference/migrations/#nested-migration-layouts&quot;&gt;迁移文档&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate><product>D1</product><category>D1</category></item><item><title>Realtime - Cloudflare 实时 WebSocket 适配器现支持自动重连并可缓冲 WebRTC 媒体</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-05-29-websocket-adapter-auto-reconnect/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-05-29-websocket-adapter-auto-reconnect/</guid><description>&lt;p&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/realtime/sfu/&quot;&gt;Cloudflare 实时 SFU&lt;/a&gt; 是一款&lt;a href=&quot;https://cloudflaredoc.ubitools.com/realtime/sfu/calls-vs-sfus/&quot;&gt;运行在 Cloudflare 全球网络上的 WebRTC 选择性转发单元&lt;/a&gt;，使您无需管理 SFU 基础设施或区域，即可在全球 WebRTC 客户端之间路由实时音频、视频和数据。&lt;/p&gt;
&lt;p&gt;当您使用 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/realtime/sfu/media-transport-adapters/websocket-adapter/&quot;&gt;WebSocket 适配器&lt;/a&gt;将 WebRTC 媒体流传输至 WebSocket 端点时，该适配器现在可在端点短暂断连或重启后自动重连并缓冲音视频。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;将-webrtc-媒体流传输至-websocket-端点&quot;&gt;将 WebRTC 媒体流传输至 WebSocket 端点&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#将-webrtc-媒体流传输至-websocket-端点&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;许多团队还将实时 SFU 用作后端应用程序的媒体层，例如转录、录制、笔记和 Agent 媒体处理服务。这些系统通常需要在后端基础设施中消费来自 SFU 的实时 WebRTC 音频或视频，包括 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/durable-objects/&quot;&gt;Durable Objects&lt;/a&gt;、&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/&quot;&gt;Workers&lt;/a&gt;、&lt;a href=&quot;https://cloudflaredoc.ubitools.com/containers/&quot;&gt;Containers&lt;/a&gt; 或外部服务，而无需自行运行 WebRTC 客户端。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/realtime/sfu/media-transport-adapters/websocket-adapter/&quot;&gt;WebSocket 适配器&lt;/a&gt;通过将 WebRTC 媒体从 SFU 以应用程序可消费的载荷形式流式传输至标准 WebSocket 端点来弥合这一差距：&lt;a href=&quot;https://cloudflaredoc.ubitools.com/realtime/sfu/media-transport-adapters/websocket-adapter/#media-formats&quot;&gt;PCM 音频帧和 JPEG 视频帧&lt;/a&gt;。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;变更内容&quot;&gt;变更内容&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#变更内容&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;当您在 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/realtime/sfu/media-transport-adapters/websocket-adapter/#stream-mode-egress&quot;&gt;Stream 模式（出口）&lt;/a&gt;下使用 WebSocket 适配器将实时音视频从 SFU 发送到您自己的 WebSocket 端点时，SFU 现在会在端点短暂断连或重启后&lt;a href=&quot;https://cloudflaredoc.ubitools.com/realtime/sfu/media-transport-adapters/websocket-adapter/#automatic-reconnection-for-streaming&quot;&gt;自动重连&lt;/a&gt;。这对于长时间运行的媒体管道尤其有用，因为在录制、转录或实时分析任务仍在进行时，WebSocket 端点可能会短暂重启。&lt;/p&gt;
&lt;p&gt;此前，WebSocket 端点的短暂断连可能导致适配器关闭，需要应用程序在媒体恢复前重新创建适配器。现在，SFU 无需更改 API 即可重试同一端点长达 5 秒。如果端点在此时间窗口内恢复，音视频传输将自动恢复。&lt;/p&gt;
&lt;p&gt;重连行为还包含&lt;a href=&quot;https://cloudflaredoc.ubitools.com/realtime/sfu/media-transport-adapters/websocket-adapter/#media-buffering-during-reconnect&quot;&gt;实时优先媒体缓冲&lt;/a&gt;，因此短暂中断可减少媒体丢失，而无需重播过时视频。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;重连行为&quot;&gt;重连行为&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#重连行为&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;重连期间：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;音频使用有限的短暂积压队列来减少可听见的丢失。如果中断时间超过积压队列的覆盖范围，较旧的音频可能会被丢弃。&lt;/li&gt;
&lt;li&gt;视频从&lt;a href=&quot;https://cloudflaredoc.ubitools.com/realtime/sfu/media-transport-adapters/websocket-adapter/#video-jpeg&quot;&gt;最新可用的 JPEG 帧&lt;/a&gt;恢复，而不是重播过时帧。&lt;/li&gt;
&lt;li&gt;恢复为尽力而为，不保证无间隙或精确一次传递。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果端点在 5 秒重连窗口后仍不可用，适配器将关闭并必须重新创建。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;了解更多&quot;&gt;了解更多&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#了解更多&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/realtime/sfu/media-transport-adapters/websocket-adapter/&quot;&gt;WebSocket 适配器&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/realtime/sfu/media-transport-adapters/websocket-adapter/#automatic-reconnection-for-streaming&quot;&gt;流传输的自动重连&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/realtime/sfu/get-started/&quot;&gt;实时 SFU 快速入门&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/realtime/sfu/example-architecture/&quot;&gt;实时 SFU 示例架构&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/realtime/sfu/calls-vs-sfus/&quot;&gt;实时 SFU 与普通 SFU 的比较&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realtime-sfu.dev-demos.workers.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;全球 SFU 网络可视化&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate><product>Realtime</product><category>Realtime</category></item><item><title>Browser Run - 直接从 Workers 使用 Browser Run Quick Actions</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-05-28-use-browser-run-quick-actions-directly-from-workers/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-05-28-use-browser-run-quick-actions-directly-from-workers/</guid><description>
&lt;p&gt;您现在可以使用浏览器绑定（browser binding）上的 &lt;code&gt;quickAction()&lt;/code&gt; 方法，直接从 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/&quot;&gt;Cloudflare Worker&lt;/a&gt; 调用 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/browser-run/quick-actions/&quot;&gt;Browser Run Quick Actions&lt;/a&gt;。这消除了对 API 令牌或外部 HTTP 请求的需求，从而简化了 Workers 与 Browser Run 的交互方式。您的 Worker 会在 Cloudflare 的网络上直接与 Browser Run 进行通信，使得代码更简单，延迟更低。&lt;/p&gt;
&lt;p&gt;通过 &lt;code&gt;quickAction()&lt;/code&gt; 方法，您可以：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;从 URL 或 HTML &lt;a href=&quot;https://cloudflaredoc.ubitools.com/browser-run/quick-actions/screenshot-endpoint/&quot;&gt;截取屏幕截图&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;生成带有自定义样式、页眉和页脚的 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/browser-run/quick-actions/pdf-endpoint/&quot;&gt;PDF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;从完全渲染的页面中 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/browser-run/quick-actions/content-endpoint/&quot;&gt;提取 HTML 内容&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/browser-run/quick-actions/markdown-endpoint/&quot;&gt;将页面转换为 Markdown&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;使用 AI &lt;a href=&quot;https://cloudflaredoc.ubitools.com/browser-run/quick-actions/json-endpoint/&quot;&gt;提取结构化 JSON&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;使用 CSS 选择器 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/browser-run/quick-actions/scrape-endpoint/&quot;&gt;抓取元素&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;从页面 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/browser-run/quick-actions/links-endpoint/&quot;&gt;获取所有链接&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/browser-run/quick-actions/snapshot/&quot;&gt;截取快照&lt;/a&gt;（在一次请求中捕获 HTML + 屏幕截图）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;要开始使用，请将浏览器绑定（browser binding）添加到您的 Wrangler 配置中：&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;compatibility_date&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;2026-03-24&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;browser&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    &quot;binding&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;BROWSER&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;compatibility_date = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;2026-03-24&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;browser&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;binding = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;BROWSER&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://cloudflaredoc.ubitools.com/Users/jt.gui/workspace/astro/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;然后直接从您的 Worker 调用任何 Quick Action。例如，要截取屏幕截图：&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; screenshot&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;BROWSER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;quickAction&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;screenshot&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	url: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;https://www.cloudflare.com/&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; screenshot&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;BROWSER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;quickAction&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;screenshot&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  url: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;https://www.cloudflare.com/&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;quickAction()&lt;/code&gt; 方法需要 &lt;code&gt;2026-03-24&lt;/code&gt; 或更晚的兼容性日期。&lt;/p&gt;
&lt;p&gt;有关设置说明和可用操作的完整列表，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/browser-run/quick-actions/&quot;&gt;Browser Run Quick Actions&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><product>Browser Run</product><category>Browser Run</category></item><item><title>Containers - Wrangler 支持用于 Containers 的 SSH ProxyCommand</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-05-28-ssh-proxy-command/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-05-28-ssh-proxy-command/</guid><description>&lt;p&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/wrangler/&quot;&gt;Wrangler&lt;/a&gt; 支持将 &lt;code&gt;wrangler containers ssh&lt;/code&gt; 作为 OpenSSH &lt;code&gt;ProxyCommand&lt;/code&gt; 用于 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/containers/&quot;&gt;Containers&lt;/a&gt;。这允许您的本地 SSH 客户端通过 Wrangler 连接到正在运行的 Container。&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -o&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; ProxyCommand=&quot;wrangler containers ssh %h&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; cloudchamber@&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;INSTANCE_I&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;D&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;当标准输入和输出被管道传输时，Wrangler 会将数据转发到 Container 中的 SSH 服务器。您也可以传递 &lt;code&gt;--stdio&lt;/code&gt; 来强制使用此模式。&lt;/p&gt;
&lt;p&gt;欲了解更多信息，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/containers/ssh/&quot;&gt;SSH 文档&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><product>Containers</product><category>Containers</category></item><item><title>Email Service - 发送带有命名收件人地址的电子邮件</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-05-28-named-email-recipients/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-05-28-named-email-recipients/</guid><description>
&lt;p&gt;除了现有的 &lt;code&gt;from&lt;/code&gt; 支持外，您现在还可以在发送电子邮件时为收件人地址添加显示名称。为 &lt;code&gt;to&lt;/code&gt;、&lt;code&gt;cc&lt;/code&gt;、&lt;code&gt;bcc&lt;/code&gt;、&lt;code&gt;replyTo&lt;/code&gt; 或 &lt;code&gt;from&lt;/code&gt; 传递一个包含 &lt;code&gt;email&lt;/code&gt; 和可选 &lt;code&gt;name&lt;/code&gt; 字段的对象：&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;js&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;src/index.js&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; response&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;EMAIL&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;send&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			from: { email: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;support@example.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Support Team&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			to: { email: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;jane@example.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Jane Doe&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			cc: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;				&quot;manager@company.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				{ email: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;team@company.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Engineering Team&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			subject: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Welcome!&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			html: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&amp;#x3C;h1&gt;Thanks for joining!&amp;#x3C;/h1&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			text: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Thanks for joining!&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; Response.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ messageId: response.messageId });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;src/index.ts&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Promise&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; response&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;EMAIL&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;send&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			from: { email: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;support@example.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Support Team&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			to: { email: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;jane@example.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Jane Doe&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			cc: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;				&quot;manager@company.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				{ email: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;team@company.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Engineering Team&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			subject: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Welcome!&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			html: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&amp;#x3C;h1&gt;Thanks for joining!&amp;#x3C;/h1&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			text: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Thanks for joining!&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; Response.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ messageId: response.messageId });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;} &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;satisfies&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ExportedHandler&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://cloudflaredoc.ubitools.com/Users/jt.gui/workspace/astro/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;为实现向后兼容，纯字符串形式仍受到完整支持，并且您可以在同一个数组中混合使用字符串和命名对象。&lt;/p&gt;
&lt;p&gt;有关完整的请求示例，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/email-service/api/send-emails/workers-api/&quot;&gt;Workers API&lt;/a&gt; 和 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/email-service/api/send-emails/rest-api/&quot;&gt;REST API&lt;/a&gt; 文档。&lt;/p&gt;</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><product>Email Service</product><category>Email Service</category></item><item><title>Pipelines - Pipelines 计费方案公布</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-05-11-pipelines-pricing-announced/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-05-11-pipelines-pricing-announced/</guid><description>&lt;p&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/pipelines/&quot;&gt;Cloudflare Pipelines&lt;/a&gt; 是一个流数据平台，可摄取事件，使用 SQL 对其进行转换，并将 JSON、Parquet 或 &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Apache Iceberg&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 表写入 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2/&quot;&gt;R2&lt;/a&gt;。Pipelines 现在公布了基于两个使用维度的计费方案：SQL 转换处理的数据量以及交付到接收器（sink）的数据量。输入（ingress）到 Pipeline 流是免费的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;计费尚未启用。我们将在开始对 Pipelines 使用进行收费之前至少提前 30 天通知。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pipelines 的计费模型旨在根据您的实际使用量按 GB 收费：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Streams (ingress)&lt;/strong&gt;：免费，无论数据量大小。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SQL 转换&lt;/strong&gt;：无状态转换（过滤、重塑、展开、转换、计算）为 0.04 美元 / GB。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sinks&lt;/strong&gt;：JSON 输出为 0.03 美元 / GB，Parquet 或 Iceberg 输出为 0.06 美元 / GB。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Workers 免费计划包括每个维度每月 1 GB。Workers 付费计划包括每月 50 GB。&lt;/p&gt;
&lt;p&gt;有关完整定价详情和计费示例，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/pipelines/platform/pricing/&quot;&gt;Pipelines 计费&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><product>Pipelines</product><category>Pipelines</category></item><item><title>R2 SQL - R2 SQL 定价公布</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-05-11-r2-sql-pricing-announced/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-05-11-r2-sql-pricing-announced/</guid><description>&lt;p&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2-sql/&quot;&gt;R2 SQL&lt;/a&gt; 是一个无服务器分布式查询引擎，可对存储在 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2/data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt; 中的 &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Apache Iceberg&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 表运行 SQL。R2 SQL 现在已发布基于单一维度的定价：即执行查询所扫描的压缩数据量。R2 SQL 的价格为 2.50 美元/TB（0.0025 美元/GB），仅为 AWS Athena 成本的一半，且不到 Google BigQuery 按需付费价格的一半。&lt;/p&gt;
&lt;p&gt;计费尚未启用。在开始对 R2 SQL 使用收费之前，我们将至少提前 30 天通知。&lt;/p&gt;
&lt;p&gt;扫描的数据量是以从 R2 对象存储中读取的压缩字节数来衡量的。这与您在 R2 存储桶中看到的相符——如果一个 Parquet 文件在磁盘上是 100 MB，那么扫描该文件将按 100 MB 计费。每个查询的最小计费增量为 10 MB。&lt;/p&gt;
&lt;p&gt;免费计划每月包含 1 GB，付费计划每月包含 10 GB。标准的 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2/pricing/&quot;&gt;R2 存储和操作费用&lt;/a&gt; 以及 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2/data-catalog/platform/pricing/&quot;&gt;R2 Data Catalog 费用&lt;/a&gt; 单独计算。&lt;/p&gt;
&lt;p&gt;有关完整的定价详细信息和计费示例，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2-sql/platform/pricing/&quot;&gt;R2 SQL 定价&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><product>R2 SQL</product><category>R2 SQL</category></item><item><title>R2 - R2 Data Catalog 定价公告</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-05-11-r2-data-catalog-pricing-announced/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-05-11-r2-data-catalog-pricing-announced/</guid><description>&lt;p&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2/data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt; 是直接内置于 R2 存储桶的托管 &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Apache Iceberg&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 数据目录，可被 Spark、Snowflake 和 DuckDB 等任何 Iceberg 兼容引擎查询。R2 Data Catalog 现在已公布目录操作和表压缩的定价，此外还有标准的 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2/pricing/&quot;&gt;R2 存储和操作&lt;/a&gt;费用。&lt;/p&gt;
&lt;p&gt;计费尚未启用。在开始对 R2 Data Catalog 使用量收费之前，我们将提前至少 30 天通知。&lt;/p&gt;
&lt;p&gt;定价基于两个维度：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;目录操作&lt;/strong&gt;：每百万次操作 $9.00，适用于创建表、读取表元数据和更新表属性等元数据请求。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;压缩&lt;/strong&gt;：每处理 1 GB 数据 $0.005，每处理 100 万个对象 $2.00。这些费用仅在为表启用自动压缩时产生。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;两个维度均包含月度免费套餐：100 万次目录操作、10 GB 压缩数据处理量和 100 万个压缩对象处理量。&lt;/p&gt;
&lt;p&gt;有关完整定价详情和计费示例，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2/data-catalog/platform/pricing/&quot;&gt;R2 Data Catalog 定价&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><product>R2</product><category>R2</category></item><item><title>R2 - R2 Data Catalog 获得专属仪表板体验</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-05-28-r2-data-catalog-dashboard/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-05-28-r2-data-catalog-dashboard/</guid><description>&lt;p&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2/data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt; 是直接内置于 R2 存储桶的托管 &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Apache Iceberg&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 数据目录。它公开标准 Iceberg REST 目录接口，因此您可以将 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2/data-catalog/config-examples/spark-scala/&quot;&gt;Spark&lt;/a&gt;、&lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2/data-catalog/config-examples/snowflake/&quot;&gt;Snowflake&lt;/a&gt;、&lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2/data-catalog/config-examples/duckdb/&quot;&gt;DuckDB&lt;/a&gt; 和 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2-sql/&quot;&gt;R2 SQL&lt;/a&gt; 等查询引擎连接到 R2 中的数据。&lt;/p&gt;
&lt;p&gt;R2 Data Catalog 现在在 Cloudflare 仪表板中拥有专属部分，取代了之前嵌入在 R2 存储桶配置中的设置面板。新体验包括：&lt;/p&gt;
&lt;img src=&quot;https://cloudflaredoc.ubitools.com/_astro/data-catalog-dashboard.BsKDvUQn_Z1Twgl3.webp&quot; alt=&quot;R2 Data Catalog 仪表板概览&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3070&quot; height=&quot;1486&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;目录概览&lt;/strong&gt; — 在一个地方查看所有目录，一览目录请求数量、存储桶大小和表维护状态。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;引导式设置向导&lt;/strong&gt; — 通过三个步骤创建目录：选择或创建 R2 存储桶、配置表维护（压缩和快照过期）、然后确认。向导会自动创建存储桶并生成服务凭证。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;设置管理&lt;/strong&gt; — 每个目录的专属设置页面，包含常规配置、表维护、服务凭证和禁用目录等部分。您现在可以直接从仪表板启用和配置&lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2/data-catalog/table-maintenance/&quot;&gt;快照过期&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内置指标&lt;/strong&gt; — 每个目录的指标标签上有五个图表：已压缩字节数、已压缩文件数、目录请求数、存储大小和已过期快照数。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;要开始使用，请在 Cloudflare 仪表板中转到 &lt;strong&gt;R2 Data Catalog&lt;/strong&gt;，或参阅&lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2/data-catalog/get-started/&quot;&gt;快速入门指南&lt;/a&gt;和&lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2/data-catalog/manage-catalogs/&quot;&gt;管理目录文档&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><product>R2</product><category>R2</category></item><item><title>Realtime - 在 RealtimeKit 中录制特定参与者的音频轨道</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-05-28-realtimekit-track-recording/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-05-28-realtimekit-track-recording/</guid><description>&lt;p&gt;您现在可以使用 RealtimeKit 的&lt;a href=&quot;https://cloudflaredoc.ubitools.com/realtime/realtimekit/recording-guide/track-recording/&quot;&gt;轨道录制&lt;/a&gt;功能录制特定参与者的音频轨道。轨道录制为每位参与者创建单独的 WebM 文件，而非单一的合成录制，这对后期处理、转录以及受监管或内容敏感的工作流非常有用。&lt;/p&gt;
&lt;p&gt;要录制特定参与者，在启动轨道录制时传入 &lt;code&gt;user_ids&lt;/code&gt;：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --request&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --url&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; https://api.cloudflare.com/client/v4/accounts/&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;account_i&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/realtime/kit/&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;app_i&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/recordings/track&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --header&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;Authorization: Bearer &amp;lt;api_token&amp;gt;&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --header&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;Content-Type: application/json&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --data&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;  &quot;meeting_id&quot;: &quot;97440c6a-140b-40a9-9499-b23fd7a3868a&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;  &quot;user_ids&quot;: [&quot;user-123&quot;, &quot;user-456&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;要在选择性轨道录制中传入 &lt;code&gt;user_ids&lt;/code&gt;，需使用以下最低 SDK 版本：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Web Core：&lt;code&gt;@cloudflare/realtimekit&lt;/code&gt; 版本 &lt;code&gt;1.4.0&lt;/code&gt; 或更高&lt;/li&gt;
&lt;li&gt;Web UI Kit：&lt;code&gt;@cloudflare/realtimekit-ui&lt;/code&gt;、&lt;code&gt;@cloudflare/realtimekit-react-ui&lt;/code&gt; 或 &lt;code&gt;@cloudflare/realtimekit-angular-ui&lt;/code&gt; 版本 &lt;code&gt;1.1.2&lt;/code&gt; 或更高&lt;/li&gt;
&lt;li&gt;Android Core 或 iOS Core：版本 &lt;code&gt;2.0.0&lt;/code&gt; 或更高&lt;/li&gt;
&lt;li&gt;Android UI Kit 或 iOS UI Kit：版本 &lt;code&gt;1.1.0&lt;/code&gt; 或更高&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/realtime/realtimekit/&quot;&gt;RealtimeKit&lt;/a&gt; 提供 SDK 和 UI 组件，让您可以在 Cloudflare 的&lt;a href=&quot;https://cloudflaredoc.ubitools.com/realtime/#realtime-sfu&quot;&gt;全球 WebRTC 基础设施&lt;/a&gt;上构建自己的会议体验。如今，各团队正在 RealtimeKit 上为全球受众构建从远程医疗到在线教育的各类产品。您可以通过我们的&lt;a href=&quot;https://cloudflaredoc.ubitools.com/realtime/realtimekit/quickstart/&quot;&gt;快速入门&lt;/a&gt;立即上手，或参考我们的 &lt;a href=&quot;https://github.com/cloudflare/meet&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare Meet 仓库&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 作为参考。&lt;/p&gt;</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><product>Realtime</product><category>Realtime</category></item><item><title>Cloudflare Images - Images 中的转换流（flows）</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-05-27-transformation-flows/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-05-27-transformation-flows/</guid><description>&lt;img src=&quot;https://cloudflaredoc.ubitools.com/_astro/custom-flow.DeAGR8BY_iGLSK.webp&quot; alt=&quot;自定义流配置面板&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1654&quot; height=&quot;1398&quot;&gt;
&lt;p&gt;流（Flows）是自动规则，它将条件（例如文件扩展名、URL 路径或查询参数）与参数进行匹配。您可以设置一个流，以自动将图像优化应用到您区域上的匹配请求，而无需编写代码或更改 URL。&lt;/p&gt;
&lt;p&gt;转换流有两种模式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/images/optimization/transformations/flows/#set-up-a-provider-flow&quot;&gt;提供商流（Provider flows）&lt;/a&gt;&lt;/strong&gt; — 从其他图像优化服务进行迁移。您现有的 URL 将继续工作，同时 Cloudflare 会将特定提供商的参数重写为 Cloudflare 对应的参数。目前，Cloudflare 支持针对 Fastly Image Optimizer 的提供商流。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/images/optimization/transformations/flows/#set-up-a-custom-flow&quot;&gt;自定义流（Custom flows）&lt;/a&gt;&lt;/strong&gt; — 为自动格式转换、具有 &lt;code&gt;width=auto&lt;/code&gt; 的&lt;a href=&quot;https://cloudflaredoc.ubitools.com/images/optimization/make-responsive-images/#using-widthauto&quot;&gt;响应式大小调整&lt;/a&gt;或基于目录的优化等使用场景定义您自己的条件和操作。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;若要开始使用，请转到 &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/images/transformations&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare 仪表板&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;中的 &lt;strong&gt;Images&lt;/strong&gt; &amp;gt; &lt;strong&gt;Transformations（转换）&lt;/strong&gt; &amp;gt; &lt;strong&gt;Automation（自动化）&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;详细了解&lt;a href=&quot;https://cloudflaredoc.ubitools.com/images/optimization/transformations/flows/&quot;&gt;转换流&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate><product>Cloudflare Images</product><category>Cloudflare Images</category></item><item><title>Flagship - Flagship 现已进入公开 Beta</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-05-26-public-beta/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-05-26-public-beta/</guid><description>
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/flagship/&quot;&gt;Flagship&lt;/a&gt;&lt;/strong&gt; 现已进入公开 Beta。无需出站 HTTP 调用，即可直接在 Cloudflare Workers 中评估功能标志，使用由 Workers KV 和 Durable Objects 支持的全球分布式标志配置。Flagship 支持类型化标志值、定向规则、百分比灰度发布、审计历史记录，以及兼容 OpenFeature 的 SDK。&lt;/p&gt;
&lt;p&gt;只需几行代码，即可在 Worker 中评估标志：&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;js&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;src/index.js&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; showNewCheckout&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;FLAGS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;getBooleanValue&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;			&quot;new-checkout&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			false&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(showNewCheckout &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;New checkout&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Standard checkout&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;src/index.ts&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Promise&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; showNewCheckout&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;FLAGS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;getBooleanValue&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;new-checkout&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			showNewCheckout &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;New checkout&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Standard checkout&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;} &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;satisfies&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ExportedHandler&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://cloudflaredoc.ubitools.com/Users/jt.gui/workspace/astro/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;立即在 Cloudflare 仪表板中开始创建标志。请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/flagship/get-started/&quot;&gt;Flagship 文档&lt;/a&gt; 以快速入门。&lt;/p&gt;</description><pubDate>Tue, 26 May 2026 00:00:00 GMT</pubDate><product>Flagship</product><category>Flagship</category></item><item><title>AI Gateway - 通过 AI Gateway 全新的 REST API 调用任何 AI 模型</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-05-21-rest-api/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-05-21-rest-api/</guid><description>&lt;p&gt;AI Gateway 现在开始使用 &lt;code&gt;api.cloudflare.com&lt;/code&gt; 上的 AI REST API。无论提供商是 OpenAI、Anthropic、Google 还是托管在 Workers AI 上，您都可以通过一个统一的 API 调用任何模型，并使用相同的端点和身份验证方式。共有四个端点可用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;POST /ai/run&lt;/code&gt; — 适用于所有模型和模态的通用端点&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POST /ai/v1/chat/completions&lt;/code&gt; — 兼容 OpenAI SDK&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POST /ai/v1/responses&lt;/code&gt; — 兼容 OpenAI Responses API&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POST /ai/v1/messages&lt;/code&gt; — 兼容 Anthropic SDK&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -X&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;https://api.cloudflare.com/client/v4/accounts/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$CLOUDFLARE_ACCOUNT_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/ai/v1/chat/completions&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --header&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer &lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$CLOUDFLARE_API_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --header&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --data&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;model&quot;: &quot;openai/gpt-5.5&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;messages&quot;: [{&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;What is Cloudflare?&quot;}]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;  }&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;所有的 AI Gateway 功能（日志记录、缓存、速率限制和护栏）都会自动应用。第三方模型将通过&lt;a href=&quot;https://cloudflaredoc.ubitools.com/ai-gateway/features/unified-billing/&quot;&gt;统一计费（Unified Billing）&lt;/a&gt;进行计费，因此您无需管理单独的提供商 API 密钥。&lt;/p&gt;
&lt;p&gt;第三方模型请求将通过您账户的默认网关（Gateway）进行路由，该网关会在首次使用时自动创建。若要通过特定网关路由请求，请添加 &lt;code&gt;cf-aig-gateway-id&lt;/code&gt; 标头。&lt;/p&gt;
&lt;p&gt;如果您已经通过现有的 REST API 调用 Workers AI 模型，该路径（&lt;code&gt;/ai/run/@cf/{model}&lt;/code&gt;）将继续有效。若要通过 AI Gateway 调用 Workers AI 模型，请使用 &lt;code&gt;@cf/&lt;/code&gt; 模型前缀（例如，&lt;code&gt;@cf/moonshotai/kimi-k2.6&lt;/code&gt;）并包含 &lt;code&gt;cf-aig-gateway-id&lt;/code&gt; 标头来指定要路由到的网关。&lt;/p&gt;
&lt;p&gt;欲了解更多细节和示例，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/ai-gateway/usage/rest-api/&quot;&gt;REST API 文档&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Thu, 21 May 2026 00:00:00 GMT</pubDate><product>AI Gateway</product><category>AI Gateway</category></item><item><title>Workers VPC - 从 Workers VPC 访问 Cloudflare WAN 目标</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-05-21-vpc-networks-cloudflare-wan/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-05-21-vpc-networks-cloudflare-wan/</guid><description>
&lt;p&gt;You can now use &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers-vpc/configuration/vpc-networks/&quot;&gt;VPC 网络（VPC Network）&lt;/a&gt; 绑定（binding）与 &lt;code&gt;network_id: &quot;cf1:network&quot;&lt;/code&gt; 从 Workers 访问您的整个私有网络，包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/cloudflare-one/networks/connectors/cloudflare-mesh/&quot;&gt;Cloudflare Mesh&lt;/a&gt; 节点和客户端设备&lt;/li&gt;
&lt;li&gt;通过 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/cloudflare-one/networks/connectors/cloudflare-tunnel/&quot;&gt;Cloudflare Tunnel&lt;/a&gt; 或 Cloudflare Mesh 宣告的子网路由和主机名路由&lt;/li&gt;
&lt;li&gt;通过 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/cloudflare-wan/&quot;&gt;Cloudflare WAN&lt;/a&gt; 接入端（on-ramps）连接的目标 —— GRE、IPsec 和 CNI&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这意味着单个 VPC 网络绑定可以将 Worker 请求路由到私有服务，无论这些服务是如何连接到 Cloudflare 的：是通过来自云 VPC 的 Cloudflare Tunnel、私有子网上的 Mesh 节点，还是通过来自您的数据中心或分支机构站点的 Cloudflare WAN 接入端。&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;vpc_networks&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;binding&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;PRIVATE_NETWORK&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;network_id&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;cf1:network&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;remote&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;vpc_networks&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;binding = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;PRIVATE_NETWORK&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;network_id = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;cf1:network&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;remote = &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://cloudflaredoc.ubitools.com/Users/jt.gui/workspace/astro/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;在运行时，您传给 &lt;code&gt;fetch()&lt;/code&gt; 的 URL 决定了目标：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Reach a service behind a Cloudflare WAN IPsec on-ramp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; response&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;PRIVATE_NETWORK&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;http://10.50.0.100:8080/api&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;aside role=&quot;note&quot; aria-label=&quot;说明&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-info); --_t: var(--nb-info-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:info&quot;&gt;&lt;symbol id=&quot;ai:ph:info&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:ph:info&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;说明&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;对于位于 Cloudflare WAN 接入端（GRE、IPsec 或 CNI）后面的目标，您的网络必须将 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/cloudflare-wan/configuration/how-to/configure-cloudflare-source-ips/&quot;&gt;Cloudflare 源 IP 范围&lt;/a&gt; 路由回该接入端，以便答复流量返回到 Cloudflare。如果没有此路由，有状态流将失败。这是标准 Cloudflare WAN 引导配置（onboarding）的一部分。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;有关配置选项，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers-vpc/configuration/vpc-networks/&quot;&gt;VPC 网络（VPC Networks）&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Thu, 21 May 2026 00:00:00 GMT</pubDate><product>Workers VPC</product><category>Workers VPC</category></item><item><title>Artifacts, Queues - 针对 Artifacts 生命周期事件的事件订阅</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-05-19-event-subscriptions/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-05-19-event-subscriptions/</guid><description>&lt;p&gt;您现在可以接收针对 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/artifacts/&quot;&gt;Artifacts&lt;/a&gt; 仓库更改的&lt;a href=&quot;https://cloudflaredoc.ubitools.com/queues/event-subscriptions/&quot;&gt;事件通知&lt;/a&gt;，并在 Worker 中使用它们来构建提交驱动的自动化。&lt;/p&gt;
&lt;p&gt;这允许您：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在创建或导入仓库时运行自定义工作流。&lt;/li&gt;
&lt;li&gt;在代理（agent）向仓库推送代码时启动构建并部署更改。&lt;/li&gt;
&lt;li&gt;在每次推送时触发评审代理。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;可用事件包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;账户级别事件&lt;/strong&gt;（&lt;code&gt;artifacts&lt;/code&gt; 源）— &lt;code&gt;repo.created&lt;/code&gt;、&lt;code&gt;repo.deleted&lt;/code&gt;、&lt;code&gt;repo.forked&lt;/code&gt;、&lt;code&gt;repo.imported&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;仓库级别事件&lt;/strong&gt;（&lt;code&gt;artifacts.repo&lt;/code&gt; 源）— &lt;code&gt;pushed&lt;/code&gt;、&lt;code&gt;cloned&lt;/code&gt;、&lt;code&gt;fetched&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;要了解更多信息，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/artifacts/guides/event-subscriptions/&quot;&gt;Artifacts 文档&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Tue, 19 May 2026 00:00:00 GMT</pubDate><product>Artifacts</product><category>Artifacts</category><category>Queues</category></item><item><title>Artifacts - 使用 Wrangler CLI 管理 Artifacts 命名空间和仓库</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-05-18-wrangler-support/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-05-18-wrangler-support/</guid><description>&lt;p&gt;您现在可以直接从 Wrangler CLI 管理 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/artifacts/&quot;&gt;Artifacts&lt;/a&gt; 命名空间、仓库以及仓库范围的令牌。&lt;/p&gt;
&lt;p&gt;可用命令：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;wrangler artifacts namespaces list&lt;/code&gt; — 列出您账户中的 Artifacts 命名空间。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wrangler artifacts namespaces get&lt;/code&gt; — 获取命名空间的元数据。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wrangler artifacts repos create&lt;/code&gt; — 在命名空间中创建仓库。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wrangler artifacts repos list&lt;/code&gt; — 列出命名空间中的仓库。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wrangler artifacts repos get&lt;/code&gt; — 获取仓库的元数据。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wrangler artifacts repos delete&lt;/code&gt; — 删除仓库。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wrangler artifacts repos issue-token&lt;/code&gt; — 签发用于 Git 访问的仓库范围令牌。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;要开始使用，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/wrangler/commands/artifacts/&quot;&gt;Wrangler Artifacts 命令文档&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate><product>Artifacts</product><category>Artifacts</category></item><item><title>Workers - 在 Wrangler 和 Vite 中通过 Cloudflare Tunnel 共享本地开发服务器</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-05-18-local-dev-tunnels/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-05-18-local-dev-tunnels/</guid><description>&lt;p&gt;现在，当使用 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/wrangler/&quot;&gt;Wrangler&lt;/a&gt; 或 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/vite-plugin/&quot;&gt;Cloudflare Vite 插件&lt;/a&gt;时，您可以通过 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/tunnel/&quot;&gt;Cloudflare Tunnel&lt;/a&gt; 共享本地开发会话并获得一个公共 URL。当您需要共享预览、测试 Webhook 或从其他设备访问您的应用程序时，这非常有用。&lt;/p&gt;
&lt;img src=&quot;https://cloudflaredoc.ubitools.com/_astro/vite-local-dev-tunnel.CW4xpgIR_ZmyQ8a.webp&quot; alt=&quot;Vite 本地开发隧道演示&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1000&quot; height=&quot;678&quot;&gt;
&lt;p&gt;这使您可以：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用随机的 &lt;code&gt;*.trycloudflare.com&lt;/code&gt; 主机名启动一个临时的&lt;a href=&quot;https://cloudflaredoc.ubitools.com/tunnel/setup/#quick-tunnels-development&quot;&gt;快捷隧道（Quick tunnel）&lt;/a&gt;，或者&lt;/li&gt;
&lt;li&gt;使用现有的&lt;a href=&quot;https://cloudflaredoc.ubitools.com/tunnel/setup/#create-a-tunnel&quot;&gt;命名隧道（named tunnel）&lt;/a&gt;以获得稳定的主机名，并使用 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/cloudflare-one/access-controls/&quot;&gt;Cloudflare Access&lt;/a&gt; 限制访问。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;要启动隧道，请在开发服务器运行时在 Wrangler 中按 &lt;code&gt;t&lt;/code&gt; 或在 Vite 中按 &lt;code&gt;t + Enter&lt;/code&gt;。有关设置命名隧道的详细信息，请参阅&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/local-development/local-dev-tunnels/&quot;&gt;共享本地开发服务器&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Hyperdrive, Workers - Hyperdrive 开放数据库连接池大小指标</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-05-15-hyperdrive-pool-size-metrics/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-05-15-hyperdrive-pool-size-metrics/</guid><description>&lt;p&gt;您现在可以查看 Hyperdrive 数据库连接池的大小，从而使您能够自诊断连接问题。使用 Cloudflare 仪表板或 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/analytics/graphql-api/getting-started/&quot;&gt;GraphQL Analytics API&lt;/a&gt; 中的 &lt;code&gt;hyperdrivePoolSizesAdaptiveGroups&lt;/code&gt; 数据集，您可以查看每个配置的 &lt;code&gt;waitingClients&lt;/code&gt;、&lt;code&gt;currentPoolSize&lt;/code&gt;、&lt;code&gt;availablePoolSlots&lt;/code&gt; 和 &lt;code&gt;maxPoolSize&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://dash.cloudflare.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare 仪表板&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;中每个 Hyperdrive 配置的 **Metrics（指标）**选项卡中添加了一个新的 **Pool connections（连接池连接）**图表。您可以使用位置选择器，按机场代码钻取托管连接池的特定位置。&lt;/p&gt;
&lt;img src=&quot;https://cloudflaredoc.ubitools.com/_astro/hyperdrive-pool-size-metrics-chart.DZxLTFgB_3zcIK.webp&quot; alt=&quot;Hyperdrive 池大小指标图表&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2604&quot; height=&quot;890&quot;&gt;
&lt;p&gt;该图表显示：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Waiting clients（等待中的客户端）&lt;/strong&gt;：等待可用连接的客户端请求。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Open connections（打开的连接）&lt;/strong&gt;：到您数据库的活动连接。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pool size maximum（最大连接池大小）&lt;/strong&gt;：您配置的源站连接限制。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;连接争用表现为等待中的客户端激增，或者当打开的连接持续接近最大连接池大小时。如果您的打开连接经常接近此限制，请考虑联系 Cloudflare 以&lt;a href=&quot;https://cloudflaredoc.ubitools.com/hyperdrive/platform/limits/#request-a-limit-increase&quot;&gt;提高您的 Hyperdrive 连接限制&lt;/a&gt;。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;连接池大小指标&quot;&gt;连接池大小指标&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#连接池大小指标&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/analytics/graphql-api/getting-started/&quot;&gt;GraphQL Analytics API&lt;/a&gt; 中的 &lt;code&gt;hyperdrivePoolSizesAdaptiveGroups&lt;/code&gt; 数据集为每个 Hyperdrive 配置公开了以下关键连接池指标：&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;avg&lt;/code&gt; 下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;currentPoolSize&lt;/code&gt;&lt;/strong&gt; — 当前在池中打开的平均连接数。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;availablePoolSlots&lt;/code&gt;&lt;/strong&gt; — 可供检出的平均连接池连接数。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;waitingClients&lt;/code&gt;&lt;/strong&gt; — 等待池中连接的平均客户端数。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在 &lt;code&gt;max&lt;/code&gt; 下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;maxPoolSize&lt;/code&gt;&lt;/strong&gt; — 配置的连接池最大大小。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;currentPoolSize&lt;/code&gt;&lt;/strong&gt; — 池中打开的峰值连接数。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;waitingClients&lt;/code&gt;&lt;/strong&gt; — 等待池中连接的峰值客户端数。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;有关更多信息，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/hyperdrive/observability/metrics/&quot;&gt;Metrics and analytics&lt;/a&gt; 和 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/hyperdrive/concepts/connection-pooling/&quot;&gt;Connection pooling&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate><product>Hyperdrive</product><category>Hyperdrive</category><category>Workers</category></item><item><title>R2 SQL - R2 SQL 现在支持 JOIN、子查询和多表查询</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-05-14-joins-subqueries-multi-table-queries/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-05-14-joins-subqueries-multi-table-queries/</guid><description>&lt;p&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2-sql/&quot;&gt;R2 SQL&lt;/a&gt; 是 Cloudflare 的无服务器分布式 SQL 引擎，用于查询存储在 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2/data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt; 中的 &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Apache Iceberg&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 表。R2 SQL 直接在 Cloudflare 的全球网络上运行，无需管理任何基础设施，因此您可以分析 R2 中的数据，而无需将其导出到外部仓库。&lt;/p&gt;
&lt;p&gt;R2 SQL 现在支持在单个查询中连接多个 Iceberg 表。您可以使用 JOIN 组合表，使用子查询进行过滤，并定义多表 CTE 以构建复杂的分析查询。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;新功能&quot;&gt;新功能&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#新功能&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;JOIN&lt;/strong&gt; — &lt;code&gt;INNER JOIN&lt;/code&gt;、&lt;code&gt;LEFT JOIN&lt;/code&gt;、&lt;code&gt;RIGHT JOIN&lt;/code&gt;、&lt;code&gt;FULL OUTER JOIN&lt;/code&gt;、&lt;code&gt;CROSS JOIN&lt;/code&gt; 以及隐式连接（&lt;code&gt;FROM&lt;/code&gt; 中以逗号分隔，且条件在 &lt;code&gt;WHERE&lt;/code&gt; 中）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;子查询&lt;/strong&gt; — &lt;code&gt;IN&lt;/code&gt; / &lt;code&gt;NOT IN&lt;/code&gt;、&lt;code&gt;EXISTS&lt;/code&gt; / &lt;code&gt;NOT EXISTS&lt;/code&gt;、&lt;code&gt;SELECT&lt;/code&gt; / &lt;code&gt;WHERE&lt;/code&gt; / &lt;code&gt;HAVING&lt;/code&gt; 中的标量子查询，以及派生表（&lt;code&gt;FROM&lt;/code&gt; 中的子查询）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多表 CTE&lt;/strong&gt; — &lt;code&gt;WITH&lt;/code&gt; 子句可以引用不同的表并包含 JOIN&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自连接&lt;/strong&gt; — 使用不同的别名将表与自身连接&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多路连接&lt;/strong&gt; — 在单个查询中连接三个或更多表&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;示例&quot;&gt;示例&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#示例&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;带有聚合的双表-join&quot;&gt;带有聚合的双表 JOIN&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#带有聚合的双表-join&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; z&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;domain&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;plan&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; request_count&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;zones&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; z&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;INNER JOIN&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;http_requests&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; h &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;ON&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; z&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;zone_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; h&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;zone_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; z&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;plan&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;enterprise&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;GROUP BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; z&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;domain&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;plan&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;ORDER BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; request_count &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;DESC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;LIMIT&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 20&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;exists-子查询&quot;&gt;&lt;code&gt;EXISTS&lt;/code&gt; 子查询&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#exists-子查询&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; z&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;domain&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;plan&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;zones&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; z&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; EXISTS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;firewall_events&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; f&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; f&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;zone_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; z&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;zone_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; AND&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; f&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;block&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;ORDER BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; z&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;domain&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;LIMIT&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 20&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;带有-join-的多表-cte&quot;&gt;带有 JOIN 的多表 CTE&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#带有-join-的多表-cte&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;WITH&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; top_zones &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; zone_id, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; req_count&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;http_requests&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    GROUP BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; zone_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    ORDER BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; req_count &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;DESC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    LIMIT&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 50&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;zone_threats &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; zone_id, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; threat_count&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;firewall_events&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; risk_score &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    GROUP BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; zone_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; tz&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;zone_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;tz&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;req_count&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;COALESCE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;zt&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;threat_count&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; threat_count&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; top_zones tz&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;LEFT JOIN&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; zone_threats zt &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;ON&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; tz&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;zone_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; zt&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;zone_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;ORDER BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; tz&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;req_count&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; DESC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;LIMIT&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 20&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;有关完整语法参考，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2-sql/sql-reference/&quot;&gt;SQL 参考&lt;/a&gt;。有关连接性能指南，请参阅&lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2-sql/reference/limitations-best-practices/&quot;&gt;限制与最佳实践&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate><product>R2 SQL</product><category>R2 SQL</category></item><item><title>Workers - Workers 仪表板中新增的域名（Domains）选项卡</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-05-14-domains-tab/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-05-14-domains-tab/</guid><description>
&lt;p&gt;在您的 Worker 仪表板中，现在有一个专用的 &lt;strong&gt;Domains（域名）&lt;/strong&gt; 选项卡，您可以在其中通过 Cloudflare Registrar 购买新域名并使其自动连接，添加&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/configuration/routing/custom-domains/&quot;&gt;现有域名&lt;/a&gt;，并在一个地方管理所有 Worker 的路由。&lt;/p&gt;
&lt;img src=&quot;https://cloudflaredoc.ubitools.com/_astro/domains-tab.Cey2Oyr-_B4kIf.webp&quot; alt=&quot;Workers 仪表板中新增的域名（Domains）选项卡&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1678&quot; height=&quot;1026&quot;&gt;
&lt;p&gt;您还可以启用或禁用您的 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/configuration/routing/workers-dev/&quot;&gt;&lt;code&gt;workers.dev&lt;/code&gt; 子域名&lt;/a&gt; 和 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/versions-and-deployments/preview-urls/&quot;&gt;预览 URL (Preview URLs)&lt;/a&gt;，将它们置于 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/cloudflare-one/access-controls/&quot;&gt;Cloudflare Access&lt;/a&gt; 保护之下以要求登录，并直接跳转到任何已连接域名的 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/analytics/&quot;&gt;分析&lt;/a&gt; 或域名概览。&lt;/p&gt;
&lt;p&gt;要开始使用，请转到 &lt;strong&gt;Workers &amp;amp; Pages&lt;/strong&gt;，选择一个 Worker，然后打开 &lt;strong&gt;Domains（域名）&lt;/strong&gt; 选项卡。&lt;/p&gt;
&lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers-and-pages&quot; data-nb-button class=&quot;group inline-flex w-max shrink-0 items-center justify-center rounded-full font-medium whitespace-nowrap no-underline shadow-xs transition-colors cursor-pointer select-none focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-2 disabled:cursor-not-allowed disabled:opacity-50 bg-primary text-primary-foreground hover:bg-primary-hover h-9 gap-1.5 px-3 text-sm&quot; target=&quot;_blank&quot;&gt;Go to &lt;strong&gt;Workers &amp;amp; Pages&lt;/strong&gt;&amp;nbsp;&amp;#8599;&lt;/a&gt;</description><pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Agents, Workers - Agents SDK v0.12.4：对话恢复、路由重试、持久化 Think 提交及 Voice 连接控制</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-05-13-agents-sdk-v0.12.4/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-05-13-agents-sdk-v0.12.4/</guid><description>
&lt;p&gt;&lt;a href=&quot;https://github.com/cloudflare/agents&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Agents SDK&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 的最新版本带来了更可靠的对话恢复、修复了重连时的 Agent 状态同步、添加了 Think 的持久化提交、暴露了路由重试配置，并为 Voice agents 添加了连接控制。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;对话恢复改进&quot;&gt;对话恢复改进&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#对话恢复改进&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;@cloudflare/ai-chat&lt;/code&gt; 现在在浏览器或客户端流中断时保持服务端 turn 继续运行。这对于长时间运行的 AI 响应场景非常有用，例如用户刷新页面、关闭标签页或临时断线。调用 &lt;code&gt;stop()&lt;/code&gt; 仍会取消服务端 turn。&lt;/p&gt;
&lt;p&gt;如果浏览器或客户端中止也应取消服务端 turn，请设置 &lt;code&gt;cancelOnClientAbort: true&lt;/code&gt;：&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; chat&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; useAgentChat&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	agent: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;assistant&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;user-123&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	cancelOnClientAbort: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;tsx&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;tsx&quot; data-nb-lang=&quot;tsx&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; chat&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; useAgentChat&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	agent: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;assistant&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;user-123&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	cancelOnClientAbort: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://cloudflaredoc.ubitools.com/Users/jt.gui/workspace/astro/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;主要 bug 修复：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对话流恢复协商不再在 replay 与关闭的 WebSocket 连接竞争时抛出异常。&lt;/li&gt;
&lt;li&gt;恢复的对话续传不再在原始 socket 在终端响应前断开时，导致 &lt;code&gt;useAgentChat&lt;/code&gt; 卡在流式传输状态。&lt;/li&gt;
&lt;li&gt;审批自动续传保留推理部分，并在最终消息中持久化续传推理。&lt;/li&gt;
&lt;li&gt;当恢复的流从备用观察路径切换到传输拥有的流时，&lt;code&gt;isServerStreaming&lt;/code&gt; 现在能正确重置。&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;agent-状态和路由修复&quot;&gt;Agent 状态和路由修复&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#agent-状态和路由修复&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;agents@0.12.4&lt;/code&gt; 防止在 WebSocket 连接设置期间出现重复的初始状态帧。这避免了过时的初始状态消息覆盖客户端已发送的状态更新。&lt;/p&gt;
&lt;p&gt;当工具调用跨越 Durable Object 重启时，Agent 恢复也更加可靠。恢复现在会将用户完成钩子推迟到 agent 启动后，并隔离钩子失败，因此一个失败的钩子不会阻止其他恢复的运行完成。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;getAgentByName()&lt;/code&gt; 现在支持 &lt;code&gt;routingRetry&lt;/code&gt;，用于处理瞬态 Durable Object 路由失败：&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { getAgentByName } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;agents&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; getAgentByName&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(env.AssistantAgent, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;user-123&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	routingRetry: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		maxAttempts: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { getAgentByName } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;agents&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; getAgentByName&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(env.AssistantAgent, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;user-123&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	routingRetry: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		maxAttempts: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;持久化-think-提交&quot;&gt;持久化 Think 提交&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#持久化-think-提交&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;@cloudflare/think&lt;/code&gt; 现在支持持久化的程序化提交。&lt;code&gt;submitMessages()&lt;/code&gt; 提供持久化接受、幂等重试、状态检查、取消和清理功能，适用于应在调用方返回后继续运行的服务器驱动 turn。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Think.chat()&lt;/code&gt; RPC turn 现在在对话恢复 fiber 内运行并持久化其流式数据块。中断的子 agent turn 可以恢复部分输出，而不必从头开始。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ChatOptions.tools&lt;/code&gt; 已从 TypeScript API 中移除。请在子 agent 上定义持久化工具，或使用 agent 工具进行编排。遗留调用者传入的运行时 &lt;code&gt;options.tools&lt;/code&gt; 值将被忽略并产生警告。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;think-消息裁剪行为变更&quot;&gt;Think 消息裁剪行为变更&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#think-消息裁剪行为变更&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;@cloudflare/think&lt;/code&gt; 默认不再对模型上下文应用 &lt;code&gt;pruneMessages({ toolCalls: &quot;before-last-2-messages&quot; })&lt;/code&gt;。以前的默认行为可能会从较长的多轮流程中剥离客户端工具结果。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;truncateOlderMessages&lt;/code&gt; 仍照常运行，因此上下文成本保持有界。依赖旧的激进裁剪行为的子类可以从 &lt;code&gt;beforeTurn&lt;/code&gt; 重新启用：&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { Think } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/think&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { pruneMessages } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;ai&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Think&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	beforeTurn&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			messages: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;pruneMessages&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				messages: ctx.messages,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				toolCalls: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;before-last-2-messages&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			}),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { Think } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/think&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { pruneMessages } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;ai&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Think&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	beforeTurn&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			messages: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;pruneMessages&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				messages: ctx.messages,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				toolCalls: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;before-last-2-messages&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			}),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;voice-agent-连接控制&quot;&gt;Voice agent 连接控制&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#voice-agent-连接控制&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;@cloudflare/voice&lt;/code&gt; 为 &lt;code&gt;useVoiceAgent&lt;/code&gt; 添加了 &lt;code&gt;enabled&lt;/code&gt; 选项。React 应用现在可以延迟创建和连接 &lt;code&gt;VoiceClient&lt;/code&gt;，直到所需条件（如能力令牌）就绪。&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; voice&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; useVoiceAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	agent: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;MyVoiceAgent&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	enabled: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Boolean&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(token),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;tsx&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;tsx&quot; data-nb-lang=&quot;tsx&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; voice&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; useVoiceAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	agent: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;MyVoiceAgent&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	enabled: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Boolean&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(token),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;此版本还修复了 Workers AI 语音转文字会话的边界情况，以及 AI SDK &lt;code&gt;textStream&lt;/code&gt; 响应中 &lt;code&gt;withVoice&lt;/code&gt; 文本流的问题。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;其他改进&quot;&gt;其他改进&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#其他改进&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Streamable HTTP 路由&lt;/strong&gt; — 当没有独立 SSE 流可用时，服务器到客户端的请求现在通过原始 POST 流路由。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结构化工具输出&lt;/strong&gt; — 裁剪旧消息或超大持久化行时会保留工具输出的形状。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;非对话 Think 工具步骤&lt;/strong&gt; — Think agent 工具子项可在不发出助手文本的情况下完成，并可通过 &lt;code&gt;getAgentToolOutput&lt;/code&gt; 返回结构化输出。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;子 agent 调度&lt;/strong&gt; — 当拥有 facet 注册条目不再存在时，过时的子 agent 调度行会被清理。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;@cloudflare/codemode&lt;/code&gt;&lt;/strong&gt; — 添加了带有 iframe sandbox 执行器的浏览器安全导出，并在 sandbox 内解析 OpenAPI 规范以避免 Worker Loader RPC 大小限制。&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;升级&quot;&gt;升级&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#升级&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;升级到最新版本：&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; i&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; agents@latest&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; @cloudflare/ai-chat@latest&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; @cloudflare/think@latest&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; @cloudflare/voice@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;更多信息请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/agents/runtime/&quot;&gt;Agents API 参考&lt;/a&gt; 和&lt;a href=&quot;https://cloudflaredoc.ubitools.com/agents/communication-channels/chat/chat-agents/&quot;&gt;对话 agents 文档&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Wed, 13 May 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>Containers - 通过 Wrangler 进行 SSH 连接现已为容器默认启用</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-05-12-ssh-enabled-by-default/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-05-12-ssh-enabled-by-default/</guid><description>
&lt;p&gt;通过 Wrangler 进行 SSH 连接现已为&lt;a href=&quot;https://cloudflaredoc.ubitools.com/containers/&quot;&gt;容器&lt;/a&gt;默认启用。此前，您必须在容器配置中将 &lt;code&gt;ssh.enabled&lt;/code&gt; 设置为 &lt;code&gt;true&lt;/code&gt; 才能连接。&lt;/p&gt;
&lt;p&gt;此更改不会在您的容器上暴露任何公开可访问的端口。SSH 服务仅可通过 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers/wrangler/commands/containers/#containers-ssh&quot;&gt;&lt;code&gt;wrangler containers ssh&lt;/code&gt;&lt;/a&gt; 访问，该命令会对您的 Cloudflare 账户进行身份验证。您还需要在 &lt;code&gt;authorized_keys&lt;/code&gt; 中添加 &lt;code&gt;ssh-ed25519&lt;/code&gt; 公钥才能连接，因此仅启用 SSH 并不能授予访问权限。&lt;/p&gt;
&lt;p&gt;要连接，请在容器配置中添加公钥并运行 &lt;code&gt;wrangler containers ssh &amp;lt;INSTANCE_ID&amp;gt;&lt;/code&gt;：&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;containers&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;authorized_keys&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;					&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&amp;#x3C;NAME&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;					&quot;public_key&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&amp;#x3C;YOUR_PUBLIC_KEY_HERE&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;containers&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;containers&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;authorized_keys&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;name = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&amp;#x3C;NAME&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;public_key = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&amp;#x3C;YOUR_PUBLIC_KEY_HERE&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://cloudflaredoc.ubitools.com/Users/jt.gui/workspace/astro/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;要禁用 SSH，请在容器配置中将 &lt;code&gt;ssh.enabled&lt;/code&gt; 设置为 &lt;code&gt;false&lt;/code&gt;：&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;containers&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;ssh&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;				&quot;enabled&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;containers&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;containers&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;enabled = &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;false&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;如需更多信息，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/containers/ssh/&quot;&gt;SSH 文档&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate><product>Containers</product><category>Containers</category></item><item><title>R2 - R2 Data Catalog 现在通过 GraphQL Analytics API 公开指标</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-05-12-r2-data-catalog-graphql-analytics/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-05-12-r2-data-catalog-graphql-analytics/</guid><description>&lt;p&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2/data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt; 是直接内置于 R2 存储桶的托管 Apache Iceberg 数据目录，允许您将 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2-sql/&quot;&gt;R2 SQL&lt;/a&gt;、Spark、Snowflake 和 DuckDB 等查询引擎连接到 R2 中的数据。&lt;/p&gt;
&lt;p&gt;您现在可以通过 Cloudflare 的 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/analytics/graphql-api/&quot;&gt;GraphQL Analytics API&lt;/a&gt; 查询 R2 Data Catalog 仓库的分析数据。两个新数据集现已可用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;r2CatalogDataOperationsAdaptiveGroups&lt;/code&gt;&lt;/strong&gt; 跟踪向目录发出的 Iceberg REST API 请求，包括操作类型、请求时长、HTTP 状态和请求体字节数。使用此数据集可监控跨仓库、命名空间和表的请求量和延迟。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;r2CatalogTableMaintenanceAdaptiveGroups&lt;/code&gt;&lt;/strong&gt; 跟踪表维护作业，例如压缩和快照过期。使用此数据集可监控作业成功率、处理的文件数、读写字节数和作业时长。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;两个数据集均支持按仓库名称、命名空间、表名称和时间范围过滤。它们还包括时长指标的百分位聚合。&lt;/p&gt;
&lt;p&gt;有关详细的 Schema 信息和示例查询，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/r2/data-catalog/observability/metrics/&quot;&gt;R2 Data Catalog 指标和分析文档&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate><product>R2</product><category>R2</category></item><item><title>Workers AI - Workers AI 上计划的模型弃用</title><link>https://cloudflaredoc.ubitools.com/changelog/post/2026-05-08-planned-model-deprecations/</link><guid isPermaLink="true">https://cloudflaredoc.ubitools.com/changelog/post/2026-05-08-planned-model-deprecations/</guid><description>&lt;p&gt;我们正在更新 Workers AI 模型目录，以为新发布的版本让出空间。请在弃用日期之前更新您的应用程序，以移除对下列模型的引用。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;推荐替代方案&quot;&gt;推荐替代方案&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#推荐替代方案&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.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; — 具有多轮工具调用和编码能力的快速多语言模型。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers-ai/models/gemma-4-26b-a4b-it/&quot;&gt;&lt;code&gt;@cf/google/gemma-4-26b-a4b-it&lt;/code&gt;&lt;/a&gt; — 具有视觉和工具调用功能的高效开源模型。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers-ai/models/kimi-k2.6/&quot;&gt;&lt;code&gt;@cf/moonshotai/kimi-k2.6&lt;/code&gt;&lt;/a&gt; — 适用于智能体工作负载和编码且功能强大的工具调用与视觉模型。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;有关定价，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers-ai/platform/pricing/&quot;&gt;Workers AI 定价页面&lt;/a&gt;。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;kimi-k25&quot;&gt;Kimi K2.5&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#kimi-k25&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;我们最初表示 Kimi K2.5 将于 2026 年 5 月 10 日弃用，但我们已将弃用日期延长至 2026 年 5 月 30 日。请求将于 2026 年 5 月 30 日自动别名（aliased）到价格更高的 Kimi K2.6。请在 2026 年 5 月 30 日之前查看 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers-ai/models/kimi-k2.6/&quot;&gt;&lt;code&gt;@cf/moonshotai/kimi-k2.6&lt;/code&gt;&lt;/a&gt; 的定价和模型能力，以确保该模型满足您的需求。&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;于-2026-年-5-月-30-日弃用的模型&quot;&gt;于 2026 年 5 月 30 日弃用的模型&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#于-2026-年-5-月-30-日弃用的模型&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@cf/moonshotai/kimi-k2.5&lt;/code&gt; --&amp;gt; &lt;code&gt;@cf/moonshotai/kimi-k2.6&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@hf/meta-llama/meta-llama-3-8b-instruct&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cf/meta/llama-3-8b-instruct&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cf/meta/llama-3-8b-instruct-awq&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cf/meta/llama-3.1-8b-instruct&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cf/meta/llama-3.1-8b-instruct-awq&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cf/meta/llama-3.1-70b-instruct&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cf/meta/llama-2-7b-chat-int8&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cf/meta/llama-2-7b-chat-fp16&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cf/mistral/mistral-7b-instruct-v0.1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@hf/mistral/mistral-7b-instruct-v0.2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@hf/google/gemma-7b-it&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cf/google/gemma-3-12b-it&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@hf/nousresearch/hermes-2-pro-mistral-7b&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cf/microsoft/phi-2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cf/defog/sqlcoder-7b-2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cf/unum/uform-gen2-qwen-500m&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cf/facebook/bart-large-cnn&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;保持活跃的变体&quot;&gt;保持活跃的变体&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#保持活跃的变体&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;模型的 &lt;code&gt;-fast&lt;/code&gt; 和 &lt;code&gt;-lora&lt;/code&gt; 变体将保持活跃，包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@cf/meta/llama-3.3-70b-instruct-fp8-fast&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cf/meta/llama-3.1-8b-instruct-fast&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cf/google/gemma-7b-it-lora&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cf/google/gemma-2b-it-lora&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cf/mistral/mistral-7b-instruct-v0.2-lora&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cf/meta-llama/llama-2-7b-chat-hf-lora&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;LoRA 模型在未来可能会被弃用。我们将向目录中添加更多 LoRA 功能，并会在新的 LoRA 模型上线时进行沟通，以便在弃用旧模型之前给用户留出训练新 LoRA 的时间。&lt;/p&gt;
&lt;p&gt;如需获取可用模型的完整列表，请参阅 &lt;a href=&quot;https://cloudflaredoc.ubitools.com/workers-ai/models/&quot;&gt;Workers AI 模型目录&lt;/a&gt;。&lt;/p&gt;</description><pubDate>Fri, 08 May 2026 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category></item></channel></rss>