from __future__ import annotations from typing import Any from pydantic import BaseModel, Field class CoursePlanRequest(BaseModel): raw_request: str source_ids: list[str] | None = None source_context: str | None = None playlist_metadata: dict[str, Any] | None = None current_level: str | None = None weak_topics: list[str] | None = None class_level: str | None = None syllabus: str | None = None board: str | None = None semester: str | None = None degree: str | None = None goal: str | None = None time_available: str | None = None daily_study_time: str | None = None subject: str | None = None chapter: str | None = None topic: str | None = None exam_date: str | None = None class LessonOutput(BaseModel): title: str duration_minutes: int task: str reason_type: str source_basis: str expected_output: str = "" prerequisite_check: str = "" class ModuleOutput(BaseModel): title: str lessons: list[LessonOutput] = Field(default_factory=list) estimated_minutes: int = 0 source_basis: str = "catalog_seed" class QuizOutput(BaseModel): title: str question_count: int focus_areas: list[str] = Field(default_factory=list) class PracticeTaskOutput(BaseModel): title: str task_type: str description: str = "" source_basis: str = "generic" class RevisionCheckpointOutput(BaseModel): title: str focus_areas: list[str] = Field(default_factory=list) estimated_minutes: int = 15 class StudentContextOutput(BaseModel): class_level: str = "" syllabus: str = "" subject: str = "" chapter: str = "" exam_date: str = "" daily_study_time: str = "" goal: str = "" class ConceptExplanationOutput(BaseModel): title: str explanation: str board_exam_focus: str = "" class DerivationProblemStepOutput(BaseModel): title: str steps: list[str] = Field(default_factory=list) common_mistake: str = "" source_basis: str = "catalog_seed" class PracticeQuestionOutput(BaseModel): question: str marks: int = 2 answer_hint: str = "" question_type: str = "short_answer" class WeakTopicRepairOutput(BaseModel): topic: str symptom: str = "" repair_task: str = "" class RevisionPlanItemOutput(BaseModel): timing: str task: str purpose: str = "" estimated_minutes: int = 10 class CoursePlanResult(BaseModel): title: str learner_level: str subject_area: str source_basis: str modules: list[ModuleOutput] = Field(default_factory=list) lessons_total: int = 0 estimated_total_minutes: int = 0 prerequisites: list[str] = Field(default_factory=list) key_concepts: list[str] = Field(default_factory=list) practice_tasks: list[PracticeTaskOutput] = Field(default_factory=list) quizzes: list[QuizOutput] = Field(default_factory=list) revision_checkpoints: list[RevisionCheckpointOutput] = Field(default_factory=list) final_outcome: str = "" next_action: str = "" data_source_label: str = "Starter seed" confidence: float = 0.0 trust_notes: list[str] = Field(default_factory=list) student_context: StudentContextOutput = Field(default_factory=StudentContextOutput) lesson_outline: list[str] = Field(default_factory=list) prerequisite_check: list[str] = Field(default_factory=list) concept_explanation: ConceptExplanationOutput | None = None derivation_or_problem_steps: list[DerivationProblemStepOutput] = Field(default_factory=list) practice_questions: list[PracticeQuestionOutput] = Field(default_factory=list) pyq_style_questions: list[PracticeQuestionOutput] = Field(default_factory=list) weak_topic_repairs: list[WeakTopicRepairOutput] = Field(default_factory=list) revision_plan: list[RevisionPlanItemOutput] = Field(default_factory=list) estimated_study_time: str = "" class ExamCoachSessionRequest(BaseModel): class_level: str | None = None board: str | None = None university: str | None = None subject: str | None = None chapter: str | None = None topic: str | None = None exam_date: str | None = None daily_time: str = "1 hour" goal: str | None = None weak_topics: list[str] | None = None pyq_data: list[dict[str, Any]] | None = None source_ids: list[str] | None = None source_context: str | None = None class StudyBlockOutput(BaseModel): duration_label: str duration_minutes: int title: str tasks: list[str] = Field(default_factory=list) reason: str = "" class ExamCoachSessionResult(BaseModel): session_title: str exam_countdown: str time_budget: str today_mission: str study_blocks: list[StudyBlockOutput] = Field(default_factory=list) concept_teaching_task: dict[str, Any] = Field(default_factory=dict) visual_lesson_task: dict[str, Any] = Field(default_factory=dict) derivation_or_numerical_task: dict[str, Any] = Field(default_factory=dict) pyq_task: dict[str, Any] = Field(default_factory=dict) answer_writing_task: dict[str, Any] = Field(default_factory=dict) revision_task: dict[str, Any] = Field(default_factory=dict) quick_test: dict[str, Any] = Field(default_factory=dict) next_day_plan: dict[str, Any] = Field(default_factory=dict) data_source_label: str = "Starter seed" trust_notes: list[str] = Field(default_factory=list)