Spaces:
Running
Running
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() | |