Spaces:
Sleeping
Sleeping
Оновлено MAI-DX Gradio Interface: змінено структуру класу для покращення логіки побудови інтерфейсу, додано метод для одноразового створення інтерфейсу. Виправлено імпорт класу та оновлено документацію. Змінено обробку запуску програми для кращої організації коду.
Browse files- run_mai_dx_fixed.py +6 -12
- updated_mai_dx_interface.py +71 -52
run_mai_dx_fixed.py
CHANGED
@@ -18,10 +18,8 @@ os.environ.update({
|
|
18 |
"GRADIO_ANALYTICS_ENABLED": "false"
|
19 |
})
|
20 |
|
21 |
-
# Ігноруємо всі попередження
|
22 |
warnings.filterwarnings("ignore")
|
23 |
|
24 |
-
# Перевіряємо що всі необхідні файли присутні
|
25 |
required_files = [
|
26 |
"enhanced_mai_dx_logger.py",
|
27 |
"mai_dx_wrapper.py",
|
@@ -31,16 +29,13 @@ required_files = [
|
|
31 |
for file in required_files:
|
32 |
if not os.path.exists(file):
|
33 |
print(f"❌ Помилка: Файл {file} не знайдено!")
|
34 |
-
print("Переконайтеся що всі файли з артефактів збережені в робочій директорії.")
|
35 |
sys.exit(1)
|
36 |
|
37 |
-
# Імпортуємо
|
38 |
try:
|
39 |
-
from updated_mai_dx_interface import
|
40 |
except ImportError as e:
|
41 |
print(f"❌ Помилка імпорту інтерфейсу: {e}")
|
42 |
-
print("Перевірте що всі залежності встановлені:")
|
43 |
-
print("pip install gradio pandas plotly python-dotenv")
|
44 |
sys.exit(1)
|
45 |
|
46 |
def main():
|
@@ -49,15 +44,14 @@ def main():
|
|
49 |
print("📁 Логи будуть збережені в директорії: mai_dx_logs/")
|
50 |
print("=" * 60)
|
51 |
|
52 |
-
# Створюємо директорію для логів якщо її немає
|
53 |
os.makedirs("mai_dx_logs", exist_ok=True)
|
54 |
|
55 |
try:
|
56 |
-
# Створюємо
|
57 |
-
|
58 |
|
59 |
-
# Запускаємо
|
60 |
-
|
61 |
server_name="0.0.0.0",
|
62 |
server_port=7860,
|
63 |
share=False,
|
|
|
18 |
"GRADIO_ANALYTICS_ENABLED": "false"
|
19 |
})
|
20 |
|
|
|
21 |
warnings.filterwarnings("ignore")
|
22 |
|
|
|
23 |
required_files = [
|
24 |
"enhanced_mai_dx_logger.py",
|
25 |
"mai_dx_wrapper.py",
|
|
|
29 |
for file in required_files:
|
30 |
if not os.path.exists(file):
|
31 |
print(f"❌ Помилка: Файл {file} не знайдено!")
|
|
|
32 |
sys.exit(1)
|
33 |
|
34 |
+
# Імпортуємо оновлений клас
|
35 |
try:
|
36 |
+
from updated_mai_dx_interface import UpdatedMAIDXInterface
|
37 |
except ImportError as e:
|
38 |
print(f"❌ Помилка імпорту інтерфейсу: {e}")
|
|
|
|
|
39 |
sys.exit(1)
|
40 |
|
41 |
def main():
|
|
|
44 |
print("📁 Логи будуть збережені в директорії: mai_dx_logs/")
|
45 |
print("=" * 60)
|
46 |
|
|
|
47 |
os.makedirs("mai_dx_logs", exist_ok=True)
|
48 |
|
49 |
try:
|
50 |
+
# Створюємо екземпляр нашого додатка ОДИН РАЗ
|
51 |
+
app = UpdatedMAIDXInterface()
|
52 |
|
53 |
+
# Запускаємо інтерфейс через метод класу
|
54 |
+
app.launch(
|
55 |
server_name="0.0.0.0",
|
56 |
server_port=7860,
|
57 |
share=False,
|
updated_mai_dx_interface.py
CHANGED
@@ -1,6 +1,7 @@
|
|
1 |
#!/usr/bin/env python3
|
2 |
"""
|
3 |
-
Оновлений MAI-DX Gradio Interface з повним логуванням розмов агентів
|
|
|
4 |
"""
|
5 |
import os
|
6 |
import sys
|
@@ -32,6 +33,10 @@ except ImportError as e:
|
|
32 |
IMPORT_ERROR = str(e)
|
33 |
|
34 |
class UpdatedMAIDXInterface:
|
|
|
|
|
|
|
|
|
35 |
def __init__(self):
|
36 |
self.conversation_logger = MAIDxConversationLogger("mai_dx_logs")
|
37 |
self.sessions_history = []
|
@@ -49,11 +54,13 @@ class UpdatedMAIDXInterface:
|
|
49 |
"expected": "Sepsis with a possible odontogenic source"
|
50 |
}
|
51 |
}
|
|
|
|
|
52 |
|
53 |
def diagnose_with_full_logging(
|
54 |
self, case_name: str, patient_info: str, mode: str, budget: int, max_iterations: int,
|
55 |
model_name: str, expected_diagnosis: str = "",
|
56 |
-
progress=gr.Progress(track_tqdm=True)
|
57 |
):
|
58 |
if not MAI_DX_AVAILABLE: return self._format_error(f"❌ MAI-DX недоступний: {IMPORT_ERROR}")
|
59 |
if not patient_info.strip(): return self._format_error("❌ Введіть інформацію про пацієнта")
|
@@ -183,57 +190,69 @@ class UpdatedMAIDXInterface:
|
|
183 |
case = self.sample_cases.get(key, {})
|
184 |
return case.get("info", ""), key, case.get("expected", "")
|
185 |
|
186 |
-
def
|
187 |
-
|
188 |
-
|
189 |
-
|
190 |
-
with gr.
|
191 |
-
|
192 |
-
|
193 |
-
|
194 |
-
|
195 |
-
|
196 |
-
|
197 |
-
|
198 |
-
|
199 |
-
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
|
204 |
-
|
205 |
-
|
206 |
-
|
207 |
-
|
208 |
-
|
209 |
-
|
210 |
-
|
211 |
-
|
212 |
-
|
213 |
-
|
214 |
-
|
215 |
-
|
216 |
-
|
217 |
-
|
218 |
-
|
219 |
-
|
220 |
-
|
221 |
-
|
222 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
223 |
|
224 |
-
|
225 |
-
|
226 |
-
|
227 |
-
|
228 |
-
# FIX: Додаємо параметр для відображення прогрес-бару
|
229 |
-
show_progress="full"
|
230 |
-
)
|
231 |
-
|
232 |
-
with gr.Tab("📊 Аналіз логів"):
|
233 |
-
gr.Markdown("### 🔍 Аналіз збережених діагностичних сесій")
|
234 |
|
235 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
236 |
|
237 |
if __name__ == "__main__":
|
238 |
-
|
239 |
-
|
|
|
|
1 |
#!/usr/bin/env python3
|
2 |
"""
|
3 |
+
Оновлений MAI-DX Gradio Interface з повним логуванням розмов агентів
|
4 |
+
(ВЕРСІЯ З ВИПРАВЛЕНИМ СТАТУС-БАРОМ І СТРУКТУРОЮ)
|
5 |
"""
|
6 |
import os
|
7 |
import sys
|
|
|
33 |
IMPORT_ERROR = str(e)
|
34 |
|
35 |
class UpdatedMAIDXInterface:
|
36 |
+
"""
|
37 |
+
Клас, що інкапсулює логіку та побудову Gradio інтерфейсу.
|
38 |
+
Це запобігає дублюванню обробників подій.
|
39 |
+
"""
|
40 |
def __init__(self):
|
41 |
self.conversation_logger = MAIDxConversationLogger("mai_dx_logs")
|
42 |
self.sessions_history = []
|
|
|
54 |
"expected": "Sepsis with a possible odontogenic source"
|
55 |
}
|
56 |
}
|
57 |
+
# Створюємо інтерфейс один раз при ініціалізації
|
58 |
+
self.demo = self.build_interface()
|
59 |
|
60 |
def diagnose_with_full_logging(
|
61 |
self, case_name: str, patient_info: str, mode: str, budget: int, max_iterations: int,
|
62 |
model_name: str, expected_diagnosis: str = "",
|
63 |
+
progress=gr.Progress(track_tqdm=True)
|
64 |
):
|
65 |
if not MAI_DX_AVAILABLE: return self._format_error(f"❌ MAI-DX недоступний: {IMPORT_ERROR}")
|
66 |
if not patient_info.strip(): return self._format_error("❌ Введіть інформацію про пацієнта")
|
|
|
190 |
case = self.sample_cases.get(key, {})
|
191 |
return case.get("info", ""), key, case.get("expected", "")
|
192 |
|
193 |
+
def build_interface(self):
|
194 |
+
"""
|
195 |
+
Метод, що будує інтерфейс Gradio. Викликається один раз.
|
196 |
+
"""
|
197 |
+
with gr.Blocks(title="🏥 MAI-DX Enhanced Platform", theme=gr.themes.Soft(primary_hue="blue")) as demo:
|
198 |
+
gr.HTML("""<div style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 2rem; border-radius: 15px; margin-bottom: 2rem; text-align: center;'><h1>🏥 MAI-DX Enhanced Research Platform</h1></div>""")
|
199 |
+
with gr.Tabs():
|
200 |
+
with gr.Tab("🩺 Діагностика"):
|
201 |
+
with gr.Row():
|
202 |
+
with gr.Column(scale=1):
|
203 |
+
gr.Markdown("### 📝 Клінічний випадок")
|
204 |
+
case_name = gr.Textbox(label="🏷️ Назва випадку", placeholder="Наприклад: Кардіологічний випадок №1")
|
205 |
+
sample_selector = gr.Dropdown(choices=list(self.sample_cases.keys()), label="🎯 Готові випадки", interactive=True)
|
206 |
+
patient_info = gr.Textbox(label="👤 Інформація про пацієнта", lines=12)
|
207 |
+
expected_diagnosis = gr.Textbox(label="🎯 Очікуваний діагноз (англ.)", lines=2)
|
208 |
+
with gr.Column(scale=1):
|
209 |
+
gr.Markdown("### ⚙️ Налаштування")
|
210 |
+
mode = gr.Radio(["instant", "question_only", "budgeted", "no_budget", "ensemble"], label="🔧 Режим", value="budgeted")
|
211 |
+
budget = gr.Slider(500, 10000, 3000, step=500, label="💵 Бюджет ($)")
|
212 |
+
max_iterations = gr.Slider(1, 15, 8, step=1, label="🔄 Макс. ітерацій")
|
213 |
+
model_name = gr.Dropdown(["gemini/gemini-2.5-flash", "gpt-4o", "claude-3-5-sonnet", "gpt-4", "gpt-4-turbo"], label="🤖 LLM Модель", value="gemini/gemini-2.5-flash")
|
214 |
+
diagnose_btn = gr.Button("🚀 Запустити діагностику", variant="primary", size="lg")
|
215 |
+
|
216 |
+
gr.Markdown("---")
|
217 |
+
with gr.Row():
|
218 |
+
with gr.Column(scale=2):
|
219 |
+
main_result = gr.Markdown()
|
220 |
+
detailed_analysis = gr.Markdown()
|
221 |
+
with gr.Column(scale=1):
|
222 |
+
recommendations = gr.Markdown()
|
223 |
+
|
224 |
+
gr.Markdown("---")
|
225 |
+
with gr.Row():
|
226 |
+
with gr.Column(scale=1):
|
227 |
+
agent_activity_report = gr.Markdown(label="🤖 Активність агентів")
|
228 |
+
with gr.Column(scale=2):
|
229 |
+
structured_conversations = gr.Markdown(label="🗣️ Структуровані розмови")
|
230 |
+
|
231 |
+
# Прив'язуємо обробники подій до методів класу
|
232 |
+
sample_selector.change(self.load_sample_case, inputs=sample_selector, outputs=[patient_info, case_name, expected_diagnosis])
|
233 |
+
|
234 |
+
diagnose_btn.click(
|
235 |
+
self.diagnose_with_full_logging,
|
236 |
+
inputs=[case_name, patient_info, mode, budget, max_iterations, model_name, expected_diagnosis],
|
237 |
+
outputs=[main_result, detailed_analysis, recommendations, agent_activity_report, structured_conversations],
|
238 |
+
show_progress="full"
|
239 |
+
)
|
240 |
|
241 |
+
with gr.Tab("📊 Аналіз логів"):
|
242 |
+
gr.Markdown("### 🔍 Аналіз збережених діагностичних сесій")
|
243 |
+
|
244 |
+
return demo
|
|
|
|
|
|
|
|
|
|
|
|
|
245 |
|
246 |
+
def launch(self, *args, **kwargs):
|
247 |
+
"""Метод для запуску Gradio-додатка."""
|
248 |
+
self.demo.launch(*args, **kwargs)
|
249 |
+
|
250 |
+
# Ця функція тепер є обгорткою для створення екземпляра класу
|
251 |
+
def create_updated_gradio_interface():
|
252 |
+
app = UpdatedMAIDXInterface()
|
253 |
+
return app.demo
|
254 |
|
255 |
if __name__ == "__main__":
|
256 |
+
# Якщо файл запускається напряму, створюємо екземпляр і запускаємо
|
257 |
+
app = UpdatedMAIDXInterface()
|
258 |
+
app.launch(server_name="0.0.0.0", server_port=7860, share=False)
|