Spaces:
Running
Running
feat: setup progress bar for analysis action and swap batch/settings tabs
Browse files- interface.py +56 -55
- main.py +11 -2
interface.py
CHANGED
|
@@ -867,62 +867,8 @@ def create_gradio_interface() -> gr.Blocks:
|
|
| 867 |
)
|
| 868 |
|
| 869 |
# Вкладка Налаштування (Settings)
|
| 870 |
-
with gr.Tab("⚙️ Налаштування", id=3):
|
| 871 |
-
gr.Markdown("### Редагування промптів", elem_classes=["tab-header"])
|
| 872 |
-
|
| 873 |
-
gr.Markdown("""
|
| 874 |
-
**Увага!** Налаштування промптів зберігаються тільки для вашої поточної сесії.
|
| 875 |
-
Кожен користувач має свої власні налаштування, які не впливають на інших користувачів.
|
| 876 |
-
""")
|
| 877 |
-
|
| 878 |
-
with gr.Column():
|
| 879 |
-
system_prompt_editor = gr.Textbox(
|
| 880 |
-
label="📋 Системний промпт",
|
| 881 |
-
value=SYSTEM_PROMPT,
|
| 882 |
-
lines=5,
|
| 883 |
-
max_lines=10,
|
| 884 |
-
placeholder="Введіть системний промпт...",
|
| 885 |
-
info="Визначає роль та базові інструкції для AI"
|
| 886 |
-
)
|
| 887 |
-
|
| 888 |
-
lp_prompt_editor = gr.Textbox(
|
| 889 |
-
label="⚖️ Промпт генерації правової позиції",
|
| 890 |
-
value=LEGAL_POSITION_PROMPT,
|
| 891 |
-
lines=15,
|
| 892 |
-
max_lines=30,
|
| 893 |
-
placeholder="Введіть промпт для генерації правової позиції...",
|
| 894 |
-
info="Шаблон для генерації правової позиції з судового рішення"
|
| 895 |
-
)
|
| 896 |
-
|
| 897 |
-
analysis_prompt_editor = gr.Textbox(
|
| 898 |
-
label="🔍 Промпт аналізу прецедентів",
|
| 899 |
-
value=str(PRECEDENT_ANALYSIS_TEMPLATE.template),
|
| 900 |
-
lines=15,
|
| 901 |
-
max_lines=30,
|
| 902 |
-
placeholder="Введіть промпт для аналізу прецедентів...",
|
| 903 |
-
info="Шаблон для порівняльного аналізу правових позицій"
|
| 904 |
-
)
|
| 905 |
-
|
| 906 |
-
with gr.Row():
|
| 907 |
-
save_prompts_button = gr.Button(
|
| 908 |
-
"💾 Зберегти промпти",
|
| 909 |
-
variant="primary",
|
| 910 |
-
scale=1,
|
| 911 |
-
interactive=False
|
| 912 |
-
)
|
| 913 |
-
reset_prompts_button = gr.Button(
|
| 914 |
-
"🔄 Скинути до стандартних",
|
| 915 |
-
variant="secondary",
|
| 916 |
-
scale=1
|
| 917 |
-
)
|
| 918 |
-
|
| 919 |
-
prompts_status = gr.Markdown(
|
| 920 |
-
"",
|
| 921 |
-
elem_classes=["tab-content"]
|
| 922 |
-
)
|
| 923 |
-
|
| 924 |
# Вкладка Пакетне тестування (Batch Testing)
|
| 925 |
-
with gr.Tab("📊 Пакетне тестування", id=
|
| 926 |
gr.Markdown("### Пакетна генерація правових позицій з CSV/Excel файлу", elem_classes=["tab-header"])
|
| 927 |
|
| 928 |
gr.Markdown("""
|
|
@@ -1055,6 +1001,61 @@ def create_gradio_interface() -> gr.Blocks:
|
|
| 1055 |
visible=False
|
| 1056 |
)
|
| 1057 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1058 |
# Вкладка Допомога (Help)
|
| 1059 |
with gr.Tab("📖 Допомога", id=5):
|
| 1060 |
gr.Markdown("### Довідка по використанню AI Асистента", elem_classes=["tab-header"])
|
|
|
|
| 867 |
)
|
| 868 |
|
| 869 |
# Вкладка Налаштування (Settings)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 870 |
# Вкладка Пакетне тестування (Batch Testing)
|
| 871 |
+
with gr.Tab("📊 Пакетне тестування", id=3):
|
| 872 |
gr.Markdown("### Пакетна генерація правових позицій з CSV/Excel файлу", elem_classes=["tab-header"])
|
| 873 |
|
| 874 |
gr.Markdown("""
|
|
|
|
| 1001 |
visible=False
|
| 1002 |
)
|
| 1003 |
|
| 1004 |
+
# Вкладка Налаштування (Settings)
|
| 1005 |
+
with gr.Tab("⚙️ Налаштування", id=4):
|
| 1006 |
+
gr.Markdown("### Редагування промптів", elem_classes=["tab-header"])
|
| 1007 |
+
|
| 1008 |
+
gr.Markdown("""
|
| 1009 |
+
**Увага!** Налаштування промптів зберігаються тільки для вашої поточної сесії.
|
| 1010 |
+
Кожен користувач має свої власні налаштування, які не впливають на інших користувачів.
|
| 1011 |
+
""")
|
| 1012 |
+
|
| 1013 |
+
with gr.Column():
|
| 1014 |
+
system_prompt_editor = gr.Textbox(
|
| 1015 |
+
label="📋 Системний промпт",
|
| 1016 |
+
value=SYSTEM_PROMPT,
|
| 1017 |
+
lines=5,
|
| 1018 |
+
max_lines=10,
|
| 1019 |
+
placeholder="Введіть системний промпт...",
|
| 1020 |
+
info="Визначає роль та базові інструкції для AI"
|
| 1021 |
+
)
|
| 1022 |
+
|
| 1023 |
+
lp_prompt_editor = gr.Textbox(
|
| 1024 |
+
label="⚖️ Промпт генерації правової позиції",
|
| 1025 |
+
value=LEGAL_POSITION_PROMPT,
|
| 1026 |
+
lines=15,
|
| 1027 |
+
max_lines=30,
|
| 1028 |
+
placeholder="Введіть промпт для генерації правової позиції...",
|
| 1029 |
+
info="Шаблон для генерації правової позиції з судового рішення"
|
| 1030 |
+
)
|
| 1031 |
+
|
| 1032 |
+
analysis_prompt_editor = gr.Textbox(
|
| 1033 |
+
label="🔍 Промпт аналізу прецедентів",
|
| 1034 |
+
value=str(PRECEDENT_ANALYSIS_TEMPLATE.template),
|
| 1035 |
+
lines=15,
|
| 1036 |
+
max_lines=30,
|
| 1037 |
+
placeholder="Введіть промпт для аналізу прецедентів...",
|
| 1038 |
+
info="Шаблон для порівняльного аналізу правових позицій"
|
| 1039 |
+
)
|
| 1040 |
+
|
| 1041 |
+
with gr.Row():
|
| 1042 |
+
save_prompts_button = gr.Button(
|
| 1043 |
+
"💾 Зберегти промпти",
|
| 1044 |
+
variant="primary",
|
| 1045 |
+
scale=1,
|
| 1046 |
+
interactive=False
|
| 1047 |
+
)
|
| 1048 |
+
reset_prompts_button = gr.Button(
|
| 1049 |
+
"🔄 Скинути до стандартних",
|
| 1050 |
+
variant="secondary",
|
| 1051 |
+
scale=1
|
| 1052 |
+
)
|
| 1053 |
+
|
| 1054 |
+
prompts_status = gr.Markdown(
|
| 1055 |
+
"",
|
| 1056 |
+
elem_classes=["tab-content"]
|
| 1057 |
+
)
|
| 1058 |
+
|
| 1059 |
# Вкладка Допомога (Help)
|
| 1060 |
with gr.Tab("📖 Допомога", id=5):
|
| 1061 |
gr.Markdown("### Довідка по використанню AI Асистента", elem_classes=["tab-header"])
|
main.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
| 1 |
import os
|
|
|
|
| 2 |
import sys
|
| 3 |
import json
|
| 4 |
import time
|
|
@@ -1500,10 +1501,12 @@ async def analyze_action(
|
|
| 1500 |
thinking_type: str = "Adaptive",
|
| 1501 |
thinking_level: str = "medium",
|
| 1502 |
openai_verbosity: str = "medium",
|
| 1503 |
-
thinking_budget: int = 10000
|
|
|
|
| 1504 |
) -> str:
|
| 1505 |
"""Analyze search results using AI."""
|
| 1506 |
try:
|
|
|
|
| 1507 |
workflow = PrecedentAnalysisWorkflow(
|
| 1508 |
provider=ModelProvider(provider),
|
| 1509 |
model_name=AnalysisModelName(model_name),
|
|
@@ -1516,6 +1519,7 @@ async def analyze_action(
|
|
| 1516 |
thinking_budget=thinking_budget
|
| 1517 |
)
|
| 1518 |
|
|
|
|
| 1519 |
query = (
|
| 1520 |
f"{legal_position_json['title']}: "
|
| 1521 |
f"{legal_position_json['text']}: "
|
|
@@ -1523,17 +1527,22 @@ async def analyze_action(
|
|
| 1523 |
f"{legal_position_json['category']}"
|
| 1524 |
)
|
| 1525 |
|
|
|
|
| 1526 |
response_text = await workflow.run(
|
| 1527 |
query=query,
|
| 1528 |
question=question,
|
| 1529 |
nodes=nodes
|
| 1530 |
)
|
| 1531 |
|
|
|
|
| 1532 |
output = f"**Аналіз ШІ (модель: {model_name}):**\n{response_text}\n\n"
|
| 1533 |
output += "**Наявні в базі правові позицій Верховного Суду:**\n\n"
|
| 1534 |
|
| 1535 |
analysis_lines = response_text.split('\n')
|
| 1536 |
-
|
|
|
|
|
|
|
|
|
|
| 1537 |
if line.startswith('* ['):
|
| 1538 |
index = line[3:line.index(']')]
|
| 1539 |
node = nodes[int(index) - 1]
|
|
|
|
| 1 |
import os
|
| 2 |
+
import gradio as gr
|
| 3 |
import sys
|
| 4 |
import json
|
| 5 |
import time
|
|
|
|
| 1501 |
thinking_type: str = "Adaptive",
|
| 1502 |
thinking_level: str = "medium",
|
| 1503 |
openai_verbosity: str = "medium",
|
| 1504 |
+
thinking_budget: int = 10000,
|
| 1505 |
+
progress=gr.Progress()
|
| 1506 |
) -> str:
|
| 1507 |
"""Analyze search results using AI."""
|
| 1508 |
try:
|
| 1509 |
+
progress(0, desc="Ініціалізація аналізу...")
|
| 1510 |
workflow = PrecedentAnalysisWorkflow(
|
| 1511 |
provider=ModelProvider(provider),
|
| 1512 |
model_name=AnalysisModelName(model_name),
|
|
|
|
| 1519 |
thinking_budget=thinking_budget
|
| 1520 |
)
|
| 1521 |
|
| 1522 |
+
progress(0.2, desc="Підготовка даних...")
|
| 1523 |
query = (
|
| 1524 |
f"{legal_position_json['title']}: "
|
| 1525 |
f"{legal_position_json['text']}: "
|
|
|
|
| 1527 |
f"{legal_position_json['category']}"
|
| 1528 |
)
|
| 1529 |
|
| 1530 |
+
progress(0.4, desc="Запит до AI (це може зайняти час)...")
|
| 1531 |
response_text = await workflow.run(
|
| 1532 |
query=query,
|
| 1533 |
question=question,
|
| 1534 |
nodes=nodes
|
| 1535 |
)
|
| 1536 |
|
| 1537 |
+
progress(0.8, desc="Формування висновків...")
|
| 1538 |
output = f"**Аналіз ШІ (модель: {model_name}):**\n{response_text}\n\n"
|
| 1539 |
output += "**Наявні в базі правові позицій Верховного Суду:**\n\n"
|
| 1540 |
|
| 1541 |
analysis_lines = response_text.split('\n')
|
| 1542 |
+
total_lines = len(analysis_lines)
|
| 1543 |
+
for i, line in enumerate(analysis_lines):
|
| 1544 |
+
if i % 2 == 0:
|
| 1545 |
+
progress(0.8 + (0.2 * i / total_lines), desc=f"Обробка результатів ({i}/{total_lines})...")
|
| 1546 |
if line.startswith('* ['):
|
| 1547 |
index = line[3:line.index(']')]
|
| 1548 |
node = nodes[int(index) - 1]
|