File size: 6,513 Bytes
56fd21a
7299972
b88df70
ea4670b
af49a43
 
 
 
 
 
b88df70
68b95db
b88df70
 
68b95db
56fd21a
5855a4f
 
 
 
7299972
b88df70
8037dca
68b95db
b88df70
 
 
080d622
b88df70
 
 
c629e49
b88df70
 
2aa225e
b88df70
 
56fd21a
b88df70
 
 
5193d26
b88df70
 
 
 
 
0e8391a
b88df70
5193d26
b88df70
68b95db
b88df70
 
 
 
 
68b95db
b88df70
ea4670b
f4e115f
 
 
 
 
 
 
 
7d17621
 
 
 
f4e115f
 
 
 
 
b88df70
f4e115f
 
68b95db
b88df70
f4e115f
 
 
 
 
 
 
 
 
 
b88df70
f4e115f
68b95db
f4e115f
b88df70
68b95db
b88df70
f4e115f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
68b95db
b88df70
 
 
68b95db
b88df70
 
 
 
 
f4e115f
b88df70
f4e115f
 
 
 
 
 
 
 
 
 
 
84f1cd4
56fd21a
f4e115f
 
b88df70
f4e115f
 
 
 
 
 
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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
import os
import sys
import threading
import time

# Установка конфигурационной директории для Matplotlib
os.environ['MPLCONFIGDIR'] = os.path.join(os.getcwd(), 'cache', 'matplotlib')
# Создаем директорию с правильными правами
os.makedirs(os.environ['MPLCONFIGDIR'], exist_ok=True)

import gradio as gr
import uvicorn
import requests
from fastapi import FastAPI
from fastapi.responses import HTMLResponse

# Add project root to Python path
current_dir = os.path.abspath(os.path.dirname(__file__))
if current_dir not in sys.path:
    sys.path.insert(0, current_dir)

# Import our main application
from api.fastapi_server import app as fastapi_app

# Run FastAPI server in a separate thread
def run_fastapi():
    uvicorn.run(fastapi_app, host="0.0.0.0", port=8000)

# Start FastAPI in a background thread
fastapi_thread = threading.Thread(target=run_fastapi, daemon=True)
fastapi_thread.start()

# Wait for FastAPI to start
time.sleep(5)

# Create a Gradio interface that will proxy requests to FastAPI
def chat_with_api(message, conversation_id=None):
    try:
        response = requests.post(
            "http://127.0.0.1:8000/chat",
            json={"message": message, "conversation_id": conversation_id}
        )
        if response.status_code == 200:
            data = response.json()
            return data["response"], data["conversation_id"]
        else:
            return f"Error: {response.status_code} - {response.text}", conversation_id
    except Exception as e:
        return f"API connection error: {str(e)}", conversation_id

def build_kb():
    try:
        response = requests.post("http://127.0.0.1:8000/build-kb")
        if response.status_code == 200:
            return f"Success: {response.json()['message']}"
        else:
            return f"Error: {response.status_code} - {response.text}"
    except Exception as e:
        return f"API connection error: {str(e)}"

# Добавим функцию проверки статуса базы знаний
def check_kb_status():
    try:
        response = requests.get("http://127.0.0.1:8000/")
        if response.status_code == 200:
            data = response.json()
            if data["knowledge_base_exists"]:
                kb_info = data["kb_info"]
                # Добавляем проверки на None и значения по умолчанию
                version = kb_info.get('version', 'N/A')
                size = kb_info.get('size', 0)
                return f"✅ База знаний готова к работе\nВерсия: {version}\nРазмер: {size:.2f if size else 0} MB"
            else:
                return "❌ База знаний не создана. Нажмите кнопку 'Create/Update Knowledge Base'"
    except Exception as e:
        return f"❌ Ошибка проверки статуса: {str(e)}"

# Create the Gradio interface
with gr.Blocks(title="Status Law Assistant", theme=gr.themes.Soft()) as demo:
    gr.Markdown("# 🤖 Status Law Assistant")
    
    with gr.Row():
        with gr.Column(scale=1):
            # Кнопки управления базой знаний
            build_kb_btn = gr.Button("Create/Update Knowledge Base", variant="primary")
            check_status_btn = gr.Button("Check Status")
            kb_status = gr.Textbox(
                label="Knowledge Base Status",
                value="Checking status...",
                interactive=False
            )
            # Привязываем обе кнопки
            build_kb_btn.click(build_kb, inputs=None, outputs=kb_status)
            check_status_btn.click(check_kb_status, inputs=None, outputs=kb_status)
    
    gr.Markdown("### 💬 Chat Interface")
    conversation_id = gr.State(None)
    
    with gr.Row():
        with gr.Column(scale=2):
            # Улучшенный интерфейс чата
            chatbot = gr.Chatbot(
                label="Conversation",
                height=400,
                show_label=False,
                bubble_full_width=False
            )
            with gr.Row():
                msg = gr.Textbox(
                    label="Введите ваш вопрос здесь",
                    placeholder="Напишите ваш вопрос и нажмите Enter...",
                    scale=4
                )
                submit_btn = gr.Button("Отправить", variant="primary", scale=1)
            
            # Добавляем очистку истории
            clear_btn = gr.Button("Очистить историю")
            
            def clear_history():
                return [], None
            
            def respond(message, chat_history, conv_id):
                if not message.strip():
                    return chat_history, conv_id
                
                chat_history.append([message, ""])
                response, new_conv_id = chat_with_api(message, conv_id)
                chat_history[-1][1] = response
                return chat_history, new_conv_id
            
            # Привязываем обработчики
            msg.submit(respond, [msg, chatbot, conversation_id], [chatbot, conversation_id])
            submit_btn.click(respond, [msg, chatbot, conversation_id], [chatbot, conversation_id])
            clear_btn.click(clear_history, None, [chatbot, conversation_id])

    # Добавляем информацию об использовании
    with gr.Accordion("ℹ️ Как использовать", open=False):
        gr.Markdown("""
        1. Сначала нажмите кнопку **Create/Update Knowledge Base** для создания базы знаний
        2. Дождитесь сообщения об успешном создании базы
        3. Введите ваш вопрос в текстовое поле и нажмите Enter или кнопку "Отправить"
        4. Используйте кнопку "Очистить историю" для начала новой беседы
        """)

if __name__ == "__main__":
    # Проверяем статус базы знаний при запуске
    initial_status = check_kb_status()
    # Launch Gradio interface
    demo.launch(
        server_name="0.0.0.0",
        server_port=7860,
        share=False
    )
    #demo.launch(server_name="0.0.0.0", server_port=7860, share=False)