File size: 2,247 Bytes
a7f250d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# Fichier : api_server.py
from fastapi import FastAPI, Header, HTTPException, Body
from pydantic import BaseModel
from typing import Optional
import core_logic

# 1. Charger le modèle au démarrage du serveur API
core_logic.load_tiny_charlotte_server()

# 2. Initialisation de l'application FastAPI
app = FastAPI(
    title="Charlotte-APY - Tiny-Charlotte Inference API",
    version="1.0.0",
    description="Endpoint pour interagir avec le modèle Tiny-Charlotte. Utiliser l'en-tête Authorization: Bearer <votre_clé>."
)

# 3. Schéma des données attendues pour l'inférence
class InferenceRequest(BaseModel):
    prompt: str = Body(..., example="Comment puis-je retrouver de l'espoir après un échec ?")
    
# --- ENDPOINT PRINCIPAL D'INFÉRENCE ---

# Le chemin est `/v1/inference`, ce qui correspond à l'URL de votre Space
@app.post("/v1/inference")
async def inference_endpoint(
    request: InferenceRequest,
    # Utilise l'en-tête Authorization: Bearer <clé>
    authorization: str = Header(..., description="Clé d'API (doit être au format 'Bearer <votre_clé>')")
):
    # 1. Extraction de la clé d'API
    if not authorization.startswith("Bearer "):
        raise HTTPException(
            status_code=401, 
            detail="Unauthorized: Authorization header must start with 'Bearer '"
        )
    api_key = authorization.split(" ")[1] # Récupère la clé

    # 2. Appel à la logique d'inférence partagée
    response_data, status_code = core_logic.run_inference_api(api_key, request.prompt)
    
    # 3. Traitement du résultat et renvoi de la réponse HTTP
    if status_code == 200:
        return response_data
    elif status_code == 401:
        raise HTTPException(status_code=401, detail=response_data['error'])
    elif status_code == 429:
        raise HTTPException(status_code=429, detail=response_data['error'])
    else:
        raise HTTPException(status_code=500, detail=response_data['error'])

# --- ENDPOINT DE VÉRIFICATION DE SANTÉ ---
@app.get("/health")
def health_check():
    """Vérifie si le serveur est en ligne et le modèle chargé."""
    if core_logic.MODEL is None:
        return {"status": "unhealthy", "model_loaded": False}
    return {"status": "ok", "model_loaded": True}