An AI-powered job recommendation and resume enhancement platform built with Streamlit, Ollama, and real-time job APIs.
AI Smart Job Assistant is a fully local, privacy-first career tool that:
- Parses your resume (PDF or DOCX) and extracts skills, experience, and seniority level
- Detects your target role automatically using a local LLM
- Fetches 100+ real job listings from multiple portals (Adzuna, SerpAPI/Google Jobs)
- Ranks jobs against your resume using RAG (vector similarity via Ollama embeddings)
- Scores each job using an AI match engine (skills overlap, seniority, domain fit)
- Flags fake/scam job postings with a multi-layer Safety Agent (heuristics + FAISS + LLM)
- Sends job alerts to your email and supports daily scheduled notifications
| Feature | Details |
|---|---|
| π Resume Parsing | PDF & DOCX support, 10-pattern experience extraction |
| π― Role Detection | LLM-based target role identification |
| π ATS Scoring | Resume improvement suggestions via local LLM |
| π Job Discovery | Adzuna + SerpAPI (Naukri, Internshala, Wellfound, Unstop, Glassdoor, LinkedIn, Indeed) |
| π§ RAG Matching | Embedding-based ranking with nomic-embed-text via Ollama |
| π€ AI Job Scoring | Per-job match score (0β100) with skill breakdown |
| π‘οΈ Safety Agent | 3-layer fake job detection: heuristics β FAISS β LLM |
| π§ Email Alerts | Beautiful HTML job alert emails via Gmail SMTP |
| β° Daily Scheduler | Cron-based daily job alerts using APScheduler |
| πΎ Search History | SQLite-backed deduplication and history tracking |
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Streamlit UI (app.py) β
β Tab 1: Resume β Tab 2: Jobs β Tab 3: History β
βββββββββββββββββ¬βββββββββββββββββββ¬ββββββββββββββββββββ
β β
βββββββββΌβββββββ βββββββββΌβββββββββββββββ
β ResumeParser β β JobService β
β (parser.py) β β (job_service.py) β
β β β Adzuna + SerpAPI β
β 10-pattern β β dedup + diversify β
β experience β βββββββββ¬βββββββββββββββ
β extraction β β
βββββββββ¬βββββββ βββββββββΌβββββββββββββββ
β β RAGMatcher β
βββββββββΌβββββββ β (rag_matcher.py) β
β LLMManager β β nomic-embed-text β
β (llm.py) β β cosine similarity β
β Ollama API β βββββββββββββββββββββββββ
β gemma3/llamaβ
βββββββββ¬βββββββ βββββββββββββββββββββββββ
β β SafetyAgent β
β β (safety_agent.py) β
β β Heuristics+FAISS+LLM β
β βββββββββββββββββββββββββ
β
βββββββββΌβββββββββββββββββββββββββββββββββββ
β Notifier (notifier.py) + DB (database.py)β
β Gmail SMTP + APScheduler + SQLite β
βββββββββββββββββββββββββββββββββββββββββββββ
- Frontend: Streamlit
- LLM Backend: Ollama (local) β
gemma3:1b,llama3,mistral,neural-chat - Embeddings:
nomic-embed-textvia Ollama,all-MiniLM-L6-v2via sentence-transformers (safety agent) - Vector Search: FAISS (fake job detection), NumPy cosine similarity (RAG matching)
- Job APIs: Adzuna API, SerpAPI (Google Jobs engine)
- Resume Parsing: pdfminer.six, python-docx
- Email: smtplib + Gmail SMTP (App Password)
- Scheduling: APScheduler (CronTrigger)
- Database: SQLite via Python's built-in
sqlite3
- Python 3.10+
- Ollama installed and running locally
git clone https://github.com/your-username/ai-smart-job-assistant.git
cd ai-smart-job-assistantpip install -r requirements.txt# LLM (pick one β gemma3:1b is fastest)
ollama pull gemma3:1b
ollama pull llama3 # optional, more capable
ollama pull mistral # optional
# Embedding model (required for RAG matching)
ollama pull nomic-embed-textCreate a .env file in the project root:
# ββ Job APIs (at least one required) ββββββββββββββββββββββββββ
ADZUNA_APP_ID=your_adzuna_app_id
ADZUNA_APP_KEY=your_adzuna_app_key
SERPAPI_KEY=your_serpapi_key
# ββ Email Notifications (optional) ββββββββββββββββββββββββββββ
SENDER_EMAIL=your_gmail_address@gmail.com
SENDER_PASSWORD=your_gmail_app_passwordNote on Gmail: You need a Gmail App Password, not your regular Gmail password. Enable 2FA first, then generate an App Password under Google Account β Security.
| API | Free Tier | Sign Up |
|---|---|---|
| Adzuna | 250 req/day | adzuna.com/api |
| SerpAPI | 100 searches/month | serpapi.com |
streamlit run app.pyOpen http://localhost:8501 in your browser.
ai-smart-job-assistant/
βββ app.py # Main Streamlit application
βββ .env # API keys & credentials (not committed)
βββ requirements.txt # Python dependencies
β
βββ src/
β βββ parser.py # Resume parser β PDF/DOCX + 10-pattern experience extractor
β βββ llm.py # LLM manager β Ollama API wrapper (role detect, ATS, scoring)
β βββ job_service.py # Job fetcher β Adzuna + SerpAPI with dedup & diversification
β βββ rag_matcher.py # RAG matcher β embedding-based job ranking
β βββ safety_agent.py # Safety agent β fake job detection (3 layers)
β βββ notifier.py # Email notifier β SMTP + HTML templates + daily scheduler
β βββ database.py # SQLite manager β search history & deduplication
β
βββ data/
β βββ jobs_history.db # Auto-created SQLite database
β
βββ debug/ # Debugging & testing scripts
βββ debug_jobs.py
βββ debug_serp.py
βββ debug_serp2.py
βββ debug_serp3.py
βββ debug_serp4.py
βββ debug_overlap.py
βββ debug_queries.py
βββ test_apis.py
βββ test_integration.py
βββ test_serpapi.py
βββ test_ollama_api.py
βββ verify_jsearch.py
Extracts structured data from PDF/DOCX resumes using rule-based logic β no LLM required for parsing.
10 supported experience patterns:
- Numeric years β
3 years - Decimal years β
2.5 years - Text years β
two years - Numeric months β
6 months - Text months β
three months - MonthβMonth ranges β
Jun 2023 β Aug 2023 - YearβYear ranges β
2022 β 2024 - Short year format β
2022β23 - MonthβPresent β
Jan 2024 β Present - Single year with context β
Internship 2023
Experience β Seniority mapping:
| Months | Level |
|---|---|
| 0 | Entry-Level |
| < 12 | Entry-Level |
| 12 β 35 | Junior |
| 36 β 71 | Mid-Level |
| 72+ | Senior |
Dual-source job fetcher with smart query generation, deduplication, and round-robin source diversification.
- Adzuna: Tries multiple keyword variants Γ date windows (7 days β 30 days fallback)
- SerpAPI: Uses platform-targeted queries (e.g.
"intern internshala","fresher naukri") - Deduplication: Fingerprint-based (normalized title + company) + URL normalization
- Diversification: Round-robin across sources so no single portal dominates results
- Caching: In-memory 5-minute cache to avoid redundant API calls
Three-layer pipeline to detect fake/scam job postings:
Layer 1 β Heuristics (regex, instant)
β Payment requests, urgency tactics, phishing attempts,
unrealistic salaries, WhatsApp-only channels, generic HR emails
Layer 2 β FAISS Vector Similarity (fast)
β Compares job text against 32 known scam-phrase embeddings
β Uses all-MiniLM-L6-v2 + cosine similarity (threshold: 0.50)
Layer 3 β LLM Behavioral Analysis (optional, ~2β5s)
β Sends job snippet to local Ollama model
β Returns trust_level + red_flags in structured JSON
Trust Score = 100 β heuristic_penalty β faiss_penalty β llm_penalty + source_bonus
| Score | Level | Verdict |
|---|---|---|
| β₯ 70 | High | β Legitimate |
| 45β69 | Medium | |
| < 45 | Low | π¨ Likely Scam |
- Sends rich dark-themed HTML job alert emails via Gmail SMTP
- Supports retry logic (configurable, default 2 attempts)
- Daily cron scheduler via APScheduler
- Deduplicates alerts using the SQLite history database
Go to the Resume Analysis tab β upload a .pdf or .docx file.
The app will display:
- Extracted skills
- ATS score with suggestions
- Detected experience (years + seniority level)
- AI candidate profile analysis
- Auto-detected target role
Go to the Job Discovery tab β optionally change location β click Find Jobs.
Each job card shows:
- Source portal badge (color-coded)
- Remote / Internship / Trusted badges
- Safety Agent verdict with trust score
- AI match score (0β100%) with explanation
- Direct apply link
Enter your email in the field below the results and click Send Jobs to Email to receive a formatted HTML digest.
In the sidebar, enter your email, set a preferred time, and click Subscribe to Daily Alerts.
| Setting | Description |
|---|---|
| LLM Model | Choose from gemma3:1b (fast), llama3, mistral, neural-chat |
| Notification Email | Email for job digests |
| Fake-job detection | Toggle heuristic + FAISS safety checks |
| Deep LLM analysis | Toggle LLM layer of safety agent (slower but deeper) |
| Alert Time | Hour / Minute / AM-PM for daily scheduled alerts |
# Test API connectivity
python debug/test_apis.py
# Test Adzuna + SerpAPI integration end-to-end
python debug/test_integration.py
# Debug SerpAPI query output and link extraction
python debug/debug_serp.py
python debug/debug_serp2.py
# Check for Adzuna β SerpAPI URL overlap
python debug/debug_overlap.py
# Test Ollama connection
python debug/test_ollama_api.py
# Verify SerpAPI account & search credits
python debug/test_serpapi.py| Issue | Fix |
|---|---|
Ollama connection error |
Make sure Ollama is running: ollama serve |
Model not found |
Run ollama pull gemma3:1b and ollama pull nomic-embed-text |
No jobs found |
Check .env has valid API keys; try a broader role or location |
Email not sent |
Use a Gmail App Password (not your regular password); check SENDER_EMAIL and SENDER_PASSWORD in .env |
Adzuna 401 error |
Verify ADZUNA_APP_ID and ADZUNA_APP_KEY are correct |
SerpAPI 429 error |
Monthly search limit reached; upgrade plan or wait for reset |
Embeddings failed |
Ensure nomic-embed-text is pulled and Ollama is running |
- Chrome Extension for one-click job saving
- Resume auto-tailoring per job description
- LinkedIn job scraping integration
- Multi-resume profile management
- Cover letter generation per job
- Interview question prep based on job description
- Job application tracker board (Kanban)
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch (
git checkout -b feature/your-feature) - Commit your changes (
git commit -m 'Add your feature') - Push and open a Pull Request
This project is licensed under the MIT License β see LICENSE for details.
- Ollama β local LLM inference
- Adzuna API β job listings
- SerpAPI β Google Jobs scraping
- FAISS β vector similarity search
- Sentence Transformers β embedding models
- Streamlit β UI framework