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