# config/api_keys.py """ API keys configuration The keys can be set through environment variables or stored in a .env file """ import os from pathlib import Path from dotenv import load_dotenv import json from typing import Optional # Load .env file if it exists env_path = Path(__file__).parent.parent / '.env' if env_path.exists(): load_dotenv(env_path) class APIKeyManager: """Manages API keys and their storage/retrieval""" # Define default paths DEFAULT_KEY_FILE = Path(__file__).parent / 'stored_keys.json' @classmethod def get_openai_key(cls) -> Optional[str]: """Get OpenAI API key from environment or stored configuration""" return ( os.getenv('OPENAI_API_KEY') or cls._get_stored_key('openai') ) @classmethod def get_google_key(cls) -> Optional[str]: """Get Google API key from environment or stored configuration""" return ( os.getenv('GOOGLE_API_KEY') or cls._get_stored_key('google') ) @classmethod def get_anthropic_key(cls) -> Optional[str]: """Get Anthropic API key from environment or stored configuration""" return ( os.getenv('ANTHROPIC_API_KEY') or cls._get_stored_key('anthropic') ) @classmethod def get_grok_key(cls) -> Optional[str]: """Get Grok API key from environment or stored configuration""" return ( os.getenv('GROK_API_KEY') or cls._get_stored_key('grok') ) @classmethod def store_key(cls, service: str, key: str) -> None: """Store an API key in the configuration file""" stored_keys = cls._read_stored_keys() stored_keys[service] = key cls.DEFAULT_KEY_FILE.parent.mkdir(exist_ok=True) with open(cls.DEFAULT_KEY_FILE, 'w') as f: json.dump(stored_keys, f) @classmethod def get_google_credentials_path(cls) -> Optional[str]: """Get path to Google credentials JSON file""" return os.getenv('GOOGLE_CREDENTIALS_PATH') or cls._get_stored_key('google_credentials_path') @classmethod def _get_stored_key(cls, service: str) -> Optional[str]: """Get a stored API key from the configuration file""" stored_keys = cls._read_stored_keys() return stored_keys.get(service) @classmethod def _read_stored_keys(cls) -> dict: """Read stored keys from configuration file""" if cls.DEFAULT_KEY_FILE.exists(): try: with open(cls.DEFAULT_KEY_FILE, 'r') as f: return json.load(f) except json.JSONDecodeError: print(f"Error reading stored keys from {cls.DEFAULT_KEY_FILE}") return {} return {}