from __future__ import annotations from datetime import datetime from uuid import UUID from pydantic import BaseModel, ConfigDict, Field class DetectionModelCapability(BaseModel): model_config = ConfigDict(protected_namespaces=()) model_id: str display_name: str framework: str task_type: str supported_classes: list[str] configured: bool status: str limitation_message: str version: str | None = None training_scope: str | None = None validation_scope: str | None = None validated_regions: list[str] = Field(default_factory=list) nationally_validated: bool = False operator_review_required: bool = True class DetectionModelsResponse(BaseModel): models: list[DetectionModelCapability] class ModelAssetRead(BaseModel): model_config = ConfigDict(protected_namespaces=()) model_asset_id: str filename: str display_name: str model_path: str suffix: str framework: str task_type: str size_bytes: int sha256: str active: bool status: str limitation_message: str will_download_models: bool = False class ModelAssetListResponse(BaseModel): model_config = ConfigDict(protected_namespaces=()) items: list[ModelAssetRead] total: int model_directory: str class DetectionRunRequest(BaseModel): model_config = ConfigDict(protected_namespaces=()) project_id: UUID dataset_id: UUID model_id: str model_asset_id: str | None = None confidence_threshold: float = Field(default=0.5, ge=0.0, le=1.0) class_filter: list[str] | None = None tile_manifest_path: str | None = None parameters_json: dict = Field(default_factory=dict) class DetectionQaRequest(BaseModel): reference_dataset_id: UUID iou_threshold: float = Field(default=0.5, ge=0.0, le=1.0) class_name: str | None = None min_confidence: float | None = Field(default=None, ge=0.0, le=1.0) class DetectionRunResponse(BaseModel): model_config = ConfigDict(protected_namespaces=()) analysis_run_id: UUID job_id: UUID project_id: UUID dataset_id: UUID model_id: str status: str detection_count: int error_code: str | None = None message: str class DetectionRunRead(BaseModel): model_config = ConfigDict(from_attributes=True, protected_namespaces=()) id: UUID project_id: UUID dataset_id: UUID | None = None job_id: UUID | None = None analysis_type: str status: str model_name: str | None = None model_version: str | None = None parameters_json: dict result_json: dict | None = None error_message: str | None = None created_at: datetime | None = None started_at: datetime | None = None finished_at: datetime | None = None class DetectionRunListResponse(BaseModel): items: list[DetectionRunRead] total: int class DetectionRead(BaseModel): model_config = ConfigDict(from_attributes=True, protected_namespaces=()) id: UUID project_id: UUID dataset_id: UUID | None = None analysis_run_id: UUID | None = None job_id: UUID | None = None model_name: str model_version: str | None = None class_name: str confidence: float bbox_json: dict | None = None source_tile_path: str | None = None properties_json: dict | None = None created_at: datetime | None = None class DetectionListResponse(BaseModel): items: list[DetectionRead] total: int class YoloPreflightChecks(BaseModel): model_config = ConfigDict(protected_namespaces=()) enabled: bool dependencies_available: bool | None = None accelerator_ready: bool | None = None model_path_set: bool | None = None model_file_exists: bool | None = None model_load_requested: bool model_load_ok: bool | None = None manifest_path_set: bool | None = None manifest_valid: bool | None = None tile_paths_exist: bool | None = None tile_limit_ok: bool | None = None class YoloRuntimeDetails(BaseModel): model_config = ConfigDict(protected_namespaces=()) dependencies_assumed: bool model_directory: str | None = None yolo_config_dir: str | None = None torch_version: str | None = None ultralytics_version: str | None = None cuda_available: bool | None = None configured_device: str cuda_required: bool class YoloPreflightResponse(BaseModel): model_config = ConfigDict(protected_namespaces=()) model_id: str model_asset_id: str | None = None model_path: str | None = None tile_manifest_path: str | None = None status: str message: str checks: YoloPreflightChecks tile_count: int max_tiles: int will_download_models: bool will_run_inference: bool runtime: YoloRuntimeDetails error_code: str | None = None details: dict | None = None