Job Hunt Assistant
A multi-agent AI system that finds jobs, analyzes requirements, and generates tailored application materials
Overview
Job Hunt Assistant is a multi-agent system that automates the entire job search process using CrewAI, LangChain, and Python. This portfolio-worthy project demonstrates practical AI engineering skills while helping you save time on repetitive job hunting tasks.
The job market is competitive, and nearly every employer values AI skills. Why not let AI help with your job hunt? This system handles everything from analyzing job descriptions to drafting personalized LinkedIn outreach messages, freeing you up for what matters most: interview prep, upskilling, and getting hired.
Technologies
Features
Core Functionality
- Job Discovery - Browse relevant positions from USAJobs API
- Smart Analysis - AI agents analyze job descriptions and requirements
- Content Generation - Create customized cover letters and resumes
- LinkedIn Outreach - Draft personalized connection messages
- Application Tracking - Persistent logging of all applications
Architecture
flowchart TD
USER[π€ User] --> UI[Streamlit UI]
UI --> API[π USAJobs API]
UI --> CREW[CrewAI Orchestrator]
CREW --> A1[π JD Analyst Agent]
CREW --> A2[βοΈ Resume & CL Agent]
CREW --> A3[πΌ Messaging Agent]
A1 & A2 & A3 --> LLM[π§ Gemini LLM]
LLM --> TRACKER[π° Token Tracker]
A2 --> OUT1[π Resume & Cover Letter]
A3 --> OUT2[π¬ LinkedIn Messages]
| Agent | Role |
|---|
| JD Analyst Agent | Analyzes job descriptions and extracts key requirements & skills |
| Resume & CL Agent | Generates tailored resume summaries and cover letters |
| Messaging Agent | Drafts personalized LinkedIn outreach messages |
Cost Tracking & Budget Alerts
The application includes comprehensive cost monitoring to help manage API expenses.
- Per-job cost tracking - See exactly what each application costs
- Session totals - Track cumulative costs in the sidebar
- Lifetime statistics - Persistent tracking across sessions
- Budget alerts - Warnings when approaching/exceeding limits
- Model breakdown - Costs split by Gemini model used
How It Works
-
Token Extraction: When CrewAI runs the pipeline, token usage is extracted from the result:
prompt_tokens - Input tokens sent to the model
completion_tokens - Output tokens generated
total_tokens - Combined count
-
Cost Calculation: Costs are calculated using Gemini API pricing:
| Model | Input (per 1M) | Output (per 1M) |
|---|
| gemini-2.0-flash | $0.10 | $0.40 |
| gemini-2.5-flash | $0.30 | $2.50 |
| gemini-1.5-pro | $1.25 | $5.00 |
-
Budget Monitoring: Set a budget limit in .env:
BUDGET_LIMIT=1.0 # USD per session
The sidebar displays usage percentage and warns when exceeded.
-
Data Persistence: Usage data is saved to data/usage_log.json with:
- Per-run breakdowns (tokens, cost, timestamp)
- Lifetime totals across all sessions
Installation
Prerequisites
Install uv:
curl -LsSf https://astral.sh/uv/install.sh | sh
Setup
# Clone the repository
git clone https://github.com/sheygs/job-hunt-assistant.git
cd job-hunt-assistant
# Create a virtual environment
uv venv
source .venv/bin/activate
# Install dependencies
uv pip install -r requirements.txt
# Set up environment variables
cp .env.example .env
Configure API Keys
The application requires two API keys:
1. USAJobs API Key
- Visit the USAJobs Developer Portal
- Navigate to the API Request Page
- Fill out the request form with your details
- You'll receive your API key via email
2. Gemini API Key
- Visit Google AI Studio
- Sign in with your Google account
- Navigate to "Get API Key" and create a new key
3. Update Your .env File
# Open .env and add your keys
USAJOBS_API_KEY = "your_usajobs_api_key"
GEMINI_API_KEY = "your_gemini_api_key"
EMAIL_ADDRESS = "your_email_address"
BASE_URL = "your_search_base_url"
...
Usage
Start the Streamlit Interface
streamlit run app.py
Configure Your Preferences
- Enter your job search criteria (role, location, keywords)
- Upload your base resume and profile information
- Select job listings to target
- Let the agents generate customized materials
Review and Apply
- Review generated cover letters and resumes
- Check drafted LinkedIn outreach messages
- Edit as needed before sending
- Track applications in the logging dashboard
Project Module
job-hunt-assistant/
β
βββ app.py # Main Streamlit entry point
β
βββ core/ # Pipeline orchestration
β βββ orchestrator.py # CrewAI sequential pipeline
β
βββ agents/ # AI agent definitions
β βββ jd_analyst.py # Job description analyzer
β βββ resume_cl_agent.py # Resume & cover letter writer
β βββ messaging_agent.py # LinkedIn outreach writer
β
βββ services/ # Business logic layer
β βββ job_service.py # Job processing & tracking
β βββ jobs_api.py # USAJobs API client
β βββ storage_service.py # Session state management
β
βββ ui/ # Streamlit UI components
β βββ search_tab.py # Job search interface
β βββ history_tab.py # Application history
β βββ settings_tab.py # Settings configuration
β βββ components.py # Reusable UI components
β
βββ utils/ # Utilities
β βββ token_tracker.py # Cost tracking & budget alerts
β βββ llm.py # Gemini LLM factory
β βββ config.py # Configuration management
β βββ constants.py # Pricing & constants
β βββ retry.py # Retry with backoff
β βββ logger.py # Logging setup
β
βββ data/ # Data storage
β βββ applications_log.csv # Application history
β βββ usage_log.json # Token usage tracking
β βββ cover_letters/ # Generated cover letters
β
βββ logs/ # Application logs
βββ requirements.txt
βββ .env.example
βββ README.md
Future Enhancements
Notes
Important: This tool is designed to assist and augment your job search, not replace human judgment. Always review and personalize generated content before sending applications. Use this as a learning project to develop your AI engineering skills while making your job hunt more efficient.
License
This project is licensed under the MIT License - see the LICENSE file for details.
Acknowledgments