Charlotte-APY / src /api_server.py
Clemylia's picture
Create api_server.py
a7f250d verified
raw
history blame
2.25 kB
# 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}