About the Project
A fully deployed multi-agent research assistant built with LangGraph. The user enters a research topic, configures analyst settings, reviews AI-generated analyst personas, approves them, and then watches the graph execute a complete research workflow.
The system conducts parallel, search-backed analyst interviews and synthesises the results into a structured markdown research report. The architecture demonstrates nested graphs, human-in-the-loop checkpointing, fan-out / fan-in parallel execution, and real-time streaming of subgraph progress to the frontend.
Graph Execution Flow
create_analystsGenerate analyst personas with structured Pydantic output
human_feedbackPause for approval — user reviews or regenerates analysts
conduct_interview × NFan-out via Send() — one subgraph per analyst in parallel
ask_questionAnalyst generates a question for the expert
search_web + search_exaParallel Tavily + Exa retrieval to build answer context
answer_questionExpert answers using retrieved context
route_messagesLoop or stop based on turn count / sign-off
write_sectionAnalyst writes a section memo from the full transcript
write_report / intro / conclusionParallel synthesis nodes assemble the final report
finalize_reportSingle markdown report delivered to frontend
Key Features
Nested Graph Architecture
Outer orchestration graph manages the full pipeline while reusable interview subgraphs run one analyst workflow each — clean separation of concerns at every level.
Human-in-the-Loop Approval
LangGraph's interrupt_before pauses execution at the analyst review step. The user can approve or give feedback to regenerate personas before any expensive work begins.
Parallel Analyst Interviews
LangGraph's Send() API fans out one interview subgraph per analyst simultaneously. Each runs independently with its own state, reducing total research time significantly.
Dual Retrieval: Tavily + Exa
Each analyst interview uses both Tavily for broad keyword-based web search and Exa for semantic highlight retrieval — giving richer, more accurate source context.
SQLite Checkpointing
LangGraph state is persisted with SqliteSaver at every step. Sessions survive server restarts and page refreshes, and the graph resumes exactly where it paused.
Streamed Graph Progress
Backend streams LangGraph updates with stream_mode='updates' including nested subgraph events. The frontend shows live node activity down to search_web and write_section.
Full Tech Stack
Try it Live
Enter a research topic and watch a multi-agent graph build a full report in real time
© 2026 Tony Ye. All rights reserved.