File size: 7,226 Bytes
4ad5efa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
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)}
            """)