-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
110 lines (74 loc) · 2.64 KB
/
main.py
File metadata and controls
110 lines (74 loc) · 2.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# main.py
from fastapi import FastAPI, HTTPException
from database import (
get_job_by_id,
get_all_jobs,
get_resume_by_id,
get_all_resumes
)
from ranking import calculate_score
from explainbility import generate_explanation
from what_if_simulator import simulate_improvement
from jd_sensitivity import analyze_jd_sensitivity
app = FastAPI(title="AI Resume Ranking & Hiring Simulation Engine")
# ---------------- HEALTH ---------------- #
@app.get("/health")
def health():
return {"status": "ok"}
# ---------------- SINGLE RESUME RANK ---------------- #
@app.post("/rank/job/{job_id}/resume/{resume_id}")
def rank_resume(job_id: int, resume_id: int):
job = get_job_by_id(job_id)
resume = get_resume_by_id(resume_id)
if not job or not resume:
raise HTTPException(status_code=404, detail="Job or Resume not found")
score, breakdown = calculate_score(resume, job, return_breakdown=True)
explanation = generate_explanation(resume, job, score)
return {
"final_score": score,
"score_breakdown": breakdown,
"explanation": explanation
}
# ---------------- WHAT-IF SIMULATOR ---------------- #
@app.post("/simulate/job/{job_id}/resume/{resume_id}")
def simulate_resume_improvement(
job_id: int,
resume_id: int,
improvement: str
):
job = get_job_by_id(job_id)
resume = get_resume_by_id(resume_id)
if not job or not resume:
raise HTTPException(status_code=404, detail="Job or Resume not found")
current = calculate_score(resume, job)
simulated = simulate_improvement(resume, job, improvement)
return {
"current_score": current,
"simulated_score": simulated,
"improvement": improvement,
"delta": round(simulated - current, 2)
}
# ---------------- JD SENSITIVITY ---------------- #
@app.post("/sensitivity/resume/{resume_id}")
def jd_sensitivity(resume_id: int):
resume = get_resume_by_id(resume_id)
jobs = get_all_jobs()
if not resume:
raise HTTPException(status_code=404, detail="Resume not found")
return analyze_jd_sensitivity(resume, jobs)
# ---------------- MULTI-RESUME RANKING ---------------- #
@app.post("/rank/job/{job_id}/all-resumes")
def rank_all_resumes(job_id: int):
job = get_job_by_id(job_id)
resumes = get_all_resumes()
if not job:
raise HTTPException(status_code=404, detail="Job not found")
ranked = []
for resume in resumes:
score = calculate_score(resume, job)
ranked.append({
"resume_id": resume["id"],
"score": score
})
ranked.sort(key=lambda x: x["score"], reverse=True)
return ranked