vioott's picture
perf(cache): cache available models list for 24 hours
cba2d88
raw
history blame
2.57 kB
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 []