|
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) |
|
|
|
|
|
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)) |