File size: 3,009 Bytes
e83ff6c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c6f6755
 
 
e83ff6c
 
 
91554bd
 
 
 
 
 
 
 
3b2729a
 
 
 
 
 
 
 
7eba895
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
91554bd
 
 
 
e83ff6c
 
 
 
 
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
73
74
75
76
77
78
79
80
81
82
83
84
"""
Pydantic Schemas for Patch-MFFT Tampering Forensics API.
"""

from typing import Dict, List, Optional
from pydantic import BaseModel, Field


class ModelInfo(BaseModel):
    id: str
    loaded: bool
    params: str
    description: str


class HealthResponse(BaseModel):
    status: str
    version: str = "1.0.0"
    models_loaded: List[str]
    timestamp: str


class PredictionResponse(BaseModel):
    prediction: str = Field(..., description="'authentic', 'full_ai', or 'spliced_tampered'")
    confidence: float
    tampering_detected: bool
    class_probabilities: Dict[str, float]
    tampering_heatmap_b64: Optional[str] = Field(None, description="Base64 PNG pixel-level tampering localization mask")
    tampering_overlay_b64: Optional[str] = Field(None, description="Base64 RGBA PNG with transparent authentic background for seamless overlay")
    tampering_peak_score: float = Field(default=0.0, description="Peak tampering probability within the localization mask")
    tampering_coverage_ratio: float = Field(default=0.0, description="Percentage of frame area exceeding tampering threshold (p > 0.50)")
    frequency_band_contributions: Dict[str, float]
    processing_time_ms: float
    model_variant: str
    is_non_photographic_graphic: bool = Field(
        default=False,
        description="True if pre-flight domain heuristics detect a digital diagram, flowchart, vector graphic, or screenshot",
    )
    domain_status: str = Field(
        default="photographic",
        description="'photographic', 'non_photographic_graphic', or 'solid_canvas_ood'",
    )
    is_social_media_compressed: bool = Field(
        default=False,
        description="True if lossy social media compression (WhatsApp, Telegram, etc.) or 8x8 blockiness is detected",
    )
    compression_blockiness: float = Field(
        default=1.0,
        description="Estimated 8x8 DCT boundary discontinuity metric",
    )
    consensus_status: Optional[str] = Field(
        default="single_model",
        description="'verified_consensus', 'disputed', or 'single_model'",
    )
    consensus_message: Optional[str] = Field(
        default=None,
        description="Explanation of multi-model consensus or discrepancy",
    )
    exif_summary: Optional[Dict[str, str]] = Field(
        default=None,
        description="Extracted camera EXIF parameters or null if stripped",
    )
    generative_software_tag: Optional[str] = Field(
        default=None,
        description="Detected AI synthesis software string in metadata",
    )
    sha256_hash: Optional[str] = Field(
        default=None,
        description="Cryptographic SHA-256 hash of image payload",
    )
    cached: bool = Field(
        default=False,
        description="True if served from high-speed in-memory LRU cache",
    )
    warning: Optional[str] = Field(
        default=None,
        description="Forensic domain warnings or OOD guidance",
    )


class ModelsResponse(BaseModel):
    default: str
    models: List[ModelInfo]