Spaces:
No application file
No application file
File size: 3,733 Bytes
7e055ad 29191d3 7e055ad 29191d3 64dd40c 7e055ad 78db81b 9270913 7e055ad b9e2d5a 9270913 7e055ad 9270913 7e055ad 9270913 29191d3 7e055ad 29191d3 7e055ad 29191d3 7e055ad 29191d3 7e055ad 29191d3 |
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 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
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
@app.on_event("startup")
async def startup_event():
asyncio.create_task(initialize_data_engine())
@app.get("/health")
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}
@app.get("/", response_class=HTMLResponse)
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)
})
@app.post("/api/filter")
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)}
)
|