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