| """ |
| Pydantic schemas for NutriLoop AI request/response models. |
| """ |
| from datetime import date |
| from typing import Optional |
| from pydantic import BaseModel, Field |
|
|
|
|
| class PredictRequest(BaseModel): |
| """Request body for /predict endpoint.""" |
| restaurant_id: str = Field(..., description="Unique restaurant identifier") |
| item_name: str = Field(..., description="Menu item name") |
| city: str = Field(..., description="City name for news adjustment") |
| days: int = Field(default=7, ge=1, le=30, description="Forecast horizon in days") |
|
|
|
|
| class ColdStartRequest(BaseModel): |
| """Request body for /cold-start endpoint.""" |
| latitude: float = Field(..., description="Restaurant latitude") |
| longitude: float = Field(..., description="Restaurant longitude") |
| cuisine_type: str = Field(..., description="Type of cuisine") |
| avg_daily_quantity: float = Field(..., description="Average daily order quantity") |
| item_name: str = Field(..., description="Menu item to forecast") |
| city: str = Field(default="Unknown", description="City name for news adjustment") |
| days: int = Field(default=7, ge=1, le=30, description="Forecast horizon in days") |
|
|
|
|
| class PredictionPoint(BaseModel): |
| """Single day forecast point.""" |
| date: str |
| quantity: int |
| adjusted_quantity: int |
|
|
|
|
| class PredictResponse(BaseModel): |
| """Response body for /predict endpoint.""" |
| restaurant_id: str |
| item_name: str |
| predictions: list[PredictionPoint] |
| news_multiplier: float |
| model_mae: float |
| source: str = Field(..., description="'prophet' or 'cold_start'") |
|
|
|
|
| class HealthResponse(BaseModel): |
| """Response body for /health endpoint.""" |
| status: str |
| global_model_present: bool |
| cluster_model_present: bool |
| config_valid: bool |
| last_retrain: Optional[str] |
| version: str |