从数据库同步 Token 状态(禁用/启用状态) Args: provider: 提供商名称 说明: - 从数据库读取最新的 Token 启用状态 - 如果数据库中 Token 被禁用,则从池中移除 - 如果数据库中有新增的启用 Token,则添加到池中 - 保留现有 Token 的运行时统计(请求数、成功率等)
(self, provider: str = "zai")
| 500 | logger.error(f"💥 {exception_count} 个 Token 检查异常") |
| 501 | |
| 502 | async def sync_from_database(self, provider: str = "zai"): |
| 503 | """ |
| 504 | 从数据库同步 Token 状态(禁用/启用状态) |
| 505 | |
| 506 | Args: |
| 507 | provider: 提供商名称 |
| 508 | |
| 509 | 说明: |
| 510 | - 从数据库读取最新的 Token 启用状态 |
| 511 | - 如果数据库中 Token 被禁用,则从池中移除 |
| 512 | - 如果数据库中有新增的启用 Token,则添加到池中 |
| 513 | - 保留现有 Token 的运行时统计(请求数、成功率等) |
| 514 | """ |
| 515 | from app.services.token_dao import get_token_dao |
| 516 | |
| 517 | dao = get_token_dao() |
| 518 | |
| 519 | # 从数据库加载所有启用的认证用户 Token |
| 520 | token_records = await dao.get_tokens_by_provider(provider, enabled_only=True) |
| 521 | |
| 522 | # 构建数据库中的 Token 映射 |
| 523 | db_tokens = { |
| 524 | record["token"]: (record["id"], record.get("token_type", "unknown")) |
| 525 | for record in token_records |
| 526 | if record.get("token_type") != "guest" # 过滤 guest token |
| 527 | } |
| 528 | |
| 529 | with self._lock: |
| 530 | # 1. 移除已在数据库中禁用的 Token |
| 531 | tokens_to_remove = [] |
| 532 | for token_value in list(self.token_statuses.keys()): |
| 533 | if token_value not in db_tokens: |
| 534 | tokens_to_remove.append(token_value) |
| 535 | |
| 536 | for token_value in tokens_to_remove: |
| 537 | del self.token_statuses[token_value] |
| 538 | del self.token_id_map[token_value] |
| 539 | logger.info(f"🗑️ 从池中移除已禁用 Token: {token_value[:20]}...") |
| 540 | |
| 541 | # 2. 添加新启用的 Token |
| 542 | new_tokens_count = 0 |
| 543 | for token_value, (token_id, token_type) in db_tokens.items(): |
| 544 | if token_value not in self.token_statuses: |
| 545 | self.token_statuses[token_value] = TokenStatus( |
| 546 | token=token_value, |
| 547 | token_id=token_id, |
| 548 | token_type=token_type |
| 549 | ) |
| 550 | self.token_id_map[token_value] = token_id |
| 551 | new_tokens_count += 1 |
| 552 | logger.info(f"➕ 添加新启用 Token: {token_value[:20]}...") |
| 553 | |
| 554 | # 3. 更新现有 Token 的类型(如果数据库中有更新) |
| 555 | for token_value, (token_id, token_type) in db_tokens.items(): |
| 556 | if token_value in self.token_statuses: |
| 557 | old_type = self.token_statuses[token_value].token_type |
| 558 | if old_type != token_type: |
| 559 | self.token_statuses[token_value].token_type = token_type |
no test coverage detected