File size: 4,714 Bytes
8161c55
8a4d350
7a09325
8161c55
7a09325
8161c55
 
 
8a4d350
 
8161c55
 
 
 
 
 
 
 
 
 
 
 
 
 
8a4d350
 
8161c55
 
 
8a4d350
8161c55
 
7a09325
 
 
8161c55
 
 
 
7a09325
 
 
 
 
8161c55
8a4d350
 
 
7a09325
 
 
 
8161c55
7a09325
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8161c55
 
8a4d350
8161c55
 
 
 
 
 
7a09325
8a4d350
 
 
 
 
 
8161c55
7a09325
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2962f9a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8161c55
 
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
import os
import google.generativeai as genai
from flask import Flask, render_template, request
from user_data import get_user_history
from logs import save_log
from book_recommendations import (
    recommend_fiction,
    recommend_non_fiction,
    recommend_science,
    recommend_fantasy
)

app = Flask(__name__)

# Configurar a chave de API
GOOGLE_API_KEY = os.environ.get('GOOGLE_API_KEY')
genai.configure(api_key=GOOGLE_API_KEY)

# Definir o modelo generativo com as funções disponíveis
magical_if = genai.GenerativeModel(
    "gemini-1.5-flash",
    tools=[
        recommend_fiction,
        recommend_non_fiction,
        recommend_science,
        recommend_fantasy
    ]
)


def ia_decision(user_id, history):
    business_rules = """
    Analise o histórico de compras do usuário e chame diretamente a função
      correspondente à categoria de livros recomendada.

    Regras:
    1. Se o usuário comprou mais livros de ficção, recomende ficção.
    2. Se o usuário comprou mais livros de não ficção, recomende não ficção.
    3. Se o usuário demonstrou interesse em ciência, recomende ciência.
    4. Se o usuário demonstrou interesse em fantasia, recomende fantasia.
    5. Caso contrário, ofereça uma recomendação geral de ficção.

    ATENÇÃO: Sempre retorne a resposta da função chamada.
    Não explique, apenas chame.
    """
    user_decision = magical_if.start_chat(
        enable_automatic_function_calling=True
    )

    message = (
        f"Histórico do usuário {user_id}: {history}\n"
        f"Regras de negócio:\n{business_rules}"
    )

    response = user_decision.send_message(message)

    # Tenta obter a chamada de função feita pela IA
    try:
        function_call = response.candidates[0].content.parts[0].function_call
        function_name = function_call.name

        user_function = {
            "recommend_fiction": recommend_fiction,
            "recommend_non_fiction": recommend_non_fiction,
            "recommend_science": recommend_science,
            "recommend_fantasy": recommend_fantasy
        }.get(function_name)

        if user_function:
            return user_function(user_id)
    except (AttributeError, IndexError):
        pass

    # Caso nenhuma função tenha sido chamada, retorna o texto
    return response.text


@app.route('/recommend/<int:user_id>')
def recommend(user_id):
    history = get_user_history(user_id)
    if not history:
        return "Usuário não encontrado", 404
    ia_response = ia_decision(user_id, history)
    save_log(user_id, history, ia_response)
    return render_template(
        'recommendation.html',
        user_id=user_id,
        message=ia_response
    )


@app.route('/chat/<int:user_id>', methods=['GET', 'POST'])
def chat(user_id):
    history = get_user_history(user_id)
    if not history:
        return "Usuário não encontrado", 404

    response = None

    if request.method == 'POST':
        question = request.form.get('question')
        user_decision = magical_if.start_chat(
            enable_automatic_function_calling=True
        )
        gemini_response = user_decision.send_message(
            f"Usuário {user_id}, histórico: {history}. Pergunta: {question}"
        )

        try:
            function_call = (
                gemini_response
                .candidates[0]
                .content.parts[0]
                .function_call
            )
            function_name = function_call.name
            user_function = {
                "recommend_fiction": recommend_fiction,
                "recommend_non_fiction": recommend_non_fiction,
                "recommend_science": recommend_science,
                "recommend_fantasy": recommend_fantasy
            }.get(function_name)

            if user_function:
                response = user_function(user_id)
            else:
                response = gemini_response.text
        except (AttributeError, IndexError):
            response = gemini_response.text

        save_log(user_id, history, response)

    return render_template('chat.html', user_id=user_id, response=response)


@app.route('/perfil/<int:user_id>', methods=['GET', 'POST'])
def perfil(user_id):
    history = get_user_history(user_id)
    if not history:
        return "Usuário não encontrado", 404

    if request.method == 'POST':
        name = request.form.get('name')
        preferences = request.form.getlist('preferences')
        # aqui vamos salvar nome e preferências
        history['name'] = name
        history['preferences'] = preferences

    return render_template('perfil.html', user_id=user_id, history=history)


if __name__ == '__main__':
    app.run(debug=True)