# How to Customize Prompt Templates in Hiring-Agent: 3 Methods Explained

> Customize hiring agent prompt templates with 3 methods: edit Jinja2 files, register new templates, or supply a custom directory. Learn how to tailor your prompts now.

- Repository: [HackerRank/hiring-agent](https://github.com/interviewstreet/hiring-agent)
- Tags: how-to-guide
- Published: 2026-07-04

---

**Yes, you can fully customize prompt templates in InterviewStreet's hiring-agent by editing the Jinja2 files in `prompts/templates/`, registering new templates in the `TemplateManager` class, or supplying a custom template directory at runtime.**

The hiring-agent repository uses **Jinja2** templating to construct LLM prompts for each resume section. According to the source code in [`prompts/template_manager.py`](https://github.com/interviewstreet/hiring-agent/blob/main/prompts/template_manager.py), the `TemplateManager` class orchestrates template loading and rendering, allowing you to modify extraction behavior, JSON output schemas, and system instructions without changing the core extraction logic.

## How Template Management Works

### The TemplateManager Class

The orchestration lives in **[`prompts/template_manager.py`](https://github.com/interviewstreet/hiring-agent/blob/main/prompts/template_manager.py)**. The `TemplateManager` class is instantiated (for example, in [`pdf.py`](https://github.com/interviewstreet/hiring-agent/blob/main/pdf.py)) with a default template directory of **`prompts/templates`**.

During construction, it calls `_load_templates()`, which builds a hard-coded dictionary mapping section names to Jinja file names:

```python

# From prompts/template_manager.py - conceptual structure

"basics": "basics.jinja"
"work": "work.jinja"
"education": "education.jinja"

```

When processing a section, `PDFHandler` requests a rendered prompt via `render_template(section_name, text_content=...)`, which returns the final prompt string ready for the LLM.

### Default Template Locations

All default templates reside under **`prompts/templates/`**:

- **`basics.jinja`** – Extracts name, email, phone, location, and profiles
- **`work.jinja`** – Extracts job history and employment details  
- **`education.jinja`** – Extracts academic background
- **`skills.jinja`** – Extracts technical and soft skills
- **`projects.jinja`** – Extracts project descriptions
- **`awards.jinja`** – Extracts awards and recognitions
- **`system_message.jinja`** – Wrapper template used for every section that receives the `section_name_param` variable

## Three Ways to Customize Prompt Templates

### Method 1: Edit Existing Jinja Files

The simplest approach is to modify the existing template files directly. Open any file under `prompts/templates/` (e.g., `basics.jinja`) and change the wording, add extra instructions, or modify the JSON schema that the LLM must return.

The next time `render_template()` is called for that section, it will use your revised wording immediately.

### Method 2: Add New Section Templates

To extract custom data points, create entirely new templates:

1. Create a new file `certifications.jinja` inside `prompts/templates/`
2. Add an entry to the `template_files` dictionary in `TemplateManager._load_templates()`:
   ```python
   "certifications": "certifications.jinja"
   ```

3. Call `render_template("certifications", text_content=...)` from your code, or extend `PDFHandler` with a new extractor method

This approach allows you to invoke custom extractions using the same infrastructure as built-in sections.

### Method 3: Change the Template Directory

To keep templates separate from the source tree (e.g., for user-specific overrides), pass a different path when constructing `TemplateManager`:

```python
from prompts.template_manager import TemplateManager

# Use custom template directory

tm = TemplateManager(template_dir="./my_custom_templates")

```

You can implement this by subclassing `PDFHandler` or modifying the instantiation in [`pdf.py`](https://github.com/interviewstreet/hiring-agent/blob/main/pdf.py).

## Practical Implementation Examples

### Rendering a Template Manually

```python
from prompts.template_manager import TemplateManager

tm = TemplateManager()  # Uses default prompts/templates directory

prompt = tm.render_template(
    "basics", 
    text_content="John Doe\njohn@example.com\nSan Francisco, CA"
)
print(prompt)  # Final Jinja-rendered prompt ready for LLM

```

### Adding a Runtime Template Without Source Modification

```python

# Create my_templates/custom_section.jinja

"""
Extract certification data from the resume text.
{{ text_content }}
Return JSON with fields: "name", "issuer", "date".
"""

# Runtime usage

tm = TemplateManager(template_dir="./my_templates")

# Manually register the mapping

tm._templates["custom"] = tm.env.get_template("custom_section.jinja")
prompt = tm.render_template("custom", text_content=resume_text)

```

### Extending PDFHandler for a New Section

```python

# In pdf.py or your subclass

def extract_certifications_section(self, resume_text: str):
    prompt = self.template_manager.render_template(
        "certifications", text_content=resume_text
    )
    if not prompt:
        return None
    return self._call_llm_for_section(
        "certifications", 
        resume_text, 
        prompt, 
        CertificationsSection  # Your Pydantic model

    )

```

## Summary

- **Edit existing templates** by modifying Jinja files in `prompts/templates/` to change wording or output schemas for standard sections like basics, work, and education
- **Add new templates** by creating `.jinja` files and registering them in `TemplateManager._load_templates()` to support custom extraction sections
- **Override template directories** by passing `template_dir` to the `TemplateManager` constructor to maintain user-specific template collections outside the repository
- **Access templates** at runtime via `render_template(section_name, text_content=...)` which returns fully-rendered prompts ready for LLM submission

## Frequently Asked Questions

### Where are the default prompt templates stored in hiring-agent?

The default templates are located in the **`prompts/templates/`** directory. This includes `basics.jinja`, `work.jinja`, `education.jinja`, `skills.jinja`, `projects.jinja`, `awards.jinja`, and `system_message.jinja`. The `TemplateManager` class in [`prompts/template_manager.py`](https://github.com/interviewstreet/hiring-agent/blob/main/prompts/template_manager.py) loads these files by default when instantiated without a custom `template_dir` parameter.

### Can I add custom resume sections without modifying the source code?

Yes, you can add custom sections at runtime by placing new Jinja files in a custom directory and using `TemplateManager(template_dir="your/path")`. Alternatively, you can monkey-patch the `TemplateManager._templates` dictionary at runtime to register new templates without editing the source files in the repository.

### What templating engine does hiring-agent use for prompts?

Hiring-agent uses **Jinja2** for template rendering. The `TemplateManager` class maintains a Jinja environment (`self.env`) that loads templates from the specified directory and renders them with variables like `text_content` and `section_name_param`.

### How do I change the system message for all resume sections?

Edit the **`system_message.jinja`** file in `prompts/templates/`. This template acts as a wrapper for every section and receives the `section_name_param` variable (as seen in line 79-80 of [`pdf.py`](https://github.com/interviewstreet/hiring-agent/blob/main/pdf.py)). Modifying this file changes the overall tone, instruction set, or formatting requirements for all extractions simultaneously.