import gradio as gr
import os
import sys
from pathlib import Path
from dotenv import load_dotenv
# Add project root to sys.path
sys.path.append(str(Path(__file__).parent))
import config
from modules.rag_system import rag_system
load_dotenv()
def format_sources(sources):
if not sources:
return ""
html = "
📚 Використані джерела:
"
for i, res in enumerate(sources):
chunk = res.get('chunk', {})
meta = chunk.get('metadata', {})
source_name = meta.get('source_name', 'Законодавство')
article = meta.get('article_title', '')
content = chunk.get('text', '')
html += f"""
[{i+1}] {source_name} {f'— {article}' if article else ''}
{content}
"""
html += "
"
return html
def run_chat(query, api_key, search_method, use_reranker, legal_area, top_k, temperature):
if not query.strip():
return "Будь ласка, введіть запитання.", ""
# Mapping display names to internal values
method_map = {
"🔄 Гібридний (Рекомендовано)": "hybrid",
"🔤 BM25 (Ключові слова)": "bm25",
"🧠 Семантичний": "semantic"
}
# Mapping Ukrainian legal area names to internal keys
area_map = {
"Всі": "Всі",
"Сімейне право": "сімейне_право",
"Трудове право": "трудове_право",
"Земельне право": "земельне_право",
"Цивільне право": "цивільне_право",
"Податкове право": "податкове_право",
"Кримінальне право": "кримінальне_право",
"Конституційне право": "конституційне_право",
"Адміністративне судочинство": "адміністративне_судочинство"
}
internal_method = method_map.get(search_method, "hybrid")
internal_area = area_map.get(legal_area, "Всі")
try:
answer, sources = rag_system.process_query(
query=query,
api_key=api_key,
use_reranker=use_reranker,
top_k_rerank=int(top_k),
temperature=float(temperature),
search_method=internal_method,
legal_area=internal_area
)
sources_html = format_sources(sources)
return answer, sources_html
except Exception as e:
return f"Помилка при обробці запиту: {str(e)}", ""
# --- Gradio UI Construction ---
css_path = Path("assets/style.css")
with open(css_path, "r", encoding="utf-8") as f:
custom_css = f.read()
with gr.Blocks(title="Асистент із Законодавства", css=custom_css, theme=gr.themes.Soft()) as demo:
# Header
with gr.Row(elem_classes="header-container"):
with gr.Column(scale=0, min_width=80):
gr.HTML("