chore: generate
This commit is contained in:
@@ -11,21 +11,21 @@ description: Build AI agents on Cloudflare Workers using the Agents SDK. Load wh
|
|||||||
|
|
||||||
Fetch current docs from `https://github.com/cloudflare/agents/tree/main/docs` before implementing.
|
Fetch current docs from `https://github.com/cloudflare/agents/tree/main/docs` before implementing.
|
||||||
|
|
||||||
| Topic | Doc | Use for |
|
| Topic | Doc | Use for |
|
||||||
|-------|-----|---------|
|
| ------------------- | ----------------------------- | ---------------------------------------------- |
|
||||||
| Getting started | `docs/getting-started.md` | First agent, project setup |
|
| Getting started | `docs/getting-started.md` | First agent, project setup |
|
||||||
| State | `docs/state.md` | `setState`, `validateStateChange`, persistence |
|
| State | `docs/state.md` | `setState`, `validateStateChange`, persistence |
|
||||||
| Routing | `docs/routing.md` | URL patterns, `routeAgentRequest`, `basePath` |
|
| Routing | `docs/routing.md` | URL patterns, `routeAgentRequest`, `basePath` |
|
||||||
| Callable methods | `docs/callable-methods.md` | `@callable`, RPC, streaming, timeouts |
|
| Callable methods | `docs/callable-methods.md` | `@callable`, RPC, streaming, timeouts |
|
||||||
| Scheduling | `docs/scheduling.md` | `schedule()`, `scheduleEvery()`, cron |
|
| Scheduling | `docs/scheduling.md` | `schedule()`, `scheduleEvery()`, cron |
|
||||||
| Workflows | `docs/workflows.md` | `AgentWorkflow`, durable multi-step tasks |
|
| Workflows | `docs/workflows.md` | `AgentWorkflow`, durable multi-step tasks |
|
||||||
| HTTP/WebSockets | `docs/http-websockets.md` | Lifecycle hooks, hibernation |
|
| HTTP/WebSockets | `docs/http-websockets.md` | Lifecycle hooks, hibernation |
|
||||||
| Email | `docs/email.md` | Email routing, secure reply resolver |
|
| Email | `docs/email.md` | Email routing, secure reply resolver |
|
||||||
| MCP client | `docs/mcp-client.md` | Connecting to MCP servers |
|
| MCP client | `docs/mcp-client.md` | Connecting to MCP servers |
|
||||||
| MCP server | `docs/mcp-servers.md` | Building MCP servers with `McpAgent` |
|
| MCP server | `docs/mcp-servers.md` | Building MCP servers with `McpAgent` |
|
||||||
| Client SDK | `docs/client-sdk.md` | `useAgent`, `useAgentChat`, React hooks |
|
| Client SDK | `docs/client-sdk.md` | `useAgent`, `useAgentChat`, React hooks |
|
||||||
| Human-in-the-loop | `docs/human-in-the-loop.md` | Approval flows, pausing workflows |
|
| Human-in-the-loop | `docs/human-in-the-loop.md` | Approval flows, pausing workflows |
|
||||||
| Resumable streaming | `docs/resumable-streaming.md` | Stream recovery on disconnect |
|
| Resumable streaming | `docs/resumable-streaming.md` | Stream recovery on disconnect |
|
||||||
|
|
||||||
Cloudflare docs: https://developers.cloudflare.com/agents/
|
Cloudflare docs: https://developers.cloudflare.com/agents/
|
||||||
|
|
||||||
@@ -49,6 +49,7 @@ npm ls agents # Should show agents package
|
|||||||
```
|
```
|
||||||
|
|
||||||
If not installed:
|
If not installed:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
npm install agents
|
npm install agents
|
||||||
```
|
```
|
||||||
@@ -58,89 +59,85 @@ npm install agents
|
|||||||
```jsonc
|
```jsonc
|
||||||
{
|
{
|
||||||
"durable_objects": {
|
"durable_objects": {
|
||||||
"bindings": [{ "name": "MyAgent", "class_name": "MyAgent" }]
|
"bindings": [{ "name": "MyAgent", "class_name": "MyAgent" }],
|
||||||
},
|
},
|
||||||
"migrations": [{ "tag": "v1", "new_sqlite_classes": ["MyAgent"] }]
|
"migrations": [{ "tag": "v1", "new_sqlite_classes": ["MyAgent"] }],
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
## Agent Class
|
## Agent Class
|
||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
import { Agent, routeAgentRequest, callable } from "agents";
|
import { Agent, routeAgentRequest, callable } from "agents"
|
||||||
|
|
||||||
type State = { count: number };
|
type State = { count: number }
|
||||||
|
|
||||||
export class Counter extends Agent<Env, State> {
|
export class Counter extends Agent<Env, State> {
|
||||||
initialState = { count: 0 };
|
initialState = { count: 0 }
|
||||||
|
|
||||||
// Validation hook - runs before state persists (sync, throwing rejects the update)
|
// Validation hook - runs before state persists (sync, throwing rejects the update)
|
||||||
validateStateChange(nextState: State, source: Connection | "server") {
|
validateStateChange(nextState: State, source: Connection | "server") {
|
||||||
if (nextState.count < 0) throw new Error("Count cannot be negative");
|
if (nextState.count < 0) throw new Error("Count cannot be negative")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Notification hook - runs after state persists (async, non-blocking)
|
// Notification hook - runs after state persists (async, non-blocking)
|
||||||
onStateUpdate(state: State, source: Connection | "server") {
|
onStateUpdate(state: State, source: Connection | "server") {
|
||||||
console.log("State updated:", state);
|
console.log("State updated:", state)
|
||||||
}
|
}
|
||||||
|
|
||||||
@callable()
|
@callable()
|
||||||
increment() {
|
increment() {
|
||||||
this.setState({ count: this.state.count + 1 });
|
this.setState({ count: this.state.count + 1 })
|
||||||
return this.state.count;
|
return this.state.count
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
fetch: (req, env) => routeAgentRequest(req, env) ?? new Response("Not found", { status: 404 })
|
fetch: (req, env) => routeAgentRequest(req, env) ?? new Response("Not found", { status: 404 }),
|
||||||
};
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
## Routing
|
## Routing
|
||||||
|
|
||||||
Requests route to `/agents/{agent-name}/{instance-name}`:
|
Requests route to `/agents/{agent-name}/{instance-name}`:
|
||||||
|
|
||||||
| Class | URL |
|
| Class | URL |
|
||||||
|-------|-----|
|
| ---------- | -------------------------- |
|
||||||
| `Counter` | `/agents/counter/user-123` |
|
| `Counter` | `/agents/counter/user-123` |
|
||||||
| `ChatRoom` | `/agents/chat-room/lobby` |
|
| `ChatRoom` | `/agents/chat-room/lobby` |
|
||||||
|
|
||||||
Client: `useAgent({ agent: "Counter", name: "user-123" })`
|
Client: `useAgent({ agent: "Counter", name: "user-123" })`
|
||||||
|
|
||||||
## Core APIs
|
## Core APIs
|
||||||
|
|
||||||
| Task | API |
|
| Task | API |
|
||||||
|------|-----|
|
| ------------------- | ------------------------------------------------------ |
|
||||||
| Read state | `this.state.count` |
|
| Read state | `this.state.count` |
|
||||||
| Write state | `this.setState({ count: 1 })` |
|
| Write state | `this.setState({ count: 1 })` |
|
||||||
| SQL query | `` this.sql`SELECT * FROM users WHERE id = ${id}` `` |
|
| SQL query | `` this.sql`SELECT * FROM users WHERE id = ${id}` `` |
|
||||||
| Schedule (delay) | `await this.schedule(60, "task", payload)` |
|
| Schedule (delay) | `await this.schedule(60, "task", payload)` |
|
||||||
| Schedule (cron) | `await this.schedule("0 * * * *", "task", payload)` |
|
| Schedule (cron) | `await this.schedule("0 * * * *", "task", payload)` |
|
||||||
| Schedule (interval) | `await this.scheduleEvery(30, "poll")` |
|
| Schedule (interval) | `await this.scheduleEvery(30, "poll")` |
|
||||||
| RPC method | `@callable() myMethod() { ... }` |
|
| RPC method | `@callable() myMethod() { ... }` |
|
||||||
| Streaming RPC | `@callable({ streaming: true }) stream(res) { ... }` |
|
| Streaming RPC | `@callable({ streaming: true }) stream(res) { ... }` |
|
||||||
| Start workflow | `await this.runWorkflow("ProcessingWorkflow", params)` |
|
| Start workflow | `await this.runWorkflow("ProcessingWorkflow", params)` |
|
||||||
|
|
||||||
## React Client
|
## React Client
|
||||||
|
|
||||||
```tsx
|
```tsx
|
||||||
import { useAgent } from "agents/react";
|
import { useAgent } from "agents/react"
|
||||||
|
|
||||||
function App() {
|
function App() {
|
||||||
const [state, setLocalState] = useState({ count: 0 });
|
const [state, setLocalState] = useState({ count: 0 })
|
||||||
|
|
||||||
const agent = useAgent({
|
const agent = useAgent({
|
||||||
agent: "Counter",
|
agent: "Counter",
|
||||||
name: "my-instance",
|
name: "my-instance",
|
||||||
onStateUpdate: (newState) => setLocalState(newState),
|
onStateUpdate: (newState) => setLocalState(newState),
|
||||||
onIdentity: (name, agentType) => console.log(`Connected to ${name}`)
|
onIdentity: (name, agentType) => console.log(`Connected to ${name}`),
|
||||||
});
|
})
|
||||||
|
|
||||||
return (
|
return <button onClick={() => agent.setState({ count: state.count + 1 })}>Count: {state.count}</button>
|
||||||
<button onClick={() => agent.setState({ count: state.count + 1 })}>
|
|
||||||
Count: {state.count}
|
|
||||||
</button>
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -7,18 +7,18 @@ Fetch `docs/callable-methods.md` from `https://github.com/cloudflare/agents/tree
|
|||||||
`@callable()` exposes agent methods to clients via WebSocket RPC.
|
`@callable()` exposes agent methods to clients via WebSocket RPC.
|
||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
import { Agent, callable } from "agents";
|
import { Agent, callable } from "agents"
|
||||||
|
|
||||||
export class MyAgent extends Agent<Env, State> {
|
export class MyAgent extends Agent<Env, State> {
|
||||||
@callable()
|
@callable()
|
||||||
async greet(name: string): Promise<string> {
|
async greet(name: string): Promise<string> {
|
||||||
return `Hello, ${name}!`;
|
return `Hello, ${name}!`
|
||||||
}
|
}
|
||||||
|
|
||||||
@callable()
|
@callable()
|
||||||
async processData(data: unknown): Promise<Result> {
|
async processData(data: unknown): Promise<Result> {
|
||||||
// Long-running work
|
// Long-running work
|
||||||
return result;
|
return result
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -27,26 +27,26 @@ export class MyAgent extends Agent<Env, State> {
|
|||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
// Basic call
|
// Basic call
|
||||||
const greeting = await agent.call("greet", ["World"]);
|
const greeting = await agent.call("greet", ["World"])
|
||||||
|
|
||||||
// With timeout
|
// With timeout
|
||||||
const result = await agent.call("processData", [data], {
|
const result = await agent.call("processData", [data], {
|
||||||
timeout: 5000 // 5 second timeout
|
timeout: 5000, // 5 second timeout
|
||||||
});
|
})
|
||||||
```
|
```
|
||||||
|
|
||||||
## Streaming Responses
|
## Streaming Responses
|
||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
import { Agent, callable, StreamingResponse } from "agents";
|
import { Agent, callable, StreamingResponse } from "agents"
|
||||||
|
|
||||||
export class MyAgent extends Agent<Env, State> {
|
export class MyAgent extends Agent<Env, State> {
|
||||||
@callable({ streaming: true })
|
@callable({ streaming: true })
|
||||||
async streamResults(stream: StreamingResponse, query: string) {
|
async streamResults(stream: StreamingResponse, query: string) {
|
||||||
for await (const item of fetchResults(query)) {
|
for await (const item of fetchResults(query)) {
|
||||||
stream.send(JSON.stringify(item));
|
stream.send(JSON.stringify(item))
|
||||||
}
|
}
|
||||||
stream.close();
|
stream.close()
|
||||||
}
|
}
|
||||||
|
|
||||||
@callable({ streaming: true })
|
@callable({ streaming: true })
|
||||||
@@ -54,10 +54,10 @@ export class MyAgent extends Agent<Env, State> {
|
|||||||
try {
|
try {
|
||||||
// ... work
|
// ... work
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
stream.error(error.message); // Signal error to client
|
stream.error(error.message) // Signal error to client
|
||||||
return;
|
return
|
||||||
}
|
}
|
||||||
stream.close();
|
stream.close()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -69,24 +69,24 @@ await agent.call("streamResults", ["search term"], {
|
|||||||
stream: {
|
stream: {
|
||||||
onChunk: (data) => console.log("Chunk:", data),
|
onChunk: (data) => console.log("Chunk:", data),
|
||||||
onDone: () => console.log("Complete"),
|
onDone: () => console.log("Complete"),
|
||||||
onError: (error) => console.error("Error:", error)
|
onError: (error) => console.error("Error:", error),
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
```
|
```
|
||||||
|
|
||||||
## Introspection
|
## Introspection
|
||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
// Get list of callable methods on an agent
|
// Get list of callable methods on an agent
|
||||||
const methods = await agent.call("getCallableMethods", []);
|
const methods = await agent.call("getCallableMethods", [])
|
||||||
// Returns: ["greet", "processData", "streamResults", ...]
|
// Returns: ["greet", "processData", "streamResults", ...]
|
||||||
```
|
```
|
||||||
|
|
||||||
## When to Use
|
## When to Use
|
||||||
|
|
||||||
| Scenario | Use |
|
| Scenario | Use |
|
||||||
|----------|-----|
|
| ------------------------------------ | --------------------------- |
|
||||||
| Browser/mobile calling agent | `@callable()` |
|
| Browser/mobile calling agent | `@callable()` |
|
||||||
| External service calling agent | `@callable()` |
|
| External service calling agent | `@callable()` |
|
||||||
| Worker calling agent (same codebase) | DO RPC directly |
|
| Worker calling agent (same codebase) | DO RPC directly |
|
||||||
| Agent calling another agent | `getAgentByName()` + DO RPC |
|
| Agent calling another agent | `getAgentByName()` + DO RPC |
|
||||||
|
|||||||
@@ -101,101 +101,111 @@ Need IaC? → pulumi/ (Pulumi), terraform/ (Terraform), or api/ (REST API)
|
|||||||
## Product Index
|
## Product Index
|
||||||
|
|
||||||
### Compute & Runtime
|
### Compute & Runtime
|
||||||
| Product | Reference |
|
|
||||||
|---------|-----------|
|
| Product | Reference |
|
||||||
| Workers | `references/workers/` |
|
| --------------------- | ----------------------------------- |
|
||||||
| Pages | `references/pages/` |
|
| Workers | `references/workers/` |
|
||||||
| Pages Functions | `references/pages-functions/` |
|
| Pages | `references/pages/` |
|
||||||
| Durable Objects | `references/durable-objects/` |
|
| Pages Functions | `references/pages-functions/` |
|
||||||
| Workflows | `references/workflows/` |
|
| Durable Objects | `references/durable-objects/` |
|
||||||
| Containers | `references/containers/` |
|
| Workflows | `references/workflows/` |
|
||||||
|
| Containers | `references/containers/` |
|
||||||
| Workers for Platforms | `references/workers-for-platforms/` |
|
| Workers for Platforms | `references/workers-for-platforms/` |
|
||||||
| Cron Triggers | `references/cron-triggers/` |
|
| Cron Triggers | `references/cron-triggers/` |
|
||||||
| Tail Workers | `references/tail-workers/` |
|
| Tail Workers | `references/tail-workers/` |
|
||||||
| Snippets | `references/snippets/` |
|
| Snippets | `references/snippets/` |
|
||||||
| Smart Placement | `references/smart-placement/` |
|
| Smart Placement | `references/smart-placement/` |
|
||||||
|
|
||||||
### Storage & Data
|
### Storage & Data
|
||||||
| Product | Reference |
|
|
||||||
|---------|-----------|
|
| Product | Reference |
|
||||||
| KV | `references/kv/` |
|
| --------------- | ----------------------------- |
|
||||||
| D1 | `references/d1/` |
|
| KV | `references/kv/` |
|
||||||
| R2 | `references/r2/` |
|
| D1 | `references/d1/` |
|
||||||
| Queues | `references/queues/` |
|
| R2 | `references/r2/` |
|
||||||
| Hyperdrive | `references/hyperdrive/` |
|
| Queues | `references/queues/` |
|
||||||
| DO Storage | `references/do-storage/` |
|
| Hyperdrive | `references/hyperdrive/` |
|
||||||
| Secrets Store | `references/secrets-store/` |
|
| DO Storage | `references/do-storage/` |
|
||||||
| Pipelines | `references/pipelines/` |
|
| Secrets Store | `references/secrets-store/` |
|
||||||
|
| Pipelines | `references/pipelines/` |
|
||||||
| R2 Data Catalog | `references/r2-data-catalog/` |
|
| R2 Data Catalog | `references/r2-data-catalog/` |
|
||||||
| R2 SQL | `references/r2-sql/` |
|
| R2 SQL | `references/r2-sql/` |
|
||||||
|
|
||||||
### AI & Machine Learning
|
### AI & Machine Learning
|
||||||
| Product | Reference |
|
|
||||||
|---------|-----------|
|
| Product | Reference |
|
||||||
|
| ---------- | ------------------------ |
|
||||||
| Workers AI | `references/workers-ai/` |
|
| Workers AI | `references/workers-ai/` |
|
||||||
| Vectorize | `references/vectorize/` |
|
| Vectorize | `references/vectorize/` |
|
||||||
| Agents SDK | `references/agents-sdk/` |
|
| Agents SDK | `references/agents-sdk/` |
|
||||||
| AI Gateway | `references/ai-gateway/` |
|
| AI Gateway | `references/ai-gateway/` |
|
||||||
| AI Search | `references/ai-search/` |
|
| AI Search | `references/ai-search/` |
|
||||||
|
|
||||||
### Networking & Connectivity
|
### Networking & Connectivity
|
||||||
| Product | Reference |
|
|
||||||
|---------|-----------|
|
| Product | Reference |
|
||||||
| Tunnel | `references/tunnel/` |
|
| -------------------- | ---------------------------------- |
|
||||||
| Spectrum | `references/spectrum/` |
|
| Tunnel | `references/tunnel/` |
|
||||||
| TURN | `references/turn/` |
|
| Spectrum | `references/spectrum/` |
|
||||||
|
| TURN | `references/turn/` |
|
||||||
| Network Interconnect | `references/network-interconnect/` |
|
| Network Interconnect | `references/network-interconnect/` |
|
||||||
| Argo Smart Routing | `references/argo-smart-routing/` |
|
| Argo Smart Routing | `references/argo-smart-routing/` |
|
||||||
| Workers VPC | `references/workers-vpc/` |
|
| Workers VPC | `references/workers-vpc/` |
|
||||||
|
|
||||||
### Security
|
### Security
|
||||||
| Product | Reference |
|
|
||||||
|---------|-----------|
|
| Product | Reference |
|
||||||
| WAF | `references/waf/` |
|
| --------------- | ---------------------------- |
|
||||||
| DDoS Protection | `references/ddos/` |
|
| WAF | `references/waf/` |
|
||||||
| Bot Management | `references/bot-management/` |
|
| DDoS Protection | `references/ddos/` |
|
||||||
| API Shield | `references/api-shield/` |
|
| Bot Management | `references/bot-management/` |
|
||||||
| Turnstile | `references/turnstile/` |
|
| API Shield | `references/api-shield/` |
|
||||||
|
| Turnstile | `references/turnstile/` |
|
||||||
|
|
||||||
### Media & Content
|
### Media & Content
|
||||||
| Product | Reference |
|
|
||||||
|---------|-----------|
|
| Product | Reference |
|
||||||
| Images | `references/images/` |
|
| ----------------- | ------------------------------- |
|
||||||
| Stream | `references/stream/` |
|
| Images | `references/images/` |
|
||||||
|
| Stream | `references/stream/` |
|
||||||
| Browser Rendering | `references/browser-rendering/` |
|
| Browser Rendering | `references/browser-rendering/` |
|
||||||
| Zaraz | `references/zaraz/` |
|
| Zaraz | `references/zaraz/` |
|
||||||
|
|
||||||
### Real-Time Communication
|
### Real-Time Communication
|
||||||
| Product | Reference |
|
|
||||||
|---------|-----------|
|
| Product | Reference |
|
||||||
| RealtimeKit | `references/realtimekit/` |
|
| ------------ | -------------------------- |
|
||||||
|
| RealtimeKit | `references/realtimekit/` |
|
||||||
| Realtime SFU | `references/realtime-sfu/` |
|
| Realtime SFU | `references/realtime-sfu/` |
|
||||||
|
|
||||||
### Developer Tools
|
### Developer Tools
|
||||||
| Product | Reference |
|
|
||||||
|---------|-----------|
|
| Product | Reference |
|
||||||
| Wrangler | `references/wrangler/` |
|
| ------------------ | -------------------------------- |
|
||||||
| Miniflare | `references/miniflare/` |
|
| Wrangler | `references/wrangler/` |
|
||||||
| C3 | `references/c3/` |
|
| Miniflare | `references/miniflare/` |
|
||||||
| Observability | `references/observability/` |
|
| C3 | `references/c3/` |
|
||||||
| Analytics Engine | `references/analytics-engine/` |
|
| Observability | `references/observability/` |
|
||||||
| Web Analytics | `references/web-analytics/` |
|
| Analytics Engine | `references/analytics-engine/` |
|
||||||
| Sandbox | `references/sandbox/` |
|
| Web Analytics | `references/web-analytics/` |
|
||||||
| Workerd | `references/workerd/` |
|
| Sandbox | `references/sandbox/` |
|
||||||
|
| Workerd | `references/workerd/` |
|
||||||
| Workers Playground | `references/workers-playground/` |
|
| Workers Playground | `references/workers-playground/` |
|
||||||
|
|
||||||
### Infrastructure as Code
|
### Infrastructure as Code
|
||||||
| Product | Reference |
|
|
||||||
|---------|-----------|
|
| Product | Reference |
|
||||||
| Pulumi | `references/pulumi/` |
|
| --------- | ----------------------- |
|
||||||
|
| Pulumi | `references/pulumi/` |
|
||||||
| Terraform | `references/terraform/` |
|
| Terraform | `references/terraform/` |
|
||||||
| API | `references/api/` |
|
| API | `references/api/` |
|
||||||
|
|
||||||
### Other Services
|
### Other Services
|
||||||
| Product | Reference |
|
|
||||||
|---------|-----------|
|
| Product | Reference |
|
||||||
|
| ------------- | --------------------------- |
|
||||||
| Email Routing | `references/email-routing/` |
|
| Email Routing | `references/email-routing/` |
|
||||||
| Email Workers | `references/email-workers/` |
|
| Email Workers | `references/email-workers/` |
|
||||||
| Static Assets | `references/static-assets/` |
|
| Static Assets | `references/static-assets/` |
|
||||||
| Bindings | `references/bindings/` |
|
| Bindings | `references/bindings/` |
|
||||||
| Cache Reserve | `references/cache-reserve/` |
|
| Cache Reserve | `references/cache-reserve/` |
|
||||||
|
|||||||
Reference in New Issue
Block a user