A CopilotKit Deep Agents demo showcasing planning, memory/files, and generative UI using Tavily for web research.
demo-deep-agents.mp4
This demo showcases all key Deep Agents capabilities:
- Planning (Todos) - Visible research plan with status indicators (pending, in progress, completed)
- Memory/Files - Markdown files created by the agent, viewable in the workspace with download option
- Generative UI - Rich tool call rendering with result summaries and expandable details
- Web Research - Tavily-powered search for real-time information
[User asks research question]
↓
Next.js Frontend (CopilotChat + Workspace)
↓
CopilotKit Runtime → LangGraphHttpAgent
↓
Python Backend (FastAPI + AG-UI)
↓
Deep Agent (research_assistant)
├── write_todos (planning, built-in)
├── write_file (filesystem, built-in)
├── read_file (filesystem, built-in)
└── research(query)
└── internal Deep Agent [thread-isolated]
└── internet_search (Tavily)
deep-research-v2/
├── src/ # Next.js frontend
│ ├── app/
│ │ ├── layout.tsx # CopilotKit provider
│ │ ├── page.tsx # Main page with useDefaultTool
│ │ ├── globals.css # Glassmorphism styles
│ │ └── api/copilotkit/route.ts # CopilotRuntime endpoint
│ ├── components/
│ │ ├── Workspace.tsx # Research progress display
│ │ ├── ToolCard.tsx # Generative UI for tools
│ │ └── FileViewerModal.tsx # Markdown file viewer
│ └── types/
│ └── research.ts # TypeScript types
│
├── agent/ # Python backend
│ ├── main.py # FastAPI server + AG-UI
│ ├── agent.py # Deep Agent definition
│ ├── tools.py # Tavily search tools
│ └── pyproject.toml # Python dependencies
│
├── .env.example # Environment variables
└── README.md # This file
| Variable | Required | Default | Description |
|---|---|---|---|
OPENAI_API_KEY |
Yes | - | Get API key |
TAVILY_API_KEY |
Yes | - | Get API key |
OPENAI_MODEL |
No | gpt-5.2 |
Model to use (gpt-5.2, gpt-5, etc.) |
LANGGRAPH_DEPLOYMENT_URL |
No | http://localhost:8123 |
Backend URL |
SERVER_HOST |
No | 0.0.0.0 |
Backend host |
SERVER_PORT |
No | 8123 |
Backend port |
cd agent
uv venv && source .venv/bin/activate
uv pip install -e .Or with pip:
cd agent
python -m venv .venv && source .venv/bin/activate
pip install -e .npm installCopy .env.example to .env in both the root directory and agent/ directory, then fill in your API keys.
Terminal 1 - Backend:
cd agent
uv run python main.pyTerminal 2 - Frontend:
npm run devOpen http://localhost:3000 and ask the assistant to research any topic.
This demo uses local React state with useDefaultTool instead of useCoAgent to avoid type mismatches between Python's FilesystemMiddleware (Dict) and TypeScript (Array):
const [state, setState] = useState<ResearchState>(INITIAL_STATE);
useDefaultTool({
render: (props) => {
// Update local state based on tool results
if (name === "write_todos" && status === "complete") {
setState(prev => ({ ...prev, todos: result.todos }));
}
return <ToolCard {...props} />;
},
});agent_graph = create_deep_agent(
model=ChatOpenAI(model="gpt-5.2"),
system_prompt=MAIN_SYSTEM_PROMPT,
tools=[research],
middleware=[CopilotKitMiddleware()],
checkpointer=MemorySaver(),
)- Deep Agents Documentation
- Building Frontends for Deep Agents
- CopilotKit Documentation
- Tavily Documentation
MIT