fix(usage): 抽取 ElapsedTimeText 组件、缩短缓存 TTL 提升实时性,修复 _KeyCandidate slots

- 将 UsageRecordsTable 中的内联计时逻辑抽取为独立的 ElapsedTimeText 组件
- usage records 缓存 TTL 从 15s 降为 3s,全局自动刷新间隔从 5s 改为 3s 并默认开启
- 补充 PoolManager._KeyCandidate 缺失的 __slots__ 字段
This commit is contained in:
fawney19
2026-03-04 02:24:46 +08:00
parent cdce817928
commit e181329a81
6 changed files with 112 additions and 59 deletions

View File

@@ -843,7 +843,7 @@ class AdminUsageRecordsAdapter(AdminApiAdapter):
@cache_result(
key_prefix="admin:usage:records",
ttl=CacheTTL.ADMIN_USAGE_RECORDS,
ttl=3, # 使用记录页强调实时性,避免 15s 缓存导致列表滞后
user_specific=False,
vary_by=[
"start_date",

View File

@@ -771,7 +771,7 @@ class GetUsageAdapter(AuthenticatedApiAdapter):
@cache_result(
key_prefix="user:usage:records",
ttl=CacheTTL.ADMIN_USAGE_RECORDS,
ttl=3, # 使用记录页强调实时性,避免 15s 缓存导致列表滞后
user_specific=True,
vary_by=[
"time_range.start_date",

View File

@@ -302,12 +302,20 @@ class PoolManager:
)
class _KeyCandidate:
__slots__ = ("key", "is_skipped", "skip_reason")
__slots__ = (
"key",
"is_skipped",
"skip_reason",
"_pool_extra_data",
"_pool_scheduling_trace",
)
def __init__(self, key: ProviderAPIKey) -> None:
self.key = key
self.is_skipped = False
self.skip_reason: str | None = None
self._pool_extra_data: dict | None = None
self._pool_scheduling_trace: PoolSchedulingTrace | None = None
wrappers = [_KeyCandidate(k) for k in keys]
reordered_wrappers = await self.reorder_candidates(session_uuid, wrappers) # type: ignore[arg-type]