This is a starter template for building AI-powered canvas applications using LlamaIndex and CopilotKit. It provides a modern Next.js application with an integrated LlamaIndex agent that manages a visual canvas of interactive cards with real-time AI synchronization.
ag-ui-canvas.mp4
- Visual Canvas Interface: Drag-free canvas displaying cards in a responsive grid layout
- Four Card Types:
- Project: Includes text fields, dropdown, date picker, and checklist
- Entity: Features text fields, dropdown, and multi-select tags
- Note: Simple rich text content area
- Chart: Visual metrics with percentage-based bar charts
- Real-time AI Sync: Bidirectional synchronization between the AI agent and UI canvas
- Multi-step Planning: AI can create and execute plans with visual progress tracking
- Human-in-the-Loop (HITL): Intelligent interrupts for clarification when needed
- JSON View: Toggle between visual canvas and raw JSON state
- Responsive Design: Optimized for both desktop (sidebar chat) and mobile (popup chat)
- Node.js 18+
- Python 3.8+
- OpenAI API Key (for the LlamaIndex agent)
- uv
- Any of the following package managers:
Note: This repository ignores lock files (package-lock.json, yarn.lock, pnpm-lock.yaml, bun.lockb) to avoid conflicts between different package managers. Each developer should generate their own lock file using their preferred package manager. After that, make sure to delete it from the .gitignore.
- Install dependencies using your preferred package manager:
# Using pnpm (recommended)
pnpm install
# Using npm
npm install
# Using yarn
yarn install
# Using bun
bun install
- Install Python dependencies for the LlamaIndex agent (requires uv).
If you don't have uv installed, install it first using one of the following:
- macOS (Homebrew):
brew install uv
- macOS/Linux (official installer):
curl -LsSf https://astral.sh/uv/install.sh | sh
- Or with pipx:
pipx install uv
- macOS (Homebrew):
# Using pnpm
pnpm install:agent
# Using npm
npm run install:agent
# Using yarn
yarn install:agent
# Using bun
bun run install:agent
Note: This will automatically setup a
.venv
(virtual environment) inside theagent
directory.To activate the virtual environment manually, you can run:
source agent/.venv/bin/activate
- Set up your OpenAI API key:
export OPENAI_API_KEY="your-openai-api-key-here"
- Start the development server:
# Using pnpm
pnpm dev
# Using npm
npm run dev
# Using yarn
yarn dev
# Using bun
bun run dev
This will start both the UI and agent servers concurrently.
Once the application is running, you can:
-
Create Cards: Use the "New Item" button or ask the AI to create cards
- "Create a new project"
- "Add an entity and a note"
- "Create a chart with sample metrics"
-
Edit Cards: Click on any field to edit directly, or ask the AI
- "Set the project field1 to 'Q1 Planning'"
- "Add a checklist item 'Review budget'"
- "Update the chart metrics"
-
Execute Plans: Give the AI multi-step instructions
- "Create 3 projects with different priorities and add 2 checklist items to each"
- The AI will create a plan and execute it step by step with visual progress
-
View JSON: Toggle between the visual canvas and JSON view using the button at the bottom
The following scripts can also be run using your preferred package manager:
dev
- Starts both UI and agent servers in development modedev:debug
- Starts development servers with debug logging enableddev:ui
- Starts only the Next.js UI serverdev:agent
- Starts only the LlamaIndex agent serverinstall:agent
- Installs Python dependencies for the agentbuild
- Builds the Next.js application for productionstart
- Starts the production serverlint
- Runs ESLint for code linting
graph TB
subgraph "Frontend (Next.js)"
UI[Canvas UI<br/>page.tsx]
Actions[Frontend Actions<br/>useCopilotAction]
State[State Management<br/>useCoAgent]
Chat[CopilotChat]
end
subgraph "Backend (Python)"
Agent[LlamaIndex Agent<br/>agent.py]
Tools[Backend Tools<br/>- set_plan<br/>- update_plan_progress<br/>- complete_plan]
AgentState[Workflow Context<br/>State Management]
Model[LLM<br/>GPT-4o]
end
subgraph "Communication"
Runtime[CopilotKit Runtime<br/>:9000]
end
UI <--> State
State <--> Runtime
Chat <--> Runtime
Actions --> Runtime
Runtime <--> Agent
Agent --> Tools
Agent --> AgentState
Agent --> Model
style UI fill:#e1f5fe
style Agent fill:#fff3e0
style Runtime fill:#f3e5f5
click UI "https://github.com/CopilotKit/canvas-with-llamaindex/blob/main/src/app/page.tsx"
click Agent "https://github.com/CopilotKit/canvas-with-llamaindex/blob/main/agent/agent/agent.py"
The main UI component is in src/app/page.tsx
. It includes:
- Canvas Management: Visual grid of cards with create, read, update, and delete operations
- State Synchronization: Uses
useCoAgent
hook for real-time state sync with the agent - Frontend Actions: Exposed as tools to the AI agent via
useCopilotAction
- Plan Visualization: Shows multi-step plan execution with progress indicators
- HITL (Tool-based): Uses
useCopilotAction
withrenderAndWaitForResponse
for disambiguation prompts (e.g., choosing an item or card type)
The agent logic is in agent/agent/agent.py
. It features:
- Workflow Context: Uses LlamaIndex's Context for state management and event streaming
- Tool Integration: Backend tools for planning, frontend tools integration via CopilotKit
- Strict Grounding: Enforces data consistency by always using shared state as truth
- Loop Control: Prevents infinite loops and redundant operations
- Planning System: Can create and execute multi-step plans with status tracking
- FastAPI Router: Uses
get_ag_ui_workflow_router
for seamless integration
Each card type has specific fields defined in the agent:
- Project: field1 (text), field2 (select), field3 (date), field4 (checklist)
- Entity: field1 (text), field2 (select), field3 (tags), field3_options (available tags)
- Note: field1 (textarea content)
- Chart: field1 (array of metrics with label and value 0-100)
sequenceDiagram
participant User
participant UI as Canvas UI
participant CK as CopilotKit
participant Agent as LlamaIndex Agent
participant Tools
User->>UI: Interact with canvas
UI->>CK: Update state via useCoAgent
CK->>Agent: Send state + message
Agent->>Agent: Process with GPT-4o
Agent->>Tools: Execute tools
Tools-->>Agent: Return results
Agent->>CK: Return updated state
CK->>UI: Sync state changes
UI->>User: Display updates
Note over Agent: Maintains ground truth
Note over UI,CK: Real-time bidirectional sync
- Define the data schema in
src/lib/canvas/types.ts
- Add the card type to the
CardType
union - Create rendering logic in
src/components/canvas/CardRenderer.tsx
- Update the agent's field schema in
agent/agent/agent.py
- Add corresponding frontend actions in
src/app/page.tsx
- Field definitions are in the agent's FIELD_SCHEMA constant
- UI components are in
CardRenderer.tsx
- Frontend actions follow the pattern:
set[Type]Field[Number]
- Global styles:
src/app/globals.css
- Component styles use Tailwind CSS with shadcn/ui components
- Theme colors can be modified via CSS custom properties
- LlamaIndex Documentation - Learn more about LlamaIndex and its features
- CopilotKit Documentation - Explore CopilotKit's capabilities
- Next.js Documentation - Learn about Next.js features and API
Feel free to submit issues and enhancement requests! This starter is designed to be easily extensible.
This project is licensed under the MIT License - see the LICENSE file for details.
If you see "I'm having trouble connecting to my tools", make sure:
- The LlamaIndex agent is running on port 9000 (check terminal output)
- Your OpenAI API key is set correctly as an environment variable
- Both servers started successfully (UI and agent)
If you see "[Errno 48] Address already in use":
- The agent might still be running from a previous session
- Kill the process using the port:
lsof -ti:9000 | xargs kill -9
- For the UI port:
lsof -ti:3000 | xargs kill -9
If the canvas and AI seem out of sync:
- Check the browser console for errors
- Ensure all frontend actions are properly registered
- Verify the agent is using the latest shared state (not cached values)
If you encounter Python import errors:
cd agent
uv sync
If issues persist, recreate the virtual environment:
cd agent
rm -rf .venv
uv venv
uv sync
Important
Some features are still under active development and may not yet work as expected. If you encounter a problem using this template, please report an issue to this repository.