All notable changes to the EcoMarineAI API are documented in this file.
The format is based on Keep a Changelog.
200 OK with rejected: true and rejection_reason: "not_a_marine_mammal" instead of a hallucinated whale ID.detection_id() (random mock) has been removed. The /v1/predict-single and /v1/predict-batch endpoints now route through inference.InferencePipeline, which loads the ViT-L/32 checkpoint lazily at FastAPI startup.Detection fields (default-valued, additive — no breaking changes for legacy clients):
is_cetacean: boolcetacean_score: float (CLIP positive aggregate softmax)rejected: boolrejection_reason: "not_a_marine_mammal" | "low_confidence" | "corrupted_image" | nullmodel_version: stringGET /v1/drift-stats — rolling-window mean/std/p50 of cetacean_score./metrics Prometheus output now includes rejections_total, rejections_by_reason, cetacean_score_avg.ALLOWED_ORIGINS env var (default: localhost dev ports)./predict-single and /predict-batch now alias /v1/* endpoints (no behavioural change for existing callers).inference.identification.IdentificationModel (lazy load) instead of module-level torch.load().detection_id() mock function.whale_infer.py and the unused routers.py empty stub.models_config.yaml.POST /predict-single - Single image identification endpoint
POST /predict-batch - Batch processing via ZIP archive
GET /health - Health check endpoint for monitoring and container orchestration{
"image_ind": "filename.jpg",
"bbox": [x, y, width, height],
"class_animal": "individual_hex_id",
"id_animal": "species_name",
"probability": 0.95,
"mask": "base64_encoded_png"
}
415 - Unsupported media type (non-image for single, non-ZIP for batch)400 - Bad ZIP archive (corrupted or invalid format)