Aller au contenu

Data flow

Du fichier open data jusqu'au rapport HTML livré au client.

Vue d'ensemble

flowchart TB
    subgraph "1 · Sources externes"
      INSEE[INSEE
RP, Filosofi, BPE, OMPHALE] DHUP[DHUP
LOVAC, RPLS, Zonage, ANIL] ADEME[ADEME DPE API] DGFIP[DGFiP
DVF, Cadastre] ARS[ARS RPPS FINESS] CAF[CNAF] end subgraph "2 · Ingestion" RAW[raw/ thématique] INGEST[ingest_*.py
scripts] INGEST -->|write| PG[(PostgreSQL
+ PostGIS)] end subgraph "3 · Analyse" MV[Vues matérialisées] ANALYSIS[analysis.py
TerritoryAnalysisService] COLLECT[data_collectors/
log_01, dem_01, ter_01…] end subgraph "4 · Génération" PROMPT[prompts/
mega-prompt LLM] LLM[Claude Sonnet 4.6
avec Pydantic validation] HTML[Template HTML
paysage A4] end subgraph "5 · Livraison" PDF[html_to_pdf.py
Playwright/Chromium] EMAIL[Brevo email
avec lien signé] end INSEE --> RAW DHUP --> RAW ADEME -.->|API live| COLLECT DGFIP --> RAW ARS --> RAW CAF --> RAW RAW --> INGEST PG --> MV PG --> ANALYSIS MV --> ANALYSIS ANALYSIS --> COLLECT COLLECT --> PROMPT PROMPT --> LLM LLM --> HTML HTML --> PDF PDF --> EMAIL classDef ext fill:#f0f4fa,stroke:#0d1f3c classDef raw fill:#fef3e8,stroke:#e87722 classDef db fill:#e0f0f0,stroke:#2a7f7f classDef gen fill:#fff8e1,stroke:#c9a84c classDef deliver fill:#e8f5e8,stroke:#2e7d32 class INSEE,DHUP,ADEME,DGFIP,ARS,CAF ext class RAW,INGEST raw class PG,MV,ANALYSIS,COLLECT db class PROMPT,LLM,HTML gen class PDF,EMAIL deliver

Contrats entre couches

Ingestion → DB

  • Un script ingest_X.py par source
  • Chaque script est idempotent (upsert, pas duplicate)
  • Logs détaillés dans backend/*_progress.log

DB → Collector

  • Le collector reçoit un commune_insee (5 chiffres) + optionnellement EPCI
  • Il retourne un dict Python plat, prêt pour le prompt
  • Valeurs manquantes → None → sérialisées "N/A" (pas de zero ni extrapolation)

Collector → Prompt

  • Prompt = template f-string paramétrable
  • Schéma Pydantic de sortie attendue (validation stricte)
  • temperature=0 (déterministe, pas de créativité)

Prompt → HTML

  • Template HTML paysage A4 (10-12 pages)
  • CSS inline pour portabilité PDF
  • Font IBM Plex Sans / Mono
  • Palette LObsTer navy/orange/teal

HTML → PDF

  • html_to_pdf.py via Playwright headless Chromium
  • Format A4 paysage, marges 0
  • Page breaks CSS page-break-after: always

PDF → Livraison

  • Upload sur storage (R2 / S3)
  • Lien signé 30 jours
  • Email Brevo au client avec template "livraison rapport"

Temps cible par étape

Étape Temps cible Temps réel actuel
Collector < 5 s 3-8 s
Prompt LLM < 90 s 60-180 s
HTML render < 2 s 1-3 s
PDF render < 10 s 7-15 s
Email + lien < 3 s 1-2 s
Total end-to-end < 2 min 2-4 min