File size: 1,793 Bytes
ac5551d
8302f42
 
ac5551d
 
 
 
 
8302f42
ac5551d
 
8302f42
ac5551d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8302f42
ac5551d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""
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