Initial commit: AI Interview System
This commit is contained in:
100
backend/app/schemas.py
Normal file
100
backend/app/schemas.py
Normal file
@@ -0,0 +1,100 @@
|
||||
"""
|
||||
Pydantic 数据模型
|
||||
"""
|
||||
from typing import Optional, List, Any
|
||||
from pydantic import BaseModel, Field
|
||||
from datetime import datetime
|
||||
|
||||
|
||||
# ============ 通用响应 ============
|
||||
|
||||
class ApiResponse(BaseModel):
|
||||
"""统一 API 响应格式"""
|
||||
code: int = 0
|
||||
message: str = "success"
|
||||
data: Any = None
|
||||
|
||||
|
||||
# ============ 候选人相关 ============
|
||||
|
||||
class SubmitCandidateResponse(BaseModel):
|
||||
"""提交候选人信息响应"""
|
||||
sessionId: str
|
||||
fileId: str
|
||||
|
||||
|
||||
class CreateRoomRequest(BaseModel):
|
||||
"""创建房间请求"""
|
||||
sessionId: Optional[str] = None # 方案A:可选,由后端生成
|
||||
fileId: Optional[str] = None # 方案A:可选,由工作流收集
|
||||
|
||||
|
||||
class CreateRoomResponse(BaseModel):
|
||||
"""创建房间响应"""
|
||||
roomId: str
|
||||
token: str
|
||||
appId: str
|
||||
userId: str
|
||||
sessionId: Optional[str] = None # 返回给前端用于后续操作
|
||||
debugInfo: Optional[Any] = None # 调试信息(语音模式)
|
||||
|
||||
|
||||
class EndInterviewResponse(BaseModel):
|
||||
"""结束面试响应"""
|
||||
success: bool
|
||||
|
||||
|
||||
class ChatRequest(BaseModel):
|
||||
"""文本对话请求(模拟语音)"""
|
||||
sessionId: str
|
||||
message: str
|
||||
conversationId: Optional[str] = None
|
||||
|
||||
|
||||
class ChatResponse(BaseModel):
|
||||
"""文本对话响应"""
|
||||
reply: str
|
||||
conversationId: str
|
||||
debugInfo: Optional[Any] = None # 调试信息(节点状态、消息列表等)
|
||||
|
||||
|
||||
# ============ 管理后台相关 ============
|
||||
|
||||
class CandidateScores(BaseModel):
|
||||
"""候选人评分"""
|
||||
salesSkill: int = Field(0, ge=0, le=100)
|
||||
salesMindset: int = Field(0, ge=0, le=100)
|
||||
quality: int = Field(0, ge=0, le=100)
|
||||
motivation: int = Field(0, ge=0, le=100)
|
||||
total: float = Field(0, ge=0, le=100)
|
||||
|
||||
|
||||
class CandidateListItem(BaseModel):
|
||||
"""候选人列表项"""
|
||||
sessionId: str
|
||||
name: str
|
||||
status: str # pending, ongoing, completed
|
||||
score: Optional[float] = None
|
||||
createdAt: str
|
||||
|
||||
|
||||
class CandidateDetail(BaseModel):
|
||||
"""候选人详情"""
|
||||
sessionId: str
|
||||
name: str
|
||||
resume: Optional[str] = None
|
||||
status: str
|
||||
currentStage: int = 0
|
||||
scores: Optional[CandidateScores] = None
|
||||
analysis: Optional[str] = None
|
||||
interviewLog: Optional[str] = None
|
||||
createdAt: str
|
||||
completedAt: Optional[str] = None
|
||||
|
||||
|
||||
class CandidateListResponse(BaseModel):
|
||||
"""候选人列表响应"""
|
||||
list: List[CandidateListItem]
|
||||
total: int
|
||||
page: int
|
||||
pageSize: int
|
||||
Reference in New Issue
Block a user