跳转到内容
搜索文档

更新日志

Cloudflare 的最新更新与改进。

直接从 Workflow 绑定调度 Workflow 实例

您现在可以在 wrangler.jsonc 中直接将 cron 计划附加到 Workflow 绑定(binding)。每次计划运行都会自动创建一个新的 Workflow 实例,因此您无需定义单独的带有 scheduled 处理程序的 Worker 来按间隔触发您的 Workflow。

例如,您可以在同一个 Workflow 上配置每小时、每 15 分钟或工作日计划:

{
	"workflows": [
		{
			"name": "my-scheduled-workflow",
			"binding": "MY_WORKFLOW",
			"class_name": "MyScheduledWorkflow",
			"schedules": ["0 * * * *", "*/15 * * * *", "0 9 * * MON-FRI"],
		},
	],
}

Cron 工作负载获得 Workflows 的所有相同优势,包括内置重试、多步骤持久执行以及 Workflows 的可配置超时。

import {
	WorkflowEntrypoint,
	WorkflowEvent,
	WorkflowStep,
} from "cloudflare:workers";

// 根据 wrangler.jsonc 中为 MY_WORKFLOW 绑定定义的每个 cron 计划自动运行。
export class MyScheduledWorkflow extends WorkflowEntrypoint<Env> {
	async run(event: WorkflowEvent, step: WorkflowStep) {
		const data = await step.do("fetch source data", async () => {
			return await fetchSourceData();
		});

		// 如果此步骤失败,则仅使用以下自定义逻辑重试此步骤
		await step.do(
			"process and store results",
			{
				retries: { limit: 5, delay: "30 seconds", backoff: "exponential" },
				timeout: "10 minutes",
			},
			async () => {
				await processAndStore(data);
			},
		);
	}
}

这使得构建定期计划的作业(例如数据库备份、发票生成、报告聚合和清理任务)变得更加容易,而无需配置单独的 Cron Trigger 入口点。

有关更多信息,请参阅触发 Workflows

Agents SDK v0.14.0:Agent 技能、信使(messengers)、计划任务、Workflows 以及强化的聊天恢复

Agents SDK 的最新版本添加了四种使用 @cloudflare/think 进行构建的新方式:按需 Agent 技能(Agent Skills)、聊天信使(chat messengers,从 Telegram 开始)、声明式计划任务以及 Workflows 内部的持久推理步骤。此版本还显著强化了持久聊天恢复,因此轮次能够可靠地度过生产环境中的部署、驱逐和停滞的模型流。

Agent 技能(Agent Skills)(实验性)

给 agent 一个按需指令、资源和脚本的目录。技能源将目录添加到系统 Prompt 中,而模型仅在任务匹配时才激活技能 —— 因此庞大的功能库不会膨胀每个 Prompt。

import { Think, skills } from "@cloudflare/think";
import bundledSkills from "agents:skills";

export class SkillsAgent extends Think {
	getSkills() {
		return [
			bundledSkills,
			skills.r2(this.env.SKILLS_BUCKET, { prefix: "skills/" }),
		];
	}
}
import { Think, skills } from "@cloudflare/think";
import bundledSkills from "agents:skills";

export class SkillsAgent extends Think<Env> {
	getSkills() {
		return [
			bundledSkills,
			skills.r2(this.env.SKILLS_BUCKET, { prefix: "skills/" }),
		];
	}
}

agents:skills 导入通过 Agents Vite 插件打包本地的 ./skills 目录(每个技能一个目录,每个目录包含一个 SKILL.md)。技能也可以从 R2 或清单(manifest)中加载。当技能可用时,Think 会暴露 activate_skillread_skill_resource 和一个可选的 run_skill_script 工具。技能加载是弹性的:重复或失败的源将被跳过并发出警告,而不会损坏 agent。

Agent 技能处于实验性阶段,尤其是脚本执行还处于早期阶段。API 可能会在未来的版本中发生变化。我们非常期待您的反馈 —— 请在 Agents 仓库中告诉我们您正在构建什么以及缺少了什么。

信使(Messengers)

将 Think agent 直接连接到聊天平台。Think 拥有 Webhook 路由、会话路由、持久回复纤程(durable reply fiber)以及流式传送回提供商。Telegram 作为第一个提供商发布。

import { Think } from "@cloudflare/think";
import {
	defineMessengers,
	ThinkMessengerStateAgent,
} from "@cloudflare/think/messengers";
import telegramMessenger from "@cloudflare/think/messengers/telegram";

export { ThinkMessengerStateAgent };

export class SupportAgent extends Think {
	getMessengers() {
		return defineMessengers({
			telegram: telegramMessenger({
				token: this.env.TELEGRAM_BOT_TOKEN,
				userName: "support_bot",
				secretToken: this.env.TELEGRAM_WEBHOOK_SECRET_TOKEN,
			}),
		});
	}
}
import { Think } from "@cloudflare/think";
import {
	defineMessengers,
	ThinkMessengerStateAgent,
} from "@cloudflare/think/messengers";
import telegramMessenger from "@cloudflare/think/messengers/telegram";

export { ThinkMessengerStateAgent };

