|
|
""" |
|
|
Configuration settings for the EchoPilot agent. |
|
|
""" |
|
|
|
|
|
import json |
|
|
import os |
|
|
from pathlib import Path |
|
|
from typing import Optional, Dict, Any |
|
|
|
|
|
|
|
|
class Config: |
|
|
"""Configuration class for EchoPilot.""" |
|
|
|
|
|
_PROJECT_ROOT = Path(__file__).resolve().parent |
|
|
|
|
|
|
|
|
OPENAI_API_KEY: Optional[str] = os.getenv("OPENAI_API_KEY") |
|
|
OPENAI_MODEL: str = os.getenv("OPENAI_MODEL", "gpt-4o-mini") |
|
|
OPENAI_TEMPERATURE: float = float(os.getenv("OPENAI_TEMPERATURE", "0.7")) |
|
|
OPENAI_MAX_TOKENS: int = int(os.getenv("OPENAI_MAX_TOKENS", "1000")) |
|
|
|
|
|
|
|
|
DEFAULT_VIDEO_PATH: str = os.getenv("VIDEO_PATH", str((_PROJECT_ROOT / "videos" / "val1.mp4"))) |
|
|
DEFAULT_PATIENT_ID: str = os.getenv("PATIENT_ID", "PATIENT-001") |
|
|
|
|
|
|
|
|
MAX_VIDEOS: int = int(os.getenv("MAX_VIDEOS", "1")) |
|
|
INCLUDE_CONFIDENCE: bool = os.getenv("INCLUDE_CONFIDENCE", "true").lower() == "true" |
|
|
SAVE_RESULTS: bool = os.getenv("SAVE_RESULTS", "true").lower() == "true" |
|
|
|
|
|
|
|
|
OUTPUT_DIR: str = os.getenv("OUTPUT_DIR", str((_PROJECT_ROOT / "outputs"))) |
|
|
RESULTS_FILE: str = os.getenv("RESULTS_FILE", "echo_analysis_results.json") |
|
|
STATE_FILE: str = os.getenv("STATE_FILE", "final_analysis_state.json") |
|
|
|
|
|
|
|
|
DEVICE: str = os.getenv("DEVICE", "cuda" if os.getenv("CUDA_VISIBLE_DEVICES") else "cpu") |
|
|
|
|
|
|
|
|
|
|
|
DEFAULT_INITIAL_MASK_PATH: str = os.getenv("ECHO_INITIAL_MASK_PATH", "") |
|
|
DEFAULT_INITIAL_MASK_STRUCTURE: str = os.getenv("ECHO_INITIAL_MASK_STRUCTURE", "LV") |
|
|
|
|
|
|
|
|
|
|
|
_ANNOTATION_PROMPTS_PATH = os.getenv("ECHO_ANNOTATION_PROMPTS") |
|
|
_DEFAULT_ANNOTATIONS_FILE = _PROJECT_ROOT / "assets" / "annotation_prompts.json" |
|
|
|
|
|
if _ANNOTATION_PROMPTS_PATH: |
|
|
try: |
|
|
with open(_ANNOTATION_PROMPTS_PATH, "r", encoding="utf-8") as annotations_file: |
|
|
ANNOTATION_PROMPTS: Dict[str, Dict[str, Any]] = json.load(annotations_file) |
|
|
except (OSError, json.JSONDecodeError) as exc: |
|
|
print(f"⚠️ Unable to load annotation prompts from {_ANNOTATION_PROMPTS_PATH}: {exc}") |
|
|
ANNOTATION_PROMPTS = {} |
|
|
elif _DEFAULT_ANNOTATIONS_FILE.exists(): |
|
|
try: |
|
|
with open(_DEFAULT_ANNOTATIONS_FILE, "r", encoding="utf-8") as annotations_file: |
|
|
ANNOTATION_PROMPTS = json.load(annotations_file) |
|
|
except (OSError, json.JSONDecodeError) as exc: |
|
|
print(f"⚠️ Unable to load default annotation prompts: {exc}") |
|
|
ANNOTATION_PROMPTS = {} |
|
|
else: |
|
|
ANNOTATION_PROMPTS = {} |
|
|
|
|
|
@classmethod |
|
|
def validate(cls) -> bool: |
|
|
"""Validate configuration.""" |
|
|
if not cls.OPENAI_API_KEY: |
|
|
print("❌ OPENAI_API_KEY not set. Please set it as an environment variable.") |
|
|
return False |
|
|
|
|
|
if not os.path.exists(cls.DEFAULT_VIDEO_PATH): |
|
|
print(f"❌ Video file not found: {cls.DEFAULT_VIDEO_PATH}") |
|
|
return False |
|
|
|
|
|
return True |
|
|
|
|
|
@classmethod |
|
|
def get_video_path(cls, video_path: Optional[str] = None) -> str: |
|
|
"""Get video path, using provided path or default.""" |
|
|
return video_path or cls.DEFAULT_VIDEO_PATH |
|
|
|
|
|
@classmethod |
|
|
def get_patient_id(cls, patient_id: Optional[str] = None) -> str: |
|
|
"""Get patient ID, using provided ID or default.""" |
|
|
return patient_id or cls.DEFAULT_PATIENT_ID |
|
|
|