跳转到内容
搜索文档

更新日志

Cloudflare 的最新更新与改进。

Agents SDK 改进了浏览器自动化、代码执行和恢复功能

Agents SDK 的最新版本使得构建能够安全地与真实系统交互且在中断时能够继续工作的 agent 变得更加容易。

Agent 现在可以通过 Browser Run 浏览网站、通过 Code Mode 针对外部工具编写代码、在委托给 Think 子 agent 时使用客户端提供的工具,并在从部署、Durable Object 驱逐以及连接流失中恢复时更加可靠。

更安全的浏览器自动化

Agent 现在可以通过单个持久化的 browser_execute 工具来使用 Browser Run。模型无需从固定的操作列表中进行选择,而是可以针对 Chrome DevTools Protocol (CDP) 编写代码,并可以检查页面、捕获屏幕截图、读取渲染的内容、调试前端行为以及与实时浏览器会话进行交互。

const browserTools = createBrowserTools({
	ctx: this.ctx,
	browser: this.env.BROWSER,
	loader: this.env.LOADER,
	session: { mode: "dynamic" },
});
const browserTools = createBrowserTools({
	ctx: this.ctx,
	browser: this.env.BROWSER,
	loader: this.env.LOADER,
	session: { mode: "dynamic" },
});

浏览器会话可以是一次性的、重用的,或者在运行期间从一次性提升为持久化的。当 agent 需要人工登录、完成多因素身份验证(MFA)或批准敏感操作时,这非常有用。运行可以暂停,保持相同的标签页和 Cookie,并在批准后恢复。

浏览器工具还为单次浏览任务添加了 Live View URL、可选的会话记录以及 browser_markdownbrowser_extractbrowser_linksbrowser_scrape 等快速操作。

具有批准的可恢复代码执行

Code Mode 现在使用 createCodemodeRuntime、连接器和持久化的执行日志。这让您只需为模型提供一个 codemode 工具,而不是满是工具定义的庞大 Prompt。模型可以发现它需要的功能、针对类型化的全局变量编写代码并重用保存的代码片段。

const runtime = createCodemodeRuntime({
	ctx: this.ctx,
	executor: new DynamicWorkerExecutor({ loader: this.env.LOADER }),
	connectors: [new GithubConnector(this.ctx, this.env, connection)],
});

const result = streamText({
	model,
	messages,
	tools: { codemode: runtime.tool() },
});
const runtime = createCodemodeRuntime({
	ctx: this.ctx,
	executor: new DynamicWorkerExecutor({ loader: this.env.LOADER }),
	connectors: [new GithubConnector(this.ctx, this.env, connection)],
});

const result = streamText({
	model,
	messages,
	tools: { codemode: runtime.tool() },
});

当代码执行到受批准限制的操作时,运行时会暂停执行并返回一个待处理的批准。批准后,已完成的调用将从持久化日志中回放,运行获得批准的操作,然后继续执行相同的代码。这使得构建创建议题(issues)、更新外部系统或执行其他副作用的 agent 变得非常实用,而无需为每个工具都编写自定义的暂停和恢复逻辑。

更好的 Think 委托

Think 子 agent 现在可以通过 RPC chat() 路径使用客户端定义的工具。父 agent 可以通过 clientTools 传递工具 schema,并通过 onClientToolCall 解析工具调用。这使得被委托的 agent 能够使用调用者提供的功能,而无需浏览器 WebSocket。

await child.chat(message, callback, {
	signal,
	clientTools: [
		{
			name: "get_user_timezone",
			description: "Get the caller's timezone",
			parameters: { type: "object" },
		},
	],
	onClientToolCall: async ({ toolName, input }) => {
		return runClientTool(toolName, input);
	},
});
await child.chat(message, callback, {
	signal,
	clientTools: [
		{
			name: "get_user_timezone",
			description: "Get the caller's timezone",
			parameters: { type: "object" },
		},
	],
	onClientToolCall: async ({ toolName, input }) => {
		return runClientTool(toolName, input);
	},
});

Think Workflows 还改进了 step.prompt()。Prompt 步骤现在会在返回结构化输出之前运行一个完整的 agent 轮次,因此 agent 可以在产生类型化结果之前调用工具。这使得 Workflow 步骤在持久的分流、研究和审批流中更加有用。

在绑定 Browser Run 时,统一的 Think 执行工具还可以包含 cdp.* 浏览器功能,以及 state.*tools.*

Voice 输出设备选择

Voice 客户端可以将助手音频路由到特定的输出设备。在 useVoiceAgent 中使用 outputDeviceId,或者从与框架无关的客户端调用 client.setOutputDevice()

const voice = useVoiceAgent({
	agent: "MyVoiceAgent",
	outputDeviceId: selectedSpeakerId,
});
const voice = useVoiceAgent({
	agent: "MyVoiceAgent",
	outputDeviceId: selectedSpeakerId,
});

不支持扬声器选择的浏览器将继续通过默认的输出设备播放,并报告非致命的 outputDeviceError

可靠性修复

此版本包括针对生产环境 agent 的多项修复:

  • useAgentAgentClient 在重连和配置更改期间更可靠地处理 WebSocket 替换。
  • 聊天流回放在重连、部署和提供商错误后更加可靠。
  • 纤程(Fiber)恢复可以跨多通道扫描继续,并在恢复 Hook 持续失败时进行退避。
  • 即使启动拆卸的请求被取消,Agent 拆卸仍会继续。
  • 大型会话历史记录使用按字节预算的读取,以减少启动期间的内存压力。

