Initial commit: AI Interview System

This commit is contained in:
111
2026-01-23 13:57:48 +08:00
commit 95770afe21
127 changed files with 24686 additions and 0 deletions

100
backend/app/schemas.py Normal file
View 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