Spaces:
Sleeping
Sleeping
YassmineNouisser
Verify — multimodal disinformation detection platform (6 modules + chatbot)
179d606 | # API Reference — Verify Backend | |
| Base URL : `http://localhost:8000` | |
| Swagger interactif : `http://localhost:8000/docs` | |
| ## Endpoints transverses | |
| | Méthode | Route | Description | | |
| |---|---|---| | |
| | `GET` | `/` | Liste de tous les modules et leurs endpoints | | |
| | `GET` | `/health` | Status global (tous les modules) | | |
| | `GET` | `/docs` | Swagger UI (OpenAPI 3) | | |
| ## Endpoints par module | |
| Toutes les routes d'analyse retournent du **JSON**. Les réponses contiennent un champ `verdict` (texte | |
| court, ex: `"FAKE"`/`"REAL"`/`"MISLEADING"`), un champ `confidence_pct` (entier 0-100), une | |
| `explanation` en anglais clair, et un sous-objet `xai` avec des heatmaps en base64 PNG. | |
| ### io1 — Fake Media Detection | |
| ```http | |
| GET /api/io1/health | |
| POST /api/io1/analyze/image # multipart: image=<file>, mode=auto|deepfake|ai | |
| POST /api/io1/analyze/video # multipart: video=<file> | |
| ``` | |
| **Modes** : | |
| - `auto` (défaut) : détecte un visage et route vers deepfake ; sinon vers AI-image | |
| - `deepfake` : force la détection face-deepfake (refuse si aucun visage trouvé) | |
| - `ai` : force la détection AI-image (whole image), avec escalation 2-détecteurs | |
| **Réponse (extrait)** : | |
| ```json | |
| { | |
| "verdict": "FAKE", | |
| "verdict_label": "AI-generated image", | |
| "confidence_pct": 97, | |
| "prob_fake": 0.97, "prob_real": 0.03, | |
| "task": "image_ai_generated", | |
| "face_detected": true, "face_box": [x, y, w, h], | |
| "model_used": "io1_resnet50.pth + AI-image consensus", | |
| "xai": { "gradcam_overlay": "<base64 PNG>", "face_crop": "<base64>" }, | |
| "explanation": "Two independent AI-image classifiers agree...", | |
| "narrative": { "headline": "AI-generated image", "summary": "...", "signals": [...] } | |
| } | |
| ``` | |
| ### io2 — Visual Manipulation / Persuasion | |
| ```http | |
| GET /api/io2/health | |
| POST /api/io2/analyze/image # multipart: image=<file> | |
| POST /api/io2/analyze/video # multipart: video=<file> (analyse la 1ère frame) | |
| ``` | |
| **Verdicts** : `AUTHENTIC` · `SUSPECT` · `MANIPULATIVE` · `HIGHLY MANIPULATIVE` | |
| **Réponse (extrait)** : | |
| ```json | |
| { | |
| "score_global": 0.73, | |
| "label": "MANIPULATIVE", "label_color": "#F97316", | |
| "scores_modules": { "nlp": 0.85, "clickbait": 0.61, "urgence": 0.95, "manipnet": 0.73 }, | |
| "texte": { "extrait": "LIMITED TIME ONLY", "tone": "alarmist", "label_nlp": "Manipulator" }, | |
| "techniques": ["limited-time", "percent-off", "fomo"], | |
| "bounding_boxes": [{"class": "limited-time", "score": 0.9, "box": [120, 30, 280, 70]}], | |
| "xai": { "bbox_overlay": "<base64>", "gradient_saliency": "<base64>" } | |
| } | |
| ``` | |
| ### io3 — Image↔Caption Coherence | |
| ```http | |
| GET /api/io3/health | |
| POST /api/io3/analyze/image # multipart: image=<file>, text=<caption> | |
| POST /api/io3/analyze/video # multipart: video=<file>, text=<caption> | |
| ``` | |
| **Verdicts** : `COHERENT` (≥0.25) · `SUSPECT` (0.15-0.25) · `INCOHERENT` (<0.15) | |
| **Réponse (extrait)** : | |
| ```json | |
| { | |
| "verdict": "INCOHERENT", | |
| "score_global": 0.11, | |
| "scores": { "clip": 0.18, "sam": 0.22, "whisper": 0.5, "yolo": 0.0, "ocr": 0.0 }, | |
| "objects_detected": ["dog", "person"], | |
| "ocr_text": "Welcome to the park", | |
| "xai": { "gradcam_base64": "<...>", "waterfall_base64": "<...>", "shap": { ... } } | |
| } | |
| ``` | |
| ### io4 — Image Tampering (Photoshop forensics) | |
| ```http | |
| GET /api/io4/health | |
| POST /api/io4/analyze/image # multipart: image=<file> | |
| POST /api/io4/analyze/compare # multipart: image=<suspect>, reference=<original> | |
| ``` | |
| **Verdicts** : `AUTHENTIC` · `FAKE` (sous-classe : `Inpainting` · `Copy-move` · `Splicing` · `Enhancement`) | |
| **Réponse (extrait)** : | |
| ```json | |
| { | |
| "verdict": "FAKE", "verdict_class": "Splicing", | |
| "predicted_class": "Splicing", "max_confidence": 0.78, | |
| "region": "top right", | |
| "ela_score": 0.67, "noise_score": 0.55, "jpeg_ghost_score": 0.42, | |
| "fused_score": 0.61, "signals_agreement": 2, | |
| "clues": ["ELA shows a compact bright patch", "JPEG ghost detected at quality 75"], | |
| "xai": { "tamper_mask_overlay": "<base64>", "gradcam_overlay": "<base64>" } | |
| } | |
| ``` | |
| ### io5 — Caption Fidelity | |
| ```http | |
| GET /api/io5/health | |
| POST /api/io5/analyze # multipart: file=<image>, text=<caption> | |
| ``` | |
| **Verdicts** : `FAITHFUL` · `PARTIAL` · `MISLEADING` | |
| **Réponse (extrait)** : | |
| ```json | |
| { | |
| "verdict": "MISLEADING", "verdict_color": "#E53E3E", | |
| "score": 0.21, "confidence": 0.92, | |
| "raw_clip_similarity": 0.13, "calibrated_similarity": 0.14, | |
| "ocr_overlap": 0.0, "tone_gap": 0.55, | |
| "phrase_breakdown": [ | |
| {"phrase": "UFO landing white house", "score": 0.08, "supported": false} | |
| ], | |
| "unsupported_phrases": ["UFO landing white house", "Breaking news"], | |
| "xai": { "clip_saliency": "<base64>" } | |
| } | |
| ``` | |
| ### io6 — Cosmetic Ads Fact-Check | |
| ```http | |
| GET /api/io6/health | |
| POST /api/io6/analyze/video # multipart: video=<file> (vidéo MP4 d'une pub cosmétique) | |
| ``` | |
| **Verdicts** : `RELIABLE` (trust_score≥50) · `MISLEADING` (<50) | |
| **Réponse (extrait)** : | |
| ```json | |
| { | |
| "global_verdict": "MISLEADING", "trust_score": 32.4, | |
| "transcript": "L'Oréal Revitalift reduces wrinkles by 40% in 7 days...", | |
| "language": "en", | |
| "claims": [ | |
| { | |
| "claim": "reduces wrinkles by 40% in 7 days", | |
| "verdict": "FALSE", "confidence": 0.9, "severity": "high", | |
| "evidence": [ | |
| {"source": "Decisive_PostProcessor", "rule_type": "FAUX_pattern", | |
| "description": "Time-bound claim without substantiation", "eu_article": "EU 655/2013 art. 4.4"} | |
| ], | |
| "eu_articles": ["EU 655/2013 art. 4.4", "EU 655/2013 art. 4.2"] | |
| } | |
| ], | |
| "stats": { "total": 8, "n_true": 3, "n_false": 4, "n_to_verify": 1 }, | |
| "eu_articles_cited": ["EU 655/2013 art. 4.2", "EU 655/2013 art. 4.4"] | |
| } | |
| ``` | |
| ## Codes HTTP | |
| | Code | Sens | | |
| |---|---| | |
| | `200` | OK — réponse JSON | | |
| | `400` | Bad request — input manquant ou format invalide (ex: io5 sans `text`) | | |
| | `500` | Erreur interne du pipeline — détails dans le message | | |
| | `503` | Module pas encore prêt (en cours de chargement initial) | | |
| ## CORS | |
| L'API autorise tous les origines (`Access-Control-Allow-Origin: *`) pour faciliter le développement | |
| avec Live Server. En production, restreindre à votre domaine via le middleware FastAPI. | |