升级

要更新到最新版本:

npm i agents@latest @cloudflare/think@latest @cloudflare/codemode@latest @cloudflare/ai-chat@latest @cloudflare/voice@latest

有关更多信息,请参阅 Code Mode 文档浏览器工具文档Think 工具文档以及 Voice 文档

在 Workers AI 上推出 GLM-5.2

我们很高兴宣布在 Workers AI 上推出 GLM-5.2,这是 Z.ai 的旗舰代理(agentic)编码模型。

@cf/zai-org/glm-5.2 是一款专为代理型编码工作流构建的文本生成模型。凭借函数调用和推理支持,它可以处理长代码库、多步规划和工具增强型智能体。

关键特性和使用场景:

  • 代理编码:专为自主编码任务、长周期规划和复杂的软件工程工作流而设计
  • 大型上下文窗口:GLM-5.2 最多支持 1,048,576 个 token 的上下文窗口。Workers AI 推出该模型时提供 262,144 个 token 的上下文窗口,并计划在未来增加此限制
  • 函数调用:构建可在多个对话轮次中调用工具和 API 的智能体
  • 推理:解决复杂的问题求解和分步推理任务

通过 Workers AI 绑定(binding) (env.AI.run())、REST API /run/v1/chat/completions,或 AI Gateway 来使用 GLM-5.2。

定价可在模型页面定价页面上找到。

通过 VPC 网络上的 connect() 进行 TCP 连接

VPC 网络(VPC Network) 绑定(binding)现在除了支持通过 fetch() 进行 HTTP 流量传输外,还支持用于指向私有目标的原始 TCP 连接的 connect() Socket API。

这意味着 Workers 现在可以向通过绑定的 Cloudflare Tunnel、Cloudflare Mesh 或 Cloudflare WAN 接入端(on-ramp)可达的任何私有服务打开 TCP 套接字 —— 包括 Redis、Memcached、MQTT、自定义二进制协议或任何其他基于 TCP 的服务。

{
  "$schema": "./node_modules/wrangler/config-schema.json",
  "vpc_networks": [
    {
      "binding": "PRIVATE_NETWORK",
      "network_id": "cf1:network",
      "remote": true
    }
  ]
}
[[vpc_networks]]
binding = "PRIVATE_NETWORK"
network_id = "cf1:network"
remote = true

在运行时,在绑定上使用 connect() 以向私有目标打开 TCP 套接字:

export default {
	async fetch(request: Request, env: Env) {
		// Open a TCP connection to a private Redis instance
		const socket = await env.PRIVATE_NETWORK.connect("10.0.1.50:6379");

		// Write a Redis PING command
		const writer = socket.writable.getWriter();
		await writer.write(new TextEncoder().encode("PING\r\n"));
		await writer.close();

		return new Response(socket.readable);
	},
};

有关更多详细信息,请参阅 VPC 网络(VPC Networks)Workers 绑定(Binding)API

Workers 追踪现在支持自定义 span

您现在可以使用 tracing.enterSpan() 在您的 Workers 代码中创建自定义追踪 span。自定义 span 与自动平台检测(fetch 调用、KV 读取、D1 查询以及其他平台操作)一起显示在您的追踪和 OpenTelemetry 导出中,并具有正确的父子嵌套关系。

该 API 可以通过 import { tracing } from "cloudflare:workers" 或通过处理程序上下文 ctx.tracing 访问:

import { tracing } from "cloudflare:workers";

export default {
  async fetch(request, env, ctx) {
    return tracing.enterSpan("handleRequest", async (span) => {
      span.setAttribute("url.path", new URL(request.url).pathname);
      const data = await env.MY_KV.get("key");
      return new Response(data);
    });
  },
};

Span 根据 JavaScript 异步上下文自动嵌套,并在回调返回或其返回的 Promise 解决时自动结束。Span 对象提供了 setAttribute(key, value) 用于附加元数据,以及 isTraced 属性用于检查当前请求是否正在被采样。

追踪瀑布图,显示与自动 KV 和 fetch 检测嵌套在一起的自定义 span

必须在您的 Wrangler 配置中启用追踪才能记录 span。

有关完整的 API 详细信息和示例,请参阅自定义 span

在 AI Gateway 日志中查看请求的用户代理(User Agent)

AI Gateway 日志现在能够捕获发起每个请求的客户端的用户代理(User Agent),从而更容易识别是哪个 SDK、库或应用程序发送了流经您网关的流量。例如,您可以区分来自 openai-python 的请求与来自自定义应用程序或 Cloudflare Worker 的请求。

用户代理会与每个日志条目中的其他详细信息一起显示,并且您可以在仪表板中按用户代理(等于、不等于或包含)对日志进行筛选。

欲了解更多信息,请参阅日志记录

按对象 ID 或名称筛选 Durable Objects 指标

现在,您可以在 Cloudflare 仪表板中,按单个 Durable Object 的 ID名称 筛选 Durable Objects 命名空间的 指标 选项卡。此前,指标图表仅显示聚合的命名空间级数据,因此很难隔离特定对象的行为。

