React + TypeScript + Vite frontend, FastAPI backend, LangChain, OpenAI, and Tavily.
frontend/: research dashboard and typed API clientbackend/app/main.py: FastAPI application and REST/SSE endpointsbackend/app/services/pipeline.py: async job orchestration and progress eventsbackend/app/agents/agents.py: search/reader agents and writer/critic chainsbackend/app/tools/web_tools.py: Tavily search and safe URL scrapingbackend/app/core/config.py: environment configuration
- Python 3.11+
- Node.js 20+
- OpenAI API key
- Tavily API key
cd backend
py -3.11 -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install -r requirements.txt
Copy-Item .env.example .env
# Edit .env and add OPENAI_API_KEY and TAVILY_API_KEY
uvicorn app.main:app --reloadAPI docs: https://researchnet-tsn5.onrender.com/docs
cd frontend
npm install
Copy-Item .env.example .env
npm run devOpen the URL Vite prints (normally http://localhost:5173).
- Submit a topic using
POST /api/research. - The backend returns a job ID immediately.
- The frontend subscribes to
GET /api/research/{job_id}/eventsusing Server-Sent Events. - Events update each pipeline stage and deliver the completed report and critique.
GET /api/research/{job_id}can retrieve the current state.
- Jobs are held in process memory. Restarting the backend clears them; use Redis/PostgreSQL for durable multi-worker production deployment.
- The current orchestration runs synchronously inside a background task. For production, add a queue (e.g. Celery/Redis or ARQ), rate limits, authentication, and durable job storage.
- URL scraping includes basic protections against non-HTTP URLs and private/local IP targets, but production deployments should add DNS-rebinding-resistant egress controls.
- LLM output and web content are untrusted. Verify citations and claims before relying on reports.