66 lines
1.8 KiB
Python
66 lines
1.8 KiB
Python
from sqlmodel import SQLModel, Field, Column
|
|
from sqlalchemy import Enum as SQLEnum, String
|
|
from datetime import datetime
|
|
from typing import Optional
|
|
from enum import Enum
|
|
|
|
|
|
class InterviewStatus(str, Enum):
|
|
CREATED = "created"
|
|
ACTIVE = "active"
|
|
COMPLETED = "completed"
|
|
FAILED = "failed"
|
|
|
|
def __str__(self):
|
|
return self.value
|
|
|
|
|
|
class InterviewSessionBase(SQLModel):
|
|
resume_id: int = Field(foreign_key="resume.id")
|
|
room_name: str = Field(max_length=255, unique=True)
|
|
status: str = Field(
|
|
default="created",
|
|
sa_column=Column(SQLEnum('created', 'active', 'completed', 'failed', name="interviewstatus"))
|
|
)
|
|
transcript: Optional[str] = None
|
|
ai_feedback: Optional[str] = None
|
|
# Добавляем отслеживание AI процесса
|
|
ai_agent_pid: Optional[int] = None
|
|
ai_agent_status: str = Field(default="not_started") # not_started, running, stopped, failed
|
|
|
|
|
|
class InterviewSession(InterviewSessionBase, table=True):
|
|
__tablename__ = "interview_sessions"
|
|
|
|
id: Optional[int] = Field(default=None, primary_key=True)
|
|
started_at: datetime = Field(default_factory=datetime.utcnow)
|
|
completed_at: Optional[datetime] = None
|
|
|
|
|
|
class InterviewSessionCreate(SQLModel):
|
|
resume_id: int
|
|
room_name: str
|
|
|
|
|
|
class InterviewSessionUpdate(SQLModel):
|
|
status: Optional[InterviewStatus] = None
|
|
completed_at: Optional[datetime] = None
|
|
transcript: Optional[str] = None
|
|
ai_feedback: Optional[str] = None
|
|
|
|
|
|
class InterviewSessionRead(InterviewSessionBase):
|
|
id: int
|
|
started_at: datetime
|
|
completed_at: Optional[datetime] = None
|
|
|
|
|
|
class InterviewValidationResponse(SQLModel):
|
|
can_interview: bool
|
|
message: str
|
|
|
|
|
|
class LiveKitTokenResponse(SQLModel):
|
|
token: str
|
|
room_name: str
|
|
server_url: str |