| | from pydantic import BaseModel, EmailStr, field_validator |
| | from typing import List, Optional, Dict, Any |
| | from datetime import datetime |
| |
|
| | |
| | class UserBase(BaseModel): |
| | email: EmailStr |
| |
|
| | class UserCreate(UserBase): |
| | password: str |
| |
|
| | class UserLogin(BaseModel): |
| | email: EmailStr |
| | password: str |
| |
|
| | class UserResponse(UserBase): |
| | id: int |
| | is_active: bool = True |
| |
|
| | class Config: |
| | from_attributes = True |
| |
|
| | class ForgotPasswordRequest(BaseModel): |
| | email: EmailStr |
| |
|
| | class VerifyOTPRequest(BaseModel): |
| | email: EmailStr |
| | otp: str |
| |
|
| | class ResetPasswordRequest(BaseModel): |
| | new_password: str |
| |
|
| | class ChangePasswordRequest(BaseModel): |
| | new_password: str |
| |
|
| | |
| | class Token(BaseModel): |
| | access_token: str |
| | token_type: str |
| |
|
| | class TokenData(BaseModel): |
| | email: Optional[str] = None |
| |
|
| | |
| | class SourceFileResponse(BaseModel): |
| | id: int |
| | filename: str |
| | s3_key: str |
| | public_url: str |
| | private_url: Optional[str] = None |
| | size: int |
| | created_at: datetime |
| | rag_id: Optional[int] = None |
| | azure_doc_id: Optional[str] = None |
| |
|
| | class Config: |
| | from_attributes = True |
| |
|
| | |
| | class PodcastGenerateRequest(BaseModel): |
| | user_prompt: str |
| | model: str = "gpt-4o" |
| | duration_minutes: int = 10 |
| | podcast_format: str = "deep dive" |
| | file_key: Optional[str] = None |
| | tts_model: str = "gemini-2.5-flash-preview-tts" |
| | spk1_voice: str = "Zephyr" |
| | spk2_voice: str = "Charon" |
| | bgm_choice: str = "No BGM" |
| | temperature: float = 1.0 |
| |
|
| | class PodcastResponse(BaseModel): |
| | id: int |
| | title: Optional[str] |
| | s3_key: Optional[str] |
| | s3_url: Optional[str] |
| | script: Optional[str] |
| | status: Optional[str] = "completed" |
| | error_message: Optional[str] |
| | parent_file_id: Optional[int] = None |
| | parent_file_key: Optional[str] = None |
| | created_at: datetime |
| |
|
| | class Config: |
| | from_attributes = True |
| |
|
| |
|
| | |
| | class FlashcardItem(BaseModel): |
| | question: str |
| | answer: str |
| |
|
| | class FlashcardGenerateRequest(BaseModel): |
| | file_key: Optional[str] = None |
| | text_input: Optional[str] = None |
| | difficulty: str = "medium" |
| | quantity: str = "standard" |
| | topic: Optional[str] = None |
| | language: str = "English" |
| |
|
| | class FlashcardResponse(BaseModel): |
| | id: int |
| | question: str |
| | answer: str |
| |
|
| | class Config: |
| | from_attributes = True |
| |
|
| | class FlashcardSetResponse(BaseModel): |
| | id: int |
| | title: Optional[str] |
| | difficulty: str |
| | status: Optional[str] = "completed" |
| | error_message: Optional[str] = None |
| | created_at: datetime |
| | parent_file_id: Optional[int] = None |
| | parent_file_key: Optional[str] = None |
| | flashcards: List[FlashcardResponse] = [] |
| |
|
| | class Config: |
| | from_attributes = True |
| |
|
| | |
| | class MindMapGenerateRequest(BaseModel): |
| | file_key: Optional[str] = None |
| | text_input: Optional[str] = None |
| | title: Optional[str] = None |
| |
|
| | class MindMapResponse(BaseModel): |
| | id: Optional[int] = None |
| | title: str |
| | mermaid_code: Optional[str] = None |
| | status: Optional[str] = "completed" |
| | error_message: Optional[str] = None |
| | parent_file_id: Optional[int] = None |
| | parent_file_key: Optional[str] = None |
| | created_at: Optional[datetime] = None |
| | message: Optional[str] = None |
| |
|
| | class Config: |
| | from_attributes = True |
| |
|
| | |
| | class QuizGenerateRequest(BaseModel): |
| | file_key: Optional[str] = None |
| | text_input: Optional[str] = None |
| | difficulty: str = "medium" |
| | topic: Optional[str] = None |
| | language: str = "English" |
| | count: str = "STANDARD" |
| |
|
| | class QuizChoice(BaseModel) : |
| | value: str |
| | label: str |
| |
|
| | class QuizQuestionResponse(BaseModel): |
| | id: int |
| | question: str |
| | hint: Optional[str] |
| | choices: List[QuizChoice] |
| | answer: str |
| | explanation: Optional[str] |
| |
|
| | @field_validator('choices', mode='before') |
| | @classmethod |
| | def validate_choices(cls, v): |
| | if isinstance(v, dict): |
| | |
| | return [{"value": key, "label": value} for key, value in v.items()] |
| | return v |
| |
|
| | class Config: |
| | from_attributes = True |
| |
|
| | class QuizSetResponse(BaseModel): |
| | id: int |
| | title: Optional[str] |
| | difficulty: str |
| | status: Optional[str] = "completed" |
| | error_message: Optional[str] = None |
| | created_at: datetime |
| | parent_file_id: Optional[int] = None |
| | parent_file_key: Optional[str] = None |
| | questions: List[QuizQuestionResponse] = [] |
| |
|
| | class Config: |
| | from_attributes = True |
| |
|
| | |
| | class ReportFormatSuggestion(BaseModel): |
| | name: str |
| | description: str |
| | prompt: str |
| |
|
| | class ReportFormatSuggestionResponse(BaseModel): |
| | suggestions: List[ReportFormatSuggestion] |
| |
|
| | class ReportGenerateRequest(BaseModel): |
| | file_key: Optional[str] = None |
| | text_input: Optional[str] = None |
| | format_key: str |
| | custom_prompt: Optional[str] = None |
| | language: str = "Japanese" |
| |
|
| | class ReportResponse(BaseModel): |
| | id: int |
| | title: str |
| | content: Optional[str] = None |
| | format_key: str |
| | status: Optional[str] = "completed" |
| | error_message: Optional[str] = None |
| | parent_file_id: Optional[int] = None |
| | parent_file_key: Optional[str] = None |
| | created_at: datetime |
| |
|
| | class Config: |
| | from_attributes = True |
| |
|
| | |
| | class VideoSummaryGenerateRequest(BaseModel): |
| | file_key: str |
| | language: str = "Japanese" |
| | voice_name: str = "Kore" |
| | use_slides_transformation: bool = True |
| | custom_prompt: Optional[str] = "" |
| |
|
| | class VideoSummaryResponse(BaseModel): |
| | id: int |
| | title: str |
| | s3_key: Optional[str] = None |
| | public_url: Optional[str] = None |
| | private_url: Optional[str] = None |
| | status: Optional[str] = "completed" |
| | error_message: Optional[str] = None |
| | parent_file_id: Optional[int] = None |
| | parent_file_key: Optional[str] = None |
| | created_at: datetime |
| |
|
| | class Config: |
| | from_attributes = True |
| |
|
| | |
| | class RAGDocumentUploadRequest(BaseModel): |
| | source_id: Optional[int] = None |
| |
|
| | class RAGSearchRequest(BaseModel): |
| | query: str |
| | top_k: int = 5 |
| |
|
| | class RAGDocumentResponse(BaseModel): |
| | id: int |
| | filename: str |
| | azure_doc_id: str |
| | blob_url: Optional[str] |
| | content_preview: Optional[str] |
| | chunk_count: int |
| | created_at: datetime |
| |
|
| | class Config: |
| | from_attributes = True |
| |
|
| | class RAGSearchResult(BaseModel): |
| | content: str |
| | score: float |
| | source: str |
| | metadata: Dict[str, Any] = {} |
| |
|
| | class RAGSearchResponse(BaseModel): |
| | results: List[RAGSearchResult] |
| | answer: Optional[str] = None |
| | |
| | class RAGQueryRequest(BaseModel): |
| | file_key: str |
| | query: str |
| | top_k: int = 3 |
| |
|
| | |
| | class ChatMessageCreate(BaseModel): |
| | query: str |
| | rag_doc_id: Optional[int] = None |
| |
|
| | class ChatMessageResponse(BaseModel): |
| | id: int |
| | role: str |
| | content: str |
| | rag_doc_id: Optional[int] |
| | created_at: datetime |
| |
|
| | class Config: |
| | from_attributes = True |
| |
|
| | |
| | class CanvasCreateRequest(BaseModel): |
| | file_key: Optional[str] = None |
| | text_input: Optional[str] = None |
| | title: Optional[str] = None |
| |
|
| | class CanvasEditRequest(BaseModel): |
| | text: str |
| |
|
| |
|
| | class CanvasResponse(BaseModel): |
| | id: int |
| | title: str |
| | text: Optional[str] |
| | status: str |
| | error_message: Optional[str] = None |
| | parent_file_id: Optional[int] = None |
| | parent_file_key: Optional[str] = None |
| | created_at: datetime |
| | updated_at: datetime |
| |
|
| | class Config: |
| | from_attributes = True |
| |
|