随机获取一个可用凭证(负载均衡)
(
self, mode: str = "geminicli", model_name: Optional[str] = None
)
| 243 | # ============ 凭证查询方法 ============ |
| 244 | |
| 245 | async def get_next_available_credential( |
| 246 | self, mode: str = "geminicli", model_name: Optional[str] = None |
| 247 | ) -> Optional[Tuple[str, Dict[str, Any]]]: |
| 248 | """随机获取一个可用凭证(负载均衡)""" |
| 249 | self._ensure_initialized() |
| 250 | |
| 251 | try: |
| 252 | table_name = self._get_table_name(mode) |
| 253 | current_time = time.time() |
| 254 | |
| 255 | async with self._pool.acquire() as conn: |
| 256 | if mode == "geminicli": |
| 257 | rows = await conn.fetch(f""" |
| 258 | SELECT filename, credential_data, model_cooldowns, preview |
| 259 | FROM {table_name} |
| 260 | WHERE disabled = 0 |
| 261 | ORDER BY RANDOM() |
| 262 | """) |
| 263 | |
| 264 | if not model_name: |
| 265 | if rows: |
| 266 | return rows[0]["filename"], json.loads(rows[0]["credential_data"]) |
| 267 | return None |
| 268 | |
| 269 | is_preview_model = "preview" in model_name.lower() |
| 270 | non_preview_creds = [] |
| 271 | preview_creds = [] |
| 272 | |
| 273 | for row in rows: |
| 274 | model_cooldowns = json.loads(row["model_cooldowns"] or "{}") |
| 275 | cd = model_cooldowns.get(model_name) |
| 276 | if cd is None or current_time >= cd: |
| 277 | if row["preview"]: |
| 278 | preview_creds.append((row["filename"], row["credential_data"])) |
| 279 | else: |
| 280 | non_preview_creds.append((row["filename"], row["credential_data"])) |
| 281 | |
| 282 | if is_preview_model: |
| 283 | if preview_creds: |
| 284 | return preview_creds[0][0], json.loads(preview_creds[0][1]) |
| 285 | else: |
| 286 | if non_preview_creds: |
| 287 | return non_preview_creds[0][0], json.loads(non_preview_creds[0][1]) |
| 288 | elif preview_creds: |
| 289 | return preview_creds[0][0], json.loads(preview_creds[0][1]) |
| 290 | |
| 291 | return None |
| 292 | else: |
| 293 | rows = await conn.fetch(f""" |
| 294 | SELECT filename, credential_data, model_cooldowns, enable_credit |
| 295 | FROM {table_name} |
| 296 | WHERE disabled = 0 |
| 297 | ORDER BY RANDOM() |
| 298 | """) |
| 299 | |
| 300 | if not model_name: |
| 301 | if rows: |
| 302 | credential_data = json.loads(rows[0]["credential_data"]) |
no test coverage detected