vioott's picture
refactor(user): remove static genre counters and redirect to chat after profile update
65b9d17
raw
history blame
6.71 kB
import os
import re
import google.generativeai as genai
from flask import Flask, redirect, render_template, request
from user_data import get_user_history, user_histories
from logs import save_log
app = Flask(__name__)
# Função para configurar a chave de API
def genai_configuration():
try:
genai.configure(api_key=os.environ['GOOGLE_API_KEY'])
# Testa se a chave principal está disponível
test_model = genai.GenerativeModel("gemini-1.5-flash")
test_model.start_chat().send_message("ping")
return
except Exception:
print("⚠️ Falha com a chave principal, tentando chave reserva 1.")
try:
genai.configure(api_key=os.environ['GOOGLE_API_KEY_2'])
# Testa se a chave reserva 1 está disponível
test_model = genai.GenerativeModel("gemini-1.5-flash")
test_model.start_chat().send_message("ping")
return
except Exception:
print("⚠️ Falha com a chave reserva 1, tentando chave reserva 2.")
try:
genai.configure(api_key=os.environ['GOOGLE_API_KEY_3'])
# Testa se a chave reserva 2 está disponível
test_model = genai.GenerativeModel("gemini-1.5-flash")
test_model.start_chat().send_message("ping")
return
except Exception:
print("❌ Todas as chaves falharam.")
genai_configuration()
# Definir o modelo generativo com as funções disponíveis
magical_if = genai.GenerativeModel("gemini-1.5-flash")
GENRES = sorted([
'ficção', 'não-ficção', 'ciência', 'fantasia', 'romance', 'mistério',
'terror', 'aventura', 'história', 'biografia', 'autoajuda',
'espiritualidade', 'filosofia', 'poesia', 'drama', 'humor', 'tecnologia',
'educação', 'negócios'
])
def ia_decision(user_id, history):
business_rules = """
Analise o histórico de compras do usuário e recomende livros a ele.
Regras:
1. Se o usuário demonstrou interesse em ficção, recomende ficção.
2. Se o usuário demonstrou interesse em 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. Se o usuário não demonstrou interesse em nenhuma categoria, recomende
os livros mais vendidos no último mês.
"""
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)
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
new_id = max(user_histories.keys()) + 1
user_histories[new_id] = {
'name': name,
'preferences': preferences
}
return redirect(f'/chat/{new_id}')
return render_template(
'start.html',
profiles=user_histories,
genres=GENRES
)
@app.route('/perfil/<int:user_id>', methods=['GET', 'POST'])
def perfil(user_id):
history = get_user_history(user_id)
if not history:
return '''
<html>
<head>
<meta http-equiv="refresh" content="2;url=/">
</head>
<body>
<h2>Ops, algo deu errado por aqui.</h2>
<p>Vou te levar de volta para a página inicial.</p>
</body>
</html>
'''
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 redirect(f'/chat/{user_id}')
return render_template(
'profile.html',
user_id=user_id,
history=history,
genres=GENRES
)
@app.route('/chat/<int:user_id>', methods=['GET', 'POST'])
def chat(user_id):
history = get_user_history(user_id)
if not history:
return '''
<html>
<head>
<meta http-equiv="refresh" content="2;url=/">
</head>
<body>
<h2>Ops, algo deu errado por aqui.</h2>
<p>Vou te levar de volta para a página inicial.</p>
</body>
</html>
'''
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"Você é uma especialista em livros e pode conversar livremente "
f"sobre obras literárias, personagens, enredos, gêneros e autores."
f" O nome do usuário é {name} e seu ID é {user_id}. A informação "
f"sobre o id é somente para você, não mencione nada sobre isso ao "
f"usuário. As preferências dele são: "
f"{', '.join(preferences) or 'nenhuma preferência registrada'}. "
f"Histórico de compras: {history}. "
f"Pergunta: {question}"
f"Responda na mesma língua em que foi feita a pergunta."
f"Sempre fale com o usuário se dirigindo diretamente a ele, "
f"não se refira a ele em terceira pessoa, como se estivesse "
f"falando de outra pessoa."
f" Dê respostas com no máximo 500 caracteres."
)
gemini_response = user_decision.send_message(prompt)
response = gemini_response.text
save_log(user_id, history, response)
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
)
if __name__ == '__main__':
app.run(debug=True)