from __future__ import annotations import os def _load_dotenv() -> None: env_path = ".env" if not os.path.exists(env_path): return with open(env_path, encoding="utf-8") as env_file: for raw_line in env_file: line = raw_line.strip() if not line or line.startswith("#") or "=" not in line: continue key, value = line.split("=", 1) os.environ.setdefault(key.strip(), value.strip().strip('"').strip("'")) def _court_mode_from_env() -> str: explicit = os.getenv("MODEL_COURT_MODE") if explicit: return explicit mode = os.getenv("MODEL_MODE", os.getenv("MODEL_BACKEND", "mock")).lower() if mode in {"vllm", "openai", "openai_compatible", "model"}: return "vllm" if mode == "hf_api": return "hf_api" return "deterministic" _load_dotenv() MODEL_BACKEND = os.getenv("MODEL_BACKEND", "mock") MODEL_MODE = os.getenv("MODEL_MODE", MODEL_BACKEND) _RAW_VLLM_BASE_URL = os.getenv("VLLM_BASE_URL") or os.getenv("MODEL_BASE_URL") VLLM_BASE_URL = _RAW_VLLM_BASE_URL or "http://localhost:8000/v1" MODEL_ENDPOINT_CONFIGURED = bool(_RAW_VLLM_BASE_URL) VLLM_API_KEY = os.getenv("VLLM_API_KEY") or os.getenv("MODEL_API_KEY", "") VLLM_TEXT_MODEL = os.getenv("VLLM_TEXT_MODEL") or os.getenv( "MODEL_NAME", "Qwen/Qwen2.5-7B-Instruct" ) VLLM_VISION_MODEL = os.getenv("VLLM_VISION_MODEL", "Qwen/Qwen2.5-VL-7B-Instruct") HF_API_TOKEN = os.getenv("HF_API_TOKEN") MODEL_TIMEOUT_SECONDS = float(os.getenv("MODEL_TIMEOUT_SECONDS", "90")) MODEL_REPAIR_ATTEMPTS = int(os.getenv("MODEL_REPAIR_ATTEMPTS", "1")) MODEL_RETRY_ATTEMPTS = int(os.getenv("MODEL_RETRY_ATTEMPTS", "1")) MODEL_COURT_MODE = _court_mode_from_env() MODEL_COURT_ENDPOINT = os.getenv("MODEL_COURT_ENDPOINT") or VLLM_BASE_URL MODEL_COURT_API_KEY = os.getenv("MODEL_COURT_API_KEY") or VLLM_API_KEY MODEL_COURT_MODEL = os.getenv("MODEL_COURT_MODEL") or VLLM_TEXT_MODEL MODEL_COURT_EXECUTION_PROFILE = os.getenv("MODEL_COURT_EXECUTION_PROFILE", "Deterministic Review")