跳转到内容
搜索文档

更新日志

Cloudflare 的最新更新与改进。

Back to all posts

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 文档