"""Todo Models""" from pydantic import BaseModel, Field from typing import List, Optional from datetime import datetime, date from enum import Enum class PriorityLevel(str, Enum): """우선순위""" HIGH = "HIGH" MEDIUM = "MEDIUM" LOW = "LOW" class TodoExtractRequest(BaseModel): """Todo 자동 추출 요청""" meeting_id: str = Field(..., description="회의 ID") transcript_text: str = Field(..., description="전체 회의록 텍스트") participants: List[str] = Field(..., description="참석자 목록") class Config: json_schema_extra = { "example": { "meeting_id": "550e8400-e29b-41d4-a716-446655440000", "transcript_text": "안건 1: 신제품 기획...\n결정사항: API 설계서는 박민수님이 1월 30일까지 작성...", "participants": ["김민준", "박서연", "이준호", "박민수"] } } class ExtractedTodo(BaseModel): """추출된 Todo""" title: str = Field(..., description="Todo 제목") description: Optional[str] = Field(None, description="상세 설명") assignee: str = Field(..., description="담당자 이름") due_date: Optional[date] = Field(None, description="마감일") priority: PriorityLevel = Field(default=PriorityLevel.MEDIUM, description="우선순위") section_reference: str = Field(..., description="섹션 참조 (예: '결정사항 #1')") confidence_score: float = Field(..., ge=0.0, le=1.0, description="신뢰도 점수") class Config: json_schema_extra = { "example": { "title": "API 설계서 작성", "description": "신규 프로젝트 API 설계서 작성 완료", "assignee": "박민수", "due_date": "2025-01-30", "priority": "HIGH", "section_reference": "결정사항 #1", "confidence_score": 0.92 } } class TodoExtractResponse(BaseModel): """Todo 자동 추출 응답""" meeting_id: str = Field(..., description="회의 ID") todos: List[ExtractedTodo] = Field(..., description="추출된 Todo 목록") total_count: int = Field(..., description="전체 Todo 개수") extracted_at: datetime = Field(default_factory=datetime.utcnow, description="추출 시각") class Config: json_schema_extra = { "example": { "meeting_id": "550e8400-e29b-41d4-a716-446655440000", "todos": [ { "title": "API 설계서 작성", "description": "신규 프로젝트 API 설계서 작성 완료", "assignee": "박민수", "due_date": "2025-01-30", "priority": "HIGH", "section_reference": "결정사항 #1", "confidence_score": 0.92 } ], "total_count": 5, "extracted_at": "2025-01-23T10:30:00Z" } }