A production-grade multi-agent AI system built with LangGraph that scrapes a job post URL, extracts requirements, and analyses them against your CV using RAG — returning a full match report, salary estimate, company insights, and interview questions.
Job URL → Scraper → Extractor → Supervisor → [CV Analyst + Salary Analyst + Company Researcher + Interview Agent] → Reports
The supervisor uses deterministic parallel fan-out — all four analyst agents run simultaneously, not sequentially.
- LangGraph — multi-agent graph with parallel fan-out and persistent checkpointing
- LangChain — LLM orchestration, embeddings, document loading
- FastAPI — streaming and non-streaming REST API
- Chroma — local vector store for CV RAG retrieval
- PostgreSQL — persistent session memory via LangGraph checkpointer
- OpenAI — GPT-4o-mini for agents, text-embedding-3-small for CV embeddings
- Jina Reader — authenticated webpage scraping without browser overhead
| Agent | Role |
|---|---|
| Scraper | Fetches job post content via Jina Reader |
| Extractor | Extracts structured requirements using GPT-4o-mini |
| Supervisor | Deterministic router with parallel fan-out |
| CV Analyst | RAG retrieval from embedded CV + match report |
| Salary Analyst | Estimates salary range from job requirements |
| Company Researcher | Extracts culture, industry, and tech stack hints |
| Interview Agent | Generates tailored technical and behavioural questions |
| Method | Endpoint | Description |
|---|---|---|
| POST | /analyse |
Full analysis, returns complete JSON report |
| POST | /analyse/stream |
Streams agent events as they complete |
1. Install dependencies
uv add langchain-openai langchain-community langchain-chroma \
langchain-tavily langgraph langgraph-checkpoint-postgres \
langchain-pymupdf4llm fastapi uvicorn python-dotenv \
beautifulsoup4 lxml psycopg[binary]2. Create .env file
OPENAI_API_KEY=your-openai-api-key
DATABASE_URL=your-postgres-connection-string
3. Add your CV
Place your CV as resume.pdf in the root directory.
4. Run the server
uvicorn supervisor:app --reloadcurl -X POST http://localhost:8000/analyse \
-H "Content-Type: application/json" \
-d '{"job_url": "https://www.reed.co.uk/jobs/lead-ai-engineer/57002808"}'{
"thread_id": "abc-123",
"cv_report": "Overall match: 75%...",
"salary_report": "Estimated range: £70k - £90k...",
"company_report": "Industry: FinTech, Culture: fast-paced...",
"interview_report": "1. Explain your RAG pipeline architecture..."
}- Deterministic supervisor routing — Python set logic, no LLM hallucinating routes
- Parallel fan-out —
Command(goto=[list])runs all agents simultaneously - RAG retrieval — CV chunked with 500/50 overlap, retrieved per job requirements
- Persistent sessions — PostgreSQL checkpointer survives server restarts
- Streaming —
/analyse/streamyields agent events as NDJSON
job-match-ai/
├── supervisor.py # Full system in one file
├── resume.pdf # Your CV (not committed)
├── .env # Environment variables (not committed)
├── chroma_db/ # Local vector store (auto-created)
└── README.md