mcpField
A
agents-sdk

agents-sdk

github.com/cloudflareAgent 工作流5.4k75 次安装今天更新
代码仓库

关于 agents-sdk

面向使用 `agents` 包构建 Agent 的 Cloudflare Agents SDK 技能,指导开发者查阅最新文档,并涵盖状态、调度、工作流、聊天和 MCP 集成。

主要功能

  1. 01指引检索最新 SDK 文档
  2. 02基于 SQLite 的持久化状态
  3. 03RPC、调度与持久化工作流
  4. 04邮件处理与流式聊天
  5. 05面向 Agent 客户端的 React 钩子

适用场景

  1. 01实现前查找对应 SDK 文档
  2. 02构建具有持久状态和定时任务的 Agent
  3. 03添加持久化多步骤处理与流式聊天
  4. 04连接 MCP 服务或构建 MCP 服务

MCP 相关

技能介绍如何让 SDK 连接 MCP 服务,以及使用 `McpAgent` 构建 MCP 服务。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/cloudflare/cloudflare-docs --skill agents-sdk

安装后在 Claude Code 中输入/agents-sdk确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
callable.md
codemode.md
email.md
mcp.md
state-scheduling.md
streaming-chat.md
workflows.md

详细介绍

Cloudflare Agents SDK

停止。 关于 Agents SDK 的知识可能已过时。处理任何 Agents SDK 任务时,应优先检索,而非依赖预训练知识。

文档

开始实现前,请从 https://github.com/cloudflare/agents/tree/main/docs 获取最新文档。

主题文档用途
入门docs/getting-started.md第一个 Agent、项目设置
状态docs/state.mdsetState、validateStateChange、持久化
路由docs/routing.mdURL 模式、routeAgentRequest、basePath
可调用方法docs/callable-methods.md@callable、RPC、流式传输、超时
调度docs/scheduling.mdschedule()、scheduleEvery()、cron
工作流docs/workflows.mdAgentWorkflow、持久化多步骤任务
HTTP/WebSocketsdocs/http-websockets.md生命周期钩子、休眠
电子邮件docs/email.md电子邮件路由、安全回复解析器
MCP 客户端docs/mcp-client.md连接到 MCP 服务
MCP 服务docs/mcp-servers.md使用 McpAgent 构建 MCP 服务
客户端 SDKdocs/client-sdk.mduseAgent、useAgentChat、React 钩子
人机协作docs/human-in-the-loop.md审批流程、暂停工作流
可恢复流式传输docs/resumable-streaming.md断开连接时恢复流

Cloudflare 文档:https://developers.cloudflare.com/agents/

功能

Agents SDK 提供:

  • 持久化状态 - 由 SQLite 支持,并自动同步到客户端
  • 可调用 RPC - 通过 WebSocket 调用 @callable() 方法
  • 调度 - 一次性、重复(scheduleEvery)和 cron 任务
  • 工作流 - 通过 AgentWorkflow 执行持久化的多步骤后台处理
  • MCP 集成 - 连接到 MCP 服务,或使用 McpAgent 构建自己的服务
  • 电子邮件处理 - 通过安全路由接收和回复电子邮件
  • 流式聊天 - 支持可恢复流的 AIChatAgent
  • React 钩子 - 用于客户端应用的 useAgent、useAgentChat

首先:验证安装

npm ls agents  # Should show agents package

如果尚未安装:

npm install agents

Wrangler 配置

{
  "durable_objects": {
    "bindings": [{ "name": "MyAgent", "class_name": "MyAgent" }]
  },
  "migrations": [{ "tag": "v1", "new_sqlite_classes": ["MyAgent"] }]
}

Agent 类

import { Agent, routeAgentRequest, callable } from "agents";

type State = { count: number };

export class Counter extends Agent<Env, State> {
  initialState = { count: 0 };

  // Validation hook - runs before state persists (sync, throwing rejects the update)
  validateStateChange(nextState: State, source: Connection | "server") {
    if (nextState.count < 0) throw new Error("Count cannot be negative");
  }

  // Notification hook - runs after state persists (async, non-blocking)
  onStateUpdate(state: State, source: Connection | "server") {
    console.log("State updated:", state);
  }

  @callable()
  increment() {
    this.setState({ count: this.state.count + 1 });
    return this.state.count;
  }
}

export default {
  fetch: (req, env) => routeAgentRequest(req, env) ?? new Response("Not found", { status: 404 })
};

路由

请求会路由到 /agents/{agent-name}/{instance-name}:

类URL
Counter/agents/counter/user-123
ChatRoom/agents/chat-room/lobby

客户端:useAgent({ agent: "Counter", name: "user-123" })

核心 API

任务API
读取状态this.state.count
写入状态this.setState({ count: 1 })
SQL 查询this.sql`SELECT * FROM users WHERE id = ${id}`
调度(延迟)await this.schedule(60, "task", payload)
调度(cron)await this.schedule("0 * * * *", "task", payload)
调度(间隔)await this.scheduleEvery(30, "poll")
RPC 方法@callable() myMethod() { ... }
流式 RPC@callable({ streaming: true }) stream(res) { ... }
启动工作流await this.runWorkflow("ProcessingWorkflow", params)

React 客户端

import { useAgent } from "agents/react";

function App() {
  const [state, setLocalState] = useState({ count: 0 });

  const agent = useAgent({
    agent: "Counter",
    name: "my-instance",
    onStateUpdate: (newState) => setLocalState(newState),
    onIdentity: (name, agentType) => console.log(`Connected to ${name}`)
  });

  return (
    <button onClick={() => agent.setState({ count: state.count + 1 })}>
      Count: {state.count}
    </button>
  );
}

参考资料

评论

支持 Markdown