Ensure a token has a pooled set of projects and return one in round-robin order.
(self, token_id: int)
| 918 | debug_logger.log_warning(f"[PROTOCOL_REFRESH] 停止后台任务时出错: {e}") |
| 919 | |
| 920 | async def ensure_project_exists(self, token_id: int) -> str: |
| 921 | """Ensure a token has a pooled set of projects and return one in round-robin order.""" |
| 922 | project_lock = await self._get_token_lock( |
| 923 | self._project_locks, |
| 924 | self._project_lock_guard, |
| 925 | token_id, |
| 926 | ) |
| 927 | async with project_lock: |
| 928 | token = await self.db.get_token(token_id) |
| 929 | if not token: |
| 930 | raise ValueError("Token not found") |
| 931 | |
| 932 | projects = [project for project in await self.db.get_projects_by_token(token_id) if project.is_active] |
| 933 | projects = self._sort_projects(projects) |
| 934 | |
| 935 | try: |
| 936 | project_pool_size = self._get_project_pool_size() |
| 937 | while len(projects) < project_pool_size: |
| 938 | new_project = await self._create_project_for_token(token, len(projects) + 1) |
| 939 | projects.append(new_project) |
| 940 | projects = self._sort_projects(projects) |
| 941 | |
| 942 | selectable_projects = projects[:project_pool_size] |
| 943 | selected_project = self._select_next_project(token, selectable_projects) |
| 944 | await self.db.update_token( |
| 945 | token_id, |
| 946 | current_project_id=selected_project.project_id, |
| 947 | current_project_name=selected_project.project_name, |
| 948 | ) |
| 949 | return selected_project.project_id |
| 950 | except Exception as e: |
| 951 | raise ValueError(f"Failed to prepare project pool: {str(e)}") |
| 952 | |
| 953 | async def record_usage(self, token_id: int, is_video: bool = False): |
| 954 | """Record token usage""" |
no test coverage detected