File size: 3,753 Bytes
b49f954
 
 
 
 
 
118e0c4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2d8002a
118e0c4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2d8002a
118e0c4
 
b95ae72
118e0c4
 
 
 
2d8002a
118e0c4
 
 
 
 
 
 
2d8002a
 
b49f954
 
 
90397ac
 
2d8002a
 
b49f954
 
 
b71d555
2d8002a
b49f954
 
 
2d8002a
b49f954
 
2d8002a
b49f954
118e0c4
a15da7e
2d8002a
 
b49f954
 
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
import streamlit as st
from langchain_core.messages import HumanMessage, AIMessage
from get_classification import get_graph_class
from datetime import datetime


def message_to_dict(messages):
    result = []
    for message in messages:
        if isinstance(message, HumanMessage) or isinstance(message, AIMessage):
            print("message:", message.content)
        if message.content == "" or message.content is None:
            continue
        if isinstance(message, HumanMessage):
            result.append({"role": "user", "content": message.content})
        elif isinstance(message, AIMessage):
            result.append({"role": "assistant", "content": message.content})
    print("-" * 100)
    return result


def find_last_bot_message(messages):
    """Находит последнее сообщение бота"""
    for message in messages[::-1]:
        if isinstance(message, AIMessage) and len(message.content) > 0:
            return message.content
    return None


def display_chat_messages():
    """Отображает историю сообщений в чате"""
    for message in st.session_state.messages:
        with st.chat_message(message["role"]):
            st.markdown(message["content"])


def save_broken_case():
    messages_dict = st.session_state.messages
    result_str = ""
    for elem in messages_dict:
        role = elem["role"]
        content = elem["content"]
        result_str += f"{role}: {content}\n"
    
    current_datetime = datetime.now()
    formatted_datetime = current_datetime.strftime("%Y-%m-%d %H:%M:%S")

    # with open("/Users/admin/my_documents/retrieval_part/services/broken_cases.txt", "a") as file:
    #     file.write(f"{formatted_datetime}\n" + result_str + "\n" + "-" * 50 + "\n\n")


def handle_user_input():
    """Обрабатывает ввод пользователя и генерирует ответ бота"""
    if prompt := st.chat_input("Введите ваш вопрос"):
        st.session_state.messages.append({"role": "user", "content": prompt})
        if prompt.lower().startswith("log"):
            save_broken_case()
            st.session_state.messages = []
            display_chat_messages()
        else:
            with st.chat_message("user"):
                st.markdown(prompt)
            
            try:
                if "bot" not in st.session_state:
                    print("init!!!!")
                    st.session_state.bot = get_graph_class(prompt)
                st.session_state.bot.invoke(prompt)
            except Exception as e:
                st.error(f"Ошибка: {str(e)}")
            
            # Извлекаем последнее сообщение бота
            last_bot_message = find_last_bot_message(st.session_state.bot.messages)
            st.session_state.messages.append(
                {"role": "assistant", "content": last_bot_message}
            )
            with st.chat_message("assistant"):
                st.markdown(last_bot_message)


def clear_chat():
    """Очищает чат и пересоздает бота"""
    st.session_state.messages = []
    if "bot" in st.session_state:
        del st.session_state.bot


def main():
    """Основная функция приложения"""
    # Заголовок приложения
    st.title("Чат-бот технической поддержки")

    # Кнопка очистки чата
    if st.button("Clear"):
        clear_chat()

    if "messages" not in st.session_state:
        st.session_state.messages = []

    # Отображение чата и обработка ввода
    display_chat_messages()
    handle_user_input()


if __name__ == "__main__":
    main()