Go to Durable Objects ↗已按 ID 筛选为单个对象的 Durable Objects 指标选项卡,按调用状态显示每个对象的请求和错误。

开始在筛选器中输入 ID 或名称,然后从自动完成下拉列表中选择匹配项。自动完成仅显示在选定时间范围内有调用的对象,因此未出现的对象在该时间窗内未被调用。这并不一定意味着该对象已被删除。页面上的每个图表都会更新,以仅反映所选的对象。这使得在调试高流量对象、错误激增或意外存储使用时,更容易识别和调查单个 Durable Object。清除筛选器可返回命名空间级指标。

指标由 GraphQL Analytics API 提供支持,因此适用标准的分析行为,例如摄取延迟和采样

欲了解更多信息,请参阅指标和分析

Terraform v5.20.0 现已可用

Cloudflare 的 Terraform v5 Provider 让开发人员能够轻松地使用配置即代码(configuration as code)方法来管理其 Cloudflare 基础设施。它每 2-3 周发布一次,以确保您始终可以管理平台中的最新功能。本周,我们发布了 Terraform v5.20.0,其中添加了 24 个新资源,将底层的 Go SDK 升级到了 cloudflare-go v7,并根据社区反馈进行了一系列错误修复和状态升级。

新资源

  • cloudflare_ai_search_namespace: 管理 AI Search 命名空间
  • cloudflare_custom_csr: 管理自定义证书签名请求
  • cloudflare_dls_prefix_binding: 管理 DLS 区域服务前缀绑定(binding)
  • cloudflare_flagship_app: 管理 Flagship 功能标志应用
  • cloudflare_flagship_flag: 管理 Flagship 功能标志
  • cloudflare_google_tag_gateway: 管理 Google Tag Gateway
  • cloudflare_load_balancer_monitor_group: 管理负载均衡器监视器组
  • cloudflare_oauth_client: 管理 IAM OAuth 客户端
  • cloudflare_origin_cloud_region: 管理源站云区域(v2 终结点)
  • cloudflare_secrets_store: 管理 Secrets Store 实例
  • cloudflare_secrets_store_secret: 管理 Secrets Store 机密
  • cloudflare_share: 管理资源共享
  • cloudflare_share_recipient: 管理共享接收者
  • cloudflare_share_resource: 管理共享资源
  • cloudflare_zero_trust_device_deployment_groups: 管理 Zero Trust 设备部署组
  • cloudflare_zero_trust_dlp_data_class: 管理 DLP 数据类
  • cloudflare_zero_trust_dlp_data_tag: 管理 DLP 数据标签
  • cloudflare_zero_trust_dlp_data_tag_category: 管理 DLP 数据标签类别
  • cloudflare_zero_trust_dlp_sensitivity_group: 管理 DLP 敏感性组
  • cloudflare_zero_trust_dlp_sensitivity_level: 管理 DLP 敏感性级别
  • cloudflare_zero_trust_dlp_sensitivity_level_order: 管理 DLP 敏感性级别排序
  • cloudflare_zero_trust_resource_library_application: 管理 Zero Trust 资源库应用
  • cloudflare_zero_trust_resource_library_category: 管理 Zero Trust 资源库类别
  • cloudflare_zero_trust_tunnel_warp_connector_config: 管理 WARP 连接器隧道配置

功能

  • cache: 为 smart_tiered_cache 添加创建 (POST) 方法
  • cache: 更新 OPCR 配置为 v2 终结点
  • dlp: 将 classification Stainless 配置提升至主分支
  • dlp: 添加自定义提示词主题终结点
  • email_security_block_sender: 用于 v4 到 v5 迁移的状态升级器
  • email_security_impersonation_registry: 用于 v4 到 v5 迁移的状态升级器
  • email_security_trusted_domains: 用于 v4 到 v5 迁移的状态升级器
  • snippets: 为 snippet 和 snippet_rules 添加 Terraform id_property 注释
  • 将 Go SDK 升级到 cloudflare-go v7

错误修复

  • account_member: 缺少从 v5.0–v5.15 的升级路径
  • authenticated_origin_pulls_settings: 空指针异常 (nil pointer panic)
  • bot_management: 恢复 model.go 中对 content_bots_protection 的处理
  • dns_record: 防止 FQDN 规范化吞掉名称缩短的更改
  • list: 将空的嵌套对象设为 null,以防止 apply 后出现不一致的结果
  • load_balancer_pool: 接受 schema_version=0 时早期 v5 对象形状的状态
  • load_balancer_pool:load_shedding 属性添加 UseStateForUnknown 以防止漂移
  • r2_custom_domain: 恢复 resource.go 中的降级响应处理
  • regional_hostname: 将 cloudflare-go 导入从 v6 更新为 v7
  • secrets_store: 修复模型/架构一致性并保护验收测试
  • spectrum_application: 接受 schema_version=0 时早期 v5 对象形状的状态
  • worker: 在多次读取之间保留 observability.traces.propagation_policy
  • worker: 在可观测性默认值中添加 propagation_policy
  • worker_version: 恢复手写的 D1 database_id 处理
  • workers_custom_domain: 状态迁移中缺少 CertId field
  • workers_script: 恢复被代码生成(codegen)剥离的注释 Read 规避方案
  • zero_trust_access_identity_provider:read_only 从计算(computed)更改为可选(optional)
  • zero_trust_access_identity_provider:UseStateForUnknown 添加到仅限 SAML 的配置字段
  • zero_trust_access_identity_provider: 在 scim_config 字段上使用 UseNonNullStateForUnknown
  • zero_trust_access_policy: 在迁移区域范围的 v4 状态时填充 account_id
  • zero_trust_access_policy: 迁移中缺少 common_names 转换
  • 在迁移期间当配置具有 attributes_flat 时,优雅地处理空指针解引用
  • 为所有新资源设置初始架构版本为 500

