patch-mfft-api / api /schemas.py
MohsinElis's picture
feat: add ensemble schemas, consensus fields, exif summary, and sha256
7eba895 verified
Raw History Blame Contribute Delete
3.01 kB
"""
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]