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)}
        )