from pydantic import BaseModel, Field from typing import List, Optional, Dict class BMSDataPoint(BaseModel): """Single BMS data point.""" cycle_index: int voltage: float current: float temperature: float capacity: float timestamp: Optional[str] = None class BMSDataInput(BaseModel): """BMS data input for prediction.""" data: List[BMSDataPoint] initial_capacity: Optional[float] = None forecast_horizons: Optional[List[int]] = Field(default=[10, 50, 100]) class HealthPredictionResponse(BaseModel): """ML prediction response.""" current_soh: Dict[str, float] health_score: float remaining_life: Dict[str, float] degradation_rate: Dict[str, float] forecasts: Dict[str, Dict[str, float]] data_quality: Dict[str, float] current_cycle: int confidence: float model_info: Dict[str, str] class ModelInfoResponse(BaseModel): """Model information for Trust Engine proof.""" model_type: str training_data: str validation_data: str metrics: Dict[str, float] feature_count: int version: str class AssetCreate(BaseModel): """Model for creating a new asset.""" owner_id: str project_name: str asset_id: str location: str capacity: float bms_provider: Optional[str] = None category: List[str] = Field(default_factory=list) project_stage: str = "Pending" initial_prediction: Optional[Dict] = None # Initial prediction data class AssetResponse(BaseModel): """Asset response model.""" id: str owner_id: str projectName: str assetId: str location: str capacity: float bmsProvider: Optional[str] category: List[str] projectStage: str healthScore: Optional[float] remainingLife: Optional[float] degradationRate: Optional[float] confidence: Optional[float] stateOfCharge: Optional[float] voltage: Optional[float] temperature: Optional[float] isOnline: bool nftHash: Optional[str] nftMintDate: Optional[str] blockExplorerUrl: Optional[str] createdAt: Optional[str] updatedAt: Optional[str] lastUpdated: Optional[str] class FleetMetricsResponse(BaseModel): """Fleet metrics response.""" totalAssets: int avgHealth: float totalCapacity: float certifiedCount: int criticalCount: int avgRemainingLife: float