Detection and segmentation run listings returned every run a project had ever produced. Runs accumulate with every analysis while the panel only ever draws the recent ones, so the response grew without bound for no benefit. Both take limit and offset now and report total, limit, offset and truncated, matching the result listings. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
106 lines
2.9 KiB
Python
106 lines
2.9 KiB
Python
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: int
|