""" Error handling utilities for CyberScraper-2077. Provides user-friendly error messages with instructions and README links. """ import os README_URL = "https://github.com/itsOwen/CyberScraper-2077/blob/main/README.md" class ErrorMessages: """Centralized error messages with user-friendly instructions.""" # Tor/Proxy errors TOR_PROXY_CONNECTION_FAILED = ( "Failed to connect to Tor proxy.\n\n" "Install Tor:\n" " Ubuntu/Debian: sudo apt install tor\n" " macOS: brew install tor\n\n" "Start Tor:\n" " Linux: sudo service tor start\n" " macOS: brew services start tor\n\n" f"For more help, see: {README_URL}#-tor-network-scraping" ) TOR_NOT_DETECTED = ( "Connection is not using Tor network.\n\n" "Please verify your Tor configuration.\n\n" f"For help, see: {README_URL}#-tor-network-scraping" ) ONION_URL_INVALID = ( "Invalid onion URL provided.\n\n" "Onion URLs must end with '.onion'.\n\n" f"For more information, see: {README_URL}#-tor-network-scraping" ) TOR_CONNECTION_ERROR = ( "Unexpected Tor connection error.\n\n" "Please check:\n" "1. Tor is running (brew services list | grep tor)\n" "2. If just started, Tor needs 1-2 minutes to bootstrap\n" " Check progress: tail /opt/homebrew/var/log/tor.log\n" "3. Wait for 'Bootstrapped 100%' before scraping .onion sites\n\n" f"For help, see: {README_URL}#-tor-network-scraping" ) # API Key errors OPENAI_API_KEY_MISSING = ( "OpenAI API Key is missing.\n\n" "Please set the OPENAI_API_KEY environment variable:\n" "1. Create a .env file in the project root\n" "2. Add: OPENAI_API_KEY=your_key_here\n" "3. Or export it: export OPENAI_API_KEY=your_key_here\n\n" f"For setup instructions, see: {README_URL}#installation" ) GOOGLE_API_KEY_MISSING = ( "Google API Key is missing.\n\n" "Please set the GOOGLE_API_KEY environment variable:\n" "1. Create a .env file in the project root\n" "2. Add: GOOGLE_API_KEY=your_key_here\n" "3. Or export it: export GOOGLE_API_KEY=your_key_here\n\n" f"For setup instructions, see: {README_URL}#installation" ) OPENAI_API_KEY_INVALID = ( "OpenAI API Key is invalid or expired.\n\n" "Please verify your API key at: https://platform.openai.com/api-keys\n\n" f"For help, see: {README_URL}#installation" ) GOOGLE_API_KEY_INVALID = ( "Google API Key is invalid or expired.\n\n" "Please verify your API key at: https://console.cloud.google.com/apis/credentials\n\n" f"For help, see: {README_URL}#installation" ) BLABLADOR_API_KEY_MISSING = ( "Blablador API Key is missing.\n\n" "Please set the BLABLADOR_API_KEY environment variable:\n" "1. Create a .env file in the project root\n" "2. Add: BLABLADOR_API_KEY=your_key_here\n" "3. Or export it: export BLABLADOR_API_KEY=your_key_here\n\n" f"For setup instructions, see: {README_URL}#installation" ) # Ollama errors OLLAMA_NOT_RUNNING = ( "Ollama is not running or not accessible.\n\n" "Please ensure:\n" "1. Ollama is installed and running\n" "2. Ollama is accessible at http://localhost:11434\n" "3. You have pulled the model you want to use\n\n" "Install Ollama: https://ollama.ai/download\n" f"For setup instructions, see: {README_URL}#ollama-setup" ) OLLAMA_MODEL_NOT_FOUND = ( "Ollama model not found.\n\n" "Please pull the model first:\n" " ollama pull \n\n" "List available models:\n" " ollama list\n\n" f"For help, see: {README_URL}#ollama-setup" ) # Scraping errors SCRAPING_FAILED = ( "Failed to scrape the website.\n\n" "This could be due to:\n" "1. The website is blocking automated requests\n" "2. Network connectivity issues\n" "3. Invalid URL\n\n" "Try using the 'Use Current Browser' option in the sidebar.\n\n" f"For help, see: {README_URL}#troubleshooting" ) URL_INVALID = ( "Invalid URL provided.\n\n" "Please provide a valid URL starting with http:// or https://\n\n" f"For help, see: {README_URL}#usage" ) TIMEOUT_ERROR = ( "Request timed out.\n\n" "The website took too long to respond. This could be due to:\n" "1. Slow website response time\n" "2. Network connectivity issues\n" "3. The website is blocking requests\n\n" "Try again later or use the 'Use Current Browser' option.\n\n" f"For help, see: {README_URL}#troubleshooting" ) # OAuth errors OAUTH_FAILED = ( "Google OAuth authentication failed.\n\n" "Please ensure:\n" "1. client_secret.json exists in the project root\n" "2. The OAuth redirect URI is correctly configured\n" "3. You have authorized the application\n\n" f"For setup instructions, see: {README_URL}#google-sheets-integration" ) OAUTH_TOKEN_MISSING = ( "Google OAuth token is missing.\n\n" "Please authenticate with Google using the button in the sidebar.\n\n" f"For help, see: {README_URL}#google-sheets-integration" ) # Generic error GENERIC_ERROR = ( "An unexpected error occurred.\n\n" "Please try again. If the issue persists, please check the README for troubleshooting.\n\n" f"For help, see: {README_URL}#troubleshooting" ) def check_api_keys() -> list[str]: """ Check for missing API keys and return list of missing keys. Returns: List of error messages for missing API keys """ errors = [] openai_models = ["gpt-4.1-mini", "gpt-4o-mini", "gpt-4", "gpt-3.5-turbo", "text-"] gemini_models = ["gemini-1.5-flash", "gemini-pro", "gemini-"] # Check for OpenAI API key if not os.getenv("OPENAI_API_KEY"): errors.append(ErrorMessages.OPENAI_API_KEY_MISSING) # Check for Google API key if not os.getenv("GOOGLE_API_KEY"): errors.append(ErrorMessages.GOOGLE_API_KEY_MISSING) return errors def check_model_api_key(model_name: str) -> str | None: """ Check if the required API key for a model is present. Args: model_name: Name of the model to check Returns: Error message if API key is missing, None otherwise """ if model_name.startswith(("gpt-", "text-")) and not os.getenv("OPENAI_API_KEY"): return ErrorMessages.OPENAI_API_KEY_MISSING if model_name.startswith("gemini-") and not os.getenv("GOOGLE_API_KEY"): return ErrorMessages.GOOGLE_API_KEY_MISSING if model_name.startswith("alias-") and not os.getenv("BLABLADOR_API_KEY"): return ErrorMessages.BLABLADOR_API_KEY_MISSING return None