A starter template for building AI-powered chat agents using Cloudflare's Agent platform, powered by agents. This project provides a foundation for creating interactive chat experiences with AI, complete with a modern UI and tool integration capabilities.
- π¬ Interactive chat interface with AI
- π οΈ Built-in tool system with human-in-the-loop confirmation
- π Advanced task scheduling (one-time, delayed, and recurring via cron)
- π¨ AI Image Generation - Create images from text prompts with automatic completion notifications
- π Dark/Light theme support
- β‘οΈ Real-time streaming responses
- π State management and chat history
- πΌοΈ Modern, responsive UI with inline image display
- Cloudflare account
- OpenAI API key
- ATXP account (optional, for AI image generation features) - Get one at accounts.atxp.ai
- Create a new project:
npx create-cloudflare@latest --template cloudflare/agents-starter- Install dependencies:
npm install- Set up your environment:
Create a .dev.vars file:
OPENAI_API_KEY=your_openai_api_key
ATXP_CONNECTION_STRING=https://accounts.atxp.ai?connection_token=your_connection_tokenNote: The ATXP_CONNECTION_STRING is optional and only needed if you want to use the AI image generation features. You can also provide connection strings dynamically through the chat interface.
- Run locally:
npm start- Deploy:
npm run deployβββ src/
β βββ app.tsx # Chat UI implementation
β βββ server.ts # Chat agent logic with image polling
β βββ tools.ts # Basic tool definitions
β βββ tools/
β β βββ imageGeneration.ts # ATXP image generation tools
β βββ utils/
β β βββ atxp.ts # ATXP connection utilities
β βββ utils.ts # Helper functions
β βββ styles.css # UI styling
Add new tools in tools.ts using the tool builder:
// Example of a tool that requires confirmation
const searchDatabase = tool({
description: "Search the database for user records",
parameters: z.object({
query: z.string(),
limit: z.number().optional()
})
// No execute function = requires confirmation
});
// Example of an auto-executing tool
const getCurrentTime = tool({
description: "Get current server time",
parameters: z.object({}),
execute: async () => new Date().toISOString()
});
// Scheduling tool implementation
const scheduleTask = tool({
description:
"schedule a task to be executed at a later time. 'when' can be a date, a delay in seconds, or a cron pattern.",
parameters: z.object({
type: z.enum(["scheduled", "delayed", "cron"]),
when: z.union([z.number(), z.string()]),
payload: z.string()
}),
execute: async ({ type, when, payload }) => {
// ... see the implementation in tools.ts
}
});To handle tool confirmations, add execution functions to the executions object:
export const executions = {
searchDatabase: async ({
query,
limit
}: {
query: string;
limit?: number;
}) => {
// Implementation for when the tool is confirmed
const results = await db.search(query, limit);
return results;
}
// Add more execution handlers for other tools that require confirmation
};Tools can be configured in two ways:
- With an
executefunction for automatic execution - Without an
executefunction, requiring confirmation and using theexecutionsobject to handle the confirmed action. NOTE: The keys inexecutionsshould matchtoolsRequiringConfirmationinapp.tsx.
This project includes advanced AI image generation capabilities powered by ATXP (AI Transaction Protocol). The image generation system provides:
- Automatic background processing - Images generate asynchronously while you continue chatting
- Real-time status updates - Get notified when generation starts and completes
- Inline image display - Generated images appear directly in the chat
- Payment notifications - Receive chat messages when payments are processed for image generation
- Task management - View all your image generation tasks and their status
- Get an ATXP account at accounts.atxp.ai
- Copy your connection string in the format:
https://accounts.atxp.ai?connection_token=your_token - Add it to your environment:
ATXP_CONNECTION_STRING=https://accounts.atxp.ai?connection_token=your_token
- Deploy your changes with
wrangler secret put ATXP_CONNECTION_STRING
Simply ask the AI to generate images:
"Generate an image of a sunset over mountains"
"Create a logo for a coffee shop"
"Make a picture of a robot playing chess"
The system will:
- Start the image generation task
- Show you the task ID and status
- Notify you with a chat message when payment is processed
- Poll for completion automatically every 10 seconds
- Notify you when complete with the image displayed inline
- Handle any errors gracefully
- Generate images: "Generate an image of..." or "Create a picture of..."
- Check status: "Check image status" (shows all tasks)
- List tasks: "List my image generation tasks"
You can provide ATXP connection strings in multiple ways:
-
Environment variable (recommended for production):
ATXP_CONNECTION_STRING=https://accounts.atxp.ai?connection_token=your_token
-
Dynamic in chat: Provide the connection string when generating images:
"Generate an image of a cat using https://accounts.atxp.ai?connection_token=your_token"
The system prioritizes dynamically provided connection strings over environment variables.
The starting server.ts implementation uses the ai-sdk and the OpenAI provider, but you can use any AI model provider by:
- Installing an alternative AI provider for the
ai-sdk, such as theworkers-ai-provideroranthropicprovider: - Replacing the AI SDK with the OpenAI SDK
- Using the Cloudflare Workers AI + AI Gateway binding API directly
For example, to use the workers-ai-provider, install the package:
npm install workers-ai-providerAdd an ai binding to wrangler.jsonc:
Replace the @ai-sdk/openai import and usage with the workers-ai-provider:
// server.ts
// Change the imports
- import { openai } from "@ai-sdk/openai";
+ import { createWorkersAI } from 'workers-ai-provider';
// Create a Workers AI instance
+ const workersai = createWorkersAI({ binding: env.AI });
// Use it when calling the streamText method (or other methods)
// from the ai-sdk
- const model = openai("gpt-4o-2024-11-20");
+ const model = workersai("@cf/deepseek-ai/deepseek-r1-distill-qwen-32b")Commit your changes and then run the agents-starter as per the rest of this README.
The chat interface is built with React and can be customized in app.tsx:
- Modify the theme colors in
styles.css - Add new UI components in the chat container
- Customize message rendering and tool confirmation dialogs
- Add new controls to the header
-
Customer Support Agent
- Add tools for:
- Ticket creation/lookup
- Order status checking
- Product recommendations
- FAQ database search
- Add tools for:
-
Development Assistant
- Integrate tools for:
- Code linting
- Git operations
- Documentation search
- Dependency checking
- Integrate tools for:
-
Data Analysis Assistant
- Build tools for:
- Database querying
- Data visualization
- Statistical analysis
- Report generation
- Build tools for:
-
Personal Productivity Assistant
- Implement tools for:
- Task scheduling with flexible timing options
- One-time, delayed, and recurring task management
- Task tracking with reminders
- Email drafting
- Note taking
- Implement tools for:
-
Scheduling Assistant
- Build tools for:
- One-time event scheduling using specific dates
- Delayed task execution (e.g., "remind me in 30 minutes")
- Recurring tasks using cron patterns
- Task payload management
- Flexible scheduling patterns
- Build tools for:
-
Creative Content Assistant
- Build tools for:
- AI image generation with ATXP integration
- Text content creation and editing
- Visual asset management and storage
- Creative project collaboration
- Automated content workflows
- Build tools for:
Each use case can be implemented by:
- Adding relevant tools in
tools.ts - Customizing the UI for specific interactions
- Extending the agent's capabilities in
server.ts - Adding any necessary external API integrations
MIT