AIdeaText commited on
Commit
81f28a3
·
verified ·
1 Parent(s): cc7c0b6

Create sidebar_chat.py

Browse files
Files changed (1) hide show
  1. modules/chatbot/sidebar_chat.py +140 -0
modules/chatbot/sidebar_chat.py ADDED
@@ -0,0 +1,140 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # modules/chatbot/sidebar_chat.py
2
+ import streamlit as st
3
+ from .chat_process import ChatProcessor
4
+ from ..database.chat_mongo_db import store_chat_history
5
+ import logging
6
+
7
+ logger = logging.getLogger(__name__)
8
+
9
+ def display_sidebar_chat(lang_code: str, chatbot_t: dict):
10
+ """Chatbot mejorado con manejo completo del contexto semántico"""
11
+ with st.sidebar:
12
+ # Configuración de estilos
13
+ st.markdown("""
14
+ <style>
15
+ .chat-container {
16
+ max-height: 60vh;
17
+ overflow-y: auto;
18
+ padding: 10px;
19
+ }
20
+ .chat-message { margin-bottom: 15px; }
21
+ </style>
22
+ """, unsafe_allow_html=True)
23
+
24
+ try:
25
+ # Inicialización del procesador
26
+ if 'chat_processor' not in st.session_state:
27
+ st.session_state.chat_processor = ChatProcessor()
28
+ logger.info("Nuevo ChatProcessor inicializado con AWS Bedrock")
29
+
30
+ # Configurar contexto semántico si está activo
31
+ if st.session_state.get('semantic_agent_active', False):
32
+ semantic_data = st.session_state.get('semantic_agent_data')
33
+ if semantic_data and all(k in semantic_data for k in ['text', 'metrics']):
34
+ try:
35
+ st.session_state.chat_processor.set_semantic_context(
36
+ text=semantic_data['text'],
37
+ metrics=semantic_data['metrics'],
38
+ graph_data=semantic_data.get('graph_data'),
39
+ lang_code=lang_code
40
+ )
41
+ logger.info("Contexto semántico configurado en el chat")
42
+
43
+ # Mostrar indicador visual de que el grafo está disponible
44
+ if semantic_data.get('graph_data'):
45
+ st.info("📊 Grafo disponible para consultas visuales")
46
+
47
+ except Exception as e:
48
+ logger.error(f"Error configurando contexto: {str(e)}")
49
+ st.error("Error al configurar el análisis. Recargue el documento.")
50
+ return
51
+
52
+ # Interfaz del chat
53
+ with st.expander("💬 Asistente de Análisis", expanded=True):
54
+ # Inicializar historial si no existe
55
+ if 'sidebar_messages' not in st.session_state:
56
+ initial_msg = {
57
+ 'en': "Hello! Ask me about the semantic analysis.",
58
+ 'es': "¡Hola! Pregúntame sobre el análisis semántico.",
59
+ 'pt': "Olá! Pergunte-me sobre a análise semântica.",
60
+ 'fr': "Bonjour! Demandez-moi sur l'analyse sémantique."
61
+ }.get(lang_code, "Hello!")
62
+
63
+ st.session_state.sidebar_messages = [
64
+ {"role": "assistant", "content": initial_msg}
65
+ ]
66
+
67
+ # Mostrar historial
68
+ chat_container = st.container()
69
+ with chat_container:
70
+ for msg in st.session_state.sidebar_messages:
71
+ st.chat_message(msg["role"]).write(msg["content"])
72
+
73
+ # Manejo de mensajes nuevos
74
+ user_input = st.chat_input(
75
+ {
76
+ 'en': "Ask about the analysis...",
77
+ 'es': "Pregunta sobre el análisis...",
78
+ 'fr': "Question sur l'analyse...",
79
+ 'pt': "Pergunte sobre a análise..."
80
+ }.get(lang_code, "Message...")
81
+ )
82
+
83
+ if user_input:
84
+ try:
85
+ # Mostrar mensaje del usuario
86
+ with chat_container:
87
+ st.chat_message("user").write(user_input)
88
+ st.session_state.sidebar_messages.append(
89
+ {"role": "user", "content": user_input}
90
+ )
91
+
92
+ # Obtener y mostrar respuesta (con limpieza de caracteres)
93
+ with st.chat_message("assistant"):
94
+ response_stream = st.session_state.chat_processor.process_chat_input(
95
+ user_input, lang_code
96
+ )
97
+
98
+ # Limpiar el stream de respuesta
99
+ def clean_response_stream(stream):
100
+ for chunk in stream:
101
+ yield chunk.replace("▌", "")
102
+
103
+ response = st.write_stream(clean_response_stream(response_stream))
104
+
105
+ # Guardar respuesta limpia
106
+ clean_response = response.replace("▌", "")
107
+ st.session_state.sidebar_messages.append(
108
+ {"role": "assistant", "content": clean_response}
109
+ )
110
+
111
+ # Guardar en base de datos (con texto limpio)
112
+ if 'username' in st.session_state and st.session_state.get('semantic_agent_data'):
113
+ store_chat_history(
114
+ username=st.session_state.username,
115
+ messages=st.session_state.sidebar_messages,
116
+ chat_type='semantic_analysis',
117
+ metadata={
118
+ 'text_sample': st.session_state.semantic_agent_data['text'][:500],
119
+ 'concepts': st.session_state.semantic_agent_data['metrics']['key_concepts'][:5],
120
+ 'graph_used': bool(st.session_state.semantic_agent_data.get('graph_data'))
121
+ }
122
+ )
123
+
124
+ except Exception as e:
125
+ logger.error(f"Error en conversación: {str(e)}", exc_info=True)
126
+ st.error({
127
+ 'en': "Error processing request. Try again.",
128
+ 'es': "Error al procesar. Intente nuevamente.",
129
+ 'fr': "Erreur de traitement. Veuillez réessayer.",
130
+ 'pt': "Erro ao processar. Tente novamente."
131
+ }.get(lang_code, "Error"))
132
+
133
+ # Botón para reiniciar
134
+ if st.button("🔄 Reiniciar Chat"):
135
+ st.session_state.sidebar_messages = []
136
+ st.rerun()
137
+
138
+ except Exception as e:
139
+ logger.error(f"Error fatal en sidebar_chat: {str(e)}", exc_info=True)
140
+ st.error("System error. Please refresh the page.")