""" api/routes/models.py — /models REST endpoints (Cloud Registry Version). Provides global model discovery and metadata. """ from __future__ import annotations from typing import Annotated from fastapi import APIRouter, HTTPException, Query from models.model import Model from observability.logger import audit, get_logger from registry.registry import get_model, list_models log = get_logger("api.models") router = APIRouter(prefix="/models", tags=["models"]) @router.get("", response_model=list[Model]) async def index( search: Annotated[str | None, Query()] = None, task: Annotated[list[str] | None, Query()] = None, framework: Annotated[list[str] | None, Query()] = None, hardware: Annotated[list[str] | None, Query()] = None, source: Annotated[list[str] | None, Query()] = None, sort_by: Annotated[str, Query()] = "downloads", sort_dir: Annotated[str, Query()] = "desc", limit: Annotated[int, Query(ge=1, le=1000)] = 200, offset: Annotated[int, Query(ge=0)] = 0, ) -> list[Model]: """ List and search models in the global registry. """ models = await list_models( search=search, tasks=task, frameworks=framework, hardware=hardware, sources=source, sort_by=sort_by, sort_dir=sort_dir, limit=limit, offset=offset, ) await audit("api_list_models", payload={"count": len(models), "search": search}) return models @router.get("/{model_id}", response_model=Model) async def detail(model_id: str) -> Model: model = await get_model(model_id) if not model: raise HTTPException(status_code=404, detail=f"Model '{model_id}' not found") await audit("api_get_model", model_id=model_id) return model