File size: 2,569 Bytes
5b5c1df
 
47d0d96
cba2d88
47d0d96
 
5b5c1df
cba2d88
 
 
 
5b5c1df
2046451
5b5c1df
2046451
5b5c1df
47d0d96
5b5c1df
 
 
 
 
 
 
 
2046451
 
 
5b5c1df
 
 
814be5a
 
2046451
 
cba2d88
2046451
 
 
 
cba2d88
2046451
cba2d88
2046451
 
 
 
 
 
 
 
 
4be8d5a
 
 
 
 
 
 
 
 
 
 
 
536f322
4be8d5a
 
 
2046451
 
 
 
 
 
 
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
import os
import google.generativeai as genai
from dotenv import load_dotenv
from cachetools import cached, TTLCache

load_dotenv()

# Configura cache para a lista de modelos: dura 24 horas (86400 segundos)
# maxsize=1 pois só armazenamos o resultado de uma única chamada
models_cache = TTLCache(maxsize=1, ttl=86400)


def configure_genai(model_name="gemini-2.5-flash"):
    """
    Configura a chave de API e inicializa o modelo Gemini escolhido.
    """
    api_key = os.getenv("GOOGLE_API_KEY")

    if not api_key:
        raise EnvironmentError(
            "❌ A variável de ambiente GOOGLE_API_KEY não está definida."
        )

    try:
        genai.configure(api_key=api_key)
        model = genai.GenerativeModel(model_name)
        # Log para debug, útil para saber qual modelo está sendo usado
        print(f"✅ Modelo configurado: {model_name}")
        return model

    except Exception as e:
        print(f"❌ Falha ao configurar a chave da API: {e}")
        return None


@cached(models_cache)
def list_available_models():
    """
    Lista os modelos disponíveis na API dinamicamente.
    Retorna uma lista de dicionários {'id': name, 'name': display_name}.
    Resultado em cache por 24h.
    """
    print("🔄 Consultando API do Google para atualizar lista de modelos...")
    api_key = os.getenv("GOOGLE_API_KEY")
    if not api_key:
        return []

    try:
        genai.configure(api_key=api_key)
        models = []
        for m in genai.list_models():
            if 'generateContent' in m.supported_generation_methods:
                name_lower = m.name.lower()
                
                # Regras estritas de filtro para garantir compatibilidade
                # 1. Deve ser da família Gemini
                if 'gemini' not in name_lower:
                    continue
                
                # 2. Deve ser da variante 'flash' (mais estável para esta conta)
                if 'flash' not in name_lower:
                    continue

                # 3. Exclui variantes problemáticas ou não suportadas
                if any(x in name_lower for x in ['image', 'vision', 'pro', 'tts']):
                    continue
                    
                models.append({"id": m.name, "name": m.display_name})
        
        # Ordena inversamente pelo nome para tentar mostrar versões mais novas (2.5 > 1.5) primeiro
        models.sort(key=lambda x: x['name'], reverse=True)
        return models
    except Exception as e:
        print(f"⚠️ Erro ao listar modelos: {e}")
        return []