Spaces:
Sleeping
Sleeping
File size: 4,330 Bytes
ecb9f70 5b778b8 ecb9f70 | 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 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 | """Pydantic request/response schemas for the Bodhi API."""
from __future__ import annotations
from datetime import datetime
from typing import Literal
from pydantic import BaseModel, Field
# ββ Roles βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
class RoleCreate(BaseModel):
role_name: str
description: str = ""
focus_areas: str = ""
typical_topics: str = ""
class RoleUpdate(BaseModel):
description: str | None = None
focus_areas: str | None = None
typical_topics: str | None = None
class RoleResponse(BaseModel):
id: int
role_name: str
description: str
focus_areas: str
typical_topics: str
created_at: datetime
updated_at: datetime
model_config = {"from_attributes": True}
# ββ Companies βββββββββββββββββββββββββββββββββββββββββββββββββββββ
class CompanyProfileCreate(BaseModel):
company_name: str
role: str = "general"
experience_level: str = "Mid-Level"
description: str = ""
hiring_patterns: str = ""
tech_stack: str = ""
custom_metrics: list[str] = [] # e.g. ["GCP Mastery", "System Design Scalability"]
class CompanyProfileResponse(BaseModel):
id: int
company_name: str
role: str
experience_level: str
description: str | None
hiring_patterns: str | None
tech_stack: str | None
custom_metrics: list | None = []
contributed_by: str | None
updated_at: datetime
model_config = {"from_attributes": True}
# ββ Documents / RAG βββββββββββββββββββββββββββββββββββββββββββββββ
class IngestRequest(BaseModel):
company: str
role: str = "general"
text: str
source_label: str = ""
class IngestResponse(BaseModel):
chunks_ingested: int
class UploadResponse(BaseModel):
chunks_ingested: int
topics_extracted: list[str] = []
profile_extracted: dict | None = None
class SearchRequest(BaseModel):
company: str
role: str = "general"
query: str
top_k: int = 5
class SearchResult(BaseModel):
chunk_text: str
similarity: float
class ContextResponse(BaseModel):
company: str
role: str
context: str
class TopicsResponse(BaseModel):
company: str
role: str
topics: list[str]
# ββ Interviews ββββββββββββββββββββββββββββββββββββββββββββββββββββ
class InterviewStartRequest(BaseModel):
candidate_name: str = "Candidate"
company: str = "General"
role: str = "Software Engineer"
experience_level: str = "Mid-Level"
jd_text: str = "" # Optional job description text for curriculum customization
mode: Literal["standard", "option_a", "option_b", "mode_a", "mode_b"] = "standard"
user_id: str | None = None # required for option_a and option_b
interviewer_persona: Literal["bodhi", "riya"] = "bodhi"
quick_demo: bool = False # 1 Q + 1 followup per phase, full interview flow
class InterviewStartResponse(BaseModel):
session_id: str
greeting_text: str
greeting_audio_b64: str = ""
class InterviewPrepareResponse(BaseModel):
session_id: str
class MessageRequest(BaseModel):
text: str
class MessageResponse(BaseModel):
transcript: str = ""
reply_text: str
reply_audio_b64: str = ""
phase: str
should_end: bool = False
class SessionStateResponse(BaseModel):
session_id: str
phase: str
difficulty_level: int
phase_scores: dict
company: str
role: str
class SessionEndResponse(BaseModel):
session_id: str
summary: str
overall_score: float | None = None
# ββ Audio utilities βββββββββββββββββββββββββββββββββββββββββββββββ
class STTResponse(BaseModel):
transcript: str
class TTSRequest(BaseModel):
text: str
target_language_code: str = "hi-IN"
speaker: str = "shubh"
class TTSResponse(BaseModel):
audio_b64: str
|