Clemylia commited on
Commit
a7f250d
·
verified ·
1 Parent(s): 805398b

Create api_server.py

Browse files
Files changed (1) hide show
  1. src/api_server.py +57 -0
src/api_server.py ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Fichier : api_server.py
2
+ from fastapi import FastAPI, Header, HTTPException, Body
3
+ from pydantic import BaseModel
4
+ from typing import Optional
5
+ import core_logic
6
+
7
+ # 1. Charger le modèle au démarrage du serveur API
8
+ core_logic.load_tiny_charlotte_server()
9
+
10
+ # 2. Initialisation de l'application FastAPI
11
+ app = FastAPI(
12
+ title="Charlotte-APY - Tiny-Charlotte Inference API",
13
+ version="1.0.0",
14
+ description="Endpoint pour interagir avec le modèle Tiny-Charlotte. Utiliser l'en-tête Authorization: Bearer <votre_clé>."
15
+ )
16
+
17
+ # 3. Schéma des données attendues pour l'inférence
18
+ class InferenceRequest(BaseModel):
19
+ prompt: str = Body(..., example="Comment puis-je retrouver de l'espoir après un échec ?")
20
+
21
+ # --- ENDPOINT PRINCIPAL D'INFÉRENCE ---
22
+
23
+ # Le chemin est `/v1/inference`, ce qui correspond à l'URL de votre Space
24
+ @app.post("/v1/inference")
25
+ async def inference_endpoint(
26
+ request: InferenceRequest,
27
+ # Utilise l'en-tête Authorization: Bearer <clé>
28
+ authorization: str = Header(..., description="Clé d'API (doit être au format 'Bearer <votre_clé>')")
29
+ ):
30
+ # 1. Extraction de la clé d'API
31
+ if not authorization.startswith("Bearer "):
32
+ raise HTTPException(
33
+ status_code=401,
34
+ detail="Unauthorized: Authorization header must start with 'Bearer '"
35
+ )
36
+ api_key = authorization.split(" ")[1] # Récupère la clé
37
+
38
+ # 2. Appel à la logique d'inférence partagée
39
+ response_data, status_code = core_logic.run_inference_api(api_key, request.prompt)
40
+
41
+ # 3. Traitement du résultat et renvoi de la réponse HTTP
42
+ if status_code == 200:
43
+ return response_data
44
+ elif status_code == 401:
45
+ raise HTTPException(status_code=401, detail=response_data['error'])
46
+ elif status_code == 429:
47
+ raise HTTPException(status_code=429, detail=response_data['error'])
48
+ else:
49
+ raise HTTPException(status_code=500, detail=response_data['error'])
50
+
51
+ # --- ENDPOINT DE VÉRIFICATION DE SANTÉ ---
52
+ @app.get("/health")
53
+ def health_check():
54
+ """Vérifie si le serveur est en ligne et le modèle chargé."""
55
+ if core_logic.MODEL is None:
56
+ return {"status": "unhealthy", "model_loaded": False}
57
+ return {"status": "ok", "model_loaded": True}