File size: 3,621 Bytes
c2b649f
1ee78e5
c2b649f
 
5a067ab
 
c2b649f
297d58b
c2b649f
 
b85afa8
4462ccc
c2b649f
 
 
 
 
 
 
 
 
 
 
 
5a067ab
 
 
 
c2b649f
 
 
7202869
c2b649f
 
 
 
7202869
c2b649f
 
 
 
e7617a8
c2b649f
 
 
 
 
 
7202869
c2b649f
 
 
 
 
 
 
 
 
8e054a4
 
c2b649f
 
 
 
 
 
8e054a4
 
c2b649f
8e054a4
 
c2b649f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5a067ab
b85afa8
 
4f49d90
 
1ee78e5
b85afa8
4462ccc
f452678
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
from fastapi import FastAPI, HTTPException
from models import CVExtracted, EvaModul, JobAndCV, ClassificationResult, InsertedLink, EvalResult
import os
from io import BytesIO
# import extractor
import extractor_llm
from datetime import datetime
from pypdf import PdfReader
import requests
import classificator
import evaluator
import extractor_helper

os.environ['TRANSFORMERS_CACHE'] = '/transformers_cache'
os.environ['HF_HOME'] = '/transformers_cache'



app =  FastAPI()
@app.get("/", response_model=dict[str, str])
def getall():
    return {"hello":"world"}


# @app.post("/ext", response_model=CVExtracted)
# async def extract(text: InsertedText):
#     dictresult = extractor.predict(text.text)
#     return CVExtracted(**dictresult)


@app.post("/classify", response_model=ClassificationResult)
async def classify(body:JobAndCV):
    mininmal_start = 0
    maximal_end = 0
    positions = []
    userMajors = []
    yoe = 0
    if len(body.cv.experiences) > 0:
        mininmal_start = datetime.strptime(body.cv.experiences[0]['start'], "%Y-%m-%d").date() if body.cv.experiences[0].get('start') != None else datetime.today().date()
        maximal_end = datetime.strptime(body.cv.experiences[0]['end'], "%Y-%m-%d").date() if body.cv.experiences[0].get('end') != None else datetime.today().date()
        for exp in body.cv.experiences:
            positions.append(exp['position'])
            if exp.get('end') == None:
                exp['end'] = datetime.today().strftime("%Y-%m-%d")
            if datetime.strptime(exp['start'], "%Y-%m-%d").date() < mininmal_start:
                mininmal_start = datetime.strptime(exp['start'], "%Y-%m-%d").date()
            if datetime.strptime(exp['end'], "%Y-%m-%d").date() > maximal_end:
                maximal_end = datetime.strptime(exp['end'], "%Y-%m-%d").date()
        yoe = (maximal_end - mininmal_start).days//365  
    
    for edu in body.cv.educations:
        userMajors.append(edu['major'])
    
    cv = {
        "experiences": str(body.cv.experiences), 
        "positions": str(positions), 
        "userMajors": str(userMajors), 
        "skills": str(body.cv.skills), 
        "yoe": yoe,
        "location": str(body.cv.location)
    }
    job = {
        "jobDesc": body.job.jobDesc, 
        "role": body.job.role, 
        "majors": str(body.job.majors), 
        "skills": str(body.job.skills), 
        "minYoE": body.job.minYoE,
        "location": str(body.job.location)
    }
    weight = body.weight.dict()
    results = classificator.predict(cv, job, weight)
    return ClassificationResult(**results)

@app.post("/cv", response_model=CVExtracted)
async def extract(link: InsertedLink):
    response = requests.get(link.link)
    if response.status_code == 200:
        # Open the PDF from bytes in memory
        pdf_reader = PdfReader(BytesIO(response.content))
        number_of_pages = len(pdf_reader.pages)
        # Optionally, read text from the first page
        page = pdf_reader.pages[0]
        text = page.extract_text()
        for i in range(1, number_of_pages):
            text+= '\n' + pdf_reader.pages[i].extract_text()
    else:
        #return error, make 500 because file server error
        raise HTTPException(status_code=response.status_code, detail="File server error")

    dictresult = extractor_llm.predict(text)
    return dictresult



@app.post("/eval", response_model=EvalResult)
async def eval(eva: EvaModul):
    transcript = extractor_helper.extract_technical(eva.competences, eva.transcript)
    return evaluator.evaluate_interview(competences=eva.competences, transcript=transcript, lang=eva.lang)