File size: 1,838 Bytes
c82cafe
831da65
 
 
 
 
c82cafe
 
 
831da65
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c82cafe
831da65
c82cafe
 
 
831da65
 
 
 
 
 
 
 
 
c82cafe
831da65
 
 
 
c82cafe
 
831da65
 
 
 
 
 
 
 
 
 
 
 
 
c82cafe
 
 
831da65
 
c82cafe
831da65
 
c82cafe
831da65
 
c82cafe
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
from pydantic import BaseModel
from typing import Dict, List, Optional, Union, Any

# =============================================================================
# REQUEST SCHEMA
# =============================================================================

class PredictRequest(BaseModel):
    """
    Forest segmentation prediction request.

    This schema is intentionally flexible to support:
    - Supabase Edge Functions
    - Hugging Face remote inference
    - Local inference scripts

    Required:
    - bands: Dict[str, Union[str, List[float]]]

    Allowed extra fields (sent by Supabase):
    - width, height
    - bbox
    - band_names
    - preprocessing
    - model_name, model_version
    """

    model_name: str = "forest_segmentation"
    model_version: str = "landsat8_v1"

    # Band data:
    # - base64-encoded float32 (remote calls)
    # - list/array of floats (local calls)
    bands: Dict[str, Union[str, List[float]]]

    class Config:
        # 🔑 CRITICAL FIX
        # Allows Supabase to send extra metadata without 422 errors
        extra = "allow"


# =============================================================================
# RESPONSE SCHEMA
# =============================================================================

class PredictResponse(BaseModel):
    """
    Forest segmentation prediction response.

    Mask values are CONTINUOUS (0–255) — NOT binary.
    """

    # Flattened mask (length = width * height)
    mask: List[int]

    # Inverted mask (optional utility)
    inverted_mask: List[int]

    # Statistics
    forest_percentage: float
    forest_confidence: float
    mean_prediction: float

    # Class mapping
    classes: Dict[str, int]

    # Model metadata
    model_info: Dict[str, Any]

    # Optional debug block
    debug: Optional[Dict[str, Any]] = None