Spaces:
Sleeping
Sleeping
Оновлено interface.py: додано багатопотокову обробку для оновлення індикатора прогресу під час аналізу тексту, зменшено затримки між кроками прогресу, покращено обробку помилок та зупинку фонових потоків. Додано детальніший опис прогресу в залежності від стану аналізу.
Browse files- src/interface.py +49 -9
src/interface.py
CHANGED
|
@@ -1,5 +1,6 @@
|
|
| 1 |
import gradio as gr
|
| 2 |
import time
|
|
|
|
| 3 |
import os
|
| 4 |
from .analyzer import NPAAnalyzer
|
| 5 |
|
|
@@ -61,7 +62,7 @@ def create_interface():
|
|
| 61 |
def analyze_and_format(npa_text, selected_provider, selected_model, enable_thinking, thinking_budget, progress=gr.Progress()):
|
| 62 |
if not npa_text.strip():
|
| 63 |
return "### Помилка\nПоле для тексту не може бути порожнім. Введіть текст для аналізу.", "", "Перевірте введені дані"
|
| 64 |
-
|
| 65 |
if api_keys_warning:
|
| 66 |
return f"### Помилка\n{api_keys_warning}", "", "Помилка конфігурації API ключів"
|
| 67 |
|
|
@@ -69,7 +70,7 @@ def create_interface():
|
|
| 69 |
try:
|
| 70 |
if analyzer.get_provider_name() != selected_provider:
|
| 71 |
analyzer.change_provider(selected_provider)
|
| 72 |
-
|
| 73 |
current_models = analyzer.get_available_models() or []
|
| 74 |
if selected_model in current_models:
|
| 75 |
analyzer.change_model(selected_model)
|
|
@@ -90,14 +91,45 @@ def create_interface():
|
|
| 90 |
|
| 91 |
start_time = time.time()
|
| 92 |
|
| 93 |
-
#
|
| 94 |
progress(0, desc="Ініціалізація аналізу...")
|
| 95 |
-
time.sleep(0.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 96 |
|
| 97 |
-
progress(0.
|
| 98 |
-
time.sleep(0.5)
|
| 99 |
|
| 100 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 101 |
|
| 102 |
# Аналіз з поточними налаштуваннями
|
| 103 |
try:
|
|
@@ -108,9 +140,17 @@ def create_interface():
|
|
| 108 |
thinking_budget=thinking_budget
|
| 109 |
)
|
| 110 |
except Exception as e:
|
|
|
|
|
|
|
|
|
|
|
|
|
| 111 |
return f"### Помилка при аналізі\n```\n{str(e)}\n```\n\nПеревірте текст та налаштування або спробуйте ще раз.", "", f"Помилка аналізу: {str(e)}"
|
| 112 |
|
| 113 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 114 |
|
| 115 |
end_time = time.time()
|
| 116 |
elapsed_time = end_time - start_time
|
|
@@ -128,7 +168,7 @@ def create_interface():
|
|
| 128 |
else:
|
| 129 |
thinking_output = f"## Роздуми моделі недоступні\n{'Режим роздумів вимкнено.' if supports_thinking else f'Провайдер {selected_provider} не підтримує режим роздумів.'}"
|
| 130 |
|
| 131 |
-
# Додавання інформації про налаштування
|
| 132 |
settings_info = f"\n\n_Провайдер: {selected_provider}, Модель: {selected_model}, "
|
| 133 |
if supports_thinking:
|
| 134 |
settings_info += f"режим роздумів {'увімкнено' if enable_thinking else 'вимкнено'}"
|
|
|
|
| 1 |
import gradio as gr
|
| 2 |
import time
|
| 3 |
+
import threading
|
| 4 |
import os
|
| 5 |
from .analyzer import NPAAnalyzer
|
| 6 |
|
|
|
|
| 62 |
def analyze_and_format(npa_text, selected_provider, selected_model, enable_thinking, thinking_budget, progress=gr.Progress()):
|
| 63 |
if not npa_text.strip():
|
| 64 |
return "### Помилка\nПоле для тексту не може бути порожнім. Введіть текст для аналізу.", "", "Перевірте введені дані"
|
| 65 |
+
|
| 66 |
if api_keys_warning:
|
| 67 |
return f"### Помилка\n{api_keys_warning}", "", "Помилка конфігурації API ключів"
|
| 68 |
|
|
|
|
| 70 |
try:
|
| 71 |
if analyzer.get_provider_name() != selected_provider:
|
| 72 |
analyzer.change_provider(selected_provider)
|
| 73 |
+
|
| 74 |
current_models = analyzer.get_available_models() or []
|
| 75 |
if selected_model in current_models:
|
| 76 |
analyzer.change_model(selected_model)
|
|
|
|
| 91 |
|
| 92 |
start_time = time.time()
|
| 93 |
|
| 94 |
+
# Початкові кроки прогресу
|
| 95 |
progress(0, desc="Ініціалізація аналізу...")
|
| 96 |
+
time.sleep(0.3)
|
| 97 |
+
|
| 98 |
+
progress(0.05, desc="Підготовка тексту НПА...")
|
| 99 |
+
time.sleep(0.3)
|
| 100 |
+
|
| 101 |
+
progress(0.1, desc=f"Підготовка запиту до {selected_provider}...")
|
| 102 |
+
time.sleep(0.3)
|
| 103 |
|
| 104 |
+
progress(0.15, desc=f"Відправка запиту до {selected_provider}...")
|
|
|
|
| 105 |
|
| 106 |
+
# Змінні для контролю фонового потоку
|
| 107 |
+
is_analyzing = True
|
| 108 |
+
current_progress = 0.15
|
| 109 |
+
|
| 110 |
+
def update_progress_bar():
|
| 111 |
+
nonlocal current_progress
|
| 112 |
+
while is_analyzing and current_progress < 0.95:
|
| 113 |
+
# Поступово збільшуємо значення прогресу
|
| 114 |
+
time.sleep(0.5) # Оновлюємо кожні 0.5 секунди
|
| 115 |
+
|
| 116 |
+
# Використовуємо логарифмічну прогресію для повільнішого наростання в кінці
|
| 117 |
+
step = max(0.005, (0.95 - current_progress) / 20)
|
| 118 |
+
current_progress += step
|
| 119 |
+
|
| 120 |
+
# Оновлюємо опис базуючись на поточному прогресі
|
| 121 |
+
desc = "Аналіз тексту..."
|
| 122 |
+
if current_progress > 0.7:
|
| 123 |
+
desc = "Формування відповіді..."
|
| 124 |
+
elif current_progress > 0.4:
|
| 125 |
+
desc = "Опрацювання результатів..."
|
| 126 |
+
|
| 127 |
+
progress(current_progress, desc=desc)
|
| 128 |
+
|
| 129 |
+
# Запускаємо фоновий потік для оновлення прогресу
|
| 130 |
+
progress_thread = threading.Thread(target=update_progress_bar)
|
| 131 |
+
progress_thread.daemon = True
|
| 132 |
+
progress_thread.start()
|
| 133 |
|
| 134 |
# Аналіз з поточними налаштуваннями
|
| 135 |
try:
|
|
|
|
| 140 |
thinking_budget=thinking_budget
|
| 141 |
)
|
| 142 |
except Exception as e:
|
| 143 |
+
# Зупиняємо фоновий потік оновлення прогресу
|
| 144 |
+
is_analyzing = False
|
| 145 |
+
progress_thread.join(timeout=1.0)
|
| 146 |
+
|
| 147 |
return f"### Помилка при аналізі\n```\n{str(e)}\n```\n\nПеревірте текст та налаштування або спробуйте ще раз.", "", f"Помилка аналізу: {str(e)}"
|
| 148 |
|
| 149 |
+
# Зупиняємо фоновий потік оновлення прогресу
|
| 150 |
+
is_analyzing = False
|
| 151 |
+
progress_thread.join(timeout=1.0)
|
| 152 |
+
|
| 153 |
+
progress(0.95, desc="Форматування результатів...")
|
| 154 |
|
| 155 |
end_time = time.time()
|
| 156 |
elapsed_time = end_time - start_time
|
|
|
|
| 168 |
else:
|
| 169 |
thinking_output = f"## Роздуми моделі недоступні\n{'Режим роздумів вимкнено.' if supports_thinking else f'Провайдер {selected_provider} не підтримує режим роздумів.'}"
|
| 170 |
|
| 171 |
+
# Додавання інформації про налаштування та токени
|
| 172 |
settings_info = f"\n\n_Провайдер: {selected_provider}, Модель: {selected_model}, "
|
| 173 |
if supports_thinking:
|
| 174 |
settings_info += f"режим роздумів {'увімкнено' if enable_thinking else 'вимкнено'}"
|