from uuid import UUID from typing import Any from pydantic import BaseModel, Field class ComponentScores(BaseModel): semantic: float = 0.0 skill: float = 0.0 yoe: float = 0.0 company: float = 0.0 growth: float = 0.0 education: float = 0.0 class GapItem(BaseModel): type: str detail: str mitigated_by_remote: bool | None = None class MatchedCandidate(BaseModel): candidate_id: UUID rank: int name: str | None = None email: str | None = None role_type: str | None = None engineer_type: str | None = None years_of_experience: float | None = None most_recent_company: str | None = None parsed_summary: str | None = None programming_languages: list[str] = [] growth_velocity: float = 0.5 stage1_score: float stage2_score: float | None = None final_score: float component_scores: ComponentScores gaps: list[GapItem] = [] class MatchResponse(BaseModel): jd_id: UUID jd_title: str jd_quality: dict[str, Any] = {} total_matched: int results: list[MatchedCandidate] weights_used: dict[str, float] = {} session_id: UUID | None = None class CandidateDetailResponse(BaseModel): jd_id: UUID candidate_id: UUID rank: int | None = None final_score: float component_scores: ComponentScores gaps: list[GapItem] = [] explanation: str | None = None candidate: dict[str, Any] = {} jd: dict[str, Any] = {} class ReRankRequest(BaseModel): weights: dict[str, float] = Field( default={ "semantic": 0.20, "skill": 0.35, "yoe": 0.15, "company": 0.10, "growth": 0.10, "education": 0.10, } )