Spaces:
				
			
			
	
			
			
					
		Running
		
	
	
	
			
			
	
	
	
	
		
		
					
		Running
		
	| from fastapi import FastAPI, HTTPException | |
| from fastapi.staticfiles import StaticFiles | |
| from fastapi.middleware.cors import CORSMiddleware | |
| import os | |
| from dotenv import load_dotenv | |
| from huggingface_hub import hf_hub_download | |
| import json | |
| from datetime import datetime, timedelta | |
| import aiofiles | |
| import aiofiles.os | |
| # Load environment variables | |
| load_dotenv() | |
| # API configuration | |
| API_HOST = os.getenv("API_HOST", "0.0.0.0") | |
| API_PORT = int(os.getenv("API_PORT", "3002")) | |
| HUGGING_FACE_HUB_TOKEN = os.getenv("HUGGING_FACE_HUB_TOKEN") | |
| HUGGING_FACE_STORAGE_REPO = os.getenv("HUGGING_FACE_STORAGE_REPO") | |
| CACHE_DIR = "cache" | |
| CACHE_DURATION = timedelta(seconds=10) | |
| app = FastAPI() | |
| # Enable CORS | |
| app.add_middleware( | |
| CORSMiddleware, | |
| allow_origins=["*"], # En production, remplacer par les domaines autorisés | |
| allow_credentials=True, | |
| allow_methods=["*"], | |
| allow_headers=["*"], | |
| ) | |
| # Ensure cache directory exists | |
| os.makedirs(CACHE_DIR, exist_ok=True) | |
| async def get_cached_data(): | |
| cache_file = os.path.join(CACHE_DIR, "leaderboards_cache.json") | |
| cache_meta_file = os.path.join(CACHE_DIR, "cache_metadata.json") | |
| try: | |
| if await aiofiles.os.path.exists(cache_meta_file): | |
| async with aiofiles.open(cache_meta_file, 'r') as f: | |
| metadata = json.loads(await f.read()) | |
| cache_time = datetime.fromisoformat(metadata['timestamp']) | |
| if datetime.now() - cache_time < CACHE_DURATION: | |
| async with aiofiles.open(cache_file, 'r') as f: | |
| return json.loads(await f.read()) | |
| except Exception as e: | |
| print(f"Error reading cache: {e}") | |
| return None | |
| async def update_cache(data): | |
| try: | |
| async with aiofiles.open(os.path.join(CACHE_DIR, "leaderboards_cache.json"), 'w') as f: | |
| await f.write(json.dumps(data)) | |
| async with aiofiles.open(os.path.join(CACHE_DIR, "cache_metadata.json"), 'w') as f: | |
| await f.write(json.dumps({'timestamp': datetime.now().isoformat()})) | |
| except Exception as e: | |
| print(f"Error updating cache: {e}") | |
| async def get_leaderboards(): | |
| try: | |
| # Check cache first | |
| cached_data = await get_cached_data() | |
| if cached_data: | |
| return cached_data | |
| # If no cache or expired, download from HF | |
| file_path = hf_hub_download( | |
| repo_id=HUGGING_FACE_STORAGE_REPO, | |
| filename="final_leaderboards.json", | |
| token=HUGGING_FACE_HUB_TOKEN, | |
| repo_type="dataset" | |
| ) | |
| with open(file_path, 'r') as f: | |
| data = json.load(f) | |
| # Update cache | |
| await update_cache(data) | |
| return data | |
| except Exception as e: | |
| raise HTTPException(status_code=500, detail=f"Failed to fetch leaderboards: {str(e)}") | |
| # Mount static files for the React client | |
| app.mount("/", StaticFiles(directory="static", html=True), name="static") | |
| def start(): | |
| """Entry point for the Poetry script""" | |
| import uvicorn | |
| uvicorn.run("server:app", host=API_HOST, port=API_PORT, reload=True) | |
| if __name__ == "__main__": | |
| start() |