97 lines
1.7 KiB
Python
97 lines
1.7 KiB
Python
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
|