Spaces:
Sleeping
Sleeping
File size: 3,503 Bytes
5b5c1df e7442a3 83fde5a 5b5c1df 410d534 2046451 5b5c1df 83fde5a 5b5c1df ec0ff9b 5b5c1df 2046451 5b5c1df 2046451 5b5c1df ec0ff9b 2046451 ec0ff9b 5b5c1df ec0ff9b 5b5c1df ec0ff9b 5b5c1df 410d534 ec0ff9b 2046451 83fde5a ec0ff9b 5b5c1df 2046451 5b5c1df | 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 | 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
)
|