Pecximenes's picture
Uploading Fauses's agent
b7835d9
import streamlit as st
import streamlit.components.v1 as components
import re
import sys
import os
import requests
from bs4 import BeautifulSoup
import difflib
from urllib.parse import urlparse, unquote
from pipelines.message import send_message
from agent import pipeline, knowledge, graph, graph_data
# Configuração do caminho
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
# Substitui o caminho do gráfico pelo conteúdo do graph_data
graph = graph.replace('"../memory/graph_data.json"', f'{graph_data}')
# Variáveis globais
extracted_links = []
# Configuração inicial do histórico de chat
if "chat_history" not in st.session_state:
st.session_state.chat_history = []
# Funções utilitárias
def extract_content(text, tag):
"""Extrai conteúdo de um texto com base na tag fornecida."""
pattern = rf'<{tag}>(.*?)</{tag}>'
match = re.search(pattern, text, re.DOTALL)
return match.group(1).strip() if match else None
def fetch_webpage_content(url):
"""Obtém o conteúdo HTML de uma URL e retorna o conteúdo principal."""
try:
response = requests.get(url)
response.raise_for_status()
soup = BeautifulSoup(response.text, 'html.parser')
main_content = soup.find('div', id='main')
if main_content:
body_tag = soup.find('body')
if body_tag:
body_tag.clear()
body_tag.append(main_content)
return str(soup)
return "<html><body><p>Could not find main content on the page.</p></body></html>"
except requests.RequestException as e:
return f"<html><body><p>Error fetching the webpage: {str(e)}</p></body></html>"
def extract_links(html_content):
"""Extrai todos os links (URLs) de um conteúdo HTML."""
soup = BeautifulSoup(html_content, 'html.parser')
return [a_tag['href'] for a_tag in soup.find_all('a', href=True)]
def url_to_suggestion(url):
"""Converte uma URL longa em uma sugestão amigável."""
path = unquote(urlparse(url).path).strip('/').split('/')
return path[-1].replace('-', ' ').replace('_', ' ').capitalize() if path else url
def display_suggestions(links):
"""Exibe sugestões para o usuário com base nos links extraídos."""
suggestions = [(link, url_to_suggestion(link)) for link in links if url_to_suggestion(link)]
st.subheader("Sugestões de Passos:")
if suggestions:
st.write("Você também pode se interessar em:")
for link, suggestion in suggestions:
st.write(f"- {suggestion}")
else:
st.write("Não há sugestões disponíveis no momento.")
def display_knowledge_tree(structure):
"""Exibe a estrutura de conhecimento na barra lateral do Streamlit."""
with st.sidebar.expander("Knowledge Structure", expanded=True):
components.html(graph, height=600, scrolling=True)
st.markdown(structure)
def navigate_page(full_url):
"""Função para navegar para uma nova página e atualizar o conteúdo."""
global extracted_links
with st.spinner("Obtendo conteúdo da página..."):
content = fetch_webpage_content(full_url)
extracted_links = extract_links(content)
st.session_state.chat_history.append({"type": "page", "content": content, "links": extracted_links})
st.subheader("Conteúdo da Página Web:")
components.html(content, height=600, scrolling=True)
display_suggestions(extracted_links)
st.subheader("URL Completa:")
st.write(full_url)
def main():
st.title("Alfred - Assistente de IA para Serviços gov.br")
st.write("Qual a sua dificuldade hoje? Estou aqui para ajudar!")
display_knowledge_tree(knowledge)
# Exibe o histórico do chat
for message in st.session_state.chat_history:
if message["type"] == "text":
st.markdown(message["content"])
elif message["type"] == "page":
st.subheader("Conteúdo da Página Web:")
components.html(message["content"], height=400, scrolling=True)
with st.form(key='user_input_form', clear_on_submit=True):
user_query = st.text_input("Digite sua mensagem aqui:")
submit_button = st.form_submit_button(label='Enviar')
if submit_button and user_query:
response_text = send_message(user_query, pipeline)
st.write("Bot:", response_text)
st.session_state.chat_history.append({"type": "text", "content": f"**Você:** {user_query}"})
# Extração do caminho da resposta do bot
path = extract_content(response_text, "path")
if path:
base_url = "https://www.gov.br/governodigital/pt-br/"
full_url = base_url + path
navigate_page(full_url)
st.session_state.chat_history.append({"type": "text", "content": f"**Bot:** {response_text}"})
if __name__ == "__main__":
main()