78 lines
1.8 KiB
Python
78 lines
1.8 KiB
Python
from __future__ import annotations
|
|
from pydantic import BaseModel, Field
|
|
|
|
class TokenPair(BaseModel):
|
|
access_token: str
|
|
refresh_token: str
|
|
token_type: str = "bearer"
|
|
username: str
|
|
role: str
|
|
|
|
class LoginRequest(BaseModel):
|
|
username: str
|
|
password: str
|
|
|
|
class RefreshRequest(BaseModel):
|
|
refresh_token: str
|
|
|
|
class GraphPosition(BaseModel):
|
|
x: float
|
|
y: float
|
|
|
|
class CrossPackLink(BaseModel):
|
|
source_concept_id: str
|
|
target_pack_id: str
|
|
target_concept_id: str
|
|
relationship: str = "related"
|
|
|
|
class PackConcept(BaseModel):
|
|
id: str
|
|
title: str
|
|
prerequisites: list[str] = Field(default_factory=list)
|
|
masteryDimension: str = "mastery"
|
|
exerciseReward: str = ""
|
|
position: GraphPosition | None = None
|
|
cross_pack_links: list[CrossPackLink] = Field(default_factory=list)
|
|
|
|
class PackData(BaseModel):
|
|
id: str
|
|
title: str
|
|
subtitle: str = ""
|
|
level: str = "novice-friendly"
|
|
concepts: list[PackConcept] = Field(default_factory=list)
|
|
onboarding: dict = Field(default_factory=dict)
|
|
compliance: dict = Field(default_factory=dict)
|
|
|
|
class CreateLearnerRequest(BaseModel):
|
|
learner_id: str
|
|
display_name: str = ""
|
|
|
|
class MasteryRecord(BaseModel):
|
|
concept_id: str
|
|
dimension: str
|
|
score: float = 0.0
|
|
confidence: float = 0.0
|
|
evidence_count: int = 0
|
|
last_updated: str = ""
|
|
|
|
class EvidenceEvent(BaseModel):
|
|
concept_id: str
|
|
dimension: str
|
|
score: float
|
|
confidence_hint: float = 0.5
|
|
timestamp: str
|
|
kind: str = "exercise"
|
|
source_id: str = ""
|
|
|
|
class LearnerState(BaseModel):
|
|
learner_id: str
|
|
records: list[MasteryRecord] = Field(default_factory=list)
|
|
history: list[EvidenceEvent] = Field(default_factory=list)
|
|
|
|
class MediaRenderRequest(BaseModel):
|
|
learner_id: str
|
|
pack_id: str
|
|
format: str = "gif"
|
|
fps: int = 2
|
|
theme: str = "default"
|