examples/showcases/deep-agents/README.md
A CopilotKit Deep Agents demo showcasing planning, memory/files, and generative UI using Tavily for web research.
https://github.com/user-attachments/assets/68d5729f-91f9-4fd9-a579-cd1a8f4aad8d
This demo showcases all key Deep Agents capabilities:
[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 install
Copy .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.py
Terminal 2 - Frontend:
npm run dev
Open 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(),
)
MIT