|
|
|
import streamlit as st
|
|
from .chat_process import ChatProcessor
|
|
from ..database.chat_mongo_db import store_chat_history
|
|
import logging
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
def display_sidebar_chat(lang_code: str, chatbot_t: dict):
|
|
"""Chatbot mejorado con manejo completo del contexto semántico"""
|
|
with st.sidebar:
|
|
|
|
st.markdown("""
|
|
<style>
|
|
.chat-container {
|
|
max-height: 60vh;
|
|
overflow-y: auto;
|
|
padding: 10px;
|
|
}
|
|
.chat-message { margin-bottom: 15px; }
|
|
</style>
|
|
""", unsafe_allow_html=True)
|
|
|
|
try:
|
|
|
|
if 'chat_processor' not in st.session_state:
|
|
st.session_state.chat_processor = ChatProcessor()
|
|
logger.info("Nuevo ChatProcessor inicializado")
|
|
|
|
|
|
if st.session_state.get('semantic_agent_active', False):
|
|
semantic_data = st.session_state.get('semantic_agent_data')
|
|
if semantic_data and all(k in semantic_data for k in ['text', 'metrics']):
|
|
try:
|
|
st.session_state.chat_processor.set_semantic_context(
|
|
text=semantic_data['text'],
|
|
metrics=semantic_data['metrics'],
|
|
graph_data=semantic_data.get('graph_data'),
|
|
lang_code=lang_code
|
|
)
|
|
logger.info("Contexto semántico configurado en el chat")
|
|
except Exception as e:
|
|
logger.error(f"Error configurando contexto: {str(e)}")
|
|
st.error("Error al configurar el análisis. Recargue el documento.")
|
|
return
|
|
|
|
|
|
with st.expander("💬 Asistente de Análisis", expanded=True):
|
|
|
|
if 'sidebar_messages' not in st.session_state:
|
|
initial_msg = {
|
|
'en': "Hello! Ask me about the semantic analysis.",
|
|
'es': "¡Hola! Pregúntame sobre el análisis semántico.",
|
|
'pt': "Olá! Pergunte-me sobre a análise semântica."
|
|
}.get(lang_code, "Hello!")
|
|
|
|
st.session_state.sidebar_messages = [
|
|
{"role": "assistant", "content": initial_msg}
|
|
]
|
|
|
|
|
|
chat_container = st.container()
|
|
with chat_container:
|
|
for msg in st.session_state.sidebar_messages:
|
|
st.chat_message(msg["role"]).write(msg["content"])
|
|
|
|
|
|
user_input = st.chat_input(
|
|
{
|
|
'en': "Ask about the analysis...",
|
|
'es': "Pregunta sobre el análisis...",
|
|
'pt': "Pergunte sobre a análise..."
|
|
}.get(lang_code, "Message...")
|
|
)
|
|
|
|
if user_input:
|
|
try:
|
|
|
|
with chat_container:
|
|
st.chat_message("user").write(user_input)
|
|
st.session_state.sidebar_messages.append(
|
|
{"role": "user", "content": user_input}
|
|
)
|
|
|
|
|
|
with st.chat_message("assistant"):
|
|
response = st.write_stream(
|
|
st.session_state.chat_processor.process_chat_input(
|
|
user_input, lang_code
|
|
)
|
|
)
|
|
st.session_state.sidebar_messages.append(
|
|
{"role": "assistant", "content": response.replace("▌", "")}
|
|
)
|
|
|
|
|
|
if 'username' in st.session_state:
|
|
store_chat_history(
|
|
username=st.session_state.username,
|
|
messages=st.session_state.sidebar_messages,
|
|
chat_type='semantic_analysis',
|
|
metadata={
|
|
'text_sample': st.session_state.semantic_agent_data['text'][:500],
|
|
'concepts': st.session_state.semantic_agent_data['metrics']['key_concepts'][:5]
|
|
}
|
|
)
|
|
|
|
except Exception as e:
|
|
logger.error(f"Error en conversación: {str(e)}", exc_info=True)
|
|
st.error({
|
|
'en': "Error processing request. Try again.",
|
|
'es': "Error al procesar. Intente nuevamente.",
|
|
'pt': "Erro ao processar. Tente novamente."
|
|
}.get(lang_code, "Error"))
|
|
|
|
|
|
if st.button("🔄 Reiniciar Chat"):
|
|
st.session_state.sidebar_messages = []
|
|
st.rerun()
|
|
|
|
except Exception as e:
|
|
logger.error(f"Error fatal en sidebar_chat: {str(e)}", exc_info=True)
|
|
st.error("System error. Please refresh the page.") |