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