Spaces:
No application file
No application file
from fastapi import FastAPI, Request | |
from fastapi.templating import Jinja2Templates | |
from fastapi.staticfiles import StaticFiles | |
from fastapi.responses import HTMLResponse, JSONResponse | |
import pandas as pd | |
from pathlib import Path | |
import asyncio | |
import time | |
from app.backend.constant import Navigation, ModelProvider, EvaluationMetric, EmbdDtype, EmbdDim, Similarity | |
from app.backend.data_engine import DataEngine | |
# 创建 FastAPI 应用 | |
app = FastAPI() | |
# 获取项目根目录 | |
BASE_DIR = Path(__file__).resolve().parent | |
# 挂载静态文件 | |
app.mount("/static", StaticFiles(directory=str(BASE_DIR / "app" / "static")), name="static") | |
# 设置模板 | |
templates = Jinja2Templates(directory=str(BASE_DIR / "app" / "templates")) | |
# 初始化数据引擎 | |
data_engine = None | |
initialization_start_time = None | |
async def initialize_data_engine(): | |
global data_engine, initialization_start_time | |
if data_engine is None and initialization_start_time is None: | |
initialization_start_time = time.time() | |
try: | |
data_engine = DataEngine() | |
print("Successfully initialized DataEngine") | |
except Exception as e: | |
print(f"Error initializing DataEngine: {str(e)}") | |
finally: | |
initialization_start_time = None | |
async def startup_event(): | |
asyncio.create_task(initialize_data_engine()) | |
async def health(): | |
if data_engine is not None: | |
return {"status": "healthy", "initialized": True} | |
elif initialization_start_time is not None: | |
return {"status": "initializing", "initialized": False, "elapsed_time": time.time() - initialization_start_time} | |
else: | |
return {"status": "not_initialized", "initialized": False} | |
async def home(request: Request, tab: str = "text"): | |
if data_engine is None: | |
return templates.TemplateResponse("loading.html", {"request": request}) | |
try: | |
# Get initial data based on tab | |
if tab == "multimodal": | |
data = data_engine.get_filtered_data(navigation="multimodal") | |
else: | |
data = data_engine.get_data() | |
# Convert data to list for template rendering | |
data_list = data.values.tolist() | |
columns = data.columns.tolist() | |
return templates.TemplateResponse("index.html", { | |
"request": request, | |
"active_tab": tab, | |
"data": data_list, | |
"columns": columns, | |
"navigations": [e.value for e in Navigation], | |
"embd_types": [e.value for e in EmbdDtype], | |
"embd_dims": [e.value for e in EmbdDim], | |
"similarities": [e.value for e in Similarity] | |
}) | |
except Exception as e: | |
print(f"Error in home route: {str(e)}") | |
return templates.TemplateResponse("error.html", { | |
"request": request, | |
"error": str(e) | |
}) | |
async def filter_data(filters: dict): | |
if data_engine is None: | |
return JSONResponse( | |
status_code=503, | |
content={"error": "Service is still initializing"} | |
) | |
try: | |
# Apply filters to data | |
data = data_engine.get_filtered_data( | |
navigation=filters.get('navigation'), | |
embd_type=filters.get('embd_type'), | |
embd_dims=filters.get('embd_dims'), | |
similarity=filters.get('similarity') | |
) | |
# Convert to list for JSON response | |
return data.values.tolist() | |
except Exception as e: | |
print(f"Error in filter route: {str(e)}") | |
return JSONResponse( | |
status_code=500, | |
content={"error": str(e)} | |
) | |