from pydantic import BaseModel, Field, EmailStr from typing import List, Optional, Any, Dict, Union import datetime # 认证相关模型 class LoginRequest(BaseModel): username: str password: str class RoleInfo(BaseModel): role_id: int role_name: str class UserInfo(BaseModel): user_id: int username: str caption: str email: Optional[str] = None role_id: int role_name: str avatar_url: Optional[str] = None created_at: datetime.datetime class LoginResponse(BaseModel): token: str user: UserInfo class UserListResponse(BaseModel): users: List[UserInfo] total: int class CreateUserRequest(BaseModel): username: str password: Optional[str] = None caption: str email: Optional[str] = None avatar_url: Optional[str] = None role_id: int = 2 class UpdateUserRequest(BaseModel): username: Optional[str] = None caption: Optional[str] = None email: Optional[str] = None role_id: Optional[int] = None avatar_url: Optional[str] = None class UserLog(BaseModel): log_id: int user_id: int username: str action: str details: Optional[str] = None ip_address: Optional[str] = None created_at: datetime.datetime # 会议相关模型 class AttendeeInfo(BaseModel): user_id: Optional[int] = None username: Optional[str] = None caption: str class Tag(BaseModel): id: int name: str class TranscriptionTaskStatus(BaseModel): task_id: str status: str progress: int message: Optional[str] = None class Meeting(BaseModel): meeting_id: int title: str meeting_time: datetime.datetime description: Optional[str] = None creator_id: int creator_username: str creator_account: Optional[str] = None created_at: datetime.datetime attendees: List[AttendeeInfo] attendee_ids: Optional[List[int]] = None tags: List[Tag] audio_file_path: Optional[str] = None audio_duration: Optional[float] = None summary: Optional[str] = None transcription_status: Optional[TranscriptionTaskStatus] = None llm_status: Optional[TranscriptionTaskStatus] = None prompt_id: Optional[int] = None prompt_name: Optional[str] = None overall_status: Optional[str] = None overall_progress: Optional[int] = None current_stage: Optional[str] = None access_password: Optional[str] = None class TranscriptSegment(BaseModel): segment_id: int speaker_id: int speaker_tag: str start_time_ms: int end_time_ms: int text_content: str class CreateMeetingRequest(BaseModel): title: str meeting_time: datetime.datetime attendee_ids: List[int] description: Optional[str] = None tags: Optional[str] = None # 逗号分隔 prompt_id: Optional[int] = None class UpdateMeetingRequest(BaseModel): title: Optional[str] = None meeting_time: Optional[datetime.datetime] = None attendee_ids: Optional[List[int]] = None description: Optional[str] = None tags: Optional[str] = None summary: Optional[str] = None prompt_id: Optional[int] = None class SpeakerTagUpdateRequest(BaseModel): speaker_id: int new_tag: str class BatchSpeakerTagUpdateRequest(BaseModel): updates: List[SpeakerTagUpdateRequest] class TranscriptUpdateRequest(BaseModel): segment_id: int text_content: str class BatchTranscriptUpdateRequest(BaseModel): updates: List[TranscriptUpdateRequest] class PasswordChangeRequest(BaseModel): old_password: str new_password: str # 提示词模版模型 class PromptBase(BaseModel): name: str task_type: str # MEETING_TASK, KNOWLEDGE_TASK content: str desc: Optional[str] = None is_system: bool = False is_default: bool = False is_active: bool = True class PromptCreate(PromptBase): pass class PromptUpdate(BaseModel): name: Optional[str] = None task_type: Optional[str] = None content: Optional[str] = None desc: Optional[str] = None is_system: Optional[bool] = None is_default: Optional[bool] = None is_active: Optional[bool] = None class PromptInfo(PromptBase): id: int creator_id: Optional[int] = None created_at: datetime.datetime # 知识库相关模型 class KnowledgeBase(BaseModel): kb_id: int title: str content: str creator_id: int created_by_name: str is_shared: bool created_at: datetime.datetime updated_at: datetime.datetime source_meeting_count: int source_meetings: Optional[List[Meeting]] = None user_prompt: Optional[str] = None tags: Optional[List[str]] = None prompt_id: Optional[int] = None class KnowledgeBaseTask(BaseModel): task_id: str status: str progress: int message: Optional[str] = None result: Optional[str] = None class CreateKnowledgeBaseRequest(BaseModel): user_prompt: Optional[str] = None source_meeting_ids: str # 逗号分隔 is_shared: bool = False prompt_id: Optional[int] = None class UpdateKnowledgeBaseRequest(BaseModel): title: Optional[str] = None content: Optional[str] = None is_shared: Optional[bool] = None class KnowledgeBaseListResponse(BaseModel): kbs: List[KnowledgeBase] total: int # 客户端下载相关模型 class ClientDownload(BaseModel): id: int platform_code: str platform_type: str # mobile, desktop, terminal platform_name: str version: str version_code: int download_url: str file_size: Optional[int] = None release_notes: Optional[str] = None min_system_version: Optional[str] = None is_active: bool is_latest: bool created_at: datetime.datetime updated_at: datetime.datetime class CreateClientDownloadRequest(BaseModel): platform_code: str platform_type: Optional[str] = None platform_name: Optional[str] = None version: str version_code: int download_url: str file_size: Optional[int] = None release_notes: Optional[str] = None min_system_version: Optional[str] = None is_active: bool = True is_latest: bool = False class UpdateClientDownloadRequest(BaseModel): platform_code: Optional[str] = None platform_type: Optional[str] = None platform_name: Optional[str] = None version: Optional[str] = None version_code: Optional[int] = None download_url: Optional[str] = None file_size: Optional[int] = None release_notes: Optional[str] = None min_system_version: Optional[str] = None is_active: Optional[bool] = None is_latest: Optional[bool] = None class ClientDownloadListResponse(BaseModel): clients: List[ClientDownload] total: int # 声纹相关模型 class VoiceprintInfo(BaseModel): user_id: int voiceprint_data: Any created_at: datetime.datetime class VoiceprintStatus(BaseModel): has_voiceprint: bool updated_at: Optional[datetime.datetime] = None class VoiceprintTemplate(BaseModel): content: str duration_seconds: int sample_rate: int channels: int # 菜单权限相关模型 class MenuInfo(BaseModel): menu_id: int menu_code: str menu_name: str menu_icon: Optional[str] = None menu_url: Optional[str] = None menu_type: str # 'action', 'link', 'divider' parent_id: Optional[int] = None sort_order: int is_active: bool description: Optional[str] = None created_at: datetime.datetime updated_at: datetime.datetime class MenuListResponse(BaseModel): menus: List[MenuInfo] total: int class RolePermissionInfo(BaseModel): role_id: int role_name: str menu_ids: List[int] class UpdateRolePermissionsRequest(BaseModel): menu_ids: List[int] class CreateRoleRequest(BaseModel): role_name: str class UpdateRoleRequest(BaseModel): role_name: str class CreateMenuRequest(BaseModel): menu_code: str menu_name: str menu_icon: Optional[str] = None menu_url: Optional[str] = None menu_type: str = "link" parent_id: Optional[int] = None sort_order: int = 0 is_active: bool = True description: Optional[str] = None class UpdateMenuRequest(BaseModel): menu_code: Optional[str] = None menu_name: Optional[str] = None menu_icon: Optional[str] = None menu_url: Optional[str] = None menu_type: Optional[str] = None parent_id: Optional[int] = None sort_order: Optional[int] = None is_active: Optional[bool] = None description: Optional[str] = None class UserMcpInfo(BaseModel): id: int user_id: int bot_id: str bot_secret: str status: int last_used_at: Optional[datetime.datetime] = None created_at: datetime.datetime updated_at: datetime.datetime # 专用终端设备模型 class Terminal(BaseModel): id: int imei: str terminal_name: Optional[str] = None terminal_type: str terminal_type_name: Optional[str] = None description: Optional[str] = None status: int # 1: 启用, 0: 停用 is_activated: int # 1: 已激活, 0: 未激活 activated_at: Optional[datetime.datetime] = None firmware_version: Optional[str] = None last_online_at: Optional[datetime.datetime] = None ip_address: Optional[str] = None mac_address: Optional[str] = None created_at: datetime.datetime updated_at: datetime.datetime created_by: Optional[int] = None creator_username: Optional[str] = None current_user_id: Optional[int] = None current_username: Optional[str] = None current_user_caption: Optional[str] = None class CreateTerminalRequest(BaseModel): imei: str terminal_name: Optional[str] = None terminal_type: str description: Optional[str] = None firmware_version: Optional[str] = None mac_address: Optional[str] = None status: int = 1 class UpdateTerminalRequest(BaseModel): terminal_name: Optional[str] = None terminal_type: Optional[str] = None description: Optional[str] = None firmware_version: Optional[str] = None mac_address: Optional[str] = None status: Optional[int] = None