重构

MoveState 空值保护(nil guard)提取到共享助手程序中

了解更多信息

Moonshot AI Kimi K2.7 Code 现已在 Workers AI 上可用

@cf/moonshotai/kimi-k2.7-code 现已在 Workers AI 上可用。Kimi K2.7 Code 是 Kimi K2 系列中针对代码进行了优化的变体,基于混合专家(Mixture-of-Experts)架构构建,总参数量为 1T,每个 token 的活跃参数量为 32B。

改进的编码和智能体性能

K2.7 Code 在编码和智能体基准测试中相比 K2.6 实现了显著提升:

  • +21.8%,在 Kimi Code Bench v2 上
  • +11.0%,在 Program Bench 上
  • +31.5%,在 MLS Bench Lite 上

推理效率

K2.7 Code 与 K2.6 相比,使用的推理 token 减少了 30%,从而减少了“过度思考”并降低了重推理工作负载的推理成本。

关键能力

  • 262.1k token 上下文窗口,用于在长期运行的智能体任务中保留完整的对话历史记录、工具定义和代码库
  • 长周期编码,具有改进的指令遵循和更高的端到端编码任务成功率
  • 视觉输入,用于随文本一起处理图像
  • 可通过 chat_template_kwargs.thinking 配置推理深度的思维模式
  • 多轮工具调用,用于构建在多个对话轮次中调用工具的智能体
  • 支持 JSON schema 的结构化输出

与 Kimi K2.6 的区别

如果您正在从 Kimi K2.6 迁移,请注意以下几点:

  • K2.7 Code 针对编码任务进行了优化,具备改进的基准测试性能和推理效率
  • 缓存的输入 token 定价为每百万(M)token 0.19 美元(而 K2.6 为 0.16 美元)
  • API 使用方式完全相同 —— 无需更改参数

快速入门

通过 Workers AI 绑定(binding) (env.AI.run())、/ai/run 处的 REST API,或者 /v1/chat/completions 处的兼容 OpenAI 的端点来使用 Kimi K2.7 Code。您还可以在这些端点中搭配使用 AI Gateway

欲了解更多信息,请参阅 Kimi K2.7 Code 模型页面定价

Browser Run /snapshot 端点新增 formats 参数

Browser Run/snapshot 端点 现在支持 formats 参数,允许您在单次 API 调用中返回多种页面格式。此前,/snapshot 仅返回 HTML 内容和截图。您现在还可以在同一响应中包含 Markdown 和无障碍树。

这些格式对 AI Agent 工作流特别有用:

  • Markdown 提供了页面内容的高效 token 表示形式,LLM 可直接处理,无需解析 HTML 标记。
  • 无障碍树提供了页面元素的结构化表示,包括角色、标签和层级关系,帮助 LLM 理解页面结构并导航其内容。

以下示例在一次调用中返回截图、Markdown 和无障碍树:

curl -X POST 'https://api.cloudflare.com/client/v4/accounts/<accountId>/browser-rendering/snapshot' \
  -H 'Authorization: Bearer <apiToken>' \
  -H 'Content-Type: application/json' \
  -d '{
    "url": "https://example.com/",
    "formats": ["screenshot", "markdown", "accessibilityTree"]
  }'
import Cloudflare from "cloudflare";

const client = new Cloudflare({
	apiToken: process.env["CLOUDFLARE_API_TOKEN"],
});

const snapshot = await client.browserRendering.snapshot.create({
	account_id: process.env["CLOUDFLARE_ACCOUNT_ID"],
	url: "https://example.com/",
	formats: ["screenshot", "markdown", "accessibilityTree"],
});

console.log(snapshot.markdown);
console.log(snapshot.accessibilityTree);
interface Env {
	BROWSER: BrowserRun;
}

export default {
	async fetch(request, env): Promise<Response> {
		return await env.BROWSER.quickAction("snapshot", {
			url: "https://example.com/",
			formats: ["screenshot", "markdown", "accessibilityTree"],
		});
	},
} satisfies ExportedHandler<Env>;

您必须至少请求两种格式。如果只需要一种格式,请使用相应的单格式端点,例如 /screenshot/markdown

请参阅 /snapshot 文档 以获取完整的支持值列表。

从仪表板和 GraphQL API 跟踪 Dynamic Workers 的使用情况

Workers 概览页面上的 Dynamic Workers 使用情况

客户现在可以从 Cloudflare 仪表板的 Workers 概览页面查看在其计费周期内调用的 Dynamic Workers 数量。

此计数反映了 Cloudflare 在所选计费周期内将计费的 Dynamic Workers 数量。Dynamic Workers 的使用数据仅追溯到 2026 年 6 月 1 日。

您还可以通过 GraphQL Analytics API 查询此计数,方法是使用 workersInvocationsByOwnerAndScriptGroups 并选择 distinctDynamicWorkerCount

