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 'вимкнено'}"
|