export class SupportAgent extends Think<Env> {
	getMessengers() {
		return defineMessengers({
			telegram: telegramMessenger({
				token: this.env.TELEGRAM_BOT_TOKEN,
				userName: "support_bot",
				secretToken: this.env.TELEGRAM_WEBHOOK_SECRET_TOKEN,
			}),
		});
	}
}

默认情况下,每个 Chat SDK 线程都映射到其自己的 Think 子 agent,因此群聊和直接消息不会共享内存。支持多个机器人、自定义会话路由和自定义提供商。

计划任务

使用类型化的领域特定语言 (DSL) 声明循环的、具有时区感知的 Prompt 和处理器。Think 在启动时协调声明,并在每次运行后重新设定下一次发生,由持久幂等提交提供支持。

import { Think, defineScheduledTasks } from "@cloudflare/think";

export class DigestAgent extends Think {
	getScheduledTasks() {
		return defineScheduledTasks({
			weeklyCommitReport: {
				schedule: "every week on monday at 09:00",
				prompt:
					"Compile my GitHub commits for the last week and summarize them.",
			},
			workout: {
				schedule: "every day at 08:00 in Europe/London",
				prompt: "Start my workout.",
			},
		});
	}
}
import { Think, defineScheduledTasks } from "@cloudflare/think";

export class DigestAgent extends Think<Env> {
	getScheduledTasks() {
		return defineScheduledTasks({
			weeklyCommitReport: {
				schedule: "every week on monday at 09:00",
				prompt:
					"Compile my GitHub commits for the last week and summarize them.",
			},
			workout: {
				schedule: "every day at 08:00 in Europe/London",
				prompt: "Start my workout.",
			},
		});
	}
}

Think Workflows

使用 ThinkWorkflowstep.prompt() 在 Cloudflare Workflow 内部运行模型驱动的推理步骤,具有持久的类型化结构化输出、长时间等待和审批门槛。

import { z } from "zod";
import { ThinkWorkflow } from "@cloudflare/think/workflows";

const draftSchema = z.object({
	title: z.string(),
	summary: z.string(),
	labels: z.array(z.string()),
});

export class TriageWorkflow extends ThinkWorkflow {
	async run(event, step) {
		const draft = await step.prompt("triage-issue", {
			prompt: `Triage issue #${event.payload.issueNumber}`,
			output: draftSchema,
			timeout: "3 days",
		});

		await step.do("apply-labels", async () => {
			await this.agent.applyLabels(draft.labels);
		});
	}
}
import { z } from "zod";
import { ThinkWorkflow } from "@cloudflare/think/workflows";
import type { ThinkWorkflowStep } from "@cloudflare/think/workflows";
import type { AgentWorkflowEvent } from "agents/workflows";

const draftSchema = z.object({
	title: z.string(),
	summary: z.string(),
	labels: z.array(z.string()),
});

export class TriageWorkflow extends ThinkWorkflow<TriageAgent, Params> {
	async run(event: AgentWorkflowEvent<Params>, step: ThinkWorkflowStep) {
		const draft = await step.prompt("triage-issue", {
			prompt: `Triage issue #${event.payload.issueNumber}`,
			output: draftSchema,
			timeout: "3 days",
		});

		await step.do("apply-labels", async () => {
			await this.agent.applyLabels(draft.labels);
		});
	}
}

针对持久聊天恢复的生产硬化

持久聊天轮次一直被设计为在轮次途中部署或 Durable Object 驱逐后存活。此版本是针对该机制进行生产硬化的重大更新。

  • 在部署期间具有更好的恢复能力。 轮次现在可以度过持续部署和驱逐,而不会丢失已完成的工作,也不会重新运行已经运行过的工具。
  • 实时的 “recovering…” 信号。 useAgentChat 暴露了一个新的 isRecovering 标志,因此恢复中的轮次会显示进度,而不是看起来像冻结了一样。大多数 UI 将 isStreaming || isRecovering 渲染为“忙碌(busy)”。
  • 停滞的流恢复。 设置 chatStreamStallTimeoutMs 可以将挂起的提供商流路由到相同的恢复路径中,而不是留下一个无限旋转的加载指示器(spinner)。
  • 子 agent 重新挂载。 在父节点恢复时,正在运行的 agentTool() 子节点会重新挂载到其结果上,而不是被放弃并重新运行,因此长期运行的子节点在部署下不再丢失工作。

MCP 传输改进

  • 可恢复的流 — 基于服务器发送事件(SSE)的正在运行的工具调用可在连接中断时存活。客户端使用 Last-Event-ID 重新连接并回放它们遗漏的任何内容。
  • 可读的服务器 IDaddMcpServer 接受一个可选的 id,因此工具会呈现为可读的键(例如 tool_github_create_pull_request),而不是不透明的连接 ID。
  • 更好地处理并发请求 — 重叠的 JSON-RPC 请求现在可以跨 HTTP 和 RPC 传输正确关联到其响应。

其他改进

  • 压缩SessiontokenCounter 现在还驱动压缩边界决策(“压缩什么”),而不仅仅是触发/不触发。
  • @cloudflare/worker-bundler — 为 createWorker 添加了 virtualModules 选项,以便在打包(bundling)期间提供内存中模块源。
  • 客户端工具继续运行 — 并行工具结果现在合并为一个单一的继续,立即恢复请求会附加到挂起的继续上,并且服务器端 needsApproval 继续会在批准后可靠地恢复。

