Spaces:
Running
Running
| # 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 | |
| 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É --- | |
| 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} |