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())