升级

要更新到最新版本:

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

有关更多信息,请参阅 Agents API 参考聊天 Agent 文档

通过 Cloudflare Tunnel 分享 sandbox 预览

Sandboxes 可以通过 sandbox.tunnels 命名空间将容器内运行的服务暴露到公共预览 URL。SDK 在 sandbox 内部使用 cloudflared,因此你可以在不配置 exposePort() 或自定义域名的情况下共享正在运行的服务。

默认情况下,sandbox.tunnels.get(port) 会在零配置的 *.trycloudflare.com URL 上创建一个快速隧道——无需 Cloudflare 账户、DNS 记录或自定义域名。这非常适合快速开发以及 .workers.dev 部署。

import { getSandbox } from "@cloudflare/sandbox";

const sandbox = getSandbox(env.Sandbox, "my-sandbox");
await sandbox.startProcess("python -m http.server 8080");

const tunnel = await sandbox.tunnels.get(8080);
console.log(tunnel.url); // → https://random-words-here.trycloudflare.com
import { getSandbox } from "@cloudflare/sandbox";

const sandbox = getSandbox(env.Sandbox, "my-sandbox");
await sandbox.startProcess("python -m http.server 8080");

const tunnel = await sandbox.tunnels.get(8080);
console.log(tunnel.url); // → https://random-words-here.trycloudflare.com

命名隧道

如需更多控制,你可以通过 sandbox.tunnels.get(port, { name }) 创建命名隧道。命名隧道绑定一个由 Cloudflare Tunnel 支持的主机名(<name>.<your-zone>),并在你的区域上创建 CNAME 记录,最终生成类似 https://my-app-preview.example.com 的地址。

与每次都生成新随机 URL 的快速隧道不同,命名隧道生成的持久 URL 在容器重启后仍然有效。这使命名隧道适用于需要对隧道及其源站进行控制的生产用途。

const tunnel = await sandbox.tunnels.get(8080, { name: "my-app-preview" });
console.log(tunnel.url); // → https://my-app-preview.example.com
const tunnel = await sandbox.tunnels.get(8080, { name: "my-app-preview" });
console.log(tunnel.url); // → https://my-app-preview.example.com

调用 sandbox.destroy() 会在销毁容器的同时拆除 Cloudflare Tunnel 和关联的 DNS 记录,因此不会留下悬空的隧道或记录。

升级

升级到最新版本:

npm i @cloudflare/sandbox@latest

有关完整的 API 详情,请参阅 Sandbox 隧道参考

D1 迁移通过 `migrations_pattern` 支持嵌套布局

现在,您可以使用新的 migrations_pattern D1 绑定(binding)配置,将 wrangler d1 migrations apply 指向嵌套的迁移布局——例如由 Drizzle 生成的布局(migrations/0001_init/migration.sql):

{
	"d1_databases": [
		{
			"binding": "DB",
			"database_name": "my-database",
			"database_id": "<UUID>",
			"migrations_dir": "migrations",
			"migrations_pattern": "migrations/*/migration.sql",
		},
	],
}

