Bambo TRAORE [SNT DRPS/PEX/SDN]
commited on
Commit
·
27b8e78
1
Parent(s):
7cc0285
fice
Browse files- .dockerignore +0 -0
- .gitignore +1 -1
- Dockerfile +16 -0
- README.md +1 -1
- app/__pycache__/main.cpython-313.pyc +0 -0
- app/src/base/__pycache__/__init__.cpython-313.pyc +0 -0
- app/src/base/__pycache__/application_service.cpython-313.pyc +0 -0
- app/src/base/__pycache__/base_ia_service.cpython-313.pyc +0 -0
- app/src/base/__pycache__/nvidia_api_service.cpython-313.pyc +0 -0
- app/src/base/application_service.py +13 -10
- app/src/base/base_ia_service.py +13 -0
- app/src/base/nvidia_api_service.py +2 -1
- app/src/models/__pycache__/__init__.cpython-313.pyc +0 -0
- app/src/models/__pycache__/schema.cpython-313.pyc +0 -0
- app/src/router/__pycache__/__init__.cpython-313.pyc +0 -0
- app/src/router/__pycache__/chat_router.cpython-313.pyc +0 -0
- app/src/router/chat_router.py +5 -0
- app/src/services/adminstrations/__pycache__/__init__.cpython-313.pyc +0 -0
- app/src/services/adminstrations/__pycache__/administration_service.cpython-313.pyc +0 -0
- app/src/services/adminstrations/administration_service.py +15 -4
- app/src/services/droitsociaux/__pycache__/__init__.cpython-313.pyc +0 -0
- app/src/services/droitsociaux/__pycache__/droitsociaux_service.cpython-313.pyc +0 -0
- app/src/services/droitsociaux/droitsociaux_service.py +12 -2
- app/src/services/education/__pycache__/__init__.cpython-313.pyc +0 -0
- app/src/services/education/__pycache__/education_service.cpython-313.pyc +0 -0
- app/src/services/education/education_service.py +13 -2
- app/src/services/emploi/__pycache__/__init__.cpython-313.pyc +0 -0
- app/src/services/emploi/__pycache__/emploi_service.cpython-313.pyc +0 -0
- app/src/services/emploi/emploi_service.py +12 -2
- app/src/services/logements/__pycache__/__init__.cpython-313.pyc +0 -0
- app/src/services/logements/__pycache__/logement_service.cpython-313.pyc +0 -0
- app/src/services/logements/logement_service.py +13 -3
- app/src/services/sante/__pycache__/__init__.cpython-313.pyc +0 -0
- app/src/services/sante/__pycache__/sante_service.cpython-313.pyc +0 -0
- app/src/services/sante/sante_service.py +12 -3
.dockerignore
ADDED
File without changes
|
.gitignore
CHANGED
@@ -1,2 +1,2 @@
|
|
1 |
-
venv
|
2 |
.env
|
|
|
1 |
+
venv/
|
2 |
.env
|
Dockerfile
CHANGED
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Read the doc: https://huggingface.co/docs/hub/spaces-sdks-docker
|
2 |
+
# you will also find guides on how best to write your Dockerfile
|
3 |
+
|
4 |
+
FROM python:3.9
|
5 |
+
|
6 |
+
RUN useradd -m -u 1000 user
|
7 |
+
USER user
|
8 |
+
ENV PATH="/home/user/.local/bin:$PATH"
|
9 |
+
|
10 |
+
WORKDIR /app
|
11 |
+
|
12 |
+
COPY --chown=user ./requirements.txt requirements.txt
|
13 |
+
RUN pip install --no-cache-dir --upgrade -r requirements.txt
|
14 |
+
|
15 |
+
COPY --chown=user . /app
|
16 |
+
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "7860"]
|
README.md
CHANGED
@@ -5,7 +5,7 @@
|
|
5 |
|
6 |
**API CHAT** FAST API est une application conçue pour fournir un chatbot rapide et efficace. Il est capable de sélectionner les informations les plus pertinentes à partir de vos données, vous permettant ainsi d'optimiser votre temps.
|
7 |
|
8 |
-
Ce projet est spécialement adapté pour analyser et répondre aux données relatives aux 6 domaines ****
|
9 |
|
10 |
Dans ce projet, nous utilisons le modèle **Llama 3,mistral** via la plateforme **Nvidia Build** : [Nvidia build](https://build.nvidia.com/explore/discover).
|
11 |
|
|
|
5 |
|
6 |
**API CHAT** FAST API est une application conçue pour fournir un chatbot rapide et efficace. Il est capable de sélectionner les informations les plus pertinentes à partir de vos données, vous permettant ainsi d'optimiser votre temps.
|
7 |
|
8 |
+
Ce projet est spécialement adapté pour analyser et répondre aux données relatives aux 6 domaines **** .
|
9 |
|
10 |
Dans ce projet, nous utilisons le modèle **Llama 3,mistral** via la plateforme **Nvidia Build** : [Nvidia build](https://build.nvidia.com/explore/discover).
|
11 |
|
app/__pycache__/main.cpython-313.pyc
ADDED
Binary file (1.2 kB). View file
|
|
app/src/base/__pycache__/__init__.cpython-313.pyc
ADDED
Binary file (204 Bytes). View file
|
|
app/src/base/__pycache__/application_service.cpython-313.pyc
ADDED
Binary file (2.29 kB). View file
|
|
app/src/base/__pycache__/base_ia_service.cpython-313.pyc
ADDED
Binary file (3.27 kB). View file
|
|
app/src/base/__pycache__/nvidia_api_service.cpython-313.pyc
ADDED
Binary file (1.37 kB). View file
|
|
app/src/base/application_service.py
CHANGED
@@ -11,25 +11,28 @@ import logging
|
|
11 |
logger = logging.getLogger(__name__)
|
12 |
|
13 |
class DomaineService:
|
14 |
-
|
15 |
-
|
16 |
-
domaine = request.domaine
|
17 |
-
if not domaine:
|
18 |
-
raise HTTPException(status_code=400, detail="Domaine non fourni")
|
19 |
-
|
20 |
-
domaine_map = {
|
21 |
-
"administrration": AdministrationService,
|
22 |
"droit": DroitSocialService,
|
23 |
"sante": SanteService,
|
24 |
"emploi": EmploiService,
|
25 |
"education": EducationService,
|
26 |
"logement": LogementService,
|
27 |
}
|
|
|
|
|
|
|
|
|
|
|
28 |
|
29 |
-
domaine_class = domaine_map.get(domaine)
|
30 |
if domaine_class:
|
31 |
logger.info(f"Domaine {domaine} trouvé")
|
32 |
return domaine_class()
|
33 |
else:
|
34 |
logger.warning(f"domaine {domaine} non trouvé")
|
35 |
-
return None
|
|
|
|
|
|
|
|
|
|
11 |
logger = logging.getLogger(__name__)
|
12 |
|
13 |
class DomaineService:
|
14 |
+
domaine_map = {
|
15 |
+
"administration": AdministrationService,
|
|
|
|
|
|
|
|
|
|
|
|
|
16 |
"droit": DroitSocialService,
|
17 |
"sante": SanteService,
|
18 |
"emploi": EmploiService,
|
19 |
"education": EducationService,
|
20 |
"logement": LogementService,
|
21 |
}
|
22 |
+
@staticmethod
|
23 |
+
async def get_domaines(request):
|
24 |
+
domaine = request.domaine
|
25 |
+
if not domaine:
|
26 |
+
raise HTTPException(status_code=400, detail="Domaine non fourni")
|
27 |
|
28 |
+
domaine_class = DomaineService.domaine_map.get(domaine)
|
29 |
if domaine_class:
|
30 |
logger.info(f"Domaine {domaine} trouvé")
|
31 |
return domaine_class()
|
32 |
else:
|
33 |
logger.warning(f"domaine {domaine} non trouvé")
|
34 |
+
return None
|
35 |
+
|
36 |
+
@staticmethod
|
37 |
+
def list_domaines():
|
38 |
+
return list(DomaineService.domaine_map.keys())
|
app/src/base/base_ia_service.py
CHANGED
@@ -1,6 +1,8 @@
|
|
1 |
from abc import ABC, abstractmethod
|
2 |
from .nvidia_api_service import OpenClientService
|
3 |
from fastapi import HTTPException
|
|
|
|
|
4 |
|
5 |
class BaseService(ABC):
|
6 |
def __init__(self):
|
@@ -43,3 +45,14 @@ class BaseService(ABC):
|
|
43 |
except Exception as e:
|
44 |
raise HTTPException(status_code=500, detail=f"Erreur lors de la génération : {e}")
|
45 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
from abc import ABC, abstractmethod
|
2 |
from .nvidia_api_service import OpenClientService
|
3 |
from fastapi import HTTPException
|
4 |
+
import datetime
|
5 |
+
|
6 |
|
7 |
class BaseService(ABC):
|
8 |
def __init__(self):
|
|
|
45 |
except Exception as e:
|
46 |
raise HTTPException(status_code=500, detail=f"Erreur lors de la génération : {e}")
|
47 |
|
48 |
+
@staticmethod
|
49 |
+
def get_salutation() -> str:
|
50 |
+
hour = datetime.datetime.now().hour
|
51 |
+
if hour < 12:
|
52 |
+
return "Bonjour"
|
53 |
+
elif hour < 18:
|
54 |
+
return "Bon après-midi"
|
55 |
+
else:
|
56 |
+
return "Bonsoir"
|
57 |
+
|
58 |
+
|
app/src/base/nvidia_api_service.py
CHANGED
@@ -9,7 +9,8 @@ class OpenClientService:
|
|
9 |
self.client = self._init_client()
|
10 |
|
11 |
def _init_client(self):
|
12 |
-
api_key
|
|
|
13 |
if not api_key:
|
14 |
raise ValueError("NVIDIA_API_KEY is not set in the environment variables.")
|
15 |
return OpenAI(
|
|
|
9 |
self.client = self._init_client()
|
10 |
|
11 |
def _init_client(self):
|
12 |
+
#api_key=os.getenv("NVIDIA_API_KEY")
|
13 |
+
api_key="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"
|
14 |
if not api_key:
|
15 |
raise ValueError("NVIDIA_API_KEY is not set in the environment variables.")
|
16 |
return OpenAI(
|
app/src/models/__pycache__/__init__.cpython-313.pyc
ADDED
Binary file (206 Bytes). View file
|
|
app/src/models/__pycache__/schema.cpython-313.pyc
ADDED
Binary file (831 Bytes). View file
|
|
app/src/router/__pycache__/__init__.cpython-313.pyc
ADDED
Binary file (206 Bytes). View file
|
|
app/src/router/__pycache__/chat_router.cpython-313.pyc
ADDED
Binary file (2.1 kB). View file
|
|
app/src/router/chat_router.py
CHANGED
@@ -15,6 +15,11 @@ logger = logging.getLogger(__name__)
|
|
15 |
|
16 |
router = APIRouter(prefix="/ia",tags=["CHATAPI"])
|
17 |
domaine_service = DomaineService()
|
|
|
|
|
|
|
|
|
|
|
18 |
@router.post("/chat")
|
19 |
async def chat(request: QuestionRequest):
|
20 |
logger.info(f"Chat request: {request}")
|
|
|
15 |
|
16 |
router = APIRouter(prefix="/ia",tags=["CHATAPI"])
|
17 |
domaine_service = DomaineService()
|
18 |
+
|
19 |
+
@router.get("/domaines")
|
20 |
+
def get_all_domaines():
|
21 |
+
return {"domaines": domaine_service.list_domaines()}
|
22 |
+
|
23 |
@router.post("/chat")
|
24 |
async def chat(request: QuestionRequest):
|
25 |
logger.info(f"Chat request: {request}")
|
app/src/services/adminstrations/__pycache__/__init__.cpython-313.pyc
ADDED
Binary file (223 Bytes). View file
|
|
app/src/services/adminstrations/__pycache__/administration_service.cpython-313.pyc
ADDED
Binary file (2.45 kB). View file
|
|
app/src/services/adminstrations/administration_service.py
CHANGED
@@ -8,9 +8,20 @@ class AdministrationService(BaseService):
|
|
8 |
|
9 |
def __init__(self):
|
10 |
super().__init__()
|
11 |
-
self.context =
|
12 |
-
|
13 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
14 |
async def handle_request(self, request):
|
15 |
"""
|
16 |
Gère la requête d'administration.
|
@@ -28,5 +39,5 @@ class AdministrationService(BaseService):
|
|
28 |
return {
|
29 |
"answer": response,
|
30 |
"historique": historique,
|
31 |
-
"domaine": "
|
32 |
}
|
|
|
8 |
|
9 |
def __init__(self):
|
10 |
super().__init__()
|
11 |
+
self.context = (
|
12 |
+
f"{self.get_salutation()}, vous êtes un assistant virtuel spécialisé dans l'administration en France. "
|
13 |
+
"Répondez toujours en français, sauf si l'utilisateur pose une question dans une autre langue. "
|
14 |
+
"Formatez toutes vos réponses en HTML simple, adapté à une intégration directe dans une interface web (via innerHTML). "
|
15 |
+
"Utilisez les balises suivantes : <p>, <strong>, <ul>, <li>, <a>. "
|
16 |
+
"Si vous mentionnez un lien (ex: www.exemple.com ou https://...), formatez-le automatiquement avec la balise <a> "
|
17 |
+
"et ajoutez l’attribut target='_blank'. "
|
18 |
+
"N'utilisez jamais les balises <html> ou <body>. "
|
19 |
+
"Soyez clair, professionnel et concis dans vos réponses. "
|
20 |
+
"Si l'utilisateur écrit simplement une salutation comme 'bonjour', 'salut' ou 'merci', "
|
21 |
+
"répondez avec une salutation adaptée à l'heure actuelle, sans générer d'information inutile."
|
22 |
+
)
|
23 |
+
|
24 |
+
|
25 |
async def handle_request(self, request):
|
26 |
"""
|
27 |
Gère la requête d'administration.
|
|
|
39 |
return {
|
40 |
"answer": response,
|
41 |
"historique": historique,
|
42 |
+
"domaine": "administration"
|
43 |
}
|
app/src/services/droitsociaux/__pycache__/__init__.cpython-313.pyc
ADDED
Binary file (221 Bytes). View file
|
|
app/src/services/droitsociaux/__pycache__/droitsociaux_service.cpython-313.pyc
ADDED
Binary file (2.43 kB). View file
|
|
app/src/services/droitsociaux/droitsociaux_service.py
CHANGED
@@ -8,8 +8,18 @@ class DroitSocialService(BaseService):
|
|
8 |
|
9 |
def __init__(self):
|
10 |
super().__init__()
|
11 |
-
self.context =
|
12 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
13 |
|
14 |
async def handle_request(self, request):
|
15 |
"""
|
|
|
8 |
|
9 |
def __init__(self):
|
10 |
super().__init__()
|
11 |
+
self.context = (
|
12 |
+
f"{self.get_salutation()}, vous êtes un assistant virtuel spécialisé dans les droits sociaux en France. "
|
13 |
+
"Répondez toujours en français, sauf si l'utilisateur pose une question dans une autre langue. "
|
14 |
+
"Formatez toutes vos réponses en HTML simple, adapté à une intégration directe dans une interface web (via innerHTML). "
|
15 |
+
"Utilisez les balises suivantes : <p>, <strong>, <ul>, <li>, <a>. "
|
16 |
+
"Si vous mentionnez un lien (ex: www.exemple.com ou https://...), formatez-le automatiquement avec la balise <a> "
|
17 |
+
"et ajoutez l’attribut target='_blank'. "
|
18 |
+
"N'utilisez jamais les balises <html> ou <body>. "
|
19 |
+
"Soyez clair, professionnel et concis dans vos réponses. "
|
20 |
+
"Si l'utilisateur écrit simplement une salutation comme 'bonjour', 'salut' ou 'merci', "
|
21 |
+
"répondez avec une salutation adaptée à l'heure actuelle, sans générer d'information inutile."
|
22 |
+
)
|
23 |
|
24 |
async def handle_request(self, request):
|
25 |
"""
|
app/src/services/education/__pycache__/__init__.cpython-313.pyc
ADDED
Binary file (218 Bytes). View file
|
|
app/src/services/education/__pycache__/education_service.cpython-313.pyc
ADDED
Binary file (2.41 kB). View file
|
|
app/src/services/education/education_service.py
CHANGED
@@ -9,8 +9,19 @@ class EducationService(BaseService):
|
|
9 |
|
10 |
def __init__(self):
|
11 |
super().__init__()
|
12 |
-
self.context =
|
13 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
14 |
async def handle_request(self, request):
|
15 |
"""
|
16 |
Gère la requête d'administration.
|
|
|
9 |
|
10 |
def __init__(self):
|
11 |
super().__init__()
|
12 |
+
self.context = (
|
13 |
+
f"{self.get_salutation()}, vous êtes un assistant virtuel spécialisé dans l'éducation en France. "
|
14 |
+
"Répondez toujours en français, sauf si l'utilisateur pose une question dans une autre langue. "
|
15 |
+
"Formatez toutes vos réponses en HTML simple, adapté à une intégration directe dans une interface web (via innerHTML). "
|
16 |
+
"Utilisez les balises suivantes : <p>, <strong>, <ul>, <li>, <a>. "
|
17 |
+
"Si vous mentionnez un lien (ex: www.exemple.com ou https://...), formatez-le automatiquement avec la balise <a> "
|
18 |
+
"et ajoutez l’attribut target='_blank'. "
|
19 |
+
"N'utilisez jamais les balises <html> ou <body>. "
|
20 |
+
"Soyez clair, professionnel et concis dans vos réponses. "
|
21 |
+
"Si l'utilisateur écrit simplement une salutation comme 'bonjour', 'salut' ou 'merci', "
|
22 |
+
"répondez avec une salutation adaptée à l'heure actuelle, sans générer d'information inutile."
|
23 |
+
)
|
24 |
+
|
25 |
async def handle_request(self, request):
|
26 |
"""
|
27 |
Gère la requête d'administration.
|
app/src/services/emploi/__pycache__/__init__.cpython-313.pyc
ADDED
Binary file (215 Bytes). View file
|
|
app/src/services/emploi/__pycache__/emploi_service.cpython-313.pyc
ADDED
Binary file (2.38 kB). View file
|
|
app/src/services/emploi/emploi_service.py
CHANGED
@@ -7,8 +7,18 @@ class EmploiService(BaseService):
|
|
7 |
|
8 |
def __init__(self):
|
9 |
super().__init__()
|
10 |
-
self.context =
|
11 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
12 |
|
13 |
async def handle_request(self, request):
|
14 |
"""
|
|
|
7 |
|
8 |
def __init__(self):
|
9 |
super().__init__()
|
10 |
+
self.context = (
|
11 |
+
f"{self.get_salutation()}, vous êtes un assistant virtuel spécialisé dans l'emploi en France. "
|
12 |
+
"Répondez toujours en français, sauf si l'utilisateur pose une question dans une autre langue. "
|
13 |
+
"Formatez toutes vos réponses en HTML simple, adapté à une intégration directe dans une interface web (via innerHTML). "
|
14 |
+
"Utilisez les balises suivantes : <p>, <strong>, <ul>, <li>, <a>. "
|
15 |
+
"Si vous mentionnez un lien (ex: www.exemple.com ou https://...), formatez-le automatiquement avec la balise <a> "
|
16 |
+
"et ajoutez l’attribut target='_blank'. "
|
17 |
+
"N'utilisez jamais les balises <html> ou <body>. "
|
18 |
+
"Soyez clair, professionnel et concis dans vos réponses. "
|
19 |
+
"Si l'utilisateur écrit simplement une salutation comme 'bonjour', 'salut' ou 'merci', "
|
20 |
+
"répondez avec une salutation adaptée à l'heure actuelle, sans générer d'information inutile."
|
21 |
+
)
|
22 |
|
23 |
async def handle_request(self, request):
|
24 |
"""
|
app/src/services/logements/__pycache__/__init__.cpython-313.pyc
ADDED
Binary file (218 Bytes). View file
|
|
app/src/services/logements/__pycache__/logement_service.cpython-313.pyc
ADDED
Binary file (2.4 kB). View file
|
|
app/src/services/logements/logement_service.py
CHANGED
@@ -7,9 +7,19 @@ class LogementService(BaseService):
|
|
7 |
|
8 |
def __init__(self):
|
9 |
super().__init__()
|
10 |
-
self.context =
|
11 |
-
|
12 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
13 |
async def handle_request(self, request):
|
14 |
"""
|
15 |
Gère la requête d'administration.
|
|
|
7 |
|
8 |
def __init__(self):
|
9 |
super().__init__()
|
10 |
+
self.context = (
|
11 |
+
f"{self.get_salutation()}, vous êtes un assistant virtuel spécialisé dans le logement en France. "
|
12 |
+
"Répondez toujours en français, sauf si l'utilisateur pose une question dans une autre langue. "
|
13 |
+
"Formatez toutes vos réponses en HTML simple, adapté à une intégration directe dans une interface web (via innerHTML). "
|
14 |
+
"Utilisez les balises suivantes : <p>, <strong>, <ul>, <li>, <a>. "
|
15 |
+
"Si vous mentionnez un lien (ex: www.exemple.com ou https://...), formatez-le automatiquement avec la balise <a> "
|
16 |
+
"et ajoutez l’attribut target='_blank'. "
|
17 |
+
"N'utilisez jamais les balises <html> ou <body>. "
|
18 |
+
"Soyez clair, professionnel et concis dans vos réponses. "
|
19 |
+
"Si l'utilisateur écrit simplement une salutation comme 'bonjour', 'salut' ou 'merci', "
|
20 |
+
"répondez avec une salutation adaptée à l'heure actuelle, sans générer d'information inutile."
|
21 |
+
)
|
22 |
+
|
23 |
async def handle_request(self, request):
|
24 |
"""
|
25 |
Gère la requête d'administration.
|
app/src/services/sante/__pycache__/__init__.cpython-313.pyc
ADDED
Binary file (214 Bytes). View file
|
|
app/src/services/sante/__pycache__/sante_service.cpython-313.pyc
ADDED
Binary file (2.38 kB). View file
|
|
app/src/services/sante/sante_service.py
CHANGED
@@ -8,9 +8,18 @@ class SanteService(BaseService):
|
|
8 |
|
9 |
def __init__(self):
|
10 |
super().__init__()
|
11 |
-
self.context =
|
12 |
-
|
13 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
14 |
async def handle_request(self, request):
|
15 |
"""
|
16 |
Gère la requête d'administration.
|
|
|
8 |
|
9 |
def __init__(self):
|
10 |
super().__init__()
|
11 |
+
self.context = (
|
12 |
+
f"{self.get_salutation()}, vous êtes un assistant virtuel spécialisé dans la santé en France. "
|
13 |
+
"Répondez toujours en français, sauf si l'utilisateur pose une question dans une autre langue. "
|
14 |
+
"Formatez toutes vos réponses en HTML simple, adapté à une intégration directe dans une interface web (via innerHTML). "
|
15 |
+
"Utilisez les balises suivantes : <p>, <strong>, <ul>, <li>, <a>. "
|
16 |
+
"Si vous mentionnez un lien (ex: www.exemple.com ou https://...), formatez-le automatiquement avec la balise <a> "
|
17 |
+
"et ajoutez l’attribut target='_blank'. "
|
18 |
+
"N'utilisez jamais les balises <html> ou <body>. "
|
19 |
+
"Soyez clair, professionnel et concis dans vos réponses. "
|
20 |
+
"Si l'utilisateur écrit simplement une salutation comme 'bonjour', 'salut' ou 'merci', "
|
21 |
+
"répondez avec une salutation adaptée à l'heure actuelle, sans générer d'information inutile."
|
22 |
+
)
|
23 |
async def handle_request(self, request):
|
24 |
"""
|
25 |
Gère la requête d'administration.
|