Spaces:
Sleeping
Sleeping
File size: 1,688 Bytes
814c791 | 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 | """Admin / 运维端点. 用于手动修复持久化状态 / 触发快照.
⚠️ 当前 API 完全开放 (单用户系统, 无鉴权). 如果将来加多用户, 这里需要
X-Admin-Token 之类的鉴权.
"""
from __future__ import annotations
import logging
from fastapi import APIRouter, Depends, HTTPException
from app.services.persist import persist_status, push_to_hf
from app.core.auth import require_admin_token
logger = logging.getLogger(__name__)
router = APIRouter(prefix="/admin", tags=["admin"], dependencies=[Depends(require_admin_token)])
@router.post("/push")
async def trigger_push() -> dict:
"""手动 trigger 一次 push. 用于:
- 修复 push 卡死 (clear pending_push flag)
- 手动快照当前 /data 到 Dataset
- 验证持久化链路
"""
status = persist_status()
if not status["enabled"]:
raise HTTPException(503, "Persistence not enabled (HF_PERSIST_REPO/HF_TOKEN missing)")
# 强制清掉 stuck flag
from app.services import persist as p
p._state["pending_push"] = False # type: ignore[index]
if not await push_to_hf():
raise HTTPException(502, "Persistence push failed; inspect /admin/status after retrying.")
new_status = persist_status()
logger.info("admin/push invoked; status before=%s, after=%s", status, new_status)
return {"status": "ok", "persist": new_status}
@router.get("/status")
async def admin_status() -> dict:
"""返回更详细的持久化状态 (供 debug)."""
from app.services import persist as p
return {
"persist": persist_status(),
"background_tasks_pending": len(p._background_tasks), # type: ignore[arg-type]
}
|