Spaces:
Build error
Build error
File size: 6,182 Bytes
93bc534 |
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 |
import streamlit as st
import pandas as pd
import folium
from streamlit_folium import st_folium
from groq import Groq
from streamlit_geolocation import streamlit_geolocation
from streamlit_js_eval import streamlit_js_eval, get_geolocation
import time
client = Groq(
api_key="",
)
# Carrega o DataFrame de promoções
promotions_df = pd.read_csv("promotions.csv")
# Função para obter a localização do usuário
def get_user_location():
try:
location = get_geolocation()
time.sleep(9)
latitude = location['coords']['latitude']
longitude = location['coords']['longitude']
return latitude, longitude
except Exception as e:
st.write(f"Aguarde um pouco...: {e}")
return None, None
# Função para encontrar promoções
def find_promotions():
promotions = []
for index, row in promotions_df.iterrows():
promotions.append(row)
return promotions
# Função para criar o mapa com folium
def create_map(user_latitude, user_longitude, nearby_promotions):
try:
st.subheader("Mapa de Ofertas")
# Cria o mapa centrado na localização do usuário
promo_map = folium.Map(location=[user_latitude, user_longitude], zoom_start=12)
# Adiciona um marcador para a localização do usuário (com uma cor diferente)
folium.Marker(
location=[user_latitude, user_longitude],
popup="Sua Localização",
icon=folium.Icon(color="red", icon="user"),
).add_to(promo_map)
# Adiciona marcadores para promoções
for _, promotion in nearby_promotions.iterrows():
folium.Marker(
location=[promotion["latitude"], promotion["longitude"]],
popup=f"{promotion['product']} em {promotion['store']} ({promotion['discount']}% de desconto)",
icon=folium.Icon(color="blue", icon="shopping-cart"),
).add_to(promo_map)
return promo_map
except Exception as e:
st.error(f"Tente novamente carregar a página")
return None
# Função para o chat com o LLM
def chat_with_llm(user_latitude, user_longitude, promotions):
# Inicia o chat
st.subheader("Chat com o Especialista em Promoções")
user_input = st.text_input("Digite a sua pergunta sobre ofertas:")
# Formata as promoções próximas para o prompt do LLM
promotions_str = "\n".join(
f"Promoção {i+1}: {row['product']} em {row['store']} cujo endereço é: {row['endereco']} ({row['discount']}% de desconto)"
for i, row in enumerate(promotions)
)
# Processa a pergunta do usuário
if user_input:
# Cria o prompt para o LLM
prompt = f"""
Você é um especialista em recomendação de produtos baseado em promoções.Deve responder somente perguntas sobre ofertas e promoções.
Promoções próximas:
{promotions_str}
Um usuário em ({user_latitude}, {user_longitude}) fez a seguinte pergunta:
{user_input}
Responda à pergunta do usuário de forma útil e informativa.
"""
chat_completion = client.chat.completions.create(
messages=[
{"role": "system", "content": "Você é especialista em recomendação de produtos baseado em promoções"},
{"role": "user", "content": prompt}
],
model="llama3-8b-8192",
)
# Exibe a resposta do LLM
st.write(chat_completion.choices[0].message.content)
# Interface do Streamlit
st.title("OfertasBot")
st.write("O OfertasBot, tem o objetivo de se tornar o Waze das ofertas e promoções.")
st.write("O seu novo assistente pessoal para economizar em grande estilo! Com a inteligência do nosso chatbot, você receberá recomendações exclusivas de promoções e descontos em produtos que realmente interessam a você. Basta conversar com o OfertasBot e deixar que ele encontre as melhores ofertas em tempo real, de acordo com suas preferências e localização. Nunca foi tão fácil fazer compras inteligentes! Colabore com a comunidade adicionado ofertas.")
# Menu de opções
option = st.sidebar.selectbox("Selecione uma opção", ["Mapa", "Adicionar Promoção", "Chat com OfertasBot"])
# Executa a função correspondente à opção selecionada
if option == "Mapa":
# Obtém a localização do usuário
user_latitude, user_longitude = get_user_location()
# Cria o mapa interativo com Folium
promo_map = create_map(float(user_latitude), float(user_longitude), promotions_df)
# Exibe o mapa na interface Streamlit
st_data = st_folium(promo_map, width=725)
elif option == "Adicionar Promoção":
#user_latitude, user_longitude = get_user_location()
st.subheader("Adicionar Nova Promoção")
product = st.text_input("Produto")
store = st.text_input("Loja")
discount = st.number_input("Desconto (%)", min_value=0, max_value=100)
st.write("Clique no botão para obter a localização:")
geolocator = streamlit_geolocation()
promotion_latitude = geolocator['latitude']
promotion_longitude = geolocator['longitude']
endereco = st.text_input("Forneça o Endereço algum ponto de referência")
# Adiciona a nova promoção ao banco de dados
if st.button("Adicionar"):
new_promotion = {
"product": product,
"store": store,
"discount": discount,
"latitude": float(promotion_latitude),
"longitude": float(promotion_longitude),
"endereco":endereco,
}
promotions_df = pd.concat([promotions_df, pd.DataFrame([new_promotion])], ignore_index=True)
promotions_df.to_csv("promotions.csv", index=False)
st.success("Promoção adicionada com sucesso!")
elif option == "Chat com OfertasBot":
# Obtém a localização do usuário
#user_latitude, user_longitude = get_user_location()
# Inicia o chat com o LLM
user_latitude, user_longitude = get_user_location()
chat_with_llm(float(user_latitude), float(user_longitude),find_promotions())
|