File size: 3,038 Bytes
d0fda5a
 
 
 
 
 
 
5482546
 
d0fda5a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from datetime import datetime
from typing import List, Optional

from fastapi import APIRouter, Depends, HTTPException, status
from pydantic import BaseModel, Field
from sqlalchemy.orm import Session

from src.config.db import get_db
from src.models.ml import MLModel

router = APIRouter(tags=["Models"])


class MLModelOut(BaseModel):
    id: str = Field(..., description="Identifiant unique du modèle (UUID en chaîne).")
    name: str = Field(..., description="Nom court du modèle.")
    description: Optional[str] = Field(None, description="Description du modèle.")
    created_at: Optional[datetime] = Field(
        None, description="Date de création du modèle (UTC, ISO 8601)."
    )
    is_active: bool = Field(..., description="Modèle actif/inactif.")
    model_config = {"json_schema_extra": {
        "examples": [{
            "id": "5b1c7b3a-0000-4000-8000-000000000002",
            "name": "best_model",
            "description": "XGB v1",
            "created_at": "2025-09-15T10:11:03.950802+00:00",
            "is_active": True
        }]
    }}


@router.get(
    "/",
    response_model=List[MLModelOut],
    status_code=status.HTTP_200_OK,
    summary="Lister les modèles ML",
    description=(
        "Retourne la liste des modèles disponibles, triés du plus récent au plus ancien.\n\n"
        "**Remarques**\n"
        "- Les champs sont mappés depuis la table `ml_models`.\n"
    ),
    responses={
        200: {
            "description": "Liste des modèles.",
            "content": {
                "application/json": {
                    "example": [
                        {
                            "id": "5b1c7b3a-0000-4000-8000-000000000002",
                            "name": "best_model",
                            "description": "XGB v1",
                            "created_at": "2025-09-15T10:11:03.950802+00:00",
                            "is_active": True
                        },
                        {
                            "id": "5b1c7b3a-0000-4000-8000-000000000001",
                            "name": "baseline",
                            "description": "Baseline model",
                            "created_at": "2025-09-15T10:11:03.950802+00:00",
                            "is_active": True
                        }
                    ]
                }
            },
        },
        500: {"description": "Erreur serveur lors de la lecture des modèles."},
    },
)
def list_ml_models(db: Session = Depends(get_db)) -> List[MLModelOut]:
    try:
        rows = (
            db.query(MLModel)
              .order_by(MLModel.created_at.desc())
              .all()
        )
        return [
            MLModelOut(
                id=str(r.id),
                name=r.name,
                description=r.description,
                created_at=r.created_at,
                is_active=r.is_active,
            )
            for r in rows
        ]
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))