A RAG-powered job description analysis and ATS scoring system built with LangGraph, Google ADK, and Groq (free tier LLMs only).
Upload your resume and job descriptions, then ask the AI agent to score your ATS match, find missing keywords, and rewrite your bullet points in the language of the JD.
┌─────────────────────────────────────────────────────────┐
│ Frontend (HTML/JS) │
│ Upload JDs + Resume | Chat Interface │
└───────────────────┬─────────────────────────────────────┘
│ HTTP
┌───────────────────▼─────────────────────────────────────┐
│ FastAPI Backend │
│ /upload/jd /upload/resume /chat /jds │
└───────────────────┬─────────────────────────────────────┘
│
┌───────────────────▼─────────────────────────────────────┐
│ Google ADK Agent Layer │
│ Tools: analyze_ats_match | list_jds | answer_question │
│ Fallback: Direct LangGraph agent (no ADK key needed) │
└───────────────────┬─────────────────────────────────────┘
│
┌───────────────────▼─────────────────────────────────────┐
│ LangGraph Stateful Graph │
│ │
│ [classify] ──► [retrieve] ──► [score_ats] ──► [format] │
│ │ │
│ └──────► [retrieve_qa] ──► [respond_qa] │
│ │ │
│ └──────► [respond_general] │
└───────────────────┬─────────────────────────────────────┘
│
┌───────────────────▼─────────────────────────────────────┐
│ RAG Layer │
│ ChromaDB (persistent) + SentenceTransformers │
│ (all-MiniLM-L6-v2 — runs locally, no API key) │
│ │
│ Collections: job_descriptions | resumes │
└─────────────────────────────────────────────────────────┘
│
Groq / Gemini
(free tier LLM inference)
The LangGraph graph begins with a classifier node that categorises every query before routing. This makes the routing explicit and testable — instead of relying on prompt design to determine flow, each query type follows a predictable path with a single clear responsibility per node.
Query types: ats_score | jd_question | resume_question | general
- Groq (
llama3-8b-8192) — default, very fast, free tier - Google Gemini (
gemini-1.5-flash) — free tier, used by ADK agent - Switch via
LLM_PROVIDER=groq|googlein.env
sentence-transformers/all-MiniLM-L6-v2 runs entirely locally — no embedding API costs, no key required.
The ADK agent wraps the LangGraph pipeline as a tool-using agent, adding session management and multi-turn conversation. If GOOGLE_API_KEY is not set, the system falls back to a direct LangGraph agent with identical capability.
git clone https://github.com/RitikaHiremath/jd-ats-analyzer
cd jd-ats-analyzer
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
cp .env.example .env
# Edit .env and add your API keys- Groq: https://console.groq.com — free tier, no credit card
- Google Gemini: https://aistudio.google.com — free tier
python run.py
# Open http://localhost:8000- Click "Upload JD" in the sidebar
- Enter company name and role
- Supports PDF, TXT, DOCX
- Click "Upload Resume"
- Replaces any previously uploaded resume
Example queries:
Score my resume against all uploaded JDs
What keywords am I missing for the Bosch role?
Rewrite my bullet points to match the SAP JD language
What are the must-have skills for the Google role?
Should I apply to JetBrains?
| Method | Endpoint | Description |
|---|---|---|
| POST | /upload/jd |
Upload and index a JD |
| POST | /upload/resume |
Upload and index resume |
| POST | /chat |
Chat with ATS agent |
| GET | /jds |
List indexed JDs |
| DELETE | /session/{id} |
Clear conversation history |
| GET | /health |
Health check |
| Layer | Technology |
|---|---|
| Graph orchestration | LangGraph 0.2 |
| Agent framework | Google ADK |
| LLM inference | Groq (llama3-8b) / Gemini 1.5 Flash |
| Vector DB | ChromaDB (persistent) |
| Embeddings | sentence-transformers (local) |
| Backend | FastAPI + Uvicorn |
| Document parsing | pypdf, python-docx |
| LangChain integration | langchain-groq, langchain-google-genai |
jd-ats-analyzer/
├── backend/
│ ├── rag/
│ │ └── core.py # Document ingestion + retrieval
│ ├── graph/
│ │ ├── ats_graph.py # LangGraph state machine
│ │ └── llm.py # LLM abstraction (Groq / Gemini)
│ ├── agents/
│ │ └── adk_agent.py # Google ADK agent + fallback
│ └── api/
│ └── main.py # FastAPI app
├── frontend/
│ └── index.html # Single-file UI
├── run.py
├── requirements.txt
└── .env.example
Ritika Hiremath — github.com/RitikaHiremath | linkedin.com/in/ritikahiremath