Alina Lozowski
Migrating to the React project
e7abd9e
raw
history blame
3.99 kB
from fastapi import APIRouter, HTTPException, Depends
from typing import Dict, Any, List
import logging
from app.services.models import ModelService
from app.api.dependencies import get_model_service
from app.core.fastapi_cache import cached
from app.utils.logging import LogFormatter
logger = logging.getLogger(__name__)
router = APIRouter(tags=["models"])
@router.get("/status")
@cached(expire=300)
async def get_models_status(
model_service: ModelService = Depends(get_model_service)
) -> Dict[str, List[Dict[str, Any]]]:
"""Get all models grouped by status"""
try:
logger.info(LogFormatter.info("Fetching status for all models"))
result = await model_service.get_models()
stats = {
status: len(models) for status, models in result.items()
}
for line in LogFormatter.stats(stats, "Models by Status"):
logger.info(line)
return result
except Exception as e:
logger.error(LogFormatter.error("Failed to get models status", e))
raise HTTPException(status_code=500, detail=str(e))
@router.get("/pending")
@cached(expire=60)
async def get_pending_models(
model_service: ModelService = Depends(get_model_service)
) -> List[Dict[str, Any]]:
"""Get all models waiting for evaluation"""
try:
logger.info(LogFormatter.info("Fetching pending models"))
models = await model_service.get_models()
pending = models.get("pending", [])
logger.info(LogFormatter.success(f"Found {len(pending)} pending models"))
return pending
except Exception as e:
logger.error(LogFormatter.error("Failed to get pending models", e))
raise HTTPException(status_code=500, detail=str(e))
@router.post("/submit")
async def submit_model(
model_data: Dict[str, Any],
model_service: ModelService = Depends(get_model_service)
) -> Dict[str, Any]:
try:
logger.info(LogFormatter.section("MODEL SUBMISSION"))
user_id = model_data.pop('user_id', None)
if not user_id:
error_msg = "user_id is required"
logger.error(LogFormatter.error("Validation failed", error_msg))
raise ValueError(error_msg)
# Log submission details
submission_info = {
"Model_ID": model_data.get("model_id"),
"User": user_id,
"Base_Model": model_data.get("base_model"),
"Precision": model_data.get("precision"),
"Model_Type": model_data.get("model_type")
}
for line in LogFormatter.tree(submission_info, "Submission Details"):
logger.info(line)
result = await model_service.submit_model(model_data, user_id)
logger.info(LogFormatter.success("Model submitted successfully"))
return result
except ValueError as e:
logger.error(LogFormatter.error("Invalid submission data", e))
raise HTTPException(status_code=400, detail=str(e))
except Exception as e:
logger.error(LogFormatter.error("Submission failed", e))
raise HTTPException(status_code=500, detail=str(e))
@router.get("/{model_id}/status")
async def get_model_status(
model_id: str,
model_service: ModelService = Depends(get_model_service)
) -> Dict[str, Any]:
try:
logger.info(LogFormatter.info(f"Checking status for model: {model_id}"))
status = await model_service.get_model_status(model_id)
if status["status"] != "not_found":
logger.info(LogFormatter.success("Status found"))
for line in LogFormatter.tree(status, "Model Status"):
logger.info(line)
else:
logger.warning(LogFormatter.warning(f"No status found for model: {model_id}"))
return status
except Exception as e:
logger.error(LogFormatter.error("Failed to get model status", e))
raise HTTPException(status_code=500, detail=str(e))