File size: 3,598 Bytes
f63f8f4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6d18a6c
f63f8f4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7747a42
 
 
 
 
 
f63f8f4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1e6a2c9
 
f63f8f4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
111
112
113
114
115
116
117
118
119
from fastapi import FastAPI, UploadFile, File, Form
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
from typing import List, Optional

# Internal imports
from ats.skill_extractor import extract_text_from_pdf, extract_skills
from ats.ats_score import calculate_ats_score
from cover_letter.generator import generate_cover_letter
from roadmap.roadmap_generator import generate_roadmap, generate_interview_questions
from agents.resume_agent import resume_agent
from agents.router_agent import router_agent
from agents.upwork_agent import generate_upwork_proposal
from agents.resume_tailor_agent import tailor_resume
from rag.qdrant_store import create_collection, store_document
import os
import shutil

app = FastAPI()

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"], # For development
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

class JDRequest(BaseModel):
    resume_text: Optional[str] = ""
    jd_text: str

class RoadmapRequest(BaseModel):
    missing_skills: List[str]

class UpworkRequest(BaseModel):
    resume_text: str
    jd_text: str
    hiring_rate: str
    payment_verified: bool
    other_notes: str

class ChatRequest(BaseModel):
    user_query: str
    resume_text: str
    jd_text: str
    missing_skills: List[str]

@app.post("/api/upload_resume")
async def upload_resume(file: UploadFile = File(...)):
    try:
        file_bytes = await file.read()
        text = extract_text_from_pdf(file_bytes)
        return {"text": text}
    except Exception as e:
        return {"error": str(e), "text": ""}

@app.post("/api/resume_analysis")
async def analyze_resume(req: JDRequest):
    analysis = resume_agent(req.resume_text)
    return {"analysis": analysis}

@app.post("/api/ats_analysis")
async def ats_analysis(req: JDRequest):
    resume_skills = extract_skills(req.resume_text, "resume")
    jd_skills = extract_skills(req.jd_text, "job description")
    result = calculate_ats_score(resume_skills, jd_skills, req.resume_text, req.jd_text)
    return {"result": result, "resume_skills": resume_skills}

@app.post("/api/cover_letter")
async def cover_letter(req: JDRequest):
    letter = generate_cover_letter(req.resume_text, req.jd_text)
    return {"cover_letter": letter}

@app.post("/api/interview_questions")
async def interview_questions(req: JDRequest):
    questions = generate_interview_questions(req.resume_text, req.jd_text)
    return {"questions": questions}

@app.post("/api/roadmap")
async def roadmap(req: RoadmapRequest):
    roadmap_text = generate_roadmap(req.missing_skills)
    return {"roadmap": roadmap_text}

@app.post("/api/upwork_proposal")
async def upwork_proposal(req: UpworkRequest):
    proposal = generate_upwork_proposal(
        req.resume_text, 
        req.jd_text, 
        req.hiring_rate, 
        req.payment_verified, 
        req.other_notes
    )
    return {"proposal": proposal}

@app.post("/api/tailor_resume")
async def api_tailor_resume(req: JDRequest):
    html_resume = tailor_resume(req.resume_text, req.jd_text)
    return {"html": html_resume}

@app.post("/api/chat")
async def chat(req: ChatRequest):
    create_collection()
    if req.resume_text:
        store_document(req.resume_text, {"type": "resume"})
    if req.jd_text:
        store_document(req.jd_text, {"type": "jd"})
    answer = router_agent(
        req.user_query,
        req.resume_text,
        req.jd_text,
        req.missing_skills
    )
    return {"answer": answer}

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)