A multi-agent resume screening system powered by LangGraph, Groq LLM, and FastAPI that automatically analyzes and ranks resumes against job descriptions.
- Intelligent Resume Parsing: Extracts and chunks resume text for detailed analysis
- Vector Embeddings: Uses HuggingFace embeddings (all-MiniLM-L6-v2) for semantic similarity scoring
- LLM-Powered Analysis: Groq's llama-3.1-8b-instant model with JSON output for structured analysis
- Multi-Agent Pipeline: LangGraph state machine with 4 specialized nodes
- Real-time Feedback: React frontend with visual scoring rings and expandable result cards
- Logging Infrastructure: Raw LLM output logging for debugging and validation
Resume Input
β
Parse Node β Extract text, chunk into 500-char segments
β
Score Node β Compute cosine similarity (HuggingFace embeddings)
β
Analyze Node β LLM analysis (Groq with JSON mode)
β
Rank Node β Sort by match_score, format final output
β
JSON Results
- Job description input
- Drag-and-drop PDF resume upload
- Real-time screening results with:
- Match score (0-100) with color-coded ring
- Recommendation (Strong Match, Good Match, Partial Match, Not Recommended)
- Strengths and gaps analysis
- Detailed reasoning
Backend:
- FastAPI (HTTP API server)
- LangGraph (multi-agent orchestration)
- LangChain (LLM framework)
- Groq (LLM provider)
- HuggingFace Transformers (embeddings)
- PyPDF2 (PDF parsing)
- FAISS (vector similarity)
Frontend:
- React 18
- Axios (HTTP client)
- CSS Grid/Flexbox
- Python 3.11+
- Node.js 16+
- Groq API key (free tier available)
- Install Python dependencies:
pip install -r requirements.txt- Create
.envfile:
GROQ_API_KEY=your_groq_api_key_here- Start FastAPI server:
python -m uvicorn main:app --host 0.0.0.0 --port 8001Backend will be available at http://localhost:8001
- Install Node dependencies:
npm install- Start React development server:
npm startFrontend will open at http://localhost:3000 (or 3001 if 3000 is busy)
- Open http://localhost:3000 in your browser
- Paste a job description in the textarea
- Upload one or more resume PDFs
- Click "Run Screening Pipeline"
- View detailed analysis results with match scores and recommendations
POST /screen
Request:
{
"jd": "Job description text...",
"resumes": [binary PDF files]
}Response:
{
"results": [
{
"rank": 1,
"name": "resume.pdf",
"match_score": 85,
"similarity_score": 82.5,
"recommendation": "Strong Match",
"strengths": ["Python experience", "FastAPI expertise"],
"gaps": ["Missing cloud deployment"],
"reasoning": "Candidate has strong Python background..."
}
]
}- Model: llama-3.1-8b-instant
- Temperature: 0.0 (deterministic)
- JSON Mode: Enabled for structured output
- Prompt: Explicitly requires JSON format with no markdown
- Model: all-MiniLM-L6-v2
- Dimensions: 384
- Similarity: Cosine distance
- Chunk Size: 500 characters
- Overlap: 0
Resume Screener Agent/
βββ main.py # FastAPI backend + LangGraph pipeline
βββ package.json # React app configuration
βββ requirements.txt # Python dependencies
βββ .gitignore # Git ignore rules
βββ public/
β βββ index.html # React HTML entry point
βββ src/
β βββ App.js # Main React component
β βββ App.css # Styling
β βββ index.js # React entry point
βββ raw_llm_outputs.log # LLM output logging (generated)
Check raw_llm_outputs.log to see the actual LLM responses:
cat raw_llm_outputs.logpython -m uvicorn main:app --host 0.0.0.0 --port 8001 --log-level debugOpen browser DevTools (F12) and check Console tab
The backend uses 3-layer enforcement to ensure LLM outputs valid JSON:
- Model Config:
model_kwargs={"response_format": {"type": "json_object"}} - Temperature: Set to 0.0 for deterministic output
- Prompt Engineering: Explicit "ONLY valid JSON" requirement with example
- Fallback JSON extraction via regex if LLM output is malformed
- Graceful degradation with default values
- All errors logged for debugging
- Text chunking reduces embedding computation
- Vector similarity precomputed before LLM analysis
- Async-ready FastAPI for concurrent requests
- Requires PDF files (TXT supported with minor code changes)
- LLM analysis limited to context window
- No resume deduplication
- Single-threaded screening (FastAPI can handle async)
- Candidate ranking comparison view
- Resume parsing improvement (better table extraction)
- Bulk resume upload with batch processing
- Dashboard with analytics
- Support for multiple file formats
- Cache results for faster re-screening
- Export results to CSV/PDF
- Check
raw_llm_outputs.logfor LLM response format - Verify GROQ_API_KEY is correct
- Ensure Groq API is working (test via
groq-cli)
lsof -i :8001 # macOS/Linux
netstat -ano | findstr :8001 # Windows- Check internet connection
- Model will download to
~/.cache/huggingface/on first run
MIT License - feel free to use this for commercial projects
Made with β€οΈ using LangGraph, Groq, and React
