visualize / app.py
wop's picture
Create app.py
3e03411 verified
raw
history blame contribute delete
3 kB
import os
import json
from fastapi import FastAPI, HTTPException
from fastapi.staticfiles import StaticFiles
from fastapi.middleware.cors import CORSMiddleware
from datasets import load_dataset
import uvicorn
app = FastAPI(title="Human Essence Emotional Flow Visualizer")
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
HF_TOKEN = os.getenv("HF_TOKEN")
DATASET_REPO = "wop/Human-Essence-Dataset"
def fetch_dataset(force=False):
download_mode = "force_redownload" if force else None
ds = load_dataset(DATASET_REPO, token=HF_TOKEN, split="train", download_mode=download_mode)
return ds.to_list()
print("Loading dataset from Hugging Face...")
try:
dataset = fetch_dataset()
print(f"Loaded {len(dataset)} entries successfully!")
except Exception as e:
print(f"Error loading dataset: {e}")
dataset = []
@app.post("/api/refresh")
def refresh_data():
global dataset
try:
dataset = fetch_dataset(force=True)
except Exception as e:
raise HTTPException(status_code=500, detail=f"Refresh failed: {e}")
print(f"Refreshed dataset: {len(dataset)} entries")
return {"ok": True, "total_entries": len(dataset)}
@app.get("/api/dataset")
def get_dataset(limit: int = 100, offset: int = 0):
"""Get dataset entries with pagination"""
total = len(dataset)
end_idx = min(offset + limit, total)
entries = dataset[offset:end_idx]
return {
"entries": entries,
"total": total,
"offset": offset,
"limit": limit
}
@app.get("/api/entry/{index}")
def get_entry(index: int):
"""Get a specific entry by index"""
if index < 0 or index >= len(dataset):
raise HTTPException(status_code=404, detail="Entry not found")
return dataset[index]
@app.get("/api/stats")
def get_stats():
"""Get dataset statistics"""
total_entries = len(dataset)
entries_with_text = sum(1 for e in dataset if e.get("text"))
entries_with_emotions = sum(1 for e in dataset if e.get("emotional_flow"))
# Count unique emotions
emotion_counts = {}
for entry in dataset:
for flow in entry.get("emotional_flow", []):
label = flow.get("label", "unknown")
emotion_counts[label] = emotion_counts.get(label, 0) + 1
return {
"total_entries": total_entries,
"entries_with_text": entries_with_text,
"entries_with_emotions": entries_with_emotions,
"emotion_distribution": emotion_counts
}
class NoCacheStaticFiles(StaticFiles):
async def get_response(self, path, scope):
response = await super().get_response(path, scope)
response.headers["Cache-Control"] = "no-cache, must-revalidate"
return response
app.mount("/", NoCacheStaticFiles(directory="static", html=True), name="static")
if __name__ == "__main__":
uvicorn.run("app:app", host="0.0.0.0", port=7860, reload=True)