File size: 5,092 Bytes
a43985f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# modules/chatbot/sidebar_chat.py
import streamlit as st
from .chat_process import ChatProcessor
from ..database.chat_mongo_db import store_chat_history, get_chat_history
import logging

logger = logging.getLogger(__name__)

def display_sidebar_chat(lang_code: str, chatbot_t: dict):
    """

    Muestra el chatbot en el sidebar

    Args:

        lang_code: C贸digo del idioma

        chatbot_t: Diccionario de traducciones del chatbot

    """
    # Asegurar que tenemos las traducciones necesarias
    default_translations = {
        'error_message': 'An error occurred',
        'expand_chat': 'Open Assistant',
        'initial_message': 'Hi! How can I help?',
        'input_placeholder': 'Type your message...',
        'clear_chat': 'Clear chat'
    }
    
    # Combinar traducciones por defecto con las proporcionadas
    translations = {**default_translations, **chatbot_t}

    with st.sidebar:
        # Chatbot expandible
        with st.expander(translations['expand_chat'], expanded=False):
            try:
                # Inicializar procesador si no existe
                if 'chat_processor' not in st.session_state:
                    try:
                        st.session_state.chat_processor = ChatProcessor()
                    except Exception as e:
                        logger.error(f"Error inicializando ChatProcessor: {str(e)}")
                        st.error("Error: No se pudo inicializar el chat. Verifica la configuraci贸n.")
                        return
                
                # Inicializar mensajes si no existen
                if 'sidebar_messages' not in st.session_state:
                    # Intentar recuperar historial previo
                    try:
                        history = get_chat_history(st.session_state.username, 'sidebar', 10)
                        if history:
                            st.session_state.sidebar_messages = history[0]['messages']
                        else:
                            st.session_state.sidebar_messages = [
                                {"role": "assistant", "content": translations['initial_message']}
                            ]
                    except Exception as e:
                        logger.error(f"Error recuperando historial: {str(e)}")
                        st.session_state.sidebar_messages = [
                            {"role": "assistant", "content": translations['initial_message']}
                        ]

                # Contenedor del chat
                chat_container = st.container()

                # Mostrar mensajes existentes
                with chat_container:
                    for message in st.session_state.sidebar_messages:
                        with st.chat_message(message["role"]):
                            st.markdown(message["content"])

                # Input del usuario
                user_input = st.text_input(
                    translations['input_placeholder'],
                    key='sidebar_chat_input'
                )

                if user_input:
                    # Agregar mensaje del usuario
                    st.session_state.sidebar_messages.append(
                        {"role": "user", "content": user_input}
                    )
                
                    # Generar y mostrar respuesta
                    with chat_container:
                        with st.chat_message("assistant"):
                            message_placeholder = st.empty()
                            full_response = ""
                            
                            for chunk in st.session_state.chat_processor.process_chat_input(
                                user_input,
                                lang_code
                            ):
                                full_response += chunk
                                message_placeholder.markdown(full_response)
                            
                            # Guardar respuesta
                            st.session_state.sidebar_messages.append(
                                {"role": "assistant", "content": full_response.strip()}
                            )
                                    
                    # En la funci贸n donde guardamos el chat
                    store_chat_history(
                        username=st.session_state.username,
                        messages=st.session_state.sidebar_messages,
                        analysis_type='sidebar'  # Especificar el tipo
                    )

                # Bot贸n para limpiar chat
                if st.button(translations['clear_chat']):
                    st.session_state.sidebar_messages = [
                        {"role": "assistant", "content": translations['initial_message']}
                    ]
                    st.rerun()

            except Exception as e:
                logger.error(f"Error en sidebar chat: {str(e)}")
                st.error(translations['error_message'])