跳转到内容
搜索文档

更新日志

Cloudflare 的最新更新与改进。

在 Threat Events 中推出 Threat Actor Profiles(威胁行为者档案)

摘要(TL;DR): 我们直接在 Threat Events 仪表板中推出了 Threat Actor Profiles(威胁行为者档案)。您现在可以立即从通用的警报或被阻止的事件,转向揭示威胁事件背后“是谁、为什么以及如何进行”的档案。

为什么这很重要

安全团队经常面临可见性差距。当一次攻击被阻止时,很难知道它是一个随机的自动化机器人,还是专门针对您行业的复杂高级持续性威胁(APT)活动。要查明原因,通常意味着需要离开您的安全仪表板,去搜寻外部的 OSINT 源或静态且过时的威胁报告。

Threat Actor Profiles 通过直接在您的工作流中共享 Cloudforce One 的深度对手研究来解决此问题:

  • Cloudflare 实时查看全球大约 20% 的网络流量。这意味着在活动恶意基础设施接触到我们全球边缘的瞬间,行为者档案就会显示该基础设施。
  • 每个档案都提供清晰的战略和战术模块,包括备用别名、来源追踪、历史威胁事件卷以及详细说明对手技术方法的 MITRE ATT&CK 映射。
  • 您可以搜索专属的威胁行为者目录,或在任何威胁事件内点击行为者的名称,以查看该特定威胁行为者的所有详细信息和相关事件。

如何使用

对手追踪现在可在 Cloudflare 仪表板中使用,并已准备好纳入您的日常调查工作流程中:

  • 点击 Threat Events 表格中的 Threat Actor(威胁行为者) 名称以打开其完整的身份档案,并查看其别名和攻击统计数据。
  • 导航至 Cloudflare 仪表板 > Application Security(应用安全) > Threat Intelligence(威胁情报) 以探索全新的 Threat Actors(威胁行为者) 标签页。在这里,您可以浏览由 Cloudforce One 追踪的所有既定实体的卡片式目录。

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

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(自带密钥) 请求。

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

Cloudflare Radar 针对较长时间范围提供更细粒度图表

Radar 现在为较长时间范围提供更细粒度的流量图表。此前,在 HTTP 和 NetFlows 图表上选择 1-3 个月视图时,默认采用每周聚合,粒度过粗,难以呈现有意义的趋势。超过 3 个月的视图默认采用每月聚合,6 个月范围内最少只返回 7 个数据点。

新的默认值为:

  • 1-3 个月:每日粒度(数据点增加 7 倍)
  • 超过 3 个月(HTTP 和 NetFlows):每周粒度(数据点增加 4 倍)

例如,12 周流量视图之前显示每周数据:

12 周视图使用每周粒度的流量趋势图

现在同一视图显示每日数据:

12 周视图使用每日粒度的流量趋势图

同样,此前 1 年 HTTP 流量视图仅显示 12 个月度数据点,现在可提供 52 个每周数据点。

访问 Cloudflare Radar 探索新的细粒度视图。

使用 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 流量策略

通过 IdP 联合跨账户共享身份提供商

Cloudflare Access 现在支持 IdP 联合,这允许组织在多个 Cloudflare 账户之间共享单个身份提供商。

无需在每个账户中分别配置相同的 IdP(例如 Okta 或 Entra ID),您只需在源账户中配置一次,然后与组织中的其他账户共享它。每个接收方账户都会获得一个只读的 IdP 连接,该连接通过一个桥接(bridge)—— 源账户中一个代理跨账户登录的隐藏应用程序 —— 将身份验证路由回源账户。最终用户使用其现有的 IdP 凭据登录,而每个账户的 Access 策略评估生成的身份就和任何其他 IdP 登录一样。

关键功能:

  • 一个 IdP,多个账户 — 配置一次您的 IdP,并将其共享给您组织中的所有账户。
  • 生命周期管理 — 随着账户加入或离开您的 Cloudflare 组织,它们的 IdP 连接会自动预配和删除 —— 无需手动清理。
  • 不可变的接收方连接 — 接收方账户中的 IdP 连接不能被意外修改或删除。

要开始使用,请参阅 IdP 联合

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

按需付费(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)的更多信息,请参阅写入流

身份提供商的 SAML 断言加密

