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