query getDynamicWorkersCount(
	$accountTag: string!
	$filter: AccountWorkersInvocationsByOwnerAndScriptGroupsFilter_InputObject
) {
	viewer {
		accounts(filter: { accountTag: $accountTag }) {
			workersInvocationsByOwnerAndScriptGroups(limit: 10000, filter: $filter) {
				uniq {
					distinctDynamicWorkerCount
				}
			}
		}
	}
}

使用变量来设置账户和计费周期日期范围:

{
	"accountTag": "<ACCOUNT_ID>",
	"filter": {
		"date_geq": "2026-06-01",
		"date_leq": "2026-06-30"
	}
}

有关更多信息,请参阅 Dynamic Workers 定价

使用 Wrangler CLI 管理 AI Search 命名空间

AI Search 现在支持命名空间级别的 Wrangler 命令,这使得从您的终端、脚本和代理工作流程中管理命名空间(namespaces)变得更加容易。

以下命令可用:

命令 描述
wrangler ai-search namespace list 列出 AI Search 命名空间
wrangler ai-search namespace create 创建新的 AI Search 命名空间
wrangler ai-search namespace get 获取命名空间的详细信息
wrangler ai-search namespace update 更新命名空间描述
wrangler ai-search namespace delete 删除 AI Search 命名空间

直接从 CLI 为新应用程序或租户创建命名空间:

wrangler ai-search namespace create docs-production --description "Production documentation search"

通过分页列出命名空间,或按名称或描述进行过滤:

wrangler ai-search namespace list --search docs --page 1 --per-page 10

--jsonlistcreategetupdate 结合使用,以返回自动化和 AI 代理可以直接解析的结构化输出。

实例级别的命令现在也支持 --namespace 标志,因此您可以从 CLI 与特定命名空间内的实例进行交互:

wrangler ai-search list --namespace docs-production

有关完整的用法详情,请参阅 AI Search Wrangler 命令文档

Flagship API 参考现已上线

Flagship API 参考 现已上线。您可以使用 Cloudflare API 创建和更新应用,以及在不使用仪表板的情况下创建、更新、删除和列出功能标志。

例如,使用 API 创建一个新的布尔标志:

curl https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/flagship/apps/$APP_ID/flags \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
  -d '{
    "key": "new-checkout",
    "enabled": true,
    "default_variation": "off",
    "variations": {
      "off": false,
      "on": true
    },
    "rules": []
  }'

要创建 API token,请前往 Cloudflare 仪表板中的账户 API Tokens 并搜索 Flagship。

API 参考包含 Flagship 应用、标志、更新日志条目和标志评估的端点。Agent 还可以使用 Cloudflare skill 中的 Flagship 参考 创建和管理 Flagship 资源。

请参阅 Flagship 文档 以了解有关从应用程序评估功能标志的更多信息。

使用 Images 绑定管理托管的图像

使用 Images 绑定(binding)可以直接从您的 Worker 上传、列出、检索、更新和删除存储在 Images 中的图像,而无需管理 API 令牌(tokens)或发送 HTTP 请求。

env.IMAGES.hosted 命名空间支持以下存储和管理操作:

例如,您可以从请求主体中上传图像并返回其元数据:

const image = await env.IMAGES.hosted.upload(request.body, {
	filename: "upload.jpg",
	metadata: { source: "worker" },
});

return Response.json(image);

或者检索并提供托管图像的原始字节:

const bytes = await env.IMAGES.hosted.image("IMAGE_ID").bytes();
return new Response(bytes);

欲了解更多信息,请参阅 Images 绑定

已弃用 Sandbox SDK 功能

今天我们宣布弃用 Sandbox SDK 的若干功能。自首次发布以来,SDK 已大幅成长和成熟。随着 Agent 工作流的发展,我们已发布了许多新功能和实验性内容,让开发者能够轻松地将安全的隔离代码执行集成到其工作流中。

我们希望 SDK 在快速迭代代码库的同时,继续为 Agent 工作流提供稳定的基础。这些已弃用的功能要么已被更新的功能所取代,要么采用率较低。它们将保留在代码库中直至 2026 年 7 月 9 日,之后将不再出现在未来的 Sandbox SDK 版本中。

HTTP 和 WebSocket 传输

2026 年 4 月,我们发布了新的 RPC 传输并弃用了 WebSocket 传输。此设置控制沙箱容器与 Workers 生态系统的通信方式。RPC 传输消除了 HTTP 和 WebSocket 传输的两种限制。自 2026 年 6 月 9 日起,它是推荐的默认选项。HTTP 和 WebSocket 传输将不再出现在 2026 年 7 月 9 日后发布的 Sandbox SDK 版本中。

如需在 2026 年 7 月 9 日之前迁移,请将 SANDBOX_TRANSPORT 变量更新为 rpc,或在调用 getSandbox() 时设置 transport 选项。更多信息,请参阅传输配置文档

Desktop

Desktop 功能作为 Sandbox SDK 功能演示而推出——可在沙箱中控制完整的浏览器环境。随着 Cloudflare Browser Run 的推出,该功能使用率极低。我们已在 0.10.2 中将其移除。

公开端口

我们最近在 Sandbox SDK 中发布了对 Cloudflare Tunnel 的支持。它为将沙箱中运行的服务公开到公共互联网提供了强大的 API,解决了许多人在本地开发和部署到 workers.dev 域名时遇到的问题。如需从 exposePort() 迁移到隧道,请参阅隧道 API 文档公开服务指南

