ishaq101's picture
[NOTICKET] Feat: Matching and Scoring
e4b8ed7
import time
from fastapi import APIRouter
from uuid import uuid4
# from externals.databases.pg_crud import get_all_cv_profiles, get_cv_profile_with_scores
from externals.databases.database import get_db
from services.agentic.agentic_setup import AgenticService
from services.knowledge.knowledge_setup import KnowledgeService
from services.models.data_model import (Criteria,
CriteriaWeight,
PayloadMatchOne,
ResponseMatchOne,
DataResponseMatchOne,
PayloadMatchBulk,
ResponseMatchBulk,
DataResponseMatchBulk)
from interfaces.api.deps import get_current_user
from fastapi import APIRouter, UploadFile, File, Depends, status, HTTPException
from externals.databases.pg_models import CVUser, CVFilter, CVWeight
from utils.logger import get_logger
logger = get_logger("agentic service")
router = APIRouter(
prefix="/agentic",
tags=["Agentic"],
)
@router.post("/create_filter")
async def create_filter(
filter: Criteria,
db=Depends(get_db),
current_user: CVUser = Depends(get_current_user),
):
try:
agentic_service = AgenticService(db=db,
user=current_user)
cv_filter = CVFilter(
criteria_id=uuid4(),
gpa_edu_1=filter.get("gpa_edu_1"),
gpa_edu_2=filter.get("gpa_edu_2"),
gpa_edu_3=filter.get("gpa_edu_3"),
univ_edu_1=filter.get("univ_edu_1"),
univ_edu_2=filter.get("univ_edu_2"),
univ_edu_3=filter.get("univ_edu_3"),
major_edu_1=filter.get("major_edu_1"),
major_edu_2=filter.get("major_edu_2"),
major_edu_3=filter.get("major_edu_3"),
domicile=filter.get("domicile"),
yoe=filter.get("yoe"),
hardskills=filter.get("hardskills"),
softskills=filter.get("softskills"),
certifications=filter.get("certifications"),
business_domain=filter.get("business_domain")
)
logger.info(f"cv_filter: {cv_filter}")
data = await agentic_service.filter.create_filter(filter=cv_filter)
return {
"status": "success",
"message": "Filter created successfully",
"criteria_id": data
}
except Exception as E:
logger.error(f"create filter error: {E}")
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=f"create filter error: {E}"
)
@router.get("/filter/{criteria_id}")
async def get_filter_by_id(
criteria_id: str,
db=Depends(get_db),
current_user: CVUser = Depends(get_current_user),
):
agentic_service = AgenticService(db=db,
user=current_user)
data = await agentic_service.filter.get_filter_by_id(criteria_id=criteria_id)
return data
@router.post("/create_weight")
async def create_weight(
criteria_id: str,
weight: CriteriaWeight,
db=Depends(get_db),
current_user: CVUser = Depends(get_current_user),
):
try:
agentic_service = AgenticService(db=db,
user=current_user)
cv_weight = CVWeight(
criteria_id=criteria_id,
weight_id=uuid4(),
gpa_edu_1=weight.get("gpa_edu_1"),
gpa_edu_2=weight.get("gpa_edu_2"),
gpa_edu_3=weight.get("gpa_edu_3"),
univ_edu_1=weight.get("univ_edu_1"),
univ_edu_2=weight.get("univ_edu_2"),
univ_edu_3=weight.get("univ_edu_3"),
major_edu_1=weight.get("major_edu_1"),
major_edu_2=weight.get("major_edu_2"),
major_edu_3=weight.get("major_edu_3"),
domicile=weight.get("domicile"),
yoe=weight.get("yoe"),
hardskills=weight.get("hardskills"),
softskills=weight.get("softskills"),
certifications=weight.get("certifications"),
business_domain=weight.get("business_domain")
)
data = await agentic_service.weight.create_weight(weight=cv_weight)
return {
"status": "success",
"message": "Weight created successfully",
"data": data
}
except Exception as E:
logger.error(f"create weight error: {E}")
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=f"create weight error: {E}"
)
@router.post("/calculate_score")
async def calculate_score(
weight_id: str,
db=Depends(get_db),
current_user: CVUser = Depends(get_current_user),
):
try:
agentic_service = AgenticService(db=db,
user=current_user)
data = await agentic_service.score.scoring(weight_id=weight_id)
return {
"status": "success",
"message": "Score calculated successfully",
"data": data
}
except Exception as E:
logger.error(f"calculate score error: {E}")
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=f"calculate score error: {E}"
)
# @router.get("/get_profile_table")
# async def get_profile_table(
# limit: int,
# ):
# data = await get_all_cv_profiles(limit)
# return data
# @router.get("/get_profile_table_and_score")
# async def get_profile_table_and_score(
# criteria_id: str,
# profile_id: str,
# ):
# data = await get_cv_profile_with_scores(
# criteria_id=criteria_id,
# profile_id=profile_id,
# )
# return data
# @router.post("/match_one")
# async def profile_matching_one(
# payload: PayloadMatchOne,
# ):
# """
# Generate profile matching score between one profile and one criteria.
# Returns:
# status: str
# message: str
# data: DataResponseExtractOne
# """
# _start = time.time()
# try:
# agentic = Agent()
# response = await agentic.scoring_profile(input_scoring=payload)
# print(f"response match one profile:", response)
# _end = time.time() - _start
# logger.info(f"API runtime profile scoring: {_end}s")
# return response
# except Exception as E:
# logger.error(f"profile scoring error, {E}")
# _end = time.time() - _start
# logger.info(f"API runtime profile scoring: {_end}s")
# return ResponseMatchOne(
# status="failed",
# message=f"profile scoring error, {E}",
# data=DataResponseMatchOne(
# profile_id=payload.get("profile_id"),
# criteria_id=payload.get("criteria").get("criteria_id"),
# score=0
# )
# )
# @router.post("/match_bulk")
# async def profile_matching_bulk(
# payload: PayloadMatchBulk,
# ):
# """
# Generate profile matching score between many profiles and one criteria.
# Returns:
# status: str
# message: str
# data: DataResponseExtractOne
# """
# _start = time.time()
# try:
# agentic = Agent()
# response = await agentic.scoring_profile(input_scoring=payload)
# print(f"response match one profile:", response)
# _end = time.time() - _start
# logger.info(f"API runtime profile scoring: {_end}s")
# return response
# except Exception as E:
# logger.error(f"profile scoring error, {E}")
# _end = time.time() - _start
# logger.info(f"API runtime profile scoring: {_end}s")
# return ResponseMatchBulk(
# status="failed",
# message=f"profile scoring error, {E}",
# data=DataResponseMatchBulk(
# profile_id=payload.get("profile_id"),
# criteria_id=payload.get("criteria").get("criteria_id"),
# score=0
# )
# )