← App | Administration Admin

📊 Statistiques

Chargement...
Par type d'événement
Par type de document
Par source
📅 7 derniers jours

📋 Événements récents

Date Type Source Format Utilisateur Fichier Tokens in Tokens out Coût $

🔌 API & Services

🔍 Service OCR
🔒 Lecture seule — modifier via .env + docker compose up -d --force-recreate ocr-service backend
🔒 Lecture seule — modifier via .env + docker compose up -d --force-recreate backend speech-service
🎙️ Service Speech
💰 Coûts API cumulés
Chargement...
Tarifs Claude Sonnet 4 : $3.00/MTok input · $15.00/MTok output

📧 Collecte Mail IMAP

Les changements de configuration IMAP sont persistés immédiatement, mais prennent effet au prochain redémarrage du poller (docker compose restart backend).
🔒 Connexion IMAP
Activer la collecte IMAP

🎛️ Feature Flags

Les changements sont enregistrés immédiatement dans la config runtime.
⚙️ Fonctionnalités
OCR activé
Permet l'upload et l'analyse de documents
Export JSON dans les devis
Attache le JSON camduct_import aux devis Odoo
Mode debug
Logs verbeux dans le backend

📦 Catalogue — Pièces & dimensions

Source unique utilisée par le formulaire client, l'OCR/Vision et la reconnaissance vocale (config/catalog/items.json). Toute modification est écrite sur disque puis rechargée immédiatement (backend + ocr-service), sans redéploiement.
🧩 Écart avec CAMduct
Cliquez sur "Comparer" pour interroger CAMduct (nécessite l'add-in actif).
📋 Pièces du catalogue (0)
Nom Description Catégorie Dimensions Connecteurs Path CAMduct Fichier ITM Spec Statut Actions
Chargement...

🧠 Prompt IA

Le prompt est chargé par l'ocr-service à chaque appel Claude. Toute modification est prise en compte immédiatement sans redémarrage.
Vous pouvez utiliser le placeholder {catalog_section} pour injecter automatiquement le catalogue CAMduct.
✏️ Éditeur de prompt

⚙️ Règles Python

Zone avancée. Les règles sont exécutées en Python après chaque appel Claude. Toute erreur de syntaxe est rejetée avant d'être appliquée. Une modification valide est prise en compte immédiatement (hot-reload).
La fonction apply_all_rules(items) doit être présente dans le code.
🐍 Éditeur de règles

📄 Annotation HVAC — Label Studio

Workflow : Uploadez un PDF (plan, devis client) → chaque page est convertie et envoyée dans Label Studio → le technicien annote les pièces HVAC avec les cotes → export YOLO pour entraîner le modèle de détection.
📤 Envoyer un PDF vers Label Studio
📄
Glissez un PDF ici
ou cliquez pour sélectionner · PDF ou image
🏷️ État Label Studio
Chargement...
Ouvrir Label Studio
Guide d'annotation
  1. Uploadez un PDF ci-dessus → les pages apparaissent dans Label Studio
  2. Dans Label Studio, sélectionnez une tâche (page)
  3. Dessinez un rectangle autour de chaque pièce HVAC visible
  4. Sélectionnez le type (Gaine, Coude-90, Transfo...)
  5. Saisissez les cotes dans les champs Largeur / Hauteur / Longueur
  6. Validez → la tâche est marquée comme annotée
  7. Répétez jusqu'à ~50 exemples par type de pièce
  8. Export YOLO depuis LS → entraînement du modèle
Types de pièces : Gaine · Gaine-Firmac · Coude-90 · Coude-45 · Coude-Variable · Réduction · Transfo · Transfo-Circ · Piquage · Té-droit · Fond · Cassé · Autre

🏷️ Label Studio

Label Studio tourne sur ce serveur — accessible sur https://devis.faclim.fr/label-studio/ ↗
Workflow : Envoyer PDF (onglet 📄 Annotation) → Créer projet HVAC (ci-dessous) → Annoter dans Label Studio → Exporter annotations.
🔑 Configuration API
Actions
Crée le projet avec la label config bounding-boxes (Gaine, Coude-90, Transfo...). "Mettre à jour" applique un nouveau layout sans supprimer les tâches. "Réinitialiser" à utiliser si le projet a été supprimé dans LS.
Télécharge le JSON complet des annotations pour l'entraînement YOLO.
Entraîne YOLOv8n sur les annotations LS (CPU, ~30 min). Auto-prédit après entraînement.
🏷️ Label config HVAC (bounding boxes)
Classes annotables sur les croquis :
Gaine Coude-90 Coude-45 Coude-Variable Transfo Transfo-Circ Piquage Te-droit Fond Cassé Autre

🔲 Plénums — Paramètres de chiffrage

Tous les paramètres ci-dessous sont utilisés par le moteur de chiffrage plénums.
Formule : Prix = Matière (surface × €/m²) + MO (temps × taux horaire).
Les modifications sont enregistrées immédiatement et prises en compte au prochain calcul.
👷 Main d'œuvre
Taux appliqué à tous les temps estimés
🏭 Prix matière — Tôle
Épaisseur utilisée si non déterminée automatiquement
🧱 Prix matière — Isolants
⏱️ Temps MO — Corps du plénum
Temps fixe de découpe/pliage/assemblage de base
Multiplié par la surface développée réelle
🔗 Temps MO — Connecteurs
Le connecteur bord franc n'ajoute pas de temps (inclus dans le corps).
🔵 Temps MO — Piquages
⚙️ Temps MO + Prix — Options
Coût matière de l'accessoire trappe/rails

💾 Sauvegarde & Restauration

Le ZIP de sauvegarde contient : catalogue, mappings, règles JSON, config runtime (DB), historique mails (metadata), et les éventuels overrides OCR (prompt, règles Python).
Les pièces jointes binaires des mails ne sont pas incluses.
📥 Télécharger une sauvegarde

Génère un fichier faclim_backup_YYYYMMDD_HHMMSS.zip contenant l'état complet de la configuration et des bases de données.

📤 Restaurer une sauvegarde
⚠️ Attention — La restauration écrase les fichiers JSON de config et met à jour les bases de données (upsert). Les données existantes non présentes dans le ZIP sont conservées.

Sélectionne un fichier .zip créé par cet outil.

📚 Documentation Technique

🏗️ Architecture globale

Plateforme unifiée sur devis.faclim.fr (VPS OVH). Tous les services tournent en Docker Compose derrière nginx (HTTPS Let's Encrypt).

Service Port interne URL externe Rôle
frontend80/443devis.faclim.fr/nginx — UI statique + proxy
backend8000/api/*FastAPI — auth, CAMduct, devis Odoo, admin
ocr-service8001/api/ocr/*FastAPI — pipeline OCR (Tesseract + Claude)
speech-service8002/api/speech/*FastAPI — reconnaissance vocale (Whisper/OpenAI)
sketch-service8003/sketch/*ML Backend LS — YOLOv8n détection HVAC
label-studio8080/label-studio/Label Studio — annotation dessins HVAC
dozzle8080/logs/ (basic auth)UI logs Docker temps réel
🔍 Pipeline OCR

Le document uploadé est d'abord classifié, puis routé vers le bon extracteur.

PDF/Image ├─ STRUCTURED → pdfplumber tables → items directs │ └ fallback Claude texte si 0 items ├─ SEMI_STRUCTURED → extraction texte → règles Python │ └ fallback Claude texte si 0 items ├─ SCANNED_IMAGE → pdf2image (300 DPI) │ ├─ Tesseract (fra+eng) par page │ └─ Claude Vision si texte insuffisant ├─ HANDWRITTEN → Claude Vision (image encodée base64) └─ PLAIN_TEXT → Claude texte (corps de mail, .txt)

Post-traitement des items (rules/__init__.py) :

  • Correction Transfo ↔ Transfo-Circ (règle 1 : nombre de cotes de sortie)
  • Suppression des offsets inventés par l'OCR (strip_ocr_offsets)
  • Normalisation des noms (dictionnaire → noms catalogue CAMduct)
🤖 Pipeline ML — Vision HVAC
Dessin / feuille de croquis HVAC (scan ou photo) │ ▼ [1] UPLOAD — onglet 📄 Annotation PDF → pdf2image (200 DPI) → JPEG par page → tâches Label Studio ▼ [2] ANNOTATION — Label Studio ↗ Bbox par pièce + label (Gaine, Coude-90…) Les cotes sont OPTIONNELLES (utiles pour OCR futur, ignorées par YOLO) ▼ [3] ENTRAÎNEMENT — bouton ▶ Entraîner YOLO Export annotations → dataset YOLO → YOLOv8n 100 epochs (CPU, ~30 min) → hvac_yolo.pt PUIS automatiquement → ▼ [4] PRÉ-ANNOTATION AUTOMATIQUE ← opérationnel Prédictions stockées dans LS sur toutes les tâches Visibles dans le panneau "Predictions" (≠ "Annotations") de chaque tâche Bouton 🔮 pour forcer sans re-entraîner ▼ [5] OCR sur crops ← FUTUR Chaque bbox → crop → Claude Vision → dimensions lues → normalisation mm → CAMduct → Devis

État dataset (2026-06-15) : 11 feuilles · 158 bboxes

Gaine 69 ✅ Coude-90 40 ✅ Transfo 24 ~ Casse 7 ❌ Coude-45 6 ❌ Transfo-Circ 6 ❌

Seuil fiabilité : ~50 bboxes/classe. Ré-entraîner après chaque session d'annotation.

LS = entraînement seulement — jamais en production
🎓 Flux apprentissage
Feuille → Upload LS
→ Annotation humaine
→ ▶ Entraîner YOLO
→ hvac_yolo.pt s'améliore
🏭 Flux production
Feuille client
→ sketch-service (YOLO)
→ Claude Vision (cotes)
→ CAMduct → Devis

LS n'est jamais dans le chemin client. Il sert uniquement à construire et améliorer le modèle YOLO.

🎮 Rôle des boutons — onglet Label Studio
Bouton Ce qu'il fait Durée Quand
▶ Entraîner YOLO Export toutes les annotations → dataset → 100 epochs depuis zéro → sauvegarde modèle → auto-prédit toutes les tâches LS ~30 min Après avoir accumulé 5-10 corrections/annotations
🔮 Prédire toutes les tâches Prend le modèle actuel (inchangé) → infère sur toutes les tâches → remplace les prédictions dans LS ~1-2 min Rafraîchir après redémarrage serveur ou pour voir l'effet sans re-entraîner
⚠️ Important — YOLO apprend uniquement sur les annotations humaines
Les prédictions YOLO (Predictions dans LS) ne sont jamais utilisées pour l'entraînement.
Seul ce que tu soumets en tant qu'Annotation compte. Si tu copies une prédiction erronée sans la corriger et que tu fais Submit, l'erreur entre dans le dataset et dégrade le modèle.
🔄 Workflow — Correction active (active learning)

C'est la façon la plus efficace de progresser : corriger les erreurs du modèle est 5× plus rapide que d'annoter depuis zéro.

  1. Envoyer un PDF — onglet 📄 Annotation :
    Upload → pages converties → tâches créées dans LS.
  2. Ouvrir la tâche dans LSlabel-studio ↗ :
    Les prédictions YOLO se chargent automatiquement en mode édition. Tu peux corriger directement sans repartir de zéro.
  3. Corriger les erreurs :
    Mauvais label → clic sur la bbox → changer le label
    Bbox mal placée → déplacer / redimensionner
    Bbox manquante → en tracer une nouvelle
    Fausse détection → supprimer la bbox
    Les cotes sont optionnelles — YOLO n'en a pas besoin.
  4. Submit → devient une annotation propre dans le dataset.
  5. Après 5-10 feuilles corrigées → bouton "▶ Entraîner YOLO"
    Le modèle réapprend. Les prédictions suivantes sont meilleures. La boucle s'accélère.
Annoter depuis zéro ≈ 15 min / feuille Corriger prédictions ≈ 2 min / feuille (quand le modèle est assez bon)

Règle : Gaine-Firmac → annoter comme Gaine. Si cotes remplies : recopier tel quel (4.60ml, Ø315). Repères bulle : (XX).

🔐 Authentification & Rôles
Rôle Condition Odoo Accès
Client portailshare=TruePricing CAMduct, OCR, création devis
Employé Faclimshare=FalseTout ci-dessus + module Mail
Adminemail = damien@faclim.frTout ci-dessus + admin (sketch, LS, config, OCR)
🚀 Déploiement

Workflow local → serveur :

# En local git add . && git commit -m "..." && git push origin main # Sur le serveur ssh ubuntu@devis.faclim.fr cd /home/ubuntu/FaclimClientPriceRQ git pull docker compose up -d --build --force-recreate

Commandes utiles :

# Logs d'un service docker compose logs backend -f docker compose logs label-studio -f # Reconstruire un seul service (plus rapide) docker compose up -d --build --force-recreate backend # Taille des images Docker docker images | grep faclim