| from __future__ import annotations | |
| from typing import Any, Literal | |
| from pydantic import BaseModel, ConfigDict | |
| class MaskResult(BaseModel): | |
| """Segmentation output for a single finding on a single image view.""" | |
| model_config = ConfigDict(arbitrary_types_allowed=True) | |
| finding_label: str | |
| image_path: str | |
| image_index: int | |
| # [y0, x0, y1, x1] normalized to [0, 1000] – matches Stage 1 BBox.box_2d | |
| bbox_normalized: list[int] | |
| # H × W binary uint8 numpy array; None when status is "failed" | |
| mask: Any | None = None | |
| # Polygon contour as [[x, y], ...] in original image pixel coords; largest contour from mask | |
| polygon: list[list[int]] | None = None | |
| status: Literal["success", "failed"] | |
| error: str | None = None | |