from __future__ import annotations from datetime import datetime from uuid import UUID from pydantic import BaseModel, Field class QaProviderComparisonRequest(BaseModel): candidate_dataset_id: UUID reference_dataset_id: UUID iou_threshold: float = Field(default=0.5, ge=0.0, le=1.0) area_id: UUID | None = None class QaProviderComparisonResult(BaseModel): status: str warnings: list[str] = Field(default_factory=list) candidate_feature_count: int reference_feature_count: int matches: int false_positives: int false_negatives: int precision: float | None recall: float | None f1_score: float | None mean_iou: float | None iou_threshold: float unsupported_geometry: bool = False unsupported_geometries: list[str] = Field(default_factory=list) match_evidence: list[dict] = Field(default_factory=list) false_positive_evidence: list[dict] = Field(default_factory=list) false_negative_evidence: list[dict] = Field(default_factory=list) generated_at: datetime class MetricRead(BaseModel): id: UUID quality_check_id: UUID | None = None analysis_run_id: UUID | None = None metric_key: str metric_value: float | None = None metric_unit: str | None = None label: str | None = None metadata_json: dict | None = None created_at: datetime | None = None model_config = {"from_attributes": True} class QualityCheckRead(BaseModel): id: UUID project_id: UUID job_id: UUID | None = None analysis_run_id: UUID | None = None candidate_dataset_id: UUID | None = None reference_dataset_id: UUID check_type: str status: str score: float | None = None parameters_json: dict | None = None findings_json: dict | None = None created_at: datetime | None = None completed_at: datetime | None = None metrics: list[MetricRead] = Field(default_factory=list) model_config = {"from_attributes": True} class QualityCheckList(BaseModel): items: list[QualityCheckRead] total: int limit: int offset: int