GUI_MAI-DxO / utils /test_logging.py
DocUA's picture
Видалено застарілі файли, включаючи модулі для логування, інтерфейси Gradio та приклади використання. Оновлено документацію для відображення нових змін у структурі проекту.
143d94c
#!/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()