File size: 2,821 Bytes
ab13a8a | 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 | import os
from dotenv import load_dotenv
load_dotenv()
import pandas as pd
import io
import uuid
from fastapi import FastAPI, UploadFile, File, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from app.models.schemas import EvaluationRequest, EvaluationResponse, Candidate
from app.services.evaluation_service import evaluate_candidate
import asyncio
app = FastAPI(title="AI Recruitment Engine")
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_methods=["*"],
allow_headers=["*"],
)
# In-memory storage for demonstration (Production should use DB)
evaluations_cache = {}
@app.post("/upload-csv")
async def upload_csv(file: UploadFile = File(...)):
if not file.filename.endswith('.csv'):
raise HTTPException(status_code=400, detail="Invalid file format. Please upload a CSV.")
try:
content = await file.read()
df = pd.read_csv(io.BytesIO(content))
df = df.fillna("")
candidates = []
for _, row in df.iterrows():
candidates.append(Candidate(
id=str(uuid.uuid4()),
name=str(row.get("name", "Unknown")),
email=str(row.get("email", "")),
skills=str(row.get("skills", "")),
experience=str(row.get("experience", "")),
projects=str(row.get("projects", "")),
education=str(row.get("education", "")),
resume_text=str(row.get("resume_text", ""))
))
return {"candidates": candidates}
except Exception as e:
raise HTTPException(status_code=500, detail=f"Error parsing CSV: {str(e)}")
@app.post("/evaluate", response_model=EvaluationResponse)
async def evaluate(request: EvaluationRequest):
if not request.jd:
raise HTTPException(status_code=400, detail="Job Description is required.")
if not request.candidates:
raise HTTPException(status_code=400, detail="No candidates provided.")
from app.services.evaluation_service import perform_hybrid_evaluation
response = await perform_hybrid_evaluation(request.jd, request.candidates)
# Store in cache for detail retrieval
for rank in response.shortlist:
evaluations_cache[rank.candidate_id] = rank
# Also store the deep review details
evaluations_cache.update(response.details)
return response
@app.get("/results")
async def get_results():
return list(evaluations_cache.values())
@app.get("/candidate/{id}")
async def get_candidate_report(id: str):
if id not in evaluations_cache:
raise HTTPException(status_code=404, detail="Candidate report not found.")
return evaluations_cache[id]
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
|