migrations_pattern 是一个用于发现迁移文件的 Glob 模式(相对于您的 Wrangler 配置文件)。它的默认值是 ${migrations_dir}/*.sql,因此现有项目无需任何修改即可继续运行。每个迁移的名称都会以相对于 migrations_dir 的路径记录在 migrations 表中。

欲了解更多信息,请访问 D1 的 迁移文档

Cloudflare 实时 WebSocket 适配器现支持自动重连并可缓冲 WebRTC 媒体

Cloudflare 实时 SFU 是一款运行在 Cloudflare 全球网络上的 WebRTC 选择性转发单元,使您无需管理 SFU 基础设施或区域,即可在全球 WebRTC 客户端之间路由实时音频、视频和数据。

当您使用 WebSocket 适配器将 WebRTC 媒体流传输至 WebSocket 端点时,该适配器现在可在端点短暂断连或重启后自动重连并缓冲音视频。

将 WebRTC 媒体流传输至 WebSocket 端点

许多团队还将实时 SFU 用作后端应用程序的媒体层,例如转录、录制、笔记和 Agent 媒体处理服务。这些系统通常需要在后端基础设施中消费来自 SFU 的实时 WebRTC 音频或视频,包括 Durable ObjectsWorkersContainers 或外部服务,而无需自行运行 WebRTC 客户端。

WebSocket 适配器通过将 WebRTC 媒体从 SFU 以应用程序可消费的载荷形式流式传输至标准 WebSocket 端点来弥合这一差距:PCM 音频帧和 JPEG 视频帧

变更内容

当您在 Stream 模式(出口)下使用 WebSocket 适配器将实时音视频从 SFU 发送到您自己的 WebSocket 端点时,SFU 现在会在端点短暂断连或重启后自动重连。这对于长时间运行的媒体管道尤其有用,因为在录制、转录或实时分析任务仍在进行时,WebSocket 端点可能会短暂重启。

此前,WebSocket 端点的短暂断连可能导致适配器关闭,需要应用程序在媒体恢复前重新创建适配器。现在,SFU 无需更改 API 即可重试同一端点长达 5 秒。如果端点在此时间窗口内恢复,音视频传输将自动恢复。

重连行为还包含实时优先媒体缓冲,因此短暂中断可减少媒体丢失,而无需重播过时视频。

重连行为

重连期间:

  • 音频使用有限的短暂积压队列来减少可听见的丢失。如果中断时间超过积压队列的覆盖范围,较旧的音频可能会被丢弃。
  • 视频从最新可用的 JPEG 帧恢复,而不是重播过时帧。
  • 恢复为尽力而为,不保证无间隙或精确一次传递。

如果端点在 5 秒重连窗口后仍不可用,适配器将关闭并必须重新创建。

了解更多

直接从 Workers 使用 Browser Run Quick Actions

您现在可以使用浏览器绑定(browser binding)上的 quickAction() 方法,直接从 Cloudflare Worker 调用 Browser Run Quick Actions。这消除了对 API 令牌或外部 HTTP 请求的需求,从而简化了 Workers 与 Browser Run 的交互方式。您的 Worker 会在 Cloudflare 的网络上直接与 Browser Run 进行通信,使得代码更简单,延迟更低。

通过 quickAction() 方法,您可以:

要开始使用,请将浏览器绑定(browser binding)添加到您的 Wrangler 配置中:

{
  "compatibility_date": "2026-03-24",
  "browser": {
    "binding": "BROWSER"
  }
}
compatibility_date = "2026-03-24"

[browser]
binding = "BROWSER"

然后直接从您的 Worker 调用任何 Quick Action。例如,要截取屏幕截图:

const screenshot = await env.BROWSER.quickAction("screenshot", {
	url: "https://www.cloudflare.com/",
});
const screenshot = await env.BROWSER.quickAction("screenshot", {
  url: "https://www.cloudflare.com/",
});

quickAction() 方法需要 2026-03-24 或更晚的兼容性日期。

有关设置说明和可用操作的完整列表,请参阅 Browser Run Quick Actions

Wrangler 支持用于 Containers 的 SSH ProxyCommand

Wrangler 支持将 wrangler containers ssh 作为 OpenSSH ProxyCommand 用于 Containers。这允许您的本地 SSH 客户端通过 Wrangler 连接到正在运行的 Container。

ssh -o ProxyCommand="wrangler containers ssh %h" cloudchamber@<INSTANCE_ID>

当标准输入和输出被管道传输时,Wrangler 会将数据转发到 Container 中的 SSH 服务器。您也可以传递 --stdio 来强制使用此模式。

欲了解更多信息,请参阅 SSH 文档

发送带有命名收件人地址的电子邮件

除了现有的 from 支持外,您现在还可以在发送电子邮件时为收件人地址添加显示名称。为 toccbccreplyTofrom 传递一个包含 email 和可选 name 字段的对象:

src/index.jsjs
export default {
	async fetch(request, env) {
		const response = await env.EMAIL.send({
			from: { email: "[email protected]", name: "Support Team" },
			to: { email: "[email protected]", name: "Jane Doe" },
			cc: [
				"[email protected]",
				{ email: "[email protected]", name: "Engineering Team" },
			],
			subject: "Welcome!",
			html: "<h1>Thanks for joining!</h1>",
			text: "Thanks for joining!",
		});

		return Response.json({ messageId: response.messageId });
	},
};
src/index.tsts
export default {
	async fetch(request, env): Promise<Response> {
		const response = await env.EMAIL.send({
			from: { email: "[email protected]", name: "Support Team" },
			to: { email: "[email protected]", name: "Jane Doe" },
			cc: [
				"[email protected]",
				{ email: "[email protected]", name: "Engineering Team" },
			],
			subject: "Welcome!",
			html: "<h1>Thanks for joining!</h1>",
			text: "Thanks for joining!",
		});

		return Response.json({ messageId: response.messageId });
	},
} satisfies ExportedHandler<Env>;

为实现向后兼容,纯字符串形式仍受到完整支持,并且您可以在同一个数组中混合使用字符串和命名对象。

有关完整的请求示例,请参阅 Workers APIREST API 文档。

Pipelines 计费方案公布

Cloudflare Pipelines 是一个流数据平台,可摄取事件,使用 SQL 对其进行转换,并将 JSON、Parquet 或 Apache Iceberg 表写入 R2。Pipelines 现在公布了基于两个使用维度的计费方案:SQL 转换处理的数据量以及交付到接收器(sink)的数据量。输入(ingress)到 Pipeline 流是免费的。

计费尚未启用。我们将在开始对 Pipelines 使用进行收费之前至少提前 30 天通知。

Pipelines 的计费模型旨在根据您的实际使用量按 GB 收费:

  • Streams (ingress):免费,无论数据量大小。
  • SQL 转换:无状态转换(过滤、重塑、展开、转换、计算)为 0.04 美元 / GB。
  • Sinks:JSON 输出为 0.03 美元 / GB,Parquet 或 Iceberg 输出为 0.06 美元 / GB。

Workers 免费计划包括每个维度每月 1 GB。Workers 付费计划包括每月 50 GB。

有关完整定价详情和计费示例,请参阅 Pipelines 计费

R2 SQL 定价公布

R2 SQL 是一个无服务器分布式查询引擎,可对存储在 R2 Data Catalog 中的 Apache Iceberg 表运行 SQL。R2 SQL 现在已发布基于单一维度的定价:即执行查询所扫描的压缩数据量。R2 SQL 的价格为 2.50 美元/TB(0.0025 美元/GB),仅为 AWS Athena 成本的一半,且不到 Google BigQuery 按需付费价格的一半。

计费尚未启用。在开始对 R2 SQL 使用收费之前,我们将至少提前 30 天通知。

扫描的数据量是以从 R2 对象存储中读取的压缩字节数来衡量的。这与您在 R2 存储桶中看到的相符——如果一个 Parquet 文件在磁盘上是 100 MB,那么扫描该文件将按 100 MB 计费。每个查询的最小计费增量为 10 MB。

免费计划每月包含 1 GB,付费计划每月包含 10 GB。标准的 R2 存储和操作费用 以及 R2 Data Catalog 费用 单独计算。

有关完整的定价详细信息和计费示例,请参阅 R2 SQL 定价

R2 Data Catalog 定价公告

R2 Data Catalog 是直接内置于 R2 存储桶的托管 Apache Iceberg 数据目录,可被 Spark、Snowflake 和 DuckDB 等任何 Iceberg 兼容引擎查询。R2 Data Catalog 现在已公布目录操作和表压缩的定价,此外还有标准的 R2 存储和操作费用。

计费尚未启用。在开始对 R2 Data Catalog 使用量收费之前,我们将提前至少 30 天通知。

定价基于两个维度:

  • 目录操作:每百万次操作 $9.00,适用于创建表、读取表元数据和更新表属性等元数据请求。
  • 压缩:每处理 1 GB 数据 $0.005,每处理 100 万个对象 $2.00。这些费用仅在为表启用自动压缩时产生。

两个维度均包含月度免费套餐:100 万次目录操作、10 GB 压缩数据处理量和 100 万个压缩对象处理量。

有关完整定价详情和计费示例,请参阅 R2 Data Catalog 定价

R2 Data Catalog 获得专属仪表板体验

R2 Data Catalog 是直接内置于 R2 存储桶的托管 Apache Iceberg 数据目录。它公开标准 Iceberg REST 目录接口,因此您可以将 SparkSnowflakeDuckDBR2 SQL 等查询引擎连接到 R2 中的数据。

R2 Data Catalog 现在在 Cloudflare 仪表板中拥有专属部分,取代了之前嵌入在 R2 存储桶配置中的设置面板。新体验包括:

R2 Data Catalog 仪表板概览
  • 目录概览 — 在一个地方查看所有目录,一览目录请求数量、存储桶大小和表维护状态。
  • 引导式设置向导 — 通过三个步骤创建目录:选择或创建 R2 存储桶、配置表维护(压缩和快照过期)、然后确认。向导会自动创建存储桶并生成服务凭证。
  • 设置管理 — 每个目录的专属设置页面,包含常规配置、表维护、服务凭证和禁用目录等部分。您现在可以直接从仪表板启用和配置快照过期
  • 内置指标 — 每个目录的指标标签上有五个图表:已压缩字节数、已压缩文件数、目录请求数、存储大小和已过期快照数。

要开始使用,请在 Cloudflare 仪表板中转到 R2 Data Catalog,或参阅快速入门指南管理目录文档

在 RealtimeKit 中录制特定参与者的音频轨道

您现在可以使用 RealtimeKit 的轨道录制功能录制特定参与者的音频轨道。轨道录制为每位参与者创建单独的 WebM 文件,而非单一的合成录制,这对后期处理、转录以及受监管或内容敏感的工作流非常有用。

要录制特定参与者,在启动轨道录制时传入 user_ids

curl --request POST \
  --url https://api.cloudflare.com/client/v4/accounts/<account_id>/realtime/kit/<app_id>/recordings/track \
  --header 'Authorization: Bearer <api_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "meeting_id": "97440c6a-140b-40a9-9499-b23fd7a3868a",
  "user_ids": ["user-123", "user-456"]
}'

要在选择性轨道录制中传入 user_ids,需使用以下最低 SDK 版本:

  • Web Core:@cloudflare/realtimekit 版本 1.4.0 或更高
  • Web UI Kit:@cloudflare/realtimekit-ui@cloudflare/realtimekit-react-ui@cloudflare/realtimekit-angular-ui 版本 1.1.2 或更高
  • Android Core 或 iOS Core:版本 2.0.0 或更高
  • Android UI Kit 或 iOS UI Kit:版本 1.1.0 或更高

RealtimeKit 提供 SDK 和 UI 组件,让您可以在 Cloudflare 的全球 WebRTC 基础设施上构建自己的会议体验。如今,各团队正在 RealtimeKit 上为全球受众构建从远程医疗到在线教育的各类产品。您可以通过我们的快速入门立即上手,或参考我们的 Cloudflare Meet 仓库 作为参考。

Images 中的转换流(flows)

自定义流配置面板

流(Flows)是自动规则,它将条件(例如文件扩展名、URL 路径或查询参数)与参数进行匹配。您可以设置一个流,以自动将图像优化应用到您区域上的匹配请求,而无需编写代码或更改 URL。

转换流有两种模式:

  • 提供商流(Provider flows) — 从其他图像优化服务进行迁移。您现有的 URL 将继续工作,同时 Cloudflare 会将特定提供商的参数重写为 Cloudflare 对应的参数。目前,Cloudflare 支持针对 Fastly Image Optimizer 的提供商流。
  • 自定义流(Custom flows) — 为自动格式转换、具有 width=auto响应式大小调整或基于目录的优化等使用场景定义您自己的条件和操作。

若要开始使用,请转到 Cloudflare 仪表板中的 Images > Transformations(转换) > Automation(自动化)

详细了解转换流

Cloudflare Tunnel 现在在启动时运行连接性预检查

cloudflared 版本 2026.5.2 开始,Cloudflare Tunnel 直接在二进制文件内部自动执行整个连接性预检查工作流程。以前,客户必须安装 dignetcat 并手动运行这些命令来验证其环境。现在 cloudflared 在启动时以原生方式执行此操作 — 并在某些内容被阻止时提供可操作的修正提示。

cloudflared 连接性预检查输出

在每次运行 cloudflared tunnel run(以及 cloudflared tunnel diag)时,二进制文件现在都会原生检查:

  • DNS 解析region1.v2.argotunnel.comregion2.v2.argotunnel.com 解析为有效的 Cloudflare IP。
  • 传输连接性 — 端口 7844 上的出站 UDP (QUIC)TCP (HTTP/2)
  • Management API — 发往 api.cloudflare.com 的出站 TCP/443,用于软件更新。

结果将以可扫描的 CLI 表格形式打印,包含以下三种状态:

  • 通过 — 检查成功。
  • ⚠️ 警告 — 非阻塞问题,例如 Management API 无法访问,因此自动更新将无法工作,但 Tunnel 仍会启动。
  • 失败 — 阻塞问题,并附有具体的修正提示(例如 Allow outbound UDP on port 7844)。

如果 DNS 无法解析,或者端口 7844 上的 UDP 和 TCP 双双失败,cloudflared 将提前退出并报告失败,而不是在不透明的 failed to dial 错误中循环。

现在每次启动都会自动运行预检查,这还能捕获诸如通宵防火墙策略变更之类的问题退化 — 无需记得重新运行故障排除指南。

要获取这一新行为,请将 cloudflared 升级到版本 2026.5.2 或更高版本。欲了解更多细节,请参阅连接性预检查文档

Flagship 现已进入公开 Beta

Flagship 现已进入公开 Beta。无需出站 HTTP 调用,即可直接在 Cloudflare Workers 中评估功能标志,使用由 Workers KV 和 Durable Objects 支持的全球分布式标志配置。Flagship 支持类型化标志值、定向规则、百分比灰度发布、审计历史记录,以及兼容 OpenFeature 的 SDK。

只需几行代码,即可在 Worker 中评估标志:

src/index.jsjs
export default {
	async fetch(request, env) {
		const showNewCheckout = await env.FLAGS.getBooleanValue(
			"new-checkout",
			false,
		);

		return new Response(showNewCheckout ? "New checkout" : "Standard checkout");
	},
};
src/index.tsts
export default {
	async fetch(request: Request, env: Env): Promise<Response> {
		const showNewCheckout = await env.FLAGS.getBooleanValue("new-checkout", false);

		return new Response(
			showNewCheckout ? "New checkout" : "Standard checkout",
		);
	},
} satisfies ExportedHandler<Env>;

立即在 Cloudflare 仪表板中开始创建标志。请参阅 Flagship 文档 以快速入门。

通过 AI Gateway 全新的 REST API 调用任何 AI 模型

AI Gateway 现在开始使用 api.cloudflare.com 上的 AI REST API。无论提供商是 OpenAI、Anthropic、Google 还是托管在 Workers AI 上,您都可以通过一个统一的 API 调用任何模型,并使用相同的端点和身份验证方式。共有四个端点可用:

  • POST /ai/run — 适用于所有模型和模态的通用端点
  • POST /ai/v1/chat/completions — 兼容 OpenAI SDK
  • POST /ai/v1/responses — 兼容 OpenAI Responses API
  • POST /ai/v1/messages — 兼容 Anthropic SDK
curl -X POST "https://api.cloudflare.com/client/v4/accounts/$CLOUDFLARE_ACCOUNT_ID/ai/v1/chat/completions" \
  --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
  --header "Content-Type: application/json" \
  --data '{
    "model": "openai/gpt-5.5",
    "messages": [{"role": "user", "content": "What is Cloudflare?"}]
  }'

所有的 AI Gateway 功能(日志记录、缓存、速率限制和护栏)都会自动应用。第三方模型将通过统一计费(Unified Billing)进行计费,因此您无需管理单独的提供商 API 密钥。

第三方模型请求将通过您账户的默认网关(Gateway)进行路由,该网关会在首次使用时自动创建。若要通过特定网关路由请求,请添加 cf-aig-gateway-id 标头。

如果您已经通过现有的 REST API 调用 Workers AI 模型,该路径(/ai/run/@cf/{model})将继续有效。若要通过 AI Gateway 调用 Workers AI 模型,请使用 @cf/ 模型前缀(例如,@cf/moonshotai/kimi-k2.6)并包含 cf-aig-gateway-id 标头来指定要路由到的网关。

欲了解更多细节和示例,请参阅 REST API 文档

Cloudflare Tunnel 和 Cloudflare Mesh 的细粒度权限

您现在可以将 Cloudflare 权限范围限定为单个 Cloudflare Tunnel 实例和 Cloudflare Mesh 节点。管理员可以委派对特定 Tunnel 或 Mesh 节点的访问权限,而无需授予对整个账户中私有网络的控制权。

新增功能

当您添加成员或创建权限策略时,资源选择器现在将 Cloudflare Tunnel 实例和 Cloudflare Mesh 节点列为可限定范围的资源类型。您可以:

  • 向支持操作人员授予对单个 Cloudflare Tunnel 实例的只读角色,以进行日志流传输和诊断,而不会暴露其他 Tunnel 或允许破坏性操作。
  • 向应用程序团队授予对特定 Cloudflare Mesh 节点的写入角色,而无需让他们访问私有网络的其余部分。
  • 将单个策略的范围同时限定为一个或多个 Tunnel 以及 Mesh 节点。

工作原理

细粒度权限是与现有账户级别角色平行的层,它们不会取代后者。

  • 现现的账户级别角色继续有效。 拥有 Cloudflare AccessCloudflare Zero Trust 的成员将保留对账户中每个 Tunnel 和 Mesh 节点的写入访问权限。这确保了与现有自动化和令牌的向后兼容性。
  • 细粒度权限是累加的。 对于针对特定 Tunnel 或 Mesh 节点的任何 API 请求,如果主体具有账户级别角色该资源的细粒度权限,则将授予访问权限。
  • 资源枚举是感知授权的。 列表端点(GET /accounts/{id}/cfd_tunnelGET /accounts/{id}/warp_connector)仅返回主体至少具有只读访问权限的资源。

开始使用

从 Workers VPC 访问 Cloudflare WAN 目标

You can now use VPC 网络(VPC Network) 绑定(binding)与 network_id: "cf1:network" 从 Workers 访问您的整个私有网络,包括:

这意味着单个 VPC 网络绑定可以将 Worker 请求路由到私有服务,无论这些服务是如何连接到 Cloudflare 的:是通过来自云 VPC 的 Cloudflare Tunnel、私有子网上的 Mesh 节点,还是通过来自您的数据中心或分支机构站点的 Cloudflare WAN 接入端。

{
	"vpc_networks": [
		{
			"binding": "PRIVATE_NETWORK",
			"network_id": "cf1:network",
			"remote": true,
		},
	],
}
[[vpc_networks]]
binding = "PRIVATE_NETWORK"
network_id = "cf1:network"
remote = true

在运行时,您传给 fetch() 的 URL 决定了目标:

// Reach a service behind a Cloudflare WAN IPsec on-ramp
const response = await env.PRIVATE_NETWORK.fetch("http://10.50.0.100:8080/api");

有关配置选项,请参阅 VPC 网络(VPC Networks)

针对 Artifacts 生命周期事件的事件订阅

您现在可以接收针对 Artifacts 仓库更改的事件通知,并在 Worker 中使用它们来构建提交驱动的自动化。

这允许您:

  • 在创建或导入仓库时运行自定义工作流。
  • 在代理(agent)向仓库推送代码时启动构建并部署更改。
  • 在每次推送时触发评审代理。

可用事件包括:

  • 账户级别事件artifacts 源)— repo.createdrepo.deletedrepo.forkedrepo.imported
  • 仓库级别事件artifacts.repo 源)— pushedclonedfetched

要了解更多信息,请参阅 Artifacts 文档

使用 Wrangler CLI 管理 Artifacts 命名空间和仓库

您现在可以直接从 Wrangler CLI 管理 Artifacts 命名空间、仓库以及仓库范围的令牌。

可用命令:

  • wrangler artifacts namespaces list — 列出您账户中的 Artifacts 命名空间。
  • wrangler artifacts namespaces get — 获取命名空间的元数据。
  • wrangler artifacts repos create — 在命名空间中创建仓库。
  • wrangler artifacts repos list — 列出命名空间中的仓库。
  • wrangler artifacts repos get — 获取仓库的元数据。
  • wrangler artifacts repos delete — 删除仓库。
  • wrangler artifacts repos issue-token — 签发用于 Git 访问的仓库范围令牌。

要开始使用,请参阅 Wrangler Artifacts 命令文档

在 Wrangler 和 Vite 中通过 Cloudflare Tunnel 共享本地开发服务器

现在,当使用 WranglerCloudflare Vite 插件时,您可以通过 Cloudflare Tunnel 共享本地开发会话并获得一个公共 URL。当您需要共享预览、测试 Webhook 或从其他设备访问您的应用程序时,这非常有用。

Vite 本地开发隧道演示

这使您可以:

要启动隧道,请在开发服务器运行时在 Wrangler 中按 t 或在 Vite 中按 t + Enter。有关设置命名隧道的详细信息,请参阅共享本地开发服务器

Hyperdrive 开放数据库连接池大小指标

您现在可以查看 Hyperdrive 数据库连接池的大小,从而使您能够自诊断连接问题。使用 Cloudflare 仪表板或 GraphQL Analytics API 中的 hyperdrivePoolSizesAdaptiveGroups 数据集,您可以查看每个配置的 waitingClientscurrentPoolSizeavailablePoolSlotsmaxPoolSize

Cloudflare 仪表板中每个 Hyperdrive 配置的 **Metrics(指标)**选项卡中添加了一个新的 **Pool connections(连接池连接)**图表。您可以使用位置选择器,按机场代码钻取托管连接池的特定位置。

Hyperdrive 池大小指标图表

该图表显示:

  • Waiting clients(等待中的客户端):等待可用连接的客户端请求。
  • Open connections(打开的连接):到您数据库的活动连接。
  • Pool size maximum(最大连接池大小):您配置的源站连接限制。

连接争用表现为等待中的客户端激增,或者当打开的连接持续接近最大连接池大小时。如果您的打开连接经常接近此限制,请考虑联系 Cloudflare 以提高您的 Hyperdrive 连接限制

连接池大小指标

GraphQL Analytics API 中的 hyperdrivePoolSizesAdaptiveGroups 数据集为每个 Hyperdrive 配置公开了以下关键连接池指标:

avg 下:

  • currentPoolSize — 当前在池中打开的平均连接数。
  • availablePoolSlots — 可供检出的平均连接池连接数。
  • waitingClients — 等待池中连接的平均客户端数。

max 下:

  • maxPoolSize — 配置的连接池最大大小。
  • currentPoolSize — 池中打开的峰值连接数。
  • waitingClients — 等待池中连接的峰值客户端数。

有关更多信息,请参阅 Metrics and analyticsConnection pooling

R2 SQL 现在支持 JOIN、子查询和多表查询

R2 SQL 是 Cloudflare 的无服务器分布式 SQL 引擎,用于查询存储在 R2 Data Catalog 中的 Apache Iceberg 表。R2 SQL 直接在 Cloudflare 的全球网络上运行,无需管理任何基础设施,因此您可以分析 R2 中的数据,而无需将其导出到外部仓库。

R2 SQL 现在支持在单个查询中连接多个 Iceberg 表。您可以使用 JOIN 组合表,使用子查询进行过滤,并定义多表 CTE 以构建复杂的分析查询。

新功能

  • JOININNER JOINLEFT JOINRIGHT JOINFULL OUTER JOINCROSS JOIN 以及隐式连接(FROM 中以逗号分隔,且条件在 WHERE 中)
  • 子查询IN / NOT INEXISTS / NOT EXISTSSELECT / WHERE / HAVING 中的标量子查询,以及派生表(FROM 中的子查询)
  • 多表 CTEWITH 子句可以引用不同的表并包含 JOIN
  • 自连接 — 使用不同的别名将表与自身连接
  • 多路连接 — 在单个查询中连接三个或更多表

示例

带有聚合的双表 JOIN

SELECT z.domain, z.plan, COUNT(*) AS request_count
FROM my_namespace.zones z
INNER JOIN my_namespace.http_requests h ON z.zone_id = h.zone_id
WHERE z.plan = 'enterprise'
GROUP BY z.domain, z.plan
ORDER BY request_count DESC
LIMIT 20

EXISTS 子查询

SELECT z.domain, z.plan
FROM my_namespace.zones z
WHERE EXISTS (
    SELECT 1 FROM my_namespace.firewall_events f
    WHERE f.zone_id = z.zone_id AND f.action = 'block'
)
ORDER BY z.domain
LIMIT 20

带有 JOIN 的多表 CTE

WITH top_zones AS (
    SELECT zone_id, COUNT(*) AS req_count
    FROM my_namespace.http_requests
    GROUP BY zone_id
    ORDER BY req_count DESC
    LIMIT 50
),
zone_threats AS (
    SELECT zone_id, COUNT(*) AS threat_count
    FROM my_namespace.firewall_events
    WHERE risk_score > 0.5
    GROUP BY zone_id
)
SELECT tz.zone_id, tz.req_count, COALESCE(zt.threat_count, 0) AS threat_count
FROM top_zones tz
LEFT JOIN zone_threats zt ON tz.zone_id = zt.zone_id
ORDER BY tz.req_count DESC
LIMIT 20

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

Workers 仪表板中新增的域名(Domains)选项卡

在您的 Worker 仪表板中,现在有一个专用的 Domains(域名) 选项卡,您可以在其中通过 Cloudflare Registrar 购买新域名并使其自动连接,添加现有域名,并在一个地方管理所有 Worker 的路由。

Workers 仪表板中新增的域名(Domains)选项卡

您还可以启用或禁用您的 workers.dev 子域名预览 URL (Preview URLs),将它们置于 Cloudflare Access 保护之下以要求登录,并直接跳转到任何已连接域名的 分析 或域名概览。

要开始使用,请转到 Workers & Pages,选择一个 Worker,然后打开 Domains(域名) 选项卡。

Go to Workers & Pages ↗