LiveHouse-TS / cloud /web.py
ziyuzhou02's picture
Deploy GitHub main a3d79b5cbaf5
a9c5d6e verified
Raw
History Blame Contribute Delete
3.12 kB
"""Public UI and credential-free health report; operator files are not served."""
from __future__ import annotations
import json
from datetime import datetime, timezone
from pathlib import Path
import sys
import time
ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT))
def health_report(root: Path = ROOT):
def read(path):
try:
return json.loads((root / path).read_text())
except (OSError, ValueError):
return {}
supervisor = read(".cloud-state/supervisor.json")
checkpoint = read(".cloud-state/checkpoint.json")
status = read("space/results/online_status.json")
publication = read("space/results/publication_status.json") or status
if status.get("push_status") == "failed":
publication = status
stamp = checkpoint.get("checkpointed_at")
def age_seconds(stamp):
try:
return (datetime.now(timezone.utc) - datetime.fromisoformat(stamp)).total_seconds()
except (ValueError, TypeError):
return None
age = age_seconds(stamp)
push_age = age_seconds(publication.get("pushed_at"))
failures = status.get("failed_forecasts", [])
model_failures = sum(item.get("model") != "*" for item in failures)
healthy = bool(supervisor.get("worker_running") and supervisor.get("evaluator_enabled")
and 0 <= time.time() - supervisor.get("updated_at", 0) < 90
and age is not None and 0 <= age < 3600
and status.get("aggregate_status") == "ok" and publication.get("push_status") == "ok"
and push_age is not None and 0 <= push_age < 3600 and model_failures == 0)
return {"ok": healthy, "source_revision": supervisor.get("source_revision"),
"evaluator_enabled": supervisor.get("evaluator_enabled", False),
"worker_running": supervisor.get("worker_running", False),
"checkpointed_at": stamp, "checkpoint_age_seconds": age,
"last_evaluation_at": status.get("finished_at"),
"evaluation_status": status.get("status"),
"model_failure_count": model_failures,
"unavailable_source_count": len(failures) - model_failures,
"pending_tasks": status.get("pending_tasks"),
"push_status": publication.get("push_status"), "pushed_at": publication.get("pushed_at")}
def main():
import gradio as gr
from fastapi import FastAPI
from fastapi.responses import JSONResponse
import uvicorn
from space.app import demo
app = FastAPI()
@app.get("/healthz")
def health():
report = health_report()
return JSONResponse(report, status_code=200 if report["ok"] else 503)
blocked = [str(ROOT / p) for p in ("space/results", "space/vendor/ts_bench/data",
".cloud-state", ".cache", ".env")]
app = gr.mount_gradio_app(app, demo.queue(default_concurrency_limit=20), path="/",
blocked_paths=[*blocked, "/proc"])
uvicorn.run(app, host="0.0.0.0", port=7860)
if __name__ == "__main__":
main()