Cloudflare Access 现在支持身份提供商集成的 SAML 断言(assertion)加密。开启后,您的身份提供商会在通过用户浏览器发送 SAML 断言之前,使用 Cloudflare 管理的证书对其进行加密。只有 Access 可以解密这些断言,从而在 TLS 终止后也能保护敏感的身份数据。

如果没有加密,SAML 断言将以明文传输,并且可能会被浏览器扩展或客户端恶意软件看到。

身份提供商配置中的 SAML 加密切换开关

SAML 加密包括内置的证书生命周期管理:

  • 自动生成证书:当您为身份提供商开启 SAML 加密时,Access 会生成一个加密证书。
  • 证书轮换:无停机轮换证书。之前的证书在过期前保持有效,为您留出时间来更新 IdP。
  • PEM 导出:复制 PEM 格式的证书以便手动上传到您的 IdP,或者将您的 IdP 指向 SAML 元数据端点以进行自动检索。

要开始使用,请参阅加密 SAML 断言

推出自托管 OAuth 客户端

今天,我们推出了自托管 OAuth,使开发者能够构建通过 OAuth 与 Cloudflare 集成的第三方应用程序。这为 API 令牌提供了一种更安全、更易用且更易于管理的替代方案。

OAuth 允许第三方应用程序代表用户访问其 Cloudflare 账户。例如,在用户授予同意后,Wrangler 可以将 Workers 部署到该账户中。

新增功能

Cloudflare 开发者现在可以创建和管理他们自己的 OAuth 应用程序,以便与 Cloudflare 集成。

创建应用程序

要创建应用程序,请转到 Cloudflare 仪表板中您账户的 Manage Account(管理账户) > OAuth clients(OAuth 客户端)

Go to OAuth clients ↗

选择受限范围

如果您曾使用 API 令牌调用 Cloudflare API,您会对 OAuth 客户端范围感到熟悉。在创建应用程序期间只选择您的应用程序所需的范围,并在向用户发送 Cloudflare 同意请求时包含该范围列表。

用户可以在同意之前查看请求的范围。

适用于私有和公共用途的应用程序

应用程序开始时具有 private 可见性。私有应用程序只能由创建该应用程序的账户的成员使用。

要使任何 Cloudflare 用户都能使用该应用程序,请完成 public 可见性的先决条件。

有关更多信息,请参阅客户端可见性

客户端域名验证

在将应用程序公开之前,您必须验证客户端域名。域名验证有助于用户确认应用程序所有者控制着同意页面上显示的域名。

验证后,用户将在同意页面上看到已验证徽章。

有关更多信息,请参阅域名验证

了解更多

有关更多信息,请参阅 OAuth 客户端

新增 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 环境变量。

直接从 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 文档

Cisco IOS XE

用于 Cloudflare WAN 的 Cisco IOS XE 第三方集成指南已更新,包含以下内容:

  • 后量子密码学 (PQC)
  • 策略路由 (PBR)
  • IP 服务水平协议 (IP SLA)

此链接将直接带您进入已更新的 Cisco IOS XE 指南。

Cloudflare One Client for macOS (version 2026.5.1155.1)

A new Beta release for the macOS Cloudflare One Client is now available on the beta releases downloads page.

This release introduces the new Cloudflare One Client UI for macOS! You can expect a cleaner and more intuitive design as well as easier access to common actions and information. Here are some of the many things we have found our users appreciate:

  • Right click context menu to access the most common client actions quickly
  • Built-in captive portal login experience