默认会话

默认情况下,Sandbox SDK 中的 exec() 方法在所有调用之间维护一个默认会话,因此某次调用中的 cd 会在下一次调用中生效。这种便利性对手动编写 exec 语句的开发者有帮助,但会让 Agent 感到困惑,并导致难以追踪的 Bug。自 0.10.3 起,我们在 getSandbox() 接口上引入了 enableDefaultSession 标志来关闭此功能。默认会话这一概念——以及该标志——将在后续版本中移除。

我们建议今天就将 enableDefaultSession: false 设置为当前值,并在需要之前行为时使用 sandbox.createSession() API

其他变更

我们还在整合所有缓冲数据的 API,以默认支持流式传输。这包括 readFilewriteFileexec。流式等效方法将被移除。

我们正在探索将非核心功能(如代码解释器终端git API)移入辅助工具。这些功能将保留现有 API,因此迁移应该很简单。

后续步骤

如果您使用了上述任何功能,请参阅 2026 年弃用迁移指南。我们还提供了一个 Agent skill 来协助迁移。

如有任何问题,请在 Cloudflare 开发者 Discord 中提问。

身份验证的 SMTP 提交功能现已在 beta 阶段可用

您现在可以使用 smtp.mx.cloudflare.net:465 上的身份验证 SMTP 提交,通过 Cloudflare Email Service 发送电子邮件。SMTP 与 REST APIWorkers 绑定 一起构成了发送交易性电子邮件的第三种方式——这对于已经采用 SMTP 协议的现有应用程序以及语言原生 SMTP 库(如 Nodemailer、smtplib、PHPMailer、JavaMail)非常有用。

设置
主机 (Host) smtp.mx.cloudflare.net
端口 (Port) 465 (隐式 TLS)
AUTH PLAINLOGIN
用户名 (Username) api_token
密码 (Password) 具有 Email Sending: Edit 权限的 Cloudflare API 令牌(账户所有或用户所有)

提交将进入与 REST API 和 Workers 绑定相同的递送管道:相同的限制、自动 DKIM 和 ARC 签名,以及共享的仪表板日志。

使用单条命令发送您的第一封电子邮件:

curl --ssl-reqd \
  --url "smtps://smtp.mx.cloudflare.com:465" \
  --user "api_token:<API_TOKEN>" \
  --mail-from "[email protected]" \
  --mail-rcpt "[email protected]" \
  --upload-file mail.txt

有关身份验证详细信息、响应代码和特定语言的示例,请参阅 SMTP 参考

R2 SQL 现在支持 UNION、INTERSECT、EXCEPT 和 SELECT DISTINCT

R2 SQL 现在支持集合操作(UNIONINTERSECTEXCEPT)和 SELECT DISTINCT,从而扩展了您可直接对 R2 Data CatalogApache Iceberg 表运行的分析查询范围。

集合操作

组合多个 SELECT 语句的结果:

  • UNION — 返回两个查询的所有行,并移除重复项。
  • UNION ALL — 返回两个查询的所有行,保留重复项。
  • INTERSECT — 仅返回在两个查询中都出现的行。
  • EXCEPT — 返回存在于第一个查询中但不存在于第二个查询中的行。
-- Find zones that had either firewall blocks OR high-risk requests
SELECT zone_id FROM my_namespace.firewall_events WHERE action = 'block'
UNION
SELECT zone_id FROM my_namespace.http_requests WHERE risk_score > 0.8
-- Find zones with both firewall blocks AND high traffic
SELECT zone_id FROM my_namespace.firewall_events WHERE action = 'block'
INTERSECT
SELECT zone_id FROM my_namespace.http_requests
GROUP BY zone_id
HAVING COUNT(*) > 10000
-- Find enterprise zones that have not been compacted
SELECT zone_id FROM my_namespace.zones WHERE plan = 'enterprise'
EXCEPT
SELECT zone_id FROM my_namespace.compaction_history

SELECT DISTINCT

从查询结果中消除重复行:

SELECT DISTINCT region, department
FROM my_namespace.sales_data
WHERE total_amount > 1000
ORDER BY region, department
LIMIT 100

对于可以接受近似结果的大型数据集,approx_distinct() 仍是计算唯一值数量的更快替代方法。

有关完整语法参考,请参阅 SQL 参考。有关性能指南,请参阅限制与最佳实践

RealtimeKit 会后转录现已正式发布

RealtimeKit 让您可以在 Cloudflare 的全球 WebRTC 基础设施上构建人们通过实时音视频进行会议的产品,例如医疗健康科技、教育科技、监考以及其他实时平台。

会后转录现已正式发布,已完成的 RealtimeKit 会议可在结束后自动生成完整的转录文件。这些转录文件还可为AI 生成摘要提供支持,用于会议记录、审查工作流以及转录文件可用后的跟进任务。

会后转录是由 Workers AI 使用 Whisper Large v3 Turbo 驱动的托管服务。RealtimeKit 处理转录过程,并可通过 webhook 或 REST API 返回转录和摘要文件,因此您无需运行自己的转录基础设施。

生成转录和摘要

要在会议结束后生成转录,请在创建会议时设置 transcribe_on_end: true。要在转录可用后也自动生成 AI 摘要,请设置 summarize_on_end: true

