聚合管理后台所需的 Token 与请求统计。
(
provider: str,
*,
token_dao: Optional[TokenDAO] = None,
request_log_dao: Optional[RequestLogDAO] = None,
token_pool: Any = _TOKEN_POOL_SENTINEL,
trend_window: str = DEFAULT_TREND_WINDOW,
)
| 84 | |
| 85 | |
| 86 | async def collect_admin_stats( |
| 87 | provider: str, |
| 88 | *, |
| 89 | token_dao: Optional[TokenDAO] = None, |
| 90 | request_log_dao: Optional[RequestLogDAO] = None, |
| 91 | token_pool: Any = _TOKEN_POOL_SENTINEL, |
| 92 | trend_window: str = DEFAULT_TREND_WINDOW, |
| 93 | ) -> Dict[str, Any]: |
| 94 | """聚合管理后台所需的 Token 与请求统计。""" |
| 95 | token_dao = token_dao or get_token_dao() |
| 96 | request_log_dao = request_log_dao or get_request_log_dao() |
| 97 | if token_pool is _TOKEN_POOL_SENTINEL: |
| 98 | token_pool = get_token_pool() |
| 99 | trend_window = normalize_trend_window(trend_window) |
| 100 | |
| 101 | token_counts = await token_dao.get_provider_token_counts(provider) |
| 102 | request_stats = await request_log_dao.get_provider_request_stats(provider) |
| 103 | usage_trend = await request_log_dao.get_provider_usage_trend( |
| 104 | provider, |
| 105 | window=trend_window, |
| 106 | ) |
| 107 | |
| 108 | pool_status: Dict[str, Any] = {} |
| 109 | if isinstance(token_pool, TokenPool) or hasattr(token_pool, "get_pool_status"): |
| 110 | pool_status = token_pool.get_pool_status() if token_pool else {} |
| 111 | |
| 112 | total_tokens = _coerce_int(token_counts.get("total_tokens")) |
| 113 | enabled_tokens = _coerce_int(token_counts.get("enabled_tokens")) |
| 114 | user_tokens = _coerce_int(token_counts.get("user_tokens")) |
| 115 | guest_tokens = _coerce_int(token_counts.get("guest_tokens")) |
| 116 | unknown_tokens = _coerce_int(token_counts.get("unknown_tokens")) |
| 117 | |
| 118 | pool_total_tokens = _coerce_int(pool_status.get("total_tokens")) |
| 119 | if pool_total_tokens == 0 and token_pool is None: |
| 120 | pool_total_tokens = max(0, enabled_tokens - guest_tokens) |
| 121 | |
| 122 | available_tokens = _coerce_int(pool_status.get("available_tokens")) |
| 123 | healthy_tokens = _coerce_int(pool_status.get("healthy_tokens")) |
| 124 | unhealthy_tokens = _coerce_int(pool_status.get("unhealthy_tokens")) |
| 125 | |
| 126 | total_requests = _coerce_int(request_stats.get("total_requests")) |
| 127 | successful_requests = _coerce_int(request_stats.get("successful_requests")) |
| 128 | failed_requests = _coerce_int(request_stats.get("failed_requests")) |
| 129 | input_tokens = _coerce_int(request_stats.get("input_tokens")) |
| 130 | output_tokens = _coerce_int(request_stats.get("output_tokens")) |
| 131 | total_consumed_tokens = _coerce_int(request_stats.get("total_tokens")) |
| 132 | cache_creation_tokens = _coerce_int( |
| 133 | request_stats.get("cache_creation_tokens") |
| 134 | ) |
| 135 | cache_read_tokens = _coerce_int(request_stats.get("cache_read_tokens")) |
| 136 | cache_creation_requests = _coerce_int( |
| 137 | request_stats.get("cache_creation_requests") |
| 138 | ) |
| 139 | cache_hit_requests = _coerce_int(request_stats.get("cache_hit_requests")) |
| 140 | average_latency = round(float(request_stats.get("avg_duration") or 0.0), 2) |
| 141 | average_first_token_latency = round( |
| 142 | float(request_stats.get("avg_first_token_time") or 0.0), |
| 143 | 2, |