CoolFace
Apppublic

SwhaleAI/marine-mammals-api

sourceHugging Facemitupdated 4mo agoView on Hugging Face
0likes
App README

🐋 CetaScope

Dashboard d'exploration des mammifères marins via chatbot en langage naturel.

![Frontend](https://lucienlaumont.github.io/cetascope) ![API](https://swhaleai-marine-mammals-api.hf.space) ![Python](https://www.python.org) ![License](LICENSE)


Aperçu

CetaScope est une application web full-stack qui permet d'explorer des millions d'observations de cétacés à travers une interface conversationnelle en français. Pose une question, obtiens une carte, un graphique ou une fiche espèce — sans ligne de code.

Les données sont synchronisées automatiquement depuis OBIS, GBIF et l'IUCN via des pipelines GitHub Actions, et enrichies par Gemini AI (morphologie, biologie). ---

Fonctionnalités

  • —Chatbot en français propulsé par Gemini 2.0 Flash — cartes, séries temporelles, fiches espèce
  • —7 types de visualisations : carte d'observations, choroplèthe, évolution annuelle, profil espèce, top espèces, timeline IUCN, réponse texte
  • —Navigation directe — clic sur une espèce → profil immédiat sans passer par le chat
  • —Boutons de navigation rapide sur chaque profil (Observations · Évolution · Historique IUCN)
  • —Historique de navigation — trail dots, flèches ← →, bouton retour navigateur
  • —Cache intelligent — données en localStorage, images Wikipedia mises en cache, chargement instantané
  • —Pipeline automatisé — synchronisation hebdomadaire/mensuelle via GitHub Actions
  • —90 espèces couvertes — de la baleine bleue au marsouin commun

Architecture

┌─────────────────────────┐     ┌──────────────────────────┐     ┌───────────────────────┐
│  Frontend               │     │  Backend                 │     │  Base de données      │
│  React 18 · D3.js       │────▶│  FastAPI · asyncpg       │────▶│  PostgreSQL 15        │
│  GitHub Pages           │     │  HuggingFace Spaces      │     │  PostGIS · Supabase   │
└─────────────────────────┘     └──────────────────────────┘     └───────────────────────┘
                                          ▲
                                          │
                                ┌─────────────────────┐
                                │  GitHub Actions      │
                                │  Sync OBIS/GBIF      │
                                │  Enrichissement LLM  │
                                └─────────────────────┘

Stack technique

CoucheTechnologieRôle
FrontendReact 18 (CDN, sans bundler), D3.js, TopoJSONInterface, visualisations
BackendFastAPI, asyncpg, Pydantic v2, httpxAPI REST + chatbot
LLMGemini 2.0 Flash (Google AI)Parsing requêtes NL + enrichissement
Base de donnéesPostgreSQL 15 + PostGIS (Supabase)Observations, espèces, zones
CI/CDGitHub ActionsDéploiement frontend + sync données
HébergementGitHub Pages + HuggingFace Spaces (Docker)100% gratuit

Sources de données

SourceUsage
OBISObservations marines mondiales (source primaire)
GBIFObservations (source secondaire / fallback)
WoRMSTaxonomie des cétacés
IUCN Red ListStatuts de conservation
Gemini AIEnrichissement morphologie & biologie
WikipediaPhotos des espèces

Démarrage local

Prérequis

  • —Python 3.12+
  • —PostgreSQL 15 avec extension PostGIS
  • —`uv` (gestionnaire de paquets Python)
  • —Fichier .env à la racine (voir .env.example)

Backend

bash
cd backend
uv sync
uv run uvicorn app.main:app --reload --port 7860

L'API est disponible sur http://localhost:7860. La documentation Swagger est accessible sur /docs.

Frontend

Modifier frontend/config.js pour pointer vers le backend local :

js
window.CETA_CONFIG = {
  apiBase: 'http://localhost:7860',
  // ...
};

Puis ouvrir frontend/index.html directement dans le navigateur, ou le servir statiquement :

bash
cd frontend
python -m http.server 3000

Scripts de données

bash
cd scripts
uv sync

# Récupérer les espèces depuis WoRMS
uv run python fetch_species.py

# Enrichir les données (IUCN, morphologie, biologie)
uv run python enrich_iucn.py
uv run python enrich_morpho.py
uv run python enrich_biology.py

# Récupérer les observations OBIS/GBIF
uv run python fetch_observations.py

API — Endpoints

MéthodeEndpointDescription
POST/chatChatbot — requête NL → type de viz + données
GET/speciesListe et recherche d'espèces (pagination)
GET/species/{id}Fiche détaillée d'une espèce
GET/species/{id}/conservation-historyTimeline IUCN
GET/map/observationsPoints d'observation GeoJSON (filtrable)
GET/analytics/time-series/{id}Évolution annuelle des observations
GET/analytics/top-speciesClassement des espèces les plus observées
GET/analytics/conservation-statusDistribution des statuts IUCN
GET/zones/{id}/choroplethDensité d'observations par zone
GET/healthÉtat de l'API

Le chatbot retourne toujours un objet { type, data, message } permettant au frontend de choisir la visualisation adaptée.


Pipeline de données (GitHub Actions)

WorkflowDéclencheurAction
deploy-pages.ymlPush sur main (frontend/)Déploiement GitHub Pages
sync-species.ymlMensuel (1er du mois, 3h UTC)WoRMS + IUCN + enrichissement Gemini
sync-observations.ymlHebdomadaire (lundi, 4h UTC)OBIS/GBIF + données environnementales

Structure du projet

cetascope/
├── frontend/          # Interface React (statique, sans bundler)
├── backend/           # API FastAPI
│   └── app/
│       ├── routers/   # Routes par domaine (species, map, analytics…)
│       ├── services/  # Logique métier
│       └── models/    # Schémas Pydantic
├── shared/            # Package Pydantic partagé (backend + scripts)
├── scripts/           # Scripts de synchronisation et d'enrichissement
├── db/                # Migrations SQL
├── docs/              # Spécification UX + screenshots
└── .github/workflows/ # CI/CD

Contact

Lucien Laumont — lucienlaumont36@gmail.com

Projet portfolio — contributions non sollicitées.


Licence

MIT © 2025 Lucien Laumont