Additional Changes and improvements

  • The client now applies DNS search suffixes configured in your device profile / network policy. Administrators can push a list of DNS search domains that the client appends to single-label queries, alongside any system-configured suffixes. See DNS search suffixes for details.
  • Administrators can now control which virtual networks (VNETs) are available to which users via WARP device profile settings in the Zero Trust dashboard. Previously, every VNET in the organization was visible to every device; you can now scope the VNET picker per profile so users only see the networks relevant to them. See VNET availability for details.
  • Added a local-file signal source for Emergency Disconnect. In addition to the existing HTTPS polling mechanism, administrators can now configure WARP to monitor for a file on disk; the presence of the file triggers an emergency disconnect even if both Cloudflare and your own infrastructure are unreachable. Either signal being asserted triggers disconnect; both must be cleared for normal operation to resume.
  • Added new warp-cli debug commands for interactive connection diagnosis. See Extra debug logging for details.
  • The local DNS proxy now supports DNSSEC passthrough. DNSSEC-signed responses are forwarded to the application intact (including DO/AD bits and RRSIG records), so applications that validate DNSSEC locally — including resolvers and the dig/drill tooling — work correctly through the client.
  • Added a new MDM format for organization-wide settings, including a cleaner way to configure the compliance environment (e.g. FedRAMP). The previous per-configuration approach still works, but the new format is now recommended. See the updated Cloudflare One MDM documentation for details.
  • Client Certificate device-posture checks now support template variables (e.g. ${serial_number}, ${device_uuid}) in the Subject Alternative Name field, matching what the documentation has always claimed. Previously only the Common Name field accepted variables, which broke posture rules that pinned identity to a SAN entry.
  • Fixed the in-client captive-portal browser rendering a blank "Success" page on some airline Wi-Fi networks (United inflight Wi-Fi was the reported case). The browser now reliably loads the airline's real portal page so users can complete sign-in from inside the client instead of having to open a separate browser.
  • Fixed an issue in proxy mode where hostnames containing underscores (e.g. ai_app.com) were rejected, breaking apps that depend on such hostnames (notably ChatGPT sandbox apps). The local proxy now accepts underscore-containing hostnames in CONNECT requests.

Known issues

  • Registration may hang at "Checking your organization configuration" due to IPC errors. A system reboot should resolve the error, allowing registration to proceed.
  • Split tunnel list configuration is not available in the new UI. Management of split tunnel entries is currently only possible via warp-cli tunnel ip and warp-cli tunnel host. UI support will be added in a future release.

Cloudflare One Client for Windows (version 2026.5.1155.1)

A new Beta release for the Windows Cloudflare One Client is now available on the beta releases downloads page.

This release introduces the new Cloudflare One Client UI for Windows! You can expect a cleaner and more intuitive design as well as easier access to common actions and information. Here are some of the many things we have found our users appreciate:

  • Right click context menu to access the most common client actions quickly
  • Built-in captive portal login experience

Additional Changes and improvements

  • The client now applies DNS search suffixes configured in your device profile / network policy. Administrators can push a list of DNS search domains that the client appends to single-label queries, alongside any system-configured suffixes. See DNS search suffixes for details.
  • Administrators can now control which virtual networks (VNETs) are available to which users via WARP device profile settings in the Zero Trust dashboard. Previously, every VNET in the organization was visible to every device; you can now scope the VNET picker per profile so users only see the networks relevant to them. See VNET availability for details.
  • Added mandatory authentication. When enabled via MDM, the Cloudflare One Client blocks all Internet traffic from the moment the machine boots until the user authenticates, closing the visibility gap on newly deployed devices and during re-authentication. See the announcement blog and documentation for details.
  • Added a local-file signal source for Emergency Disconnect. In addition to the existing HTTPS polling mechanism, administrators can now configure WARP to monitor for a file on disk; the presence of the file triggers an emergency disconnect even if both Cloudflare and your own infrastructure are unreachable. Either signal being asserted triggers disconnect; both must be cleared for normal operation to resume.
  • Added new warp-cli debug commands for interactive connection diagnosis. See Extra debug logging for details.
  • The local DNS proxy now supports DNSSEC passthrough. DNSSEC-signed responses are forwarded to the application intact (including DO/AD bits and RRSIG records), so applications that validate DNSSEC locally — including resolvers and the dig/drill tooling — work correctly through the client.
  • Added a new MDM format for organization-wide settings, including a cleaner way to configure the compliance environment (e.g. FedRAMP). The previous per-configuration approach still works, but the new format is now recommended. See the updated Cloudflare One MDM documentation for details.
  • Client Certificate device-posture checks now support template variables (e.g. ${serial_number}, ${device_uuid}) in the Subject Alternative Name field, matching what the documentation has always claimed. Previously only the Common Name field accepted variables, which broke posture rules that pinned identity to a SAN entry.
  • The UseWebView2 registry value (HKLM\SOFTWARE\Cloudflare\CloudflareWARP\UseWebView2 = y) is once again honored by the new GUI for authentication, so administrators who prefer the embedded WebView2 browser for sign-in can opt back in. This setting was effectively ignored in the previous release; the default browser was always used. This key is now also honored for re-authentications.
  • Fixed a crash in the authentication browser when navigating to a site that prompts for browser permissions (microphone, camera, notifications, etc.). The same fix had previously landed for the captive-portal browser; this extends it to the auth browser.
  • Fixed an issue in proxy mode where hostnames containing underscores (e.g. ai_app.com) were rejected, breaking apps that depend on such hostnames (notably ChatGPT sandbox apps). The local proxy now accepts underscore-containing hostnames in CONNECT requests.

