跳转到内容
搜索文档

更新日志

Cloudflare 的最新更新与改进。

Back to all posts

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