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/', 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', '
') formatted_response = re.sub( r'(?<=
)\s*(Ficção|Não[- ]Ficção|Ciência|Fantasia)\s*:(?=
)', r'\1:', f"
{formatted_response}
" )[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 )