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