How to Run the Hiring Agent Locally on Your Machine
Clone the interviewstreet/hiring-agent repository, install dependencies from requirements.txt, configure your .env file with LLM_PROVIDER and API keys, and execute python score.py path/to/resume.pdf to generate a scored evaluation with cached intermediate results.
The Hiring Agent is an open-source Python pipeline that transforms resume PDFs into structured, explainable evaluations using local or hosted LLMs. According to the interviewstreet/hiring-agent source code, the system extracts text, parses sections with Jinja templates, enriches data via GitHub APIs, and applies a fairness-aware scoring rubric. Running the Hiring Agent locally lets you evaluate candidates without sending sensitive data to external services, provided you have a compatible LLM backend such as Ollama.
Prerequisites and Local Setup
Clone the Repository and Create a Virtual Environment
Start by cloning the repository and setting up an isolated Python environment to avoid dependency conflicts with other projects.
Install Python Dependencies
Install the required packages listed in requirements.txt to ensure all PDF processing, LLM client, and data validation libraries are available.
git clone https://github.com/interviewstreet/hiring-agent
cd hiring-agent
python -m venv .venv
source .venv/bin/activate # Use .venv\Scripts\activate on Windows
pip install -r requirements.txt
Configure the LLM Provider
The Hiring Agent supports multiple LLM backends through a common abstraction layer defined in models.py. Configuration is handled via environment variables stored in a .env file at the project root.
Using Ollama for Local Inference
For fully local execution without external API calls, install Ollama and pull a compatible model such as gemma3:4b. Set LLM_PROVIDER=ollama in your .env file to route all inference through your local instance.
Using Gemini for Cloud Inference
To use Google's Gemini API, obtain an API key and set LLM_PROVIDER=gemini along with GEMINI_API_KEY in your .env file. You may also set DEFAULT_MODEL to specify which Gemini model variant to use.
# Copy the example configuration
cp .env.example .env
# Edit .env to set your preferred provider and credentials
# LLM_PROVIDER=ollama
# DEFAULT_MODEL=gemma3:4b
# GITHUB_TOKEN=your_github_token_here
Running the End-to-End Pipeline
Once configured, execute the main entry point score.py with a path to a resume PDF. The pipeline orchestrates five distinct stages that transform raw PDF data into a structured evaluation:
- PDF extraction –
pymupdf_rag.pyreads the PDF using PyMuPDF and converts it to Markdown-like text. - Section parsing –
pdf.pysends parsed sections (Basics, Work, Education) to the LLM using Jinja templates fromprompts/templates/, returning JSON-Resume structures defined inmodels.py. - GitHub enrichment –
github.pyextracts usernames from the resume, pulls profile and repository data via the GitHub API, and uses the LLM to select the top 7 repositories for scoring. - Evaluation –
evaluator.pyapplies the scoring rubric via additional Jinja templates, assessing open-source contributions, production experience, technical skills, and fairness metrics. - Output –
score.pyprints a human-readable summary and, whenDEVELOPMENT_MODE=True(the default inconfig.py), writes a CSV row toresume_evaluations.csvand caches JSON files undercache/.
python score.py path/to/resume.pdf
Understanding the Pipeline Architecture
All stages share utility functions from llm_utils.py that normalize LLM responses and instantiate either OllamaProvider or GeminiProvider based on your LLM_PROVIDER setting. The config.py file manages global settings including the DEVELOPMENT_MODE flag.
Key files involved in local execution include:
score.py– CLI entry point that orchestrates the workflow.pdf.py– Handles PDF-to-Markdown conversion and per-section LLM calls.pymupdf_rag.py– Low-level text extraction using PyMuPDF.github.py– GitHub profile enrichment and repository classification.evaluator.py– Fairness-aware scoring logic.models.py– Pydantic schemas and LLM provider interfaces.prompts/templates/– Jinja templates for extraction and evaluation prompts.
Summary
- Clone the interviewstreet/hiring-agent repository and install dependencies via
pip install -r requirements.txt. - Configure your
.envfile withLLM_PROVIDER(set toollamaorgemini),DEFAULT_MODEL, and required API keys. - Run the complete pipeline with
python score.py <resume.pdf>to generate scored evaluations. - The system caches intermediate results in
cache/and appends evaluations toresume_evaluations.csvwhenDEVELOPMENT_MODE=True. - Core orchestration happens in
score.py, with PDF processing inpdf.pyandpymupdf_rag.py, and scoring logic implemented inevaluator.py.
Frequently Asked Questions
Do I need a GPU to run the Hiring Agent locally?
No. If you use Ollama with a small model like gemma3:4b, the pipeline runs on CPU-only machines, though inference will be slower. For faster performance or larger models, a GPU is recommended. Alternatively, set GEMINI_API_KEY to offload LLM inference to Google's cloud servers.
Where does the Hiring Agent store intermediate results?
When DEVELOPMENT_MODE=True (the default set in config.py), the pipeline writes cached JSON files to the cache/ directory and appends evaluation results to resume_evaluations.csv in the project root. This allows you to inspect the parsed resume structure and GitHub data without re-running expensive LLM calls.
Can I use a different LLM provider than Ollama or Gemini?
The current implementation in models.py defines OllamaProvider and GeminiProvider classes. To add a new provider, you would need to implement a compatible provider class following the abstraction pattern used in models.py and update llm_utils.py to instantiate your new class based on the LLM_PROVIDER environment variable.
Why does the pipeline require a GitHub token?
The github.py module extracts GitHub usernames from resumes and queries the GitHub API to retrieve profile metadata, repository statistics, and project classifications. A GITHUB_TOKEN is required to avoid rate limits and access detailed repository information. Without it, the GitHub enrichment stage may fail or return incomplete data.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →