vioott's picture
feat(error-handling): add specific error message for quota exhaustion
410d534
raw
history blame
3.5 kB
import re
import sys
import logging
import traceback
from flask import Blueprint, render_template, request
from google.api_core.exceptions import ResourceExhausted
from services.genai_service import configure_genai, list_available_models
from logs import get_user_history, save_log
# Configurar logger
logging.basicConfig(level=logging.ERROR)
logger = logging.getLogger(__name__)
chat_bp = Blueprint('chat', __name__)
@chat_bp.route('/chat/<int:user_id>', methods=['GET', 'POST'])
def chat(user_id):
"""
Rota para interação do usuário com a IA.
"""
history = get_user_history(user_id)
if not history:
return render_template('error_redirect.html')
# Busca modelos disponíveis dinamicamente
available_models = list_available_models()
# Fallback se a API falhar: garante que pelo menos o padrão funcione
if not available_models:
available_models = [{"id": "gemini-2.5-flash", "name": "Gemini 2.5 Flash (Padrão)"}]
# Define o modelo atual (o primeiro da lista ou o padrão)
current_model = available_models[0]['id']
response = None
if request.method == 'POST':
question = request.form.get('question')
# Atualiza com a escolha do usuário
current_model = request.form.get('model_name', current_model)
try:
model = configure_genai(current_model)
session = model.start_chat(enable_automatic_function_calling=True)
prompt = (
f"Você é uma especialista em livros e pode conversar "
f"livremente sobre obras literárias, personagens, enredos, "
f"gêneros e autores. O nome do usuário é "
f"{history.get('name', f'Usuário {user_id}')}. "
f"As preferências dele são: "
f"{', '.join(history.get('preferences', [])) or 'nenhuma'}. "
f"Histórico: {history}. "
f"Pergunta: {question}. Responda na mesma língua da pergunta,"
f" com até 500 caracteres."
f"Fale diretamente com o usuário."
)
gemini_response = session.send_message(prompt)
response = gemini_response.text
save_log(user_id, history, response)
except ResourceExhausted:
logger.warning(f"Cota diária excedida para o modelo {current_model}.")
response = "⚠️ A cota gratuita diária se esgotou. Por favor, retorne em 24h."
except Exception as e:
logger.error(f"Erro CRÍTICO ao usar a IA ({current_model}): {e}")
logger.error(traceback.format_exc())
print(f"Erro ao usar a IA (stdout): {e}", flush=True)
print(traceback.format_exc(), flush=True)
response = "⚠️ A IA está indisponível, retorne em 24h."
formatted_response = None
if response:
formatted_response = response.replace('\n', '<br>')
formatted_response = re.sub(
r'(?<=<br>)\s*(Ficção|Não[- ]Ficção|Ciência|Fantasia)\s*:(?=<br>)',
r'<b>\1:</b>',
f"<br>{formatted_response}<br>"
)[4:-4]
formatted_response = formatted_response.replace('**', '')
formatted_response = formatted_response.replace('* ', '• ')
return render_template(
'chat.html',
user_id=user_id,
response=formatted_response,
history=history,
models=available_models,
current_model=current_model
)