File size: 3,352 Bytes
450846b
d1254fd
 
 
450846b
d1254fd
 
 
450846b
d1254fd
 
 
 
 
 
450846b
d1254fd
 
 
 
 
 
 
 
 
 
 
450846b
d1254fd
 
 
 
 
 
 
 
 
 
 
450846b
d1254fd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
450846b
d1254fd
 
 
 
 
 
450846b
d1254fd
 
 
 
 
450846b
d1254fd
450846b
d1254fd
 
 
 
 
450846b
 
d1254fd
 
 
 
 
 
450846b
d1254fd
450846b
d1254fd
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
import gradio as gr
from langchain_core.messages import HumanMessage, AIMessage
from get_classification import get_graph_class
from datetime import datetime

# Глобальные переменные состояния (аналог session_state в Streamlit)
messages = []
bot_instance = None

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

def save_broken_case(messages_dict):
    """Сохраняет 'сломанные' кейсы (заглушка)"""
    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")
    print(f"Saved broken case at {formatted_datetime}:\n{result_str}")

def predict(message, history):
    """Обработка ввода пользователя и генерация ответа"""
    global messages, bot_instance
    
    # Обработка команды log
    if message.lower().startswith("log"):
        save_broken_case(messages)
        messages = []
        return ""
    
    # Добавляем сообщение пользователя
    messages.append({"role": "user", "content": message})
    
    try:
        # Инициализация бота при первом запросе
        if bot_instance is None:
            bot_instance = get_graph_class(message)
        
        # Вызываем бота
        bot_instance.invoke(message)
        
        # Извлекаем последний ответ бота
        last_bot_message = find_last_bot_message(bot_instance.messages)
        last_bot_message = last_bot_message or "Извините, не удалось сгенерировать ответ"
        
        # Добавляем ответ в историю
        messages.append({"role": "assistant", "content": last_bot_message})
        return last_bot_message
    
    except Exception as e:
        error_msg = f"Ошибка: {str(e)}"
        messages.append({"role": "assistant", "content": error_msg})
        return error_msg

def clear_chat():
    """Очистка чата и сброс состояния"""
    global messages, bot_instance
    messages = []
    bot_instance = None
    return []

# Создаем интерфейс чата
chat_interface = gr.ChatInterface(
    fn=predict,
    title="Чат-бот технической поддержки",
    description="Задайте ваш вопрос технической поддержке",
    additional_inputs=[
        gr.Button("Clear", variant="stop")
    ],
    examples=[
        "Как настроить VPN?",
        "Почему не работает принтер?",
        "Как сбросить пароль?"
    ]
)

# Добавляем обработчик для кнопки Clear
chat_interface.additional_inputs[0].click(
    fn=clear_chat,
    inputs=[],
    outputs=chat_interface.chatbot
)

# Запускаем приложение
if __name__ == "__main__":
    chat_interface.launch()