REFACTOR external service and improve websocket training

This commit is contained in:
Urtzi Alfaro
2025-10-09 14:11:02 +02:00
parent 7c72f83c51
commit 3c689b4f98
111 changed files with 13289 additions and 2374 deletions

View File

@@ -6,7 +6,7 @@ Forecasting Operations API - Business operations for forecast generation and pre
import structlog
from fastapi import APIRouter, Depends, HTTPException, status, Query, Path, Request
from typing import List, Dict, Any, Optional
from datetime import date, datetime
from datetime import date, datetime, timezone
import uuid
from app.services.forecasting_service import EnhancedForecastingService
@@ -50,6 +50,7 @@ async def generate_single_forecast(
request: ForecastRequest,
tenant_id: str = Path(..., description="Tenant ID"),
request_obj: Request = None,
current_user: dict = Depends(get_current_user_dep),
enhanced_forecasting_service: EnhancedForecastingService = Depends(get_enhanced_forecasting_service)
):
"""Generate a single product forecast"""
@@ -106,6 +107,7 @@ async def generate_multi_day_forecast(
request: ForecastRequest,
tenant_id: str = Path(..., description="Tenant ID"),
request_obj: Request = None,
current_user: dict = Depends(get_current_user_dep),
enhanced_forecasting_service: EnhancedForecastingService = Depends(get_enhanced_forecasting_service)
):
"""Generate multiple daily forecasts for the specified period"""
@@ -167,6 +169,7 @@ async def generate_batch_forecast(
request: BatchForecastRequest,
tenant_id: str = Path(..., description="Tenant ID"),
request_obj: Request = None,
current_user: dict = Depends(get_current_user_dep),
enhanced_forecasting_service: EnhancedForecastingService = Depends(get_enhanced_forecasting_service)
):
"""Generate forecasts for multiple products in batch"""
@@ -224,6 +227,7 @@ async def generate_realtime_prediction(
prediction_request: Dict[str, Any],
tenant_id: str = Path(..., description="Tenant ID"),
request_obj: Request = None,
current_user: dict = Depends(get_current_user_dep),
prediction_service: PredictionService = Depends(get_enhanced_prediction_service)
):
"""Generate real-time prediction"""
@@ -245,10 +249,12 @@ async def generate_realtime_prediction(
detail=f"Missing required fields: {missing_fields}"
)
prediction_result = await prediction_service.predict(
prediction_result = await prediction_service.predict_with_weather_forecast(
model_id=prediction_request["model_id"],
model_path=prediction_request.get("model_path", ""),
features=prediction_request["features"],
tenant_id=tenant_id,
days=prediction_request.get("days", 7),
confidence_level=prediction_request.get("confidence_level", 0.8)
)
@@ -257,15 +263,15 @@ async def generate_realtime_prediction(
logger.info("Real-time prediction generated successfully",
tenant_id=tenant_id,
prediction_value=prediction_result.get("prediction"))
days=len(prediction_result))
return {
"tenant_id": tenant_id,
"inventory_product_id": prediction_request["inventory_product_id"],
"model_id": prediction_request["model_id"],
"prediction": prediction_result.get("prediction"),
"confidence": prediction_result.get("confidence"),
"timestamp": datetime.utcnow().isoformat()
"predictions": prediction_result,
"days": len(prediction_result),
"timestamp": datetime.now(timezone.utc).isoformat()
}
except HTTPException:
@@ -295,6 +301,7 @@ async def generate_realtime_prediction(
async def generate_batch_predictions(
predictions_request: List[Dict[str, Any]],
tenant_id: str = Path(..., description="Tenant ID"),
current_user: dict = Depends(get_current_user_dep),
prediction_service: PredictionService = Depends(get_enhanced_prediction_service)
):
"""Generate batch predictions"""
@@ -304,16 +311,17 @@ async def generate_batch_predictions(
results = []
for pred_request in predictions_request:
try:
prediction_result = await prediction_service.predict(
prediction_result = await prediction_service.predict_with_weather_forecast(
model_id=pred_request["model_id"],
model_path=pred_request.get("model_path", ""),
features=pred_request["features"],
tenant_id=tenant_id,
days=pred_request.get("days", 7),
confidence_level=pred_request.get("confidence_level", 0.8)
)
results.append({
"inventory_product_id": pred_request.get("inventory_product_id"),
"prediction": prediction_result.get("prediction"),
"confidence": prediction_result.get("confidence"),
"predictions": prediction_result,
"success": True
})
except Exception as e:

View File

@@ -6,7 +6,7 @@ Business operations for "what-if" scenario testing and strategic planning
import structlog
from fastapi import APIRouter, Depends, HTTPException, status, Path, Request
from typing import List, Dict, Any
from datetime import date, datetime, timedelta
from datetime import date, datetime, timedelta, timezone
import uuid
from app.schemas.forecasts import (
@@ -65,7 +65,7 @@ async def simulate_scenario(
**PROFESSIONAL/ENTERPRISE ONLY**
"""
metrics = get_metrics_collector(request_obj)
start_time = datetime.utcnow()
start_time = datetime.now(timezone.utc)
try:
logger.info("Starting scenario simulation",
@@ -131,7 +131,7 @@ async def simulate_scenario(
)
# Calculate processing time
processing_time_ms = int((datetime.utcnow() - start_time).total_seconds() * 1000)
processing_time_ms = int((datetime.now(timezone.utc) - start_time).total_seconds() * 1000)
if metrics:
metrics.increment_counter("scenario_simulations_success_total")
@@ -160,7 +160,7 @@ async def simulate_scenario(
insights=insights,
recommendations=recommendations,
risk_level=risk_level,
created_at=datetime.utcnow(),
created_at=datetime.now(timezone.utc),
processing_time_ms=processing_time_ms
)