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
    )