""" 文件管理 Schema 文件上传/下载相关的请求/响应模型 """ from datetime import datetime from typing import List, Literal, Optional from pydantic import BaseModel, Field class FileMetadata(BaseModel): """ 文件元数据 描述已上传文件的详细信息 """ id: str = Field(..., description="文件唯一标识") filename: str = Field(..., description="原始文件名") content_type: Optional[str] = Field( default=None, description="MIME 类型,如 'audio/wav', 'audio/mp3'" ) size_bytes: int = Field( default=0, ge=0, description="文件大小(字节)" ) purpose: Optional[Literal["training", "reference", "output"]] = Field( default="training", description="文件用途:training(训练), reference(参考音频), output(输出模型)" ) duration_seconds: Optional[float] = Field( default=None, ge=0, description="音频时长(秒),仅音频文件有效" ) sample_rate: Optional[int] = Field( default=None, ge=0, description="采样率(Hz),仅音频文件有效" ) uploaded_at: datetime = Field(..., description="上传时间") model_config = { "json_schema_extra": { "examples": [ { "id": "550e8400-e29b-41d4-a716-446655440000", "filename": "my_voice.wav", "content_type": "audio/wav", "size_bytes": 15728640, "purpose": "training", "duration_seconds": 120.5, "sample_rate": 44100, "uploaded_at": "2024-01-01T10:00:00Z" } ] } } class FileUploadResponse(BaseModel): """ 文件上传响应 上传成功后返回文件信息 """ success: bool = Field(default=True, description="是否成功") message: str = Field(default="文件上传成功", description="响应消息") file: FileMetadata = Field(..., description="文件元数据") model_config = { "json_schema_extra": { "examples": [ { "success": True, "message": "文件上传成功", "file": { "id": "550e8400-e29b-41d4-a716-446655440000", "filename": "my_voice.wav", "content_type": "audio/wav", "size_bytes": 15728640, "purpose": "training", "uploaded_at": "2024-01-01T10:00:00Z" } } ] } } class FileListResponse(BaseModel): """ 文件列表响应 """ items: List[FileMetadata] = Field( default_factory=list, description="文件列表" ) total: int = Field( default=0, ge=0, description="总数量" ) limit: int = Field( default=50, ge=1, le=100, description="每页数量" ) offset: int = Field( default=0, ge=0, description="偏移量" ) model_config = { "json_schema_extra": { "examples": [ { "items": [ { "id": "file-123", "filename": "voice_1.wav", "content_type": "audio/wav", "size_bytes": 5242880, "purpose": "training", "uploaded_at": "2024-01-01T10:00:00Z" } ], "total": 1, "limit": 50, "offset": 0 } ] } } class FileDeleteResponse(BaseModel): """ 文件删除响应 """ success: bool = Field(default=True, description="是否成功") message: str = Field(default="文件删除成功", description="响应消息") file_id: str = Field(..., description="已删除的文件 ID") model_config = { "json_schema_extra": { "examples": [ { "success": True, "message": "文件删除成功", "file_id": "550e8400-e29b-41d4-a716-446655440000" } ] } }