Full-stack multi-agent research assistant that turns a user query into a structured research report through a search, read, and critique workflow.
This project is built to reduce manual research time by orchestrating specialized agents instead of relying on a single model response.
The backend runs a three-stage pipeline:
- Search agent finds relevant sources from the web.
- Reader agent opens the most relevant pages and extracts usable content.
- Critic agent refines the collected notes into a final report.
The frontend consumes streamed events over Server-Sent Events, so users can see each phase of the research process in real time.
- Multi-agent workflow with separated responsibilities for search, reading, and critique
- Real-time streaming updates for phase status, tool calls, and final output
- Prompt-engineered agent pipeline powered by LangChain
- OpenRouter-backed LLM responses
- Tavily-powered web search for source discovery
- Webpage content extraction and cleaning before report generation
- Markdown report rendering with grouped citations
- Copy-to-clipboard support for the final report
- Stop and reset controls for long-running research sessions
| Layer | Tools | Purpose |
|---|---|---|
| Frontend | React, TypeScript, Vite | User interface and app shell |
| UI | Tailwind CSS, Motion, Lucide React | Styling, motion, and icons |
| Backend | FastAPI, Python | API layer and streaming endpoint |
| AI Orchestration | LangChain | Agent creation and prompt-driven workflow |
| LLM Provider | OpenRouter | Model access for agent responses |
| Search | Tavily | Web search and source discovery |
| Content Extraction | BeautifulSoup, Requests | Page reading and text cleaning |
| Markdown | React Markdown, remark-gfm | Report rendering |
The system is split into two parts:
search_agentuses Tavily search to collect relevant sources.reader_agentfetches and cleans webpage content.critic_agentsynthesizes the final report from the collected notes.research_pipeline_stream.pyruns the pipeline on a background thread and emits structured events.app/main.pyexposes the API and enables CORS for the frontend.
useResearch.tsmanages the run state and handles incoming stream events.ResearchTimelineshows each phase and its tool activity.ReportViewrenders the final report in Markdown and supports citations.ChatInputsubmits queries and provides stop/reset behavior for active runs.
Create .env files from the examples below.
| Variable | Description |
|---|---|
OPENROUTER_API_KEY |
API key used for OpenRouter LLM access |
TAVILY_API_KEY |
API key used for web search |
FRONTEND_URL |
Optional frontend origin for CORS, for example the deployed app URL |
| Variable | Description |
|---|---|
VITE_API_BASE_URL |
Backend API base URL, default is http://localhost:8000 |
cd backend
uv sync
cp .env.example .env
uv run uvicorn app.main:app --reload --port 8000cd frontend
npm install
cp .env.example .env
npm run dev| Method | Endpoint | Description |
|---|---|---|
GET |
/api/health |
Health check endpoint |
POST |
/api/research/stream |
Starts a streamed research run |
- The user submits a topic or question.
- The backend creates a shared research state object.
- The search agent gathers candidate sources.
- The reader agent extracts and cleans source content.
- The critic agent composes the final report.
- The frontend updates the timeline and renders the report as the stream progresses.
backend/
app/
agents/
prompts/
tools/
research_pipeline.py
research_pipeline_stream.py
frontend/
src/
components/
hooks/
lib/
types/
- Live demo: https://researcharena.vercel.app
- The backend is designed around streaming output, not a single blocking response.
- The report is rendered in Markdown, which keeps the output readable and citation-friendly.
- The frontend can stop an active run and reset the workspace for a new query.
MIT Licence

