import logging import requests import google.generativeai as genai from openai import OpenAI from app.core.config import settings import os logger = logging.getLogger(__name__) def validate_openai_key(): """Validates the OpenAI API key by making a small test request.""" if not settings.OPENAI_API_KEY: logger.warning("OpenAI API key is not set. OpenAI features will use mock data.") return False try: client = OpenAI(api_key=settings.OPENAI_API_KEY) response = client.models.list() logger.info(f"OpenAI API key is valid. Available models: {len(response.data)} models") logger.info(f"Using OpenAI model: {settings.OPENAI_MODEL}") return True except Exception as e: logger.error(f"OpenAI API key validation failed: {str(e)}") return False def validate_perplexity_key(): """Validates the Perplexity API key by making a small test request.""" perplexity_api_key = os.getenv("PERPLEXITY_API_KEY", "") if not perplexity_api_key: logger.warning("Perplexity API key is not set. Perplexity features will use mock data.") return False try: headers = { "Authorization": f"Bearer {perplexity_api_key}", "Content-Type": "application/json" } # Simple test query to validate API key data = { "model": "sonar", "messages": [{"role": "user", "content": "Hello, can you respond with 'API key is valid'?"}], "stream": False } response = requests.post( "https://api.perplexity.ai/chat/completions", headers=headers, json=data ) if response.status_code == 200: logger.info("Perplexity API key is valid") return True else: logger.error(f"Perplexity API key validation failed. Status code: {response.status_code}, Response: {response.text}") return False except Exception as e: logger.error(f"Perplexity API key validation failed: {str(e)}") return False def validate_gemini_key(): """Validates the Gemini API key by making a small test request.""" if not settings.GEMINI_API_KEY: logger.warning("Gemini API key is not set. Gemini features will use mock data.") return False try: genai.configure(api_key=settings.GEMINI_API_KEY) # List available models to validate key models = genai.list_models() model_names = [model.name for model in models] # Check if the configured model is available if f"models/{settings.GEMINI_MODEL}" in model_names or any(settings.GEMINI_MODEL in name for name in model_names): logger.info(f"Gemini API key is valid. Using model: {settings.GEMINI_MODEL}") return True else: available_models = ", ".join(model_names) logger.warning(f"Gemini API key is valid but the configured model '{settings.GEMINI_MODEL}' may not be available. Available models: {available_models}") return True except Exception as e: logger.error(f"Gemini API key validation failed: {str(e)}") return False def validate_all_api_keys(): """Validates all API keys and returns a dictionary with validation results.""" openai_valid = validate_openai_key() perplexity_valid = validate_perplexity_key() gemini_valid = validate_gemini_key() return { "openai": openai_valid, "perplexity": perplexity_valid, "gemini": gemini_valid }