DocUA commited on
Commit
8f09ca9
·
1 Parent(s): ac50cc2

Оновлено MAI-DX Gradio Interface: змінено структуру класу для покращення логіки побудови інтерфейсу, додано метод для одноразового створення інтерфейсу. Виправлено імпорт класу та оновлено документацію. Змінено обробку запуску програми для кращої організації коду.

Browse files
Files changed (2) hide show
  1. run_mai_dx_fixed.py +6 -12
  2. 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 create_updated_gradio_interface
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
- demo = create_updated_gradio_interface()
58
 
59
- # Запускаємо з налаштуваннями
60
- demo.launch(
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) # Додаємо track_tqdm для кращої інтеграції
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 create_updated_gradio_interface():
187
- interface = UpdatedMAIDXInterface()
188
- with gr.Blocks(title="🏥 MAI-DX Enhanced Platform", theme=gr.themes.Soft(primary_hue="blue")) as demo:
189
- 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>""")
190
- with gr.Tabs():
191
- with gr.Tab("🩺 Діагностика"):
192
- with gr.Row():
193
- with gr.Column(scale=1):
194
- gr.Markdown("### 📝 Клінічний випадок")
195
- case_name = gr.Textbox(label="🏷️ Назва випадку", placeholder="Наприклад: Кардіологічний випадок №1")
196
- sample_selector = gr.Dropdown(choices=list(interface.sample_cases.keys()), label="🎯 Готові випадки", interactive=True)
197
- patient_info = gr.Textbox(label="👤 Інформація про пацієнта", lines=12)
198
- expected_diagnosis = gr.Textbox(label="🎯 Очікуваний діагноз (англ.)", lines=2)
199
- with gr.Column(scale=1):
200
- gr.Markdown("### ⚙️ Налаштування")
201
- mode = gr.Radio(["instant", "question_only", "budgeted", "no_budget", "ensemble"], label="🔧 Режим", value="budgeted")
202
- budget = gr.Slider(500, 10000, 3000, step=500, label="💵 Бюджет ($)")
203
- max_iterations = gr.Slider(1, 15, 8, step=1, label="🔄 Макс. ітерацій")
204
- 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")
205
- diagnose_btn = gr.Button("🚀 Запустити діагностику", variant="primary", size="lg")
206
-
207
- sample_selector.change(interface.load_sample_case, inputs=sample_selector, outputs=[patient_info, case_name, expected_diagnosis])
208
-
209
- gr.Markdown("---")
210
- with gr.Row():
211
- with gr.Column(scale=2):
212
- main_result = gr.Markdown()
213
- detailed_analysis = gr.Markdown()
214
- with gr.Column(scale=1):
215
- recommendations = gr.Markdown()
216
-
217
- gr.Markdown("---")
218
- with gr.Row():
219
- with gr.Column(scale=1):
220
- agent_activity_report = gr.Markdown(label="🤖 Активність агентів")
221
- with gr.Column(scale=2):
222
- structured_conversations = gr.Markdown(label="🗣️ Структуровані розмови")
 
 
 
 
 
 
 
 
 
 
223
 
224
- diagnose_btn.click(
225
- interface.diagnose_with_full_logging,
226
- inputs=[case_name, patient_info, mode, budget, max_iterations, model_name, expected_diagnosis],
227
- outputs=[main_result, detailed_analysis, recommendations, agent_activity_report, structured_conversations],
228
- # FIX: Додаємо параметр для відображення прогрес-бару
229
- show_progress="full"
230
- )
231
-
232
- with gr.Tab("📊 Аналіз логів"):
233
- gr.Markdown("### 🔍 Аналіз збережених діагностичних сесій")
234
 
235
- return demo
 
 
 
 
 
 
 
236
 
237
  if __name__ == "__main__":
238
- demo = create_updated_gradio_interface()
239
- demo.launch(server_name="0.0.0.0", server_port=7860, share=False)
 
 
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)