curl -X POST "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/realtime/kit/$APP_ID/meetings" \
  -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Weekly product review",
    "transcribe_on_end": true,
    "summarize_on_end": true,
    "ai_config": {
      "transcription": {
        "language": "en"
      },
      "summarization": {
        "word_limit": 500,
        "text_format": "markdown",
        "summary_type": "team_meeting"
      }
    }
  }'

获取结果

当 RealtimeKit 完成会议处理后,会为转录文件创建下载 URL,如果设置了 summarize_on_end,则还会为摘要创建下载 URL。您可以通过 webhook 自动接收这些 URL,或通过 REST API 稍后为特定会话获取。

要在结果准备好后立即接收,请配置 meeting.transcriptmeeting.summary webhook 事件:

curl -X POST "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/realtime/kit/$APP_ID/webhooks" \
  -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "AI results webhook",
    "url": "https://example.com/webhook",
    "events": ["meeting.transcript", "meeting.summary"],
    "enabled": true
  }'

要稍后获取结果,请调用相应会话的转录摘要端点:

curl -X GET "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/realtime/kit/$APP_ID/sessions/$SESSION_ID/transcript" \
  -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN"

curl -X GET "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/realtime/kit/$APP_ID/sessions/$SESSION_ID/summary" \
  -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN"

仅当未设置 summarize_on_end 且您希望在转录可用后手动生成摘要时,才使用为会话转录生成摘要 API:

curl -X POST "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/realtime/kit/$APP_ID/sessions/$SESSION_ID/summary" \
  -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN"

会后转录支持 CSV、JSON、SRT 和 VTT 转录输出格式自动语言检测和 Whisper 语言代码。RealtimeKit 还支持使用 Deepgram Nova-3 进行实时转录,用于实时字幕、会议内无障碍功能和实时记录。

RealtimeKit 转录文档摘要文档中了解更多信息。

Workflows 现已支持回滚

Workflows 现已支持 saga 风格的回滚,允许您向每个 step.do() 添加补偿逻辑,以应对下游故障。如果实例失败,回滚处理程序将按照 step-start 顺序的逆序执行。

这对于涉及外部系统的多步骤操作非常有用,例如库存预留、付款授权、工单创建或基础设施配置。与其将所有清理逻辑编写在顶级 catch 中,不如将每个补偿操作放在其所撤销的步骤旁边。

回滚处理程序支持自己的重试和超时配置,Workflows 现在在实例状态响应中公开回滚结果。Workflows 分析还会发送回滚生命周期事件,使在调试生产工作流时更容易区分正向执行失败和回滚失败。

await step.do(
	"provision resource",
	async () => {
		const resource = await provisionResource();
		return { resourceId: resource.id };
	},
	{
		rollback: async ({ output }) => {
			const { resourceId } = output;
			await deleteResource(resourceId);
		},
		rollbackConfig: {
			retries: { limit: 3, delay: "15 seconds", backoff: "linear" },
			timeout: "2 minutes",
		},
	},
);
await step.do(
	"provision resource",
	async () => {
		const resource = await provisionResource();
		return { resourceId: resource.id };
	},
	{
		rollback: async ({ output }) => {
			const { resourceId } = output as { resourceId: string };
			await deleteResource(resourceId);
		},
		rollbackConfig: {
			retries: { limit: 3, delay: "15 seconds", backoff: "linear" },
			timeout: "2 minutes",
		},
	},
);

请参阅回滚选项了解更多信息。

使用支出限制控制 AI 成本

AI Gateway 现在支持支出限制(spend limits)——基于成本的预算,可追踪累计美元支出,并在超出预算时拦截请求。与限制请求次数的速率限制不同,支出限制是基于 Token 使用量和模型定价来追踪实际成本。

您可以按模型、提供商或自定义元数据维度来限定限制范围。例如,为每个用户分配每日 200 美元的预算,将网关总支出限制在每日 10,000 美元以内,或者限制每个用户对特定模型的每日支出上限为 50 美元。每条规则都使用可配置的时间窗口,可采用固定或滑动执行策略。

支出限制适用于具有已知定价模型的 统一计费(Unified Billing)BYOK(自带密钥) 请求。

欲了解更多细节,请参阅支出限制文档

使用 Gateway 策略过滤 Workers 的公共互联网流量

使用 VPC 网络(VPC Network) 绑定(binding)与 network_id: "cf1:network" 的 Workers 现在可以通过 Cloudflare Gateway 出口到公共互联网目标。这意味着您现有的 Zero Trust 流量策略 —— DNS、HTTP、网络和出口(egress)—— 将延伸到源自您的 Workers 的流量,就像今天对 WARP 用户所做的那样。

  1. Calls env.EGRESS.fetch()

  2. VPC binding
  3. Public Internet

    Any public hostname or IP

Gateway logsDNSHTTPNetwork

