获取 Token 池状态(HTML 片段)
(request: Request)
| 267 | |
| 268 | @router.get("/token-pool", response_class=HTMLResponse) |
| 269 | async def get_token_pool_status(request: Request): |
| 270 | """获取 Token 池状态(HTML 片段)""" |
| 271 | from app.utils.token_pool import get_token_pool |
| 272 | |
| 273 | token_pool = get_token_pool() |
| 274 | |
| 275 | if not token_pool: |
| 276 | # Token 池未初始化 |
| 277 | context = { |
| 278 | "request": request, |
| 279 | "tokens": [], |
| 280 | } |
| 281 | return templates.TemplateResponse("components/token_pool.html", context) |
| 282 | |
| 283 | # 获取 token 状态统计 |
| 284 | pool_status = token_pool.get_pool_status() |
| 285 | tokens_info = [] |
| 286 | |
| 287 | for idx, token_info in enumerate(pool_status.get("tokens", []), 1): |
| 288 | is_available = token_info.get("is_available", False) |
| 289 | is_healthy = token_info.get("is_healthy", False) |
| 290 | |
| 291 | # 确定状态和颜色 |
| 292 | if is_healthy: |
| 293 | status = "健康" |
| 294 | status_color = "bg-green-100 text-green-800" |
| 295 | elif is_available: |
| 296 | status = "可用" |
| 297 | status_color = "bg-yellow-100 text-yellow-800" |
| 298 | else: |
| 299 | status = "失败" |
| 300 | status_color = "bg-red-100 text-red-800" |
| 301 | |
| 302 | # 格式化最后使用时间 |
| 303 | last_success = token_info.get("last_success_time", 0) |
| 304 | if last_success > 0: |
| 305 | from datetime import datetime |
| 306 | last_used = datetime.fromtimestamp(last_success).strftime("%Y-%m-%d %H:%M:%S") |
| 307 | else: |
| 308 | last_used = "从未使用" |
| 309 | |
| 310 | tokens_info.append({ |
| 311 | "index": idx, |
| 312 | "key": token_info.get("token", "")[:20] + "...", |
| 313 | "status": status, |
| 314 | "status_color": status_color, |
| 315 | "last_used": last_used, |
| 316 | "failure_count": token_info.get("failure_count", 0), |
| 317 | "success_rate": token_info.get("success_rate", "0%"), |
| 318 | "token_type": token_info.get("token_type", "unknown"), |
| 319 | }) |
| 320 | |
| 321 | context = { |
| 322 | "request": request, |
| 323 | "tokens": tokens_info, |
| 324 | } |
| 325 | |
| 326 | return templates.TemplateResponse("components/token_pool.html", context) |
nothing calls this directly
no test coverage detected