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.pypar 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
dictPython 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.pyvia 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 |