Spaces:
Runtime error
Runtime error
File size: 3,666 Bytes
2962b6a |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
import os
import time
from dotenv import load_dotenv
from .supabase_cli import get_supabase_client # Import from the existing supabase_cli
load_dotenv()
# Simple in-memory cache
api_key_cache = {}
last_loaded_time = 0
CACHE_TTL = 300 # Cache time-to-live in seconds (5 minutes)
def load_api_keys_from_db():
"""Loads API keys from the database into the cache."""
global api_key_cache
print("Loading API keys from database...")
supabase = get_supabase_client() # Use the imported function
if not supabase:
return {}
try:
response = supabase.from_("app_config").select("config").eq("id", 1).execute()
#[
# {
# 'config': {
# 'api_keys': [
# {'api_key': 'xxxxx', 'can_use_at': 0},
# {'api_key': 'yyyyy', 'can_use_at': 0}
# ]
# }
# }
#]
# print(f"Supabase response data: {response.data}")
if response.data and response.data[0] and 'config' in response.data[0] and 'api_keys' in response.data[0]['config']:
api_keys_list = response.data[0]['config']['api_keys']
if api_keys_list:
api_key_cache = {item['api_key']: item['can_use_at'] for item in api_keys_list}
# {'xxxxx': 0, 'yyyyy': 0}
# print(f"Successfully loaded {len(api_key_cache)} API keys with can_use_at timestamps.")
# print(f"API keys cache: {api_key_cache}")
else:
print("API keys list is empty in the database response.")
api_key_cache = {}
else:
print("Unexpected database response structure or no data found.")
api_key_cache = {}
except Exception as e:
print(f"Error loading API keys from database: {e}")
api_key_cache = {} # Clear cache on error
return api_key_cache
def get_api_key():
"""Gets an API key from the cache, loading from DB if necessary."""
global api_key_cache
# print("\n\n\n\n\nGetting API key...")
# print(api_key_cache)
# Ensure cache is loaded
if not api_key_cache :
load_api_keys_from_db()
# api_key_cache={'xxxxx': 1, 'yyyyy': 0}
# print('api_key_cache',api_key_cache)
# Sort available keys by their 'can_use_at' timestamp in ascending order
sorted_key_cache = sorted(api_key_cache, key=lambda key: api_key_cache.get(key, float('inf')))
# print('\n\n\n\n\n\n\n\n\nsorted_key_cache',sorted_key_cache)
# Select the key with the smallest 'can_use_at' value
selected_key = sorted_key_cache[0]
# TODO: Update the 'can_use_at' timestamp for the selected key in the cache
# This requires knowing the rate limit or delay period for the API.
# For now, we'll just return the key. In a real system, you'd update the cache
# with a future timestamp after using the key successfully.
# Example: api_key_cache[selected_key] = time.time() + API_RATE_LIMIT_DELAY
# print(f"Using API key: {selected_key[:5]}...") # Print partial key for security
api_key_cache[selected_key]=time.time()
return selected_key
# Example usage (for testing)
if __name__ == "__main__":
# In a real application, environment variables would be set
# For testing, you might set them here or use a .env file loader
# os.environ['SUPABASE_URL'] = 'your_supabase_url'
# os.environ['SUPABASE_KEY'] = 'your_supabase_key'
# keys = load_api_keys_from_db()
# print("Loaded keys:", keys)
# # Simulate using cached keys
# keys = load_api_keys_from_db()
# print("Loaded keys (from cache):", keys)
pass
|