from __future__ import annotations from typing import Any from pydantic import BaseModel, Field class StudyPathRequest(BaseModel): raw_text: str | None = None syllabus_text: str | None = None source_id: str | None = None source_ids: list[str] | None = None study_profile_id: str | None = None use_my_profile: bool = True topic: str | None = None subject: str | None = None exam: str | None = None goal: str | None = None time_left: str | None = None level: str | None = None language_preference: str | None = None class TimelineItem(BaseModel): order: int title: str duration_minutes: int reason: str reason_type: str task: str expected_output: str actions: list[str] = Field(default_factory=list) source_basis: str day_block: str | None = None class StudyPathResult(BaseModel): title: str exam: str | None subject: str | None topic: str | None goal: str | None time_left: str | None level: str | None plan_type: str = "standard" plan_label: str = "Study plan" plan_tip: str | None = None readiness_score: float next_best_action: str study_timeline: list[TimelineItem] = Field(default_factory=list) weak_areas: list[str] = Field(default_factory=list) easy_marks: list[str] = Field(default_factory=list) danger_areas: list[str] = Field(default_factory=list) revision_keywords: list[str] = Field(default_factory=list) source_basis: str = "generic_topic_template" trust_notes: list[str] = Field(default_factory=list) evidence_label: str | None = None analysis: dict[str, Any] = Field(default_factory=dict)