Building AI Agent on Cloudflare

Build AI agents on Cloudflare using the Agents SDK with state management, real-time WebSockets, scheduled tasks, tool integration, and chat capabilities.


npx degit LangbaseInc/agent-skills/building-ai-agent-on-cloudflare my-ai-agent-cloudflare

Build production-ready AI agents that run on Cloudflare's global edge network with Workers AI, Durable Objects, and the Agents SDK.


UserWorkers (HTTP/WebSocket) AI Agent (Durable Object) [Workers AI, KV, D1, R2, Tools]

Workers AI

  • Run LLMs on the edge
  • 100+ models available
  • No cold starts
  • Global deployment
  • Pay per use

Durable Objects

  • Stateful agents
  • WebSocket support
  • Strong consistency
  • Automatic persistence
  • Global coordination

Agents SDK

  • Chat management
  • Tool integration
  • Memory/context
  • Streaming responses
  • Multi-turn conversations

1. Install Dependencies

npm create cloudflare@latest my-agent cd my-agent npm install @cloudflare/ai

2. Configure Worker

export interface Env { AI: any; AGENT: DurableObjectNamespace; KV: KVNamespace; DB: D1Database; }

3. Create Agent

import { WorkersAI } from '@cloudflare/ai'; export class AIAgent { constructor(state: DurableObjectState, env: Env) { this.state = state; this.env = env; this.ai = new WorkersAI(env.AI); } async chat(message: string) { const response = await this.ai.run('@cf/meta/llama-3-8b-instruct', { messages: [ { role: 'user', content: message } ] }); return response; } }

Durable Objects Storage

// Save state await this.state.storage.put('conversation', messages); // Load state const messages = await this.state.storage.get('conversation'); // Update state await this.state.storage.transaction(async (txn) => { const current = await txn.get('count'); await txn.put('count', current + 1); });

export class ChatAgent { async fetch(request: Request) { const upgradeHeader = request.headers.get('Upgrade'); if (upgradeHeader === 'websocket') { const pair = new WebSocketPair(); this.handleWebSocket(pair[1]); return new Response(null, { status: 101, webSocket: pair[0] }); } } async handleWebSocket(ws: WebSocket) { ws.accept(); ws.addEventListener('message', async (event) => { const message = event.data; const response = await this.chat(message); ws.send(JSON.stringify(response)); }); } }

const tools = { getWeather: async (city: string) => { const data = await fetch(`https://api.weather.com/${city}`); return data.json(); }, searchDatabase: async (query: string) => { const results = await env.DB.prepare( 'SELECT * FROM docs WHERE content MATCH ?' ).bind(query).all(); return results; } }; // Use tools in agent const result = await this.ai.run('@cf/meta/llama-3-8b-instruct', { messages: [...], tools: Object.keys(tools), }); if (result.tool_calls) { for (const call of result.tool_calls) { const output = await tools[call.name](...call.arguments); // Continue conversation with tool output } }

export default { async scheduled(event: ScheduledEvent, env: Env) { // Run agent tasks periodically const agent = env.AGENT.get(id); await agent.performScheduledTask(); } };

Short-term Memory

class Agent { messages: Message[] = []; async chat(message: string) { this.messages.push({ role: 'user', content: message }); const response = await this.ai.run(model, { messages: this.messages }); this.messages.push({ role: 'assistant', content: response }); return response; } }

Long-term Memory (Vectorize)

// Store embeddings const embedding = await env.AI.run('@cf/baai/bge-base-en-v1.5', { text: message }); await env.VECTORIZE.insert([{ id: msgId, values: embedding, metadata: { text: message } }]); // Retrieve similar const results = await env.VECTORIZE.query(embedding, { topK: 5 });

async stream(message: string) { const stream = await this.ai.run(model, { messages: [{ role: 'user', content: message }], stream: true }); return new Response(stream, { headers: { 'content-type': 'text/event-stream' } }); }

  • Use Durable Objects for state
  • Implement proper error handling
  • Cache frequently used data
  • Monitor token usage
  • Implement rate limiting
  • Use WebSockets for real-time
  • Version your agents
  • Test thoroughly

# Deploy worker wrangler deploy # Monitor wrangler tail # Check analytics wrangler pages deployment tail

  • Customer support chatbots
  • Code assistants
  • Content generation
  • Data analysis agents
  • Task automation
  • Research assistants
  • Interactive tutorials