Add YOLO preflight runtime diagnostics
GeoIntel CI / docs-smoke (push) Has been cancelled
GeoIntel CI / contract-smoke (push) Has been cancelled

This commit is contained in:
Codex
2026-07-05 21:17:20 +02:00
parent ad4fa45584
commit 7a29e7867d
6 changed files with 87 additions and 2 deletions
@@ -1,5 +1,7 @@
from __future__ import annotations
import os
from importlib import metadata
from pathlib import Path
from typing import Any, Type
@@ -42,6 +44,10 @@ class YoloPreflightService:
"max_tiles": resolved_settings.yolo_max_tiles,
"will_download_models": False,
"will_run_inference": False,
"runtime": YoloPreflightService._runtime_details(
settings=resolved_settings,
assume_dependencies=assume_dependencies,
),
}
if not resolved_settings.yolo_enabled:
@@ -50,6 +56,8 @@ class YoloPreflightService:
dependencies_available = True if assume_dependencies else yolo_adapter_class.dependencies_available()
result["checks"]["dependencies_available"] = dependencies_available
if dependencies_available and not assume_dependencies:
result["runtime"]["cuda_available"] = YoloPreflightService._torch_cuda_available()
if not dependencies_available:
result["status"] = "dependency_unavailable"
result["message"] = "YOLO dependencies are not installed. Install backend optional extras with geointel-backend[ai]."
@@ -115,3 +123,35 @@ class YoloPreflightService:
else:
result["message"] = "Configured YOLO preflight passed. No model was loaded and no inference was run."
return result
@staticmethod
def _runtime_details(*, settings: Settings, assume_dependencies: bool) -> dict[str, Any]:
model_directory = None
if settings.yolo_model_path:
model_directory = str(Path(settings.yolo_model_path).expanduser().parent)
return {
"dependencies_assumed": assume_dependencies,
"model_directory": model_directory,
"yolo_config_dir": os.environ.get("YOLO_CONFIG_DIR"),
"torch_version": YoloPreflightService._package_version("torch"),
"ultralytics_version": YoloPreflightService._package_version("ultralytics"),
"cuda_available": None,
}
@staticmethod
def _package_version(package_name: str) -> str | None:
try:
return metadata.version(package_name)
except metadata.PackageNotFoundError:
return None
@staticmethod
def _torch_cuda_available() -> bool | None:
try:
import torch
except Exception:
return None
try:
return bool(torch.cuda.is_available())
except Exception:
return None