Expected Output Format from the Hiring-Agent's Analysis: Structure and Schema

The hiring-agent produces a human-readable terminal report featuring an overall score out of 120, detailed category breakdowns, bonus points, deductions, and actionable feedback, generated from a structured JSON schema defined in the models.py file.

The interviewstreet/hiring-agent is an open-source resume evaluation tool that analyzes PDF resumes using Large Language Models (LLMs). Understanding the expected output format from the hiring-agent's analysis is essential for integrating the tool into hiring workflows, parsing results programmatically, or customizing the evaluation display.

Architecture of the Output Pipeline

The end-to-end pipeline orchestrated in score.py processes candidate data through distinct stages before rendering the final report.

Resume Extraction and Enrichment

First, PDFHandler.extract_json_from_pdf() in pdf.py converts the PDF into a structured JSONResume object. Optionally, fetch_and_display_github_info() in github.py appends public repository data and profile information to enrich the evaluation context.

LLM Evaluation and Schema Validation

The ResumeEvaluator.evaluate_resume() method constructs a structured prompt and sends it to the configured LLM (Ollama or Gemini). The model returns a JSON payload that strictly conforms to the EvaluationData Pydantic schema defined in models.py, ensuring type-safe validation of all scores, evidence text, and feedback categories.

Terminal Formatting and Rendering

Finally, print_evaluation_results() in score.py consumes the validated EvaluationData object and renders the formatted output to stdout. The calculation logic—handling category score caps, bonus point limits, and the absolute maximum of 120 points—resides in score.py lines 41-70 and 78-130.

Structure of the Terminal Output Report

The formatted report uses visual separators, emoji prefixes, and aligned columns to maximize readability in terminal environments:

  • Overall Score: Displayed as 🎯 OVERALL SCORE: <total>/<max> where the maximum possible is 120 points
  • Detailed Scores: Four evaluated categories with individual caps:
    • open_source (35 points maximum)
    • self_projects (30 points maximum)
    • production (25 points maximum)
    • technical_skills (10 points maximum)
  • Bonus Points: ⭐ BONUS POINTS: <total> with descriptive breakdown
  • Deductions: ⚠️ DEDUCTIONS: -<total> accompanied by specific reasons
  • Key Strengths: Numbered list of up to 5 strengths extracted from the evaluation
  • Areas for Improvement: Numbered list of up to 5 specific suggestions

Capturing and Parsing the Output

To generate the standard terminal report, execute the main pipeline:

python score.py path/to/resume.pdf

Typical output appears as:


================================================================================
📊 RESUME EVALUATION RESULTS FOR: Jane Doe
================================================================================

🎯 OVERALL SCORE: 92.5/115

📈 DETAILED SCORES:
------------------------------------------------------------
🌐 Open Source:          32/35
   Evidence: Contributed to 3 open‑source libraries

🚀 Self Projects:        28/30
   Evidence: Built a personal CI/CD tool

🏢 Production Experience: 20/25
   Evidence: 2 years as backend engineer

💻 Technical Skills:     9/10
   Evidence: Strong Go, Python, Docker skills

⭐ BONUS POINTS: 5
------------------------------
   Extra credit for community mentorship

⚠️  DEDUCTIONS: -3
------------------------------
   Minor gaps in cloud architecture knowledge

✅ KEY STRENGTHS:
------------------------------
  1. Consistent delivery of high‑quality code
  2. Passion for open source

🔧 AREAS FOR IMPROVEMENT:
------------------------------
  1. Deepen AWS/GCP expertise

Accessing Raw JSON Data

For programmatic integration, access the underlying EvaluationData object before formatting:

from score import _evaluate_resume, PDFHandler

pdf = PDFHandler()
resume = pdf.extract_json_from_pdf("resume.pdf")
eval_data = _evaluate_resume(resume)

# Serialize to JSON

print(eval_data.json(indent=2))

Core Files Defining the Output Format

File Function Responsibility
score.py print_evaluation_results() Renders human-readable terminal output with emoji separators
models.py EvaluationData schema Defines Pydantic models for JSON validation and structure
evaluator.py evaluate_resume() Wraps LLM calls and parses responses into EvaluationData
pdf.py PDFHandler class Extracts JSONResume from PDF inputs
github.py fetch_and_display_github_info() Enriches resume data with public GitHub metrics

Summary

  • The hiring-agent outputs a terminal-formatted report with emoji separators, aligned columns, and visual boundaries for immediate human review
  • Raw structured data conforms to the EvaluationData Pydantic schema defined in models.py, enabling machine parsing
  • The scoring system caps at 120 total points across four categories (open source, self projects, production, technical skills) plus bonuses minus deductions
  • Calculation logic in score.py enforces category maximums and handles score capping automatically
  • Both CLI terminal output and programmatic JSON access are supported through the same pipeline

Frequently Asked Questions

What is the maximum possible score in the hiring-agent's evaluation?

The maximum total score is 120 points, calculated from four category maximums (35 + 30 + 25 + 10 = 100) plus possible bonus points, minus any deductions. The calculation logic in score.py lines 41-70 enforces caps on individual categories and ensures the final total never exceeds 120.

Can I extract the evaluation results as JSON instead of terminal text?

Yes. The EvaluationData object returned by _evaluate_resume() in score.py can be serialized using the .json() method. This Pydantic model defined in models.py contains all category scores, evidence text, bonus details, deductions, strengths, and improvement areas in a structured format suitable for API responses or database storage.

Which file handles the formatting of the terminal output?

The print_evaluation_results() function in score.py handles all terminal-specific formatting, including emoji prefixes (🎯, ⭐, ⚠️), separator lines (====), and the visual layout of scores and feedback. This function consumes the validated EvaluationData object and prints directly to stdout.

How does the hiring-agent calculate the overall score?

The system sums the four category scores (capped at their respective maximums), adds any bonus points, and subtracts deductions. The EvaluationData schema in models.py defines these fields, while the display logic in score.py handles the arithmetic and enforces the 120-point global maximum, ensuring consistent scoring across all evaluations.

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:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →