jobwin-assistant / main.py
akestronai-ai
Allow Cover Letter generation with Job Application only and update UI
6d18a6c
Raw
History Blame Contribute Delete
3.6 kB
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)