File size: 3,625 Bytes
e34506d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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
    }