Token 运行时状态(内存中)
| 27 | |
| 28 | @dataclass |
| 29 | class TokenStatus: |
| 30 | """Token 运行时状态(内存中)""" |
| 31 | token: str |
| 32 | token_id: int # 数据库 ID,用于同步统计 |
| 33 | token_type: str = "unknown" # "user", "guest", "unknown" |
| 34 | is_available: bool = True |
| 35 | failure_count: int = 0 |
| 36 | last_failure_time: float = 0.0 |
| 37 | last_success_time: float = 0.0 |
| 38 | total_requests: int = 0 |
| 39 | successful_requests: int = 0 |
| 40 | db_synced_successful_requests: int = 0 |
| 41 | db_synced_failed_requests: int = 0 |
| 42 | |
| 43 | @property |
| 44 | def success_rate(self) -> float: |
| 45 | """成功率""" |
| 46 | if self.total_requests == 0: |
| 47 | return 1.0 |
| 48 | return self.successful_requests / self.total_requests |
| 49 | |
| 50 | @property |
| 51 | def failed_requests(self) -> int: |
| 52 | """失败次数。""" |
| 53 | return max(0, self.total_requests - self.successful_requests) |
| 54 | |
| 55 | @property |
| 56 | def is_healthy(self) -> bool: |
| 57 | """ |
| 58 | Token 健康状态判断 |
| 59 | |
| 60 | 健康标准: |
| 61 | 1. 必须是认证用户 Token (token_type = "user") |
| 62 | 2. 当前可用 (is_available = True) |
| 63 | 3. 成功率 >= 50% 或总请求数 <= 3(新 Token 容错) |
| 64 | |
| 65 | 注意: |
| 66 | - guest Token 永远不健康 |
| 67 | - unknown Token 永远不健康 |
| 68 | """ |
| 69 | # guest 和 unknown token 永远不健康 |
| 70 | if self.token_type != "user": |
| 71 | return False |
| 72 | |
| 73 | # 不可用的 token 不健康 |
| 74 | if not self.is_available: |
| 75 | return False |
| 76 | |
| 77 | # 新 token 容错:请求数很少时,只要没失败就健康 |
| 78 | if self.total_requests <= 3: |
| 79 | return self.failure_count == 0 |
| 80 | |
| 81 | # 基于成功率判断 |
| 82 | return self.success_rate >= 0.5 |
| 83 | |
| 84 | |
| 85 | # ==================== Token 验证服务 ==================== |
no outgoing calls
no test coverage detected