Known issues

  • An error indicating that Microsoft Edge can't read and write to its data directory may be displayed during captive portal login; this error is benign and can be dismissed.
  • Registration may hang at "Checking your organization configuration" due to IPC errors. A system reboot should resolve the error, allowing registration to proceed.
  • Split tunnel list configuration is not available in the new UI. Management of Split Tunnel entries is currently only possible via warp-cli tunnel ip and warp-cli tunnel host. UI support will be added in a future release.
  • Windows ARM may prompt the user to close running applications while trying to install this version. Simply click “Ok” with the default highlighted option.
  • DNS resolution may be broken when the following conditions are all true:
    • The client is in Secure Web Gateway without DNS filtering (tunnel-only) mode.
    • A custom DNS server address is configured on the primary network adapter.
    • The custom DNS server address on the primary network adapter is changed while the client is connected.
      To work around this issue, please reconnect the client by selecting "disconnect" and then "connect" in the client user interface.

通过 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 Radar 后量子检查器中的 TLS 漏洞检测

Radar后量子 TLS 支持检查器现在还可以报告握手测试期间检测到的 TLS 漏洞。当被扫描的主机存在兼容性问题时,结果中会包含检测到的具体漏洞详情,以及排查和修复每个问题的指导。漏洞部分仅在发现问题的主机中显示。

检测到的 TLS 漏洞如下:

  • Split ClientHello — 连接在发送分片后量子 ClientHello 时失败,但使用经典握手可成功。通常由无法重组分割 TLS 消息的中间件或防火墙引起。
  • HRR Failure — 服务器发送了 HelloRetryRequest,但之后无法完成握手。
  • Unknown Keyshare — 服务器无法处理未知密钥交换算法,并以失败告终,而非按 TLS 1.3 规范要求响应 HelloRetryRequest
Radar 后量子检查器中的 TLS 漏洞检测结果

漏洞检测数据可通过现有的 /post_quantum/tls/support 端点获取。

访问后量子加密页面以测试主机。

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 秒重连窗口后仍不可用,适配器将关闭并必须重新创建。

了解更多

安全扫描更频繁

Security Insights 扫描现在运行得更频繁。Cloudflare 对 Free 账户每 7 天扫描一次,对 Pro 和 Business 账户每 3 天扫描一次,对 Enterprise 账户每天进行扫描。

此外,现在所有账户和区域默认都会接受扫描。在 Cloudflare 检查您的账户是否存在配置错误、漏洞和其他安全风险之前,您不再需要手动启用扫描。

任何计划现在都可以使用细粒度的按需扫描。您可以从 Cloudflare 仪表板触发针对任何区域、见解或见解类型的按需扫描,以便在解决问题后快速重新检查您的安全状况。

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

用于 MCP 服务器门户的工具和提示词别名

当您通过 MCP 服务器门户连接第三方 MCP 服务器时,您无法控制服务器作者如何命名工具或编写描述。不明确的名称使 AI 代理更难选择正确的工具,也使用户更难理解可用内容。

您现在可以直接在门户上重命名工具和提示词并重写其描述,而无需修改上游服务器。例如,名为 super_cool_tool 的工具可以变成 search_customer_records,并配有专门针对您组织定制的描述。

显示 MCP 服务器工具的名称和描述字段的编辑工具模态框

修改后的工具会在工具列表中显示 **Modified(已修改)**标签,以便管理员一眼就能看出哪些工具被自定义过。

在重命名的工具上显示已修改标签的授权工具列表

别名会覆盖 MCP 客户端接收到的元数据。您可以在两个层级设置它们:

  • 针对每个门户:仅在特定门户内适用。优先级高于服务器级别的别名。
  • 针对每个服务器:适用于所有使用该服务器的门户。

您可以随时重置别名以恢复原始的上游名称。

欲了解更多信息,请参阅工具和提示词别名