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 "
❌ Помилка: спочатку завантажте дані CSV
" 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"❌ Помилка при створенні індексів: {result['error']}
" # Формуємо HTML для відображення результату html_result = f"""✅ Індекси успішно створено!
Директорія індексів: {result.get('indices_dir')}
Тепер можна використовувати гібридний чат!
❌ Помилка при ініціалізації індексів: {str(e)}
" 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)} """)