"""AVM v2 ensemble router — residential property valuation.""" from fastapi import APIRouter from app.models.avm_v2 import ( AVMv2ModelInfo, AVMv2PredictRequest, AVMv2PredictResponse, AVMv2TrainRequest, AVMv2TrainResponse, ) from app.services.avm_v2_service import avm_v2_service router = APIRouter(prefix="/avm/v2", tags=["AVM v2 Ensemble"]) @router.post("/predict", response_model=AVMv2PredictResponse) def predict_v2(req: AVMv2PredictRequest) -> AVMv2PredictResponse: """Predict residential property price using the multi-model ensemble. Ensemble: XGBoost (0.4) + LightGBM (0.35) + CatBoost (0.25). Falls back to heuristic when trained models are not available. """ return avm_v2_service.predict(req) @router.post("/train", response_model=AVMv2TrainResponse) def train_v2(req: AVMv2TrainRequest) -> AVMv2TrainResponse: """Trigger model retraining with Optuna hyperparameter optimization. Requires training data pipeline (Phase 3). Currently returns scaffold. """ return avm_v2_service.train(req) @router.get("/model-info", response_model=AVMv2ModelInfo) def model_info_v2() -> AVMv2ModelInfo: """Get current active ensemble model information.""" return avm_v2_service.get_model_info()