Doc-chat / app.py
Rulga's picture
Add Matplotlib cache directory and update Dockerfile to create it
af49a43
raw
history blame
6.51 kB
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)