| import random |
| from typing import List, Optional, Tuple |
| import config as app_config |
|
|
|
|
| class ExpressKeyManager: |
| """ |
| Manager for Vertex Express API keys with support for both random and round-robin selection strategies. |
| Similar to CredentialManager but specifically for Express API keys. |
| """ |
| |
| def __init__(self): |
| """Initialize the Express Key Manager with API keys from config.""" |
| self.express_keys: List[str] = app_config.VERTEX_EXPRESS_API_KEY_VAL |
| self.round_robin_index: int = 0 |
| |
| def get_total_keys(self) -> int: |
| """Get the total number of available Express API keys.""" |
| return len(self.express_keys) |
| |
| def get_random_express_key(self) -> Optional[Tuple[int, str]]: |
| """ |
| Get a random Express API key. |
| Returns (original_index, key) tuple or None if no keys available. |
| """ |
| if not self.express_keys: |
| print("WARNING: No Express API keys available for selection.") |
| return None |
| |
| print(f"DEBUG: Using random Express API key selection strategy.") |
| |
| |
| indexed_keys = list(enumerate(self.express_keys)) |
| |
| random.shuffle(indexed_keys) |
| |
| |
| original_idx, key = indexed_keys[0] |
| return (original_idx, key) |
| |
| def get_roundrobin_express_key(self) -> Optional[Tuple[int, str]]: |
| """ |
| Get an Express API key using round-robin selection. |
| Returns (original_index, key) tuple or None if no keys available. |
| """ |
| if not self.express_keys: |
| print("WARNING: No Express API keys available for selection.") |
| return None |
| |
| print(f"DEBUG: Using round-robin Express API key selection strategy.") |
| |
| |
| if self.round_robin_index >= len(self.express_keys): |
| self.round_robin_index = 0 |
| |
| |
| key = self.express_keys[self.round_robin_index] |
| original_idx = self.round_robin_index |
| |
| |
| self.round_robin_index = (self.round_robin_index + 1) % len(self.express_keys) |
| |
| return (original_idx, key) |
| |
| def get_express_api_key(self) -> Optional[Tuple[int, str]]: |
| """ |
| Get an Express API key based on the configured selection strategy. |
| Checks ROUNDROBIN config and calls the appropriate method. |
| Returns (original_index, key) tuple or None if no keys available. |
| """ |
| if app_config.ROUNDROBIN: |
| return self.get_roundrobin_express_key() |
| else: |
| return self.get_random_express_key() |
| |
| def get_all_keys_indexed(self) -> List[Tuple[int, str]]: |
| """ |
| Get all Express API keys with their indices. |
| Useful for retry logic where we need to try all keys. |
| Returns list of (original_index, key) tuples. |
| """ |
| return list(enumerate(self.express_keys)) |
| |
| def refresh_keys(self): |
| """ |
| Refresh the Express API keys from config. |
| This allows for dynamic updates if the config is reloaded. |
| """ |
| self.express_keys = app_config.VERTEX_EXPRESS_API_KEY_VAL |
| |
| if self.round_robin_index >= len(self.express_keys): |
| self.round_robin_index = 0 |
| print(f"INFO: Express API keys refreshed. Total keys: {self.get_total_keys()}") |