File size: 5,720 Bytes
8161c55
8a4d350
809791b
8161c55
7a09325
8161c55
 
 
8a4d350
 
8161c55
 
 
 
 
 
 
 
 
 
 
 
 
 
8a4d350
 
8161c55
 
 
8a4d350
8161c55
 
7a09325
 
 
8161c55
 
 
 
7a09325
 
 
 
 
8161c55
8a4d350
 
 
7a09325
 
 
 
8161c55
7a09325
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8161c55
 
8a4d350
809791b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8161c55
 
 
809791b
 
 
 
 
 
 
 
 
8a4d350
8161c55
7a09325
 
 
 
 
 
 
 
 
 
 
 
 
c2139f1
 
 
 
 
 
 
 
7a09325
c2139f1
7a09325
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
809791b
 
 
 
 
 
7a09325
 
809791b
 
2962f9a
 
 
809791b
 
 
 
 
 
 
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
import os
import google.generativeai as genai
from flask import Flask, redirect, 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('/', methods=['GET', 'POST'])
def inicio():
    if request.method == 'POST':
        name = request.form.get('name')
        preferences = request.form.getlist('preferences')

        # Simula criação de novo ID
        from user_data import user_histories
        new_id = max(user_histories.keys()) + 1
        user_histories[new_id] = {
            'fiction': 0,
            'non_fiction': 0,
            'science': 0,
            'fantasy': 0,
            'name': name,
            'preferences': preferences
        }

        return redirect(f'/chat/{new_id}')

    return render_template('start.html')


@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('profile.html', user_id=user_id, history=history)


@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
        )
        name = history.get("name", f"Usuário {user_id}")
        preferences = history.get("preferences", [])
        prompt = (
            f"O nome do usuário é {name}. "
            f"As preferências dele são: "
            f"{', '.join(preferences) or 'nenhuma preferência registrada'}. "
            f"Histórico de compras: {history}. "
            f"Pergunta: {question}"
        )
        gemini_response = user_decision.send_message(prompt)
        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,
        history=history
    )


@app.route('/recomendacoes/<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
    )


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