File size: 4,448 Bytes
63b2074 e7abd9e 23c96f8 e7abd9e 58582d3 e7abd9e 58582d3 e7abd9e 58582d3 e7abd9e 58582d3 e7abd9e 58582d3 e7abd9e 58582d3 e7abd9e 58582d3 e7abd9e 58582d3 e7abd9e 58582d3 e7abd9e 58582d3 e7abd9e 58582d3 e7abd9e 58582d3 63b2074 58582d3 63b2074 58582d3 63b2074 58582d3 e7abd9e 58582d3 e7abd9e 58582d3 e7abd9e 58582d3 e7abd9e 58582d3 e7abd9e 58582d3 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
from fastapi import APIRouter, HTTPException, Depends, Query
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.core.formatting 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"),
}
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("/organization/{organization}/submissions")
async def get_organization_submissions(
organization: str,
days: int = Query(default=7, ge=1, le=30),
model_service: ModelService = Depends(get_model_service),
) -> List[Dict[str, Any]]:
"""Get all submissions from an organization in the last n days"""
try:
submissions = await model_service.get_organization_submissions(
organization, days
)
return submissions
except Exception as 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))
|