Agents SDK v0.14.0:Agent 技能、信使(messengers)、计划任务、Workflows 以及强化的聊天恢复
Agents SDK ↗ 的最新版本添加了四种使用 @cloudflare/think 进行构建的新方式:按需 Agent 技能(Agent Skills)、聊天信使(chat messengers,从 Telegram 开始)、声明式计划任务以及 Workflows 内部的持久推理步骤。此版本还显著强化了持久聊天恢复,因此轮次能够可靠地度过生产环境中的部署、驱逐和停滞的模型流。
给 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_skill、read_skill_resource 和一个可选的 run_skill_script 工具。技能加载是弹性的:重复或失败的源将被跳过并发出警告,而不会损坏 agent。
Agent 技能处于实验性阶段,尤其是脚本执行还处于早期阶段。API 可能会在未来的版本中发生变化。我们非常期待您的反馈 —— 请在 Agents 仓库 ↗中告诉我们您正在构建什么以及缺少了什么。
将 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.",
},
});
}
}使用 ThinkWorkflow 和 step.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()子节点会重新挂载到其结果上,而不是被放弃并重新运行,因此长期运行的子节点在部署下不再丢失工作。
- 可恢复的流 — 基于服务器发送事件(SSE)的正在运行的工具调用可在连接中断时存活。客户端使用
Last-Event-ID重新连接并回放它们遗漏的任何内容。 - 可读的服务器 ID —
addMcpServer接受一个可选的id,因此工具会呈现为可读的键(例如tool_github_create_pull_request),而不是不透明的连接 ID。 - 更好地处理并发请求 — 重叠的 JSON-RPC 请求现在可以跨 HTTP 和 RPC 传输正确关联到其响应。
- 压缩 —
Session的tokenCounter现在还驱动压缩边界决策(“压缩什么”),而不仅仅是触发/不触发。 @cloudflare/worker-bundler— 为createWorker添加了virtualModules选项,以便在打包(bundling)期间提供内存中模块源。- 客户端工具继续运行 — 并行工具结果现在合并为一个单一的继续,立即恢复请求会附加到挂起的继续上,并且服务器端
needsApproval继续会在批准后可靠地恢复。
要更新到最新版本:
npm i agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latestyarn add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latestpnpm add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latestbun add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest有关更多信息,请参阅 Agents API 参考和聊天 Agent 文档。