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

View File

@@ -0,0 +1,83 @@
"""
候选人相关接口
"""
import time
import uuid
from fastapi import APIRouter, UploadFile, File, Form, HTTPException
from loguru import logger
from app.schemas import ApiResponse, SubmitCandidateResponse
from app.services.coze_service import coze_service
router = APIRouter()
def generate_session_id(name: str) -> str:
"""生成会话 ID"""
timestamp = int(time.time())
random_code = uuid.uuid4().hex[:6]
return f"SESS_{timestamp}_{name}_{random_code}"
@router.post("/candidates", response_model=ApiResponse)
async def submit_candidate(
name: str = Form(..., min_length=2, max_length=20, description="候选人姓名"),
resume: UploadFile = File(..., description="简历文件"),
):
"""
提交候选人信息(上传简历)
- 上传简历到 Coze
- 生成 session_id
- 返回 session_id 和 file_id
"""
try:
# 验证文件类型
allowed_types = [
"application/pdf",
"application/msword",
"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
]
if resume.content_type not in allowed_types:
raise HTTPException(
status_code=400,
detail="只支持 PDF、DOC、DOCX 格式的文件"
)
# 验证文件大小10MB
content = await resume.read()
if len(content) > 10 * 1024 * 1024:
raise HTTPException(
status_code=400,
detail="文件大小不能超过 10MB"
)
# 上传文件到 Coze
file_result = await coze_service.upload_file(content, resume.filename or "resume.pdf")
file_id = file_result.get("id")
if not file_id:
raise HTTPException(
status_code=500,
detail="文件上传失败"
)
# 生成 session_id
session_id = generate_session_id(name)
logger.info(f"Candidate submitted: name={name}, session_id={session_id}, file_id={file_id}")
return ApiResponse(
code=0,
message="success",
data=SubmitCandidateResponse(
sessionId=session_id,
fileId=file_id,
)
)
except HTTPException:
raise
except Exception as e:
logger.error(f"Submit candidate error: {e}")
raise HTTPException(status_code=500, detail=str(e))