Problem
Manual lead research took hours per account and produced inconsistent outreach.
What I built
A six-agent LangGraph system with one typed shared state: Researcher, Website Intelligence, ICP Scorer, Opportunity Finder, Outreach Writer and QA Validator, streamed into a Next.js front end.
Key engineering decisions
- Typed shared state instead of message passing, so every agent reads and writes the same validated object.
- Retry-with-correction: the QA agent returns structured feedback and the writer regenerates, capped at two attempts.
- Provider-agnostic LLM layer so models can be swapped per agent without touching orchestration.
Validation and QA
Pydantic-validated outputs at every agent boundary; pytest coverage over the orchestration graph; SSE streaming so reviewers see progress, not a spinner.
Result
Research, scoring and outreach generated end to end with QA before delivery. 6 agents, one state object, retries visible in the UI.