# generated by datamodel-codegen: # filename: kpi_report.json from __future__ import annotations from enum import StrEnum from pydantic import AwareDatetime, BaseModel, ConfigDict, Field, conint, constr class Window(BaseModel): model_config = ConfigDict( extra='forbid', ) from_: constr(pattern=r'^\d{4}-\d{2}-\d{2}$') | None = Field(..., alias='from') to: constr(pattern=r'^\d{4}-\d{2}-\d{2}$') | None days: conint(ge=0, le=9007199254740991) class Id(StrEnum): FORECAST_LOAD_MAPE = 'FORECAST_LOAD_MAPE' FORECAST_PV_NRMSE = 'FORECAST_PV_NRMSE' POTENTIAL_ACCURACY = 'POTENTIAL_ACCURACY' DECISION_LATENCY_P95_MS = 'DECISION_LATENCY_P95_MS' DISPATCH_SUCCESS_RATE = 'DISPATCH_SUCCESS_RATE' REVENUE_UPLIFT_VS_HUMAN = 'REVENUE_UPLIFT_VS_HUMAN' CROSS_REGION_MATCH = 'CROSS_REGION_MATCH' class Comparator(StrEnum): LTE = 'LTE' GTE = 'GTE' class Status(StrEnum): MEET = 'MEET' MISS = 'MISS' NO_DATA = 'NO_DATA' NOT_APPLICABLE = 'NOT_APPLICABLE' class Kpi(BaseModel): model_config = ConfigDict( extra='forbid', ) id: Id value: constr(pattern=r'^-?\d+(\.\d+)?$') | None unit: constr(min_length=1) target: constr(pattern=r'^-?\d+(\.\d+)?$') | None comparator: Comparator samples: conint(ge=0, le=9007199254740991) status: Status definition: constr(min_length=1) class Comparison(BaseModel): model_config = ConfigDict( extra='forbid', ) shadow_yuan: constr(pattern=r'^-?\d+(\.\d+)?$') human_yuan: constr(pattern=r'^-?\d+(\.\d+)?$') | None hindsight_yuan: constr(pattern=r'^-?\d+(\.\d+)?$') naive_yuan: constr(pattern=r'^-?\d+(\.\d+)?$') capture_ratio: constr(pattern=r'^-?\d+(\.\d+)?$') | None uplift_vs_naive: constr(pattern=r'^-?\d+(\.\d+)?$') | None days_with_human_baseline: conint(ge=0, le=9007199254740991) class Shadow(BaseModel): model_config = ConfigDict( extra='forbid', ) days: conint(ge=0, le=9007199254740991) complete_days: conint(ge=0, le=9007199254740991) consecutive_complete_days: conint(ge=0, le=9007199254740991) first_date: constr(pattern=r'^\d{4}-\d{2}-\d{2}$') | None last_date: constr(pattern=r'^\d{4}-\d{2}-\d{2}$') | None released_days: conint(ge=0, le=9007199254740991) pending_days: conint(ge=0, le=9007199254740991) widen_recommendations: conint(ge=0, le=9007199254740991) breaker_trips: conint(ge=0, le=9007199254740991) class KpiReport(BaseModel): model_config = ConfigDict( extra='forbid', ) id: constr(min_length=1) window: Window kpis: list[Kpi] comparison: Comparison shadow: Shadow generated_at: AwareDatetime