jira-ai-assistant / modules /interface /ai_assistant_ui.py
DocUA's picture
Єдиний коміт - очищення історії
4ad5efa
import gradio as gr
import logging
import os
logger = logging.getLogger("jira_assistant_interface")
def init_indices_handler(app):
"""
Обробник для кнопки ініціалізації індексів для гібридного чату.
Використовує безпосередньо логіку JiraHybridChat для створення індексів.
Args:
app: Екземпляр JiraAssistantApp
Returns:
str: HTML-повідомлення про результат
"""
if not hasattr(app, 'current_data') or app.current_data is None:
return "<p style='color:red;'>❌ Помилка: спочатку завантажте дані CSV</p>"
try:
# Функція для ініціалізації індексів через JiraHybridChat
def initialize_chat_indices():
try:
from modules.ai_analysis.jira_hybrid_chat import JiraHybridChat
# Визначаємо директорію для індексів
indices_dir = None
if hasattr(app, 'current_session_id') and app.current_session_id is not None:
indices_dir = f"temp/indices/{app.current_session_id}"
os.makedirs(indices_dir, exist_ok=True)
# Створюємо екземпляр JiraHybridChat
chat = JiraHybridChat(
indices_dir=indices_dir,
app=app
)
# Якщо хочемо примусово перезавантажити/створити індекси,
# викликаємо load_indices
success = chat.load_indices(indices_dir)
if not success:
return {"error": "Не вдалося створити або завантажити індекси"}
# Отримуємо потрібні посилання на створені ретривери/індекси
vector_index = chat.index
bm25_retriever = chat.retriever_bm25
if not vector_index or not bm25_retriever:
return {"error": "Не вдалося створити індекси"}
# Зберігаємо шлях до індексів
app.indices_path = indices_dir
# Очищуємо кеш чату для перезавантаження з новими індексами
if hasattr(JiraHybridChat, 'chat_instances_cache'):
JiraHybridChat.chat_instances_cache = {}
return {
"success": True,
"indices_dir": indices_dir
}
except Exception as e:
import traceback
logger.error(f"Помилка при ініціалізації індексів: {e}\n{traceback.format_exc()}")
return {"error": str(e)}
# Викликаємо функцію ініціалізації
result = initialize_chat_indices()
if "error" in result:
return f"<p style='color:red;'>❌ Помилка при створенні індексів: {result['error']}</p>"
# Формуємо HTML для відображення результату
html_result = f"""
<div style='background-color:#e6f7e6; padding:15px; border-left:4px solid #28a745; border-radius:5px;'>
<p style='color:#28a745; font-weight:bold; font-size:16px;'>✅ Індекси успішно створено!</p>
<p>Директорія індексів: {result.get('indices_dir')}</p>
<p><b>Тепер можна використовувати гібридний чат!</b></p>
</div>
"""
return html_result
except Exception as e:
import traceback
error_details = traceback.format_exc()
logger.error(f"Помилка при ініціалізації індексів: {e}\n{error_details}")
return f"<p style='color:red;'>❌ Помилка при ініціалізації індексів: {str(e)}</p>"
def create_ai_assistant_tab(app):
"""
Створює вкладку 'AI Асистенти' у Gradio інтерфейсі.
Спроба завантажити або модифікований, або стандартний AI асистент.
Якщо імпорт не вдається, показується повідомлення про залежності.
"""
with gr.Tab("AI Асистенти"):
try:
# Додаємо секцію для ініціалізації індексів
gr.Markdown("## Ініціалізація індексів для гібридного пошуку")
gr.Markdown("""
Для роботи гібридного чату потрібно створити індекси FAISS і BM25.
Це потрібно зробити один раз після завантаження нових даних.
Кожен рядок CSV буде конвертовано в окрему ноду для пошуку.
""")
init_indices_btn = gr.Button("Ініціалізувати індекси", variant="primary")
indices_status = gr.HTML(label="Статус індексів")
# Прив'язуємо обробник до кнопки
init_indices_btn.click(
fn=lambda: init_indices_handler(app),
inputs=[],
outputs=[indices_status]
)
# Спробуємо модифіковану версію
try:
from modules.ai_analysis.ai_assistant_integration_mod import setup_ai_assistant_tab
setup_ai_assistant_tab(app, gr)
logger.info("Успішно завантажено модифіковану версію AI асистента")
except ImportError:
logger.info("Помилка завантаження модифікованої версії AI асистента")
except ImportError as e:
logger.error(f"Помилка імпорту модулів для AI асистента: {e}")
gr.Markdown("## AI Асистенти для Jira")
gr.Markdown(f"""
### ⚠️ Потрібні додаткові залежності
Для роботи AI асистентів необхідно встановити додаткові бібліотеки:
```bash
pip install llama-index-llms-gemini llama-index llama-index-embeddings-openai llama-index-retrievers-bm25 llama-index-vector-stores-faiss faiss-cpu tiktoken
```
Помилка: {str(e)}
""")