#!/usr/bin/env python3 """ Тестовий скрипт для перевірки що логування працює коректно """ import sys import os sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) import json from enhanced_mai_dx_logger import MAIDxConversationLogger def test_basic_logging(): """Тест базового логування""" print("🧪 Тест 1: Базове логування") logger = MAIDxConversationLogger("test_logs") # Створюємо тестову сесію case_id = logger.start_session( case_name="Тестовий випадок", patient_info="Тестова інформація", mode="test", budget=1000 ) print(f"✅ Створено сесію: {case_id}") # Симулюємо захоплення виводу def mock_orchestrator_run(*args, **kwargs): print("Starting Diagnostic Loop 1/3") print("2025-07-11 10:00:00 | INFO | mai_dx.main:_run_panel_deliberation:1304 - 🧠 Dr. Hypothesis analyzing differential diagnosis...") print("╭─── Agent Name Dr. Hypothesis [Max Loops: 1] ───╮") print("│ Analyzing patient symptoms... │") print("│ High probability of sepsis │") print("╰────────────────────────────────────────────────╯") print("2025-07-11 10:00:05 | INFO | mai_dx.main:run:1689 - ⚕️ Panel decision: DIAGNOSE -> Sepsis") # Симулюємо результат class MockResult: final_diagnosis = "Sepsis" accuracy_score = 4.0 total_cost = 500.0 return MockResult() # Виконуємо з захопленням result = logger.capture_orchestrator_output( case_id=case_id, orchestrator_func=mock_orchestrator_run ) print(f"✅ Діагноз: {result.final_diagnosis}") # Завершуємо сесію saved_id = logger.end_session( case_id=case_id, final_diagnosis=result.final_diagnosis, confidence=result.accuracy_score, cost=result.total_cost, reasoning="Test reasoning" ) print(f"✅ Збережено: {saved_id}") # Перевіряємо що файли створені json_file = f"test_logs/{case_id}.json" if os.path.exists(json_file): with open(json_file, 'r') as f: data = json.load(f) print(f"✅ JSON файл містить {len(data['conversations'])} розмов") if data['conversations']: conv = data['conversations'][0] print(f" - Раунд {conv['round_number']}: {len(conv['messages'])} повідомлень") else: print(f"❌ JSON файл не створено!") print("-" * 60) def test_conversation_parsing(): """Тест парсингу розмов""" print("🧪 Тест 2: Парсинг складних розмов") logger = MAIDxConversationLogger("test_logs") case_id = logger.start_session( case_name="Складний випадок", patient_info="Множинні симптоми", mode="budgeted", budget=5000 ) # Симулюємо складніший вивід def complex_orchestrator_run(*args, **kwargs): output = """ 2025-07-11 10:00:00 | INFO | mai_dx.main:run:1679 - --- Starting Diagnostic Loop 1/3 --- 2025-07-11 10:00:00 | INFO | mai_dx.main:run:1682 - Current cost: $300 | Remaining budget: $4,700 2025-07-11 10:00:01 | INFO | mai_dx.main:_run_panel_deliberation:1304 - 🧠 Dr. Hypothesis analyzing differential diagnosis... ╭─────────────────────────────── Agent Name Dr. Hypothesis [Max Loops: 1 ] ───────────────────────────────╮ │ Structured Output - Attempting Function Call Execution [10:00:02] │ │ │ │ Top differential diagnoses: │ │ 1. Acute Myocardial Infarction (85%) │ │ 2. Pulmonary Embolism (10%) │ │ 3. Aortic Dissection (5%) │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ 2025-07-11 10:00:05 | INFO | mai_dx.main:_run_panel_deliberation:1320 - 🔬 Dr. Test-Chooser selecting optimal tests... ╭────────────────────────────── Agent Name Dr. Test-Chooser [Max Loops: 1 ] ──────────────────────────────╮ │ Recommending tests: │ │ - ECG (immediate) │ │ - Troponin levels │ │ - Chest X-ray │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ 2025-07-11 10:00:10 | INFO | mai_dx.main:run:1689 - ⚕️ Panel decision: TEST -> ECG, Troponin, CXR 2025-07-11 10:00:10 | INFO | mai_dx.main:run:1692 - 💭 Medical reasoning: High suspicion for cardiac event """ print(output) class MockResult: final_diagnosis = "Acute Myocardial Infarction" accuracy_score = 4.5 total_cost = 850.0 return MockResult() result = logger.capture_orchestrator_output( case_id=case_id, orchestrator_func=complex_orchestrator_run ) # Генеруємо HTML html_path = logger.export_conversation_html(case_id) print(f"✅ HTML звіт: {html_path}") # Завершуємо logger.end_session( case_id=case_id, final_diagnosis=result.final_diagnosis, confidence=result.accuracy_score, cost=result.total_cost ) print("-" * 60) def test_error_handling(): """Тест обробки помилок""" print("🧪 Тест 3: Обробка помилок") logger = MAIDxConversationLogger("test_logs") # Спроба завершити неіснуючу сесію result = logger.end_session("non_existent_id") print(f"✅ Обробка неіснуючої сесії: {result}") # Спроба отримати розмови неіснуючої сесії conversations = logger.get_session_conversations("non_existent_id") print(f"✅ Розмови неіснуючої сесії: {len(conversations)} елементів") print("-" * 60) def main(): """Запуск всіх тестів""" print("=" * 60) print("🔬 Тестування системи логування MAI-DX") print("=" * 60) # Створюємо тестову директорію os.makedirs("test_logs", exist_ok=True) try: test_basic_logging() test_conversation_parsing() test_error_handling() print("\n✅ Всі тести пройдено успішно!") print("📁 Перевірте директорію 'test_logs' для результатів") except Exception as e: print(f"\n❌ Помилка під час тестування: {e}") import traceback traceback.print_exc() if __name__ == "__main__": main()