<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Cloudflare changelogs | Workers</title><description>Cloudflare changelogs for Workers</description><link>https://cloudflaredoc.ubitools.com/changelog/</link><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-18adb4e8-5930-4adf-be25-95fa9c2ec81d-npm&quot; id=&quot;pm-tab-pm-18adb4e8-5930-4adf-be25-95fa9c2ec81d-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-18adb4e8-5930-4adf-be25-95fa9c2ec81d-yarn&quot; id=&quot;pm-tab-pm-18adb4e8-5930-4adf-be25-95fa9c2ec81d-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-18adb4e8-5930-4adf-be25-95fa9c2ec81d-pnpm&quot; id=&quot;pm-tab-pm-18adb4e8-5930-4adf-be25-95fa9c2ec81d-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-18adb4e8-5930-4adf-be25-95fa9c2ec81d-bun&quot; id=&quot;pm-tab-pm-18adb4e8-5930-4adf-be25-95fa9c2ec81d-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-18adb4e8-5930-4adf-be25-95fa9c2ec81d-npm&quot; aria-labelledby=&quot;pm-tab-pm-18adb4e8-5930-4adf-be25-95fa9c2ec81d-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-18adb4e8-5930-4adf-be25-95fa9c2ec81d-yarn&quot; aria-labelledby=&quot;pm-tab-pm-18adb4e8-5930-4adf-be25-95fa9c2ec81d-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-18adb4e8-5930-4adf-be25-95fa9c2ec81d-pnpm&quot; aria-labelledby=&quot;pm-tab-pm-18adb4e8-5930-4adf-be25-95fa9c2ec81d-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-18adb4e8-5930-4adf-be25-95fa9c2ec81d-bun&quot; aria-labelledby=&quot;pm-tab-pm-18adb4e8-5930-4adf-be25-95fa9c2ec81d-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>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>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-285d2fe1-2305-4fdd-a5ed-a05ccabed2b8-npm&quot; id=&quot;pm-tab-pm-285d2fe1-2305-4fdd-a5ed-a05ccabed2b8-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-285d2fe1-2305-4fdd-a5ed-a05ccabed2b8-yarn&quot; id=&quot;pm-tab-pm-285d2fe1-2305-4fdd-a5ed-a05ccabed2b8-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-285d2fe1-2305-4fdd-a5ed-a05ccabed2b8-pnpm&quot; id=&quot;pm-tab-pm-285d2fe1-2305-4fdd-a5ed-a05ccabed2b8-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-285d2fe1-2305-4fdd-a5ed-a05ccabed2b8-bun&quot; id=&quot;pm-tab-pm-285d2fe1-2305-4fdd-a5ed-a05ccabed2b8-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-285d2fe1-2305-4fdd-a5ed-a05ccabed2b8-npm&quot; aria-labelledby=&quot;pm-tab-pm-285d2fe1-2305-4fdd-a5ed-a05ccabed2b8-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-285d2fe1-2305-4fdd-a5ed-a05ccabed2b8-yarn&quot; aria-labelledby=&quot;pm-tab-pm-285d2fe1-2305-4fdd-a5ed-a05ccabed2b8-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-285d2fe1-2305-4fdd-a5ed-a05ccabed2b8-pnpm&quot; aria-labelledby=&quot;pm-tab-pm-285d2fe1-2305-4fdd-a5ed-a05ccabed2b8-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-285d2fe1-2305-4fdd-a5ed-a05ccabed2b8-bun&quot; aria-labelledby=&quot;pm-tab-pm-285d2fe1-2305-4fdd-a5ed-a05ccabed2b8-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>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>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>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-bb31e9b2-a44a-408a-8761-2a44a23ccba6-npm&quot; id=&quot;pm-tab-pm-bb31e9b2-a44a-408a-8761-2a44a23ccba6-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-bb31e9b2-a44a-408a-8761-2a44a23ccba6-yarn&quot; id=&quot;pm-tab-pm-bb31e9b2-a44a-408a-8761-2a44a23ccba6-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-bb31e9b2-a44a-408a-8761-2a44a23ccba6-pnpm&quot; id=&quot;pm-tab-pm-bb31e9b2-a44a-408a-8761-2a44a23ccba6-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-bb31e9b2-a44a-408a-8761-2a44a23ccba6-bun&quot; id=&quot;pm-tab-pm-bb31e9b2-a44a-408a-8761-2a44a23ccba6-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-bb31e9b2-a44a-408a-8761-2a44a23ccba6-npm&quot; aria-labelledby=&quot;pm-tab-pm-bb31e9b2-a44a-408a-8761-2a44a23ccba6-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-bb31e9b2-a44a-408a-8761-2a44a23ccba6-yarn&quot; aria-labelledby=&quot;pm-tab-pm-bb31e9b2-a44a-408a-8761-2a44a23ccba6-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-bb31e9b2-a44a-408a-8761-2a44a23ccba6-pnpm&quot; aria-labelledby=&quot;pm-tab-pm-bb31e9b2-a44a-408a-8761-2a44a23ccba6-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-bb31e9b2-a44a-408a-8761-2a44a23ccba6-bun&quot; aria-labelledby=&quot;pm-tab-pm-bb31e9b2-a44a-408a-8761-2a44a23ccba6-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>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>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-7cc7a7df-6549-4653-b22b-4fc87f50fd09-npm&quot; id=&quot;pm-tab-pm-7cc7a7df-6549-4653-b22b-4fc87f50fd09-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-7cc7a7df-6549-4653-b22b-4fc87f50fd09-yarn&quot; id=&quot;pm-tab-pm-7cc7a7df-6549-4653-b22b-4fc87f50fd09-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-7cc7a7df-6549-4653-b22b-4fc87f50fd09-pnpm&quot; id=&quot;pm-tab-pm-7cc7a7df-6549-4653-b22b-4fc87f50fd09-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-7cc7a7df-6549-4653-b22b-4fc87f50fd09-bun&quot; id=&quot;pm-tab-pm-7cc7a7df-6549-4653-b22b-4fc87f50fd09-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-7cc7a7df-6549-4653-b22b-4fc87f50fd09-npm&quot; aria-labelledby=&quot;pm-tab-pm-7cc7a7df-6549-4653-b22b-4fc87f50fd09-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-7cc7a7df-6549-4653-b22b-4fc87f50fd09-yarn&quot; aria-labelledby=&quot;pm-tab-pm-7cc7a7df-6549-4653-b22b-4fc87f50fd09-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-7cc7a7df-6549-4653-b22b-4fc87f50fd09-pnpm&quot; aria-labelledby=&quot;pm-tab-pm-7cc7a7df-6549-4653-b22b-4fc87f50fd09-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-7cc7a7df-6549-4653-b22b-4fc87f50fd09-bun&quot; aria-labelledby=&quot;pm-tab-pm-7cc7a7df-6549-4653-b22b-4fc87f50fd09-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>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>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>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>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-c4150c56-0947-45d5-8ce9-a48ad59e831f-npm&quot; id=&quot;pm-tab-pm-c4150c56-0947-45d5-8ce9-a48ad59e831f-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-c4150c56-0947-45d5-8ce9-a48ad59e831f-yarn&quot; id=&quot;pm-tab-pm-c4150c56-0947-45d5-8ce9-a48ad59e831f-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-c4150c56-0947-45d5-8ce9-a48ad59e831f-pnpm&quot; id=&quot;pm-tab-pm-c4150c56-0947-45d5-8ce9-a48ad59e831f-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-c4150c56-0947-45d5-8ce9-a48ad59e831f-bun&quot; id=&quot;pm-tab-pm-c4150c56-0947-45d5-8ce9-a48ad59e831f-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-c4150c56-0947-45d5-8ce9-a48ad59e831f-npm&quot; aria-labelledby=&quot;pm-tab-pm-c4150c56-0947-45d5-8ce9-a48ad59e831f-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-c4150c56-0947-45d5-8ce9-a48ad59e831f-yarn&quot; aria-labelledby=&quot;pm-tab-pm-c4150c56-0947-45d5-8ce9-a48ad59e831f-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-c4150c56-0947-45d5-8ce9-a48ad59e831f-pnpm&quot; aria-labelledby=&quot;pm-tab-pm-c4150c56-0947-45d5-8ce9-a48ad59e831f-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-c4150c56-0947-45d5-8ce9-a48ad59e831f-bun&quot; aria-labelledby=&quot;pm-tab-pm-c4150c56-0947-45d5-8ce9-a48ad59e831f-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>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 - 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>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 - 从仪表板和 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>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-72ef665d-ef8f-4d89-bc24-dab4d9750e1c-npm&quot; id=&quot;pm-tab-pm-72ef665d-ef8f-4d89-bc24-dab4d9750e1c-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-72ef665d-ef8f-4d89-bc24-dab4d9750e1c-yarn&quot; id=&quot;pm-tab-pm-72ef665d-ef8f-4d89-bc24-dab4d9750e1c-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-72ef665d-ef8f-4d89-bc24-dab4d9750e1c-pnpm&quot; id=&quot;pm-tab-pm-72ef665d-ef8f-4d89-bc24-dab4d9750e1c-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-72ef665d-ef8f-4d89-bc24-dab4d9750e1c-bun&quot; id=&quot;pm-tab-pm-72ef665d-ef8f-4d89-bc24-dab4d9750e1c-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-72ef665d-ef8f-4d89-bc24-dab4d9750e1c-npm&quot; aria-labelledby=&quot;pm-tab-pm-72ef665d-ef8f-4d89-bc24-dab4d9750e1c-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-72ef665d-ef8f-4d89-bc24-dab4d9750e1c-yarn&quot; aria-labelledby=&quot;pm-tab-pm-72ef665d-ef8f-4d89-bc24-dab4d9750e1c-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-72ef665d-ef8f-4d89-bc24-dab4d9750e1c-pnpm&quot; aria-labelledby=&quot;pm-tab-pm-72ef665d-ef8f-4d89-bc24-dab4d9750e1c-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-72ef665d-ef8f-4d89-bc24-dab4d9750e1c-bun&quot; aria-labelledby=&quot;pm-tab-pm-72ef665d-ef8f-4d89-bc24-dab4d9750e1c-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>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>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></channel></rss>