agAdvisor / src /config /credentials.py
tirtho149's picture
Deploy AgAdvisor
b30f068 verified
Raw
History Blame Contribute Delete
3.78 kB
"""
Credentials Manager for API Keys
Loads and manages API keys from .env file
"""
import os
from pathlib import Path
from dotenv import load_dotenv
from typing import Optional
class CredentialsManager:
"""
Manages API credentials from environment variables
Usage:
creds = CredentialsManager()
weather_key = creds.get_api_key("openweather")
"""
def __init__(self, env_file: Optional[str] = None):
"""
Initialize credentials manager
Args:
env_file: Path to .env file (default: project_root/.env)
"""
if env_file is None:
# Default to .env in project root
project_root = Path(__file__).parent.parent.parent
env_file = project_root / ".env"
# Load environment variables
load_dotenv(env_file)
# Map of API names to environment variable names
self.api_key_map = {
"openweather": "OPENWEATHER_API_KEY",
"openai": "OPENAI_API_KEY",
"tavily": "TAVILY_API_KEY"
}
def get_api_key(self, api_name: str) -> str:
"""
Get API key for a specific service
Args:
api_name: Name of the API (e.g., "openweather", "openai")
Returns:
API key string
Raises:
ValueError: If API key is not found or is a placeholder
"""
env_var_name = self.api_key_map.get(api_name)
if not env_var_name:
raise ValueError(
f"Unknown API: {api_name}. "
f"Known APIs: {list(self.api_key_map.keys())}"
)
api_key = os.getenv(env_var_name)
if not api_key:
raise ValueError(
f"API key for '{api_name}' not found in environment. "
f"Please add {env_var_name} to your .env file. "
f"See env_template.txt for an example."
)
# Check for placeholder values
if "your_" in api_key.lower() or "placeholder" in api_key.lower():
raise ValueError(
f"API key for '{api_name}' appears to be a placeholder. "
f"Please replace it with your actual API key in .env file."
)
return api_key
def has_api_key(self, api_name: str) -> bool:
"""
Check if an API key is available
Args:
api_name: Name of the API
Returns:
True if key is available and valid, False otherwise
"""
try:
self.get_api_key(api_name)
return True
except ValueError:
return False
def get_all_available_keys(self) -> dict:
"""
Get status of all configured API keys
Returns:
Dict mapping API name to availability status
"""
status = {}
for api_name in self.api_key_map.keys():
status[api_name] = self.has_api_key(api_name)
return status
# Test function
if __name__ == "__main__":
print("Testing Credentials Manager...")
print("-" * 50)
creds = CredentialsManager()
# Check all API keys
status = creds.get_all_available_keys()
for api_name, available in status.items():
status_icon = "✅" if available else "❌"
print(f"{status_icon} {api_name}: {'Available' if available else 'Not configured'}")
# Try to get OpenWeather key
print("\n" + "-" * 50)
try:
key = creds.get_api_key("openweather")
print(f"✅ OpenWeather API Key loaded: {key[:10]}...")
except ValueError as e:
print(f"❌ Error: {e}")