from __future__ import annotations from datetime import datetime from uuid import UUID from pydantic import BaseModel, ConfigDict, Field from app.schemas.detection import DetectionModelCapability SegmentationModelCapability = DetectionModelCapability class SegmentationModelsResponse(BaseModel): models: list[SegmentationModelCapability] class SegmentationRunRequest(BaseModel): model_config = ConfigDict(protected_namespaces=()) project_id: UUID dataset_id: UUID model_id: str 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 SegmentationQaRequest(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) # Read off the one matching pass, exactly as for detection. calibration_thresholds: list[float] = Field(default_factory=list, max_length=32) class SegmentationRunResponse(BaseModel): model_config = ConfigDict(protected_namespaces=()) analysis_run_id: UUID job_id: UUID project_id: UUID dataset_id: UUID model_id: str status: str segmentation_count: int error_code: str | None = None message: str class SegmentationRunRead(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 SegmentationRunListResponse(BaseModel): items: list[SegmentationRunRead] # ``total`` counts every run; ``items`` is the most recent page of them. total: int limit: int | None = None offset: int = 0 truncated: bool = False class SegmentationRead(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 | None = None bbox_json: dict | None = None area_m2: float | None = None mask_path: str | None = None source_tile_path: str | None = None tile_index: int | None = None properties_json: dict | None = None provenance_json: dict | None = None created_at: datetime | None = None class SegmentationListResponse(BaseModel): items: list[SegmentationRead] # ``total`` describes the complete filtered population; ``items`` is one # stable confidence-ranked page of it. total: int limit: int | None = None offset: int = 0 truncated: bool = False