from pydantic import BaseModel, Field from typing import List, Optional, Dict, Any, Union class SkillDto(BaseModel): id: Optional[int] = None name: str class DomainDto(BaseModel): id: Optional[int] = None name: str class CareerDto(BaseModel): id: Optional[int] = None name: str class ExperienceDto(BaseModel): company: Optional[str] = None position: Optional[str] = None start_date: Optional[str] = None end_date: Optional[str] = None description: Optional[str] = None class EducationDto(BaseModel): school: Optional[str] = None degree: Optional[str] = None start_date: Optional[str] = None end_date: Optional[str] = None description: Optional[str] = None class MentorUpsertRequest(BaseModel): mentor_id: int full_name: Optional[str] = None bio: Optional[str] = None career: Optional[Union[CareerDto, Dict[str, Any], str]] = None skills: Optional[List[Union[SkillDto, Dict[str, Any], str]]] = None domains: Optional[List[Union[DomainDto, Dict[str, Any], str]]] = None experiences: Optional[List[Union[ExperienceDto, Dict[str, Any]]]] = None educations: Optional[List[Union[EducationDto, Dict[str, Any]]]] = None rating: Optional[float] = Field(None, ge=0.0, le=5.0) total_ratings: Optional[int] = Field(None, ge=0) session_count: Optional[int] = Field(None, ge=0) career_id: Optional[int] = None skill_ids: Optional[List[int]] = None domain_ids: Optional[List[int]] = None status: Optional[str] = "ACTIVATED" class MentorUpsertResponse(BaseModel): success: bool message: str mentor_id: int class RecommendationRequest(BaseModel): goals: Optional[str] = None skill_ids: Optional[List[int]] = None domain_ids: Optional[List[int]] = None mentor_domain_ids: Optional[List[int]] = None career_id: Optional[int] = None career_name: Optional[str] = None domain_names: Optional[List[str]] = None mentor_domain_names: Optional[List[str]] = None skill_names: Optional[List[str]] = None top_k: Optional[int] = Field(None, ge=1, le=100) final_count: Optional[int] = Field(None, ge=1, le=20) class RecommendedMentor(BaseModel): mentor_id: str score: float semantic_similarity: float reason: str metadata: Dict[str, Any] class RecommendationResponse(BaseModel): mentors: List[RecommendedMentor] count: int query_text: Optional[str] = None class HealthResponse(BaseModel): status: str embedding_model: Dict[str, Any] pinecone_index: Dict[str, Any] class BatchUpsertRequest(BaseModel): mentors: List[MentorUpsertRequest] class BatchUpsertResponse(BaseModel): success: bool message: str upserted_count: int failed_count: int