# 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 ." ) # 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 authorization: str = Header(..., description="Clé d'API (doit être au format 'Bearer ')") ): # 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}