from pydantic import BaseModel, Field from typing import List class StudentCreate(BaseModel): first_name: str = Field(..., min_length=1) age: int = Field(..., ge=8, le=12) grade: str class StudentRead(BaseModel): id: int first_name: str age: int grade: str class Config: from_attributes = True class UserRead(BaseModel): id: int username: str role: str student_id: int | None = None class Config: from_attributes = True class LoginRequest(BaseModel): username: str = Field(..., min_length=1) password: str = Field(..., min_length=1) class LoginResponse(BaseModel): access_token: str token_type: str = "bearer" user: UserRead class ChatRequest(BaseModel): student_id: int message: str class ChatResponse(BaseModel): reply: str should_speak: bool = True class TTSProfile(BaseModel): id: str label: str description: str class TTSProfilesResponse(BaseModel): profiles: List[TTSProfile] class TTSRequest(BaseModel): text: str = Field(..., min_length=1, max_length=4096) profile_id: str = Field(..., min_length=1) class SkillProgress(BaseModel): code: str subject: str label: str mastery_score: float confidence: float evidence_count: int class ProgressResponse(BaseModel): student: StudentRead progress: List[SkillProgress] class AssessmentQuestionResponse(BaseModel): skill_code: str skill_label: str question: str class AssessmentAnswerRequest(BaseModel): student_id: int skill_code: str answer: str class AssessmentAnswerResponse(BaseModel): correct: bool feedback: str mastery_score: float