File size: 3,757 Bytes
4c3e2c0
a95e592
 
 
5827414
 
a95e592
 
 
 
 
 
5827414
a95e592
 
 
 
 
 
 
 
 
5827414
a95e592
5827414
a95e592
 
 
 
 
 
5827414
a95e592
5827414
a95e592
5827414
a95e592
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5827414
a95e592
5827414
a95e592
5827414
a95e592
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import streamlit as st
import requests
from PIL import Image
import base64


class ChatbotApp:
    def __init__(self):
        # URL do backend (Flask)
        self.backend_url = "http://localhost:5001/chat"
        self.title = "Chatbot Carômetro"
        self.description = "Este assistente virtual pode te ajudar com informações sobre carômetros da Sicoob."

    def stream_chat(self, user_input):
        """
        Faz a comunicação com o backend e retorna a resposta como streaming de tokens.
        """
        try:
            response = requests.post(
                self.backend_url,
                json={"message": user_input},
                stream=True  # Ativa o streaming
            )
            response.raise_for_status()

            # Gera os tokens conforme chegam no streaming
            for chunk in response.iter_content(chunk_size=512):
                if chunk:
                    yield chunk.decode("utf-8")
        except Exception as e:
            yield f"Erro ao conectar ao servidor: {e}"

    def render_sidebar(self):
        """
        Exibe opções na barra lateral e renderiza a logo do Sicoob.
        """
        st.sidebar.title("Configuração de LLM")
        sidebar_option = st.sidebar.radio("Selecione o LLM", ["gpt-3.5-turbo"])
        if sidebar_option != "gpt-3.5-turbo":
            raise Exception("Opção de LLM inválida!")

        # Exibe a logo do Sicoob na barra lateral
        with open("sicoob-logo.png", "rb") as f:
            data = base64.b64encode(f.read()).decode("utf-8")
            st.sidebar.markdown(
                f"""
                <div style="display:table;margin-top:-80%;margin-left:0%;">
                    <img src="data:image/png;base64,{data}" width="250" height="70">
                </div>
                """,
                unsafe_allow_html=True,
            )

    def render(self):
        """
        Renderiza a interface do chatbot.
        """
        # Configura título, ícone e layout da página
        im = Image.open("pngegg.png")
        st.set_page_config(page_title="Chatbot Carômetro", page_icon=im, layout="wide")

        # Renderiza a barra lateral
        self.render_sidebar()

        # Título e descrição
        st.title(self.title)
        st.write(self.description)

        # Inicializa o histórico na sessão
        if "chat_history" not in st.session_state:
            st.session_state.chat_history = []

        # Renderiza as mensagens do histórico
        for message in st.session_state.chat_history:
            role, text = message.split(":", 1)
            with st.chat_message(role.strip().lower()):
                st.write(text.strip())

        # Captura o input do usuário
        user_input = st.chat_input("Digite sua pergunta")
        if user_input:
            # Exibe a mensagem do usuário
            with st.chat_message("user"):
                st.write(user_input)
            st.session_state.chat_history.append(f"user: {user_input}")

            # Placeholder para a resposta do assistente
            with st.chat_message("assistant"):
                message_placeholder = st.empty()
                assistant_message = ""

                # Executa o streaming de tokens enquanto o backend responde
                for token in self.stream_chat(user_input):
                    assistant_message += token
                    message_placeholder.markdown(assistant_message + "▌")

                # Atualiza o placeholder com a mensagem final
                message_placeholder.markdown(assistant_message)
                st.session_state.chat_history.append(f"assistant: {assistant_message}")


if __name__ == "__main__":
    chatbot_app = ChatbotApp()
    chatbot_app.render()