您默认获得的内容:

  • 可见性。 Worker 出口流量与您的其他流量一起显示在 Gateway DNSHTTP网络 日志中,以便您可以审计您的 Workers 在何时调用了什么。
  • 强制执行。 任何其选择器与 Worker 请求相匹配的现有 Gateway 策略都将适用 —— 包括允许/阻止列表、DNS 类别过滤和 HTTP 目标规则。如果您已经为您的员工屏蔽了某个类别,您的 Workers 将继承该屏蔽。
{
	"vpc_networks": [
		{
			"binding": "EGRESS",
			"network_id": "cf1:network",
			"remote": true,
		},
	],
}
[[vpc_networks]]
binding = "EGRESS"
network_id = "cf1:network"
remote = true
// Egress to a public destination — subject to your Gateway policies and logged
const response = await env.EGRESS.fetch("https://api.example.com/data");
// Egress to a public destination — subject to your Gateway policies and logged
const response = await env.EGRESS.fetch("https://api.example.com/data");

有关配置选项,请参阅 VPC 网络(VPC Networks)。有关策略编写,请参阅 Cloudflare Gateway 流量策略

计费使用量和预算警报现已集成到产品侧边栏中

按需付费(Pay-as-you-go)客户现在可以直接从 Workers & PagesD1R2Workers KVQueuesVectorizeDurable ObjectsContainers 的产品概览页面查看计费使用量并创建预算警报。新的侧边栏小组件显示了当前时期的支出和账单周期日期范围,同时还提供了一个用于创建预算警报的按钮。

该小组件提取与计费使用量仪表板相同的数据,并与您的账单周期(或免费计划中的当前日期)保持一致,因此数据与您的发票相符。目前尚不支持 Enterprise 合约账户。

Durable Objects 产品侧边栏中的计费使用量小组件,显示当前时期的支出和按服务细分的明细

选择 **Create budget alert(创建预算警报)**会以内联方式打开预算警报流程,以便您在查看使用量的同一位置设置美元阈值。预算警报适用于您在所有产品上的账户级别总支出,而不仅仅是您创建该警报的产品页面。

有关更多信息,请参阅基于使用量的计费文档

Pipeline 绑定(binding)配置字段重命名为 stream

您的 Wrangler 配置文件pipelines 绑定(binding)配置里的 pipeline 字段已重命名为 stream。旧字段已弃用但仍被接受。

请更新您的配置以使用 stream,从而避免弃用警告。

之前(已弃用):

{
  "$schema": "./node_modules/wrangler/config-schema.json",
  "pipelines": [
    {
      "binding": "MY_PIPELINE",
      "pipeline": "<STREAM_ID>"
    }
  ]
}
[[pipelines]]
binding = "MY_PIPELINE"
pipeline = "<STREAM_ID>"

之后:

{
  "$schema": "./node_modules/wrangler/config-schema.json",
  "pipelines": [
    {
      "binding": "MY_PIPELINE",
      "stream": "<STREAM_ID>"
    }
  ]
}
[[pipelines]]
binding = "MY_PIPELINE"
stream = "<STREAM_ID>"

无需进行其他更改。绑定(binding)名称、TypeScript 类型和运行时 API (env.MY_PIPELINE.send(...)) 保持不变。

有关配置 pipeline 绑定(binding)的更多信息,请参阅写入流

新增 Workers 批量机密(secrets)API 端点

您现在可以使用 批量机密端点 在单个请求中为您的 Worker 创建、更新或删除多个机密(secrets)。

  • 包含具有值的机密以进行创建或更新。
  • 将机密设置为 null 以进行删除。
  • 请求中未包含的机密将保持不变。

以下示例创建 API_KEY,更新已存在的 DB_PASSWORD,并删除 OLD_SECRET

{
  "secrets": {
    "API_KEY": { "type": "secret_text", "name": "API_KEY", "text": "my-api-key" },
    "DB_PASSWORD": { "type": "secret_text", "name": "DB_PASSWORD", "text": "my-db-password" },
    "OLD_SECRET": null
  }
}

您可以使用 wrangler secret bulk 在命令行中执行相同的操作:

npx wrangler secret bulk < secrets.json

要删除某个键,请在 JSON 文件中将其值设置为 null.env 文件不支持删除操作。

每个请求最多支持 100 次总操作(包括创建、更新和删除的组合)

在您操作系统的钥匙串中存储 Wrangler 的 OAuth 凭证

Wrangler 现在可以将 wrangler login 返回的 OAuth 凭证存储在 AES-256-GCM 加密的文件中,加密密钥保存在您的操作系统钥匙串中。默认行为没有改变 —— 除非您选择启用,否则凭证仍保存在明文 TOML 文件中。

要选择启用,请运行:

npx wrangler login --use-keyring

该选择会在 Wrangler 调用之间持久保存。使用 npx wrangler login --no-use-keyring 可以取消选择,或者使用 CLOUDFLARE_AUTH_USE_KEYRING 环境变量覆盖单个命令的首选项。

wrangler whoami 现在会报告凭证的存储位置:

🔐 Credentials are stored in: Encrypted file (~/.config/.wrangler/config/default.enc) with key in macOS Keychain (service=wrangler, account=default)

各平台后端:

  • macOS 通过 /usr/bin/security 使用内置的 Keychain。
  • Linux 通过 libsecret-tools 包中的 secret-tool CLI 使用 libsecret
  • Windows 通过 @napi-rs/keyring 使用 凭据管理器 (Credential Manager),该包在您首次选择启用时按需安装。

有关完整详细信息,请参阅在操作系统钥匙串中存储 OAuth 凭证,包括启用/禁用时的迁移行为以及 CLOUDFLARE_AUTH_USE_KEYRING 环境变量。