File size: 4,605 Bytes
56f192b | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | """
Pydantic models β exact mirrors of Phoebe iOS Swift DTOs.
Field names = snake_case matching CodingKeys from:
- APIModels.swift (HeadacheLogSnapshotDTO, DailySnapshotDTO)
- InsightPayloadDTO.swift (HealthKitMetricsDTO, WeatherDataDTO, UserContextDTO)
"""
from __future__ import annotations
from pydantic import BaseModel, Field
from typing import List, Optional
from enum import Enum
# ββ Enums ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
class MedicationResponseEnum(str, Enum):
horrible = "horrible"
worse = "worse"
same = "same"
better = "better"
excellent = "excellent"
# ββ Diary sub-payloads βββββββββββββββββββββββββββββββββββββββββββββββ
class SymptomsPayload(BaseModel):
symptoms: List[str] = []
class TriggersPayload(BaseModel):
triggers: List[str] = []
class MedicationPayload(BaseModel):
medication_taken: List[str] = []
class TherapeuticPayload(BaseModel):
therapeutic_activities: List[str] = []
# ββ HealthKit (from InsightPayloadDTO.swift) βββββββββββββββββββββββββ
class SleepAnalysisDTO(BaseModel):
total_duration_hours: Optional[float] = None
deep_sleep_minutes: Optional[float] = None
rem_sleep_minutes: Optional[float] = None
class HRVSummaryDTO(BaseModel):
average_ms: Optional[float] = None
class HealthKitMetricsDTO(BaseModel):
resting_heart_rate: Optional[float] = None
sleep_analysis: Optional[SleepAnalysisDTO] = None
hrv_summary: Optional[HRVSummaryDTO] = None
workout_minutes: Optional[int] = None
had_menstrual_flow: Optional[bool] = None
# ββ Weather (from InsightPayloadDTO.swift) βββββββββββββββββββββββββββ
class WeatherDataDTO(BaseModel):
barometric_pressure_mb: float = 1013.25
pressure_change_24h_mb: float = 0.0
humidity_percent: float = 50.0
temperature_celsius: float = 15.0
# ββ Headache log (from APIModels.swift) ββββββββββββββββββββββββββββββ
class HeadacheLogSnapshotDTO(BaseModel):
severity: int = 0
duration_hours: float = 0.0
symptoms: SymptomsPayload = Field(default_factory=SymptomsPayload)
triggers: TriggersPayload = Field(default_factory=TriggersPayload)
notes: Optional[str] = None
input_date: str = ""
input_time: Optional[str] = None
end_date: Optional[str] = None
end_time: Optional[str] = None
pain_frontal: bool = False
pain_temporal_left: bool = False
pain_temporal_right: bool = False
pain_occipital: bool = False
pain_parietal: bool = False
pain_ocular_left: bool = False
pain_ocular_right: bool = False
pain_sinus: bool = False
mood: Optional[str] = None
medication_taken: Optional[MedicationPayload] = None
medication_response: Optional[MedicationResponseEnum] = None
therapeutic_activities: Optional[TherapeuticPayload] = None
# ββ DailySnapshotDTO (top-level) ββββββββββββββββββββββββββββββββββββ
class DailySnapshotDTO(BaseModel):
headache_log: Optional[HeadacheLogSnapshotDTO] = None
health_kit_metrics: Optional[HealthKitMetricsDTO] = None
weather_data: Optional[WeatherDataDTO] = None
# ββ UserContextDTO ββββββββββββββββββββββββββββββββββββββββββββββββββ
class UserContextDTO(BaseModel):
age_range: Optional[str] = None
location_region: Optional[str] = None
# ββ API request / response ββββββββββββββββββββββββββββββββββββββββββ
class PredictionRequest(BaseModel):
user_context: Optional[UserContextDTO] = None
daily_snapshots: List[DailySnapshotDTO]
class DayPrediction(BaseModel):
day: int
date: Optional[str] = None
prediction: int
probability: float
risk_level: str
top_risk_factors: List[str] = []
class PredictionResponse(BaseModel):
predictions: List[DayPrediction]
model_version: str
threshold: float
# Legacy
class SinglePredictionRequest(BaseModel):
features: List[float]
class SinglePredictionResponse(BaseModel):
prediction: int
probability: float
|