← Retour

/comprendre

Genesis — tout ce qu'il faut savoir pour utiliser l'endpoint

Ce que fait /comprendre

Le commercial dicte ou tape ses notes de visite terrain. /comprendre les analyse, extrait les signaux commerciaux, classifie la temperature de l'opportunite (Chaud / Tiede / Froid), recommande des produits vitrage, et genere un plan d'action. Le tout en une seule requete.

POST /comprendre

Comment le prompter

Parlez comme a un collegue. Pas besoin de structure, pas besoin de champs. Dites ce que vous avez vu, entendu, compris pendant la visite.

Bon prompt : "Visite chez Garnier a Villeurbanne, menuisier PVC, ils refont leur gamme pour du neuf collectif RT2020. Le patron en a marre de son fournisseur qui livre en 4 semaines. 300 vitrages par mois. Il veut des echantillons de double vitrage thermique + acoustique facades. Budget 38-42 euros/m2."
Prompt minimal : "Dupont Marseille, alu, 200 vitrages/mois, echantillons, fournisseur lent."
Prompt pauvre : "visite client" — ca marche quand meme, mais le scoring sera Froid par manque de signaux.

Plus il y a de signaux dans le texte, plus le scoring est precis. Les signaux cles :

SignalImpact sur le scoreExemple dans le texte
Insatisfaction concurrent+fort"marre de son fournisseur", "probleme qualite"
Volume mensuel+fort"200 vitrages par mois"
Decideur present+fort"le patron", "le directeur"
Engagement detecte+fort"veut des echantillons", "demande devis"
Budget communique+moyen"38-42 euros/m2"
Norme citee+moyen"RT2020", "RE2020"
Objection prix-frein"c'est cher", "budget serre"
Objection delai-frein"trop long", "urgent"

Datastructure IN

{
  "text": "Visite chez Dupont a Marseille, ils refont leur gamme alu, 200 vitrages par mois, le patron veut des echantillons, en marre de leur fournisseur lent.",
  "factory_id": 3,
  "anthropic": false
}

anthropic: false (defaut) → extraction par mots-cles, Snake classifie. Pas d'API key requise.

anthropic: true → Claude Haiku extrait les signaux, Snake classifie. Necessite Bedrock ou ANTHROPIC_API_KEY.

ChampTypeRequisDefaultDescription
textstringouiNotes terrain brutes — voix transcrite, texte libre, n'importe quoi
factory_idintnon3ID usine Monce (1=VIT, 3=Monce, 4=VIP, 9=Euro, 10=TGVI)
anthropicboolnonfalseSi true, utilise Claude Haiku pour l'extraction (plus precis, ~2s). Si false, extraction par mots-cles uniquement (instantane, pas d'API key requise).
Design decision : anthropic est false par defaut. L'endpoint fonctionne toujours, meme sans cle API, meme sans Bedrock, meme sans internet. Le feeling AI vient de Snake — les 30 couches SAT, les 600 lookalikes, les probabilites calibrees. Haiku est un bonus de precision sur l'extraction, pas une dependance.

Datastructure OUT

{
  "factory_id": 3,
  "version": "v0.1.0410",
  "latency_ms": 2611,
  "extraction_method": "haiku_bedrock",    // or "haiku_direct" or "keyword_fallback"
  "extraction": {
    "client_info": { "nom": "Dupont", "localisation": "Marseille", "segment": "menuisier_alu", "activite": "mixte" },
    "opportunite": { "volume_mensuel": 200, "insatisfaction_concurrent": true, "engagement_detecte": "demande d'echantillons", "decision_maker_present": true, ... },
    "besoins_techniques": [ { "besoin": "vitrages aluminium", "usage": "renouvellement gamme", "priorite": 1 } ],
    "contraintes": { "budget_m2": { "min": null, "max": null }, "delai_attendu": null },
    "signaux_achat": [ "demande d'echantillons", "insatisfaction fournisseur actuel", ... ],
    "objections_detectees": []
  },
  "mock": false,                           // true if Snake model not loaded
  "opportunite": {
    "temperature": {
      "Prediction": "Chaud",               // Chaud | Tiede | Froid
      "Probability": { "Chaud": 0.953, "Tiede": 0.039, "Froid": 0.008 },
      "method": "snake_sat"                // or "heuristic_fallback"
    },
    "probabilite_closing": 0.78,
    "ca_potentiel_annuel": 105600,
    "ca_calcul": "200 vitrages/mois x 12 mois x 44EUR/m2 moyen = 105KEUR"
  },
  "recommandations_produit": [ ... ],
  "cross_sell": [ ... ],
  "plan_action": [ ... ],
  "arguments_cles": [ ... ],
  "quality_score": 0.87,
  "xai": {
    "temperature_audit": "SAT classification: Chaud (P=0.95). 4 signaux. Audit: ...",
    "matching_audit": "Besoin 1: 'vitrages aluminium' -> ...",
    "budget_audit": "Budget non specifie.",
    "closing_audit": "P(closing) 78%: insatisfaction concurrent, decideur present, ..."
  }
}

Deux modes : avec et sans Haiku

HAIKU Claude Haiku active

extraction_method: "haiku_bedrock" ou "haiku_direct"

Claude Haiku analyse le texte en profondeur. Il comprend le contexte, infere le segment client, detecte des signaux implicites ("le patron m'a dit" → decision_maker_present), et structure les besoins techniques avec precision.

KEYWORD Fallback regex (pas d'API key)

extraction_method: "keyword_fallback"

Extraction par mots-cles et regex. Fonctionne toujours, meme sans cle API. Cherche des patterns connus : "chez X a Y", "N vitrages", "marre de", "echantillons", "38-42 euros".

Comparaison sur le meme texte

"Visite chez Dupont a Marseille, ils refont leur gamme alu, 200 vitrages par mois, le patron veut des echantillons, en marre de leur fournisseur actuel qui est lent."

HaikuKeyword
client_info.nomDupontDupont
client_info.localisationMarseilleMarseille
client_info.segmentmenuisier_alumenuisier_alu
volume_mensuel200200
insatisfactiontrue (motif: "fournisseur lent")true (motif: "fournisseur actuel qui est lent")
engagement"demande d'echantillons""demande echantillons"
decision_makertruetrue
type_projetrenouvellement_gammerenouvellement_gamme
signaux_achat4 signaux (inferes en contexte)5 signaux (pattern match)
besoins_techniques"vitrages aluminium" (semantique)"non specifie" (pas de mot-cle technique)
TemperatureChaud 95.3%Chaud ~90% (moins precis mais meme direction)
Latence~2.6s~3ms
Le mode keyword detecte les memes signaux forts (volume, insatisfaction, decideur, engagement). La temperature sera correcte dans la majorite des cas. La difference se voit sur les besoins techniques et les nuances contextuelles — c'est la que Haiku apporte sa valeur.

Configuration EC2

Option 1 : Bedrock (recommande en prod)

L'EC2 utilise les credentials AWS pour appeler Claude via Bedrock. Pas besoin de cle API Anthropic.

# /opt/furnitureclassifier/.env
AWS_ACCESS_KEY_ID=AKIA...
AWS_SECRET_ACCESS_KEY=...
AWS_REGION=eu-west-3
SNAKE_MODEL_PATH=/opt/furnitureclassifier/models/opportunity_iter10.json

Le SDK anthropic.AnthropicBedrock() lit ces variables automatiquement. Le modele appele est eu.anthropic.claude-haiku-4-5-20251001-v1:0 (Haiku 4.5 via Bedrock EU).

Option 2 : API directe

# /opt/furnitureclassifier/.env
ANTHROPIC_API_KEY=sk-ant-...
SNAKE_MODEL_PATH=/opt/furnitureclassifier/models/opportunity_iter10.json

Utilise anthropic.Anthropic(api_key=...) avec le modele claude-haiku-4-5-20251001. La cle doit commencer par sk-ant-.

Option 3 : Pas de cle (keyword fallback)

# /opt/furnitureclassifier/.env
SNAKE_MODEL_PATH=/opt/furnitureclassifier/models/opportunity_iter10.json

Aucune cle API configuree. L'extraction tombe en mode keyword. Snake classifie quand meme sur les signaux detectes par regex. /comprendre retourne toujours un payload complet — jamais une 500.

Variable .zshrc / bearer token

Si vous avez un AWS_BEARER_TOKEN dans votre .zshrc, il faut le propager dans le .env du service :

# Sur votre machine locale
echo $AWS_BEARER_TOKEN

# Sur l'EC2, ajouter dans /opt/furnitureclassifier/.env
AWS_BEARER_TOKEN=votre_token

# Puis restart
sudo systemctl restart furnitureclassifier

Note : le SDK Anthropic Bedrock utilise AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY, pas le bearer token directement. Si vous utilisez un bearer token pour un autre service d'auth, il faut le mapper vers les credentials IAM appropriees.

Exemples de requetes

curl

curl -X POST https://furnitureclassifier.aws.monce.ai/comprendre \
  -H "Content-Type: application/json" \
  -d '{"text": "Visite chez Garnier, PVC neuf collectif RT2020, 300 vitrages/mois, echantillons demandes, marre du fournisseur actuel. Budget 38-42 eur/m2.", "factory_id": 3}'

Python (httpx)

import httpx

resp = httpx.post("https://furnitureclassifier.aws.monce.ai/comprendre", json={
    "text": "Visite chez Garnier, PVC neuf collectif RT2020, 300 vitrages/mois, echantillons demandes.",
    "factory_id": 3,
})
data = resp.json()
print(f"Temperature: {data['opportunite']['temperature']['Prediction']}")
print(f"Closing: {data['opportunite']['probabilite_closing']}")
print(f"Method: {data['extraction_method']}")

JavaScript (fetch)

const resp = await fetch('/comprendre', {
  method: 'POST',
  headers: {'Content-Type': 'application/json'},
  body: JSON.stringify({
    text: "Visite chez Garnier, PVC, 300 vitrages/mois, echantillons.",
    factory_id: 3
  })
});
const data = await resp.json();
console.log(data.opportunite.temperature.Prediction);
// "Chaud"

Pipeline complet

POST /comprendre { text: "..." }
        |
        v
 [1] EXTRACTION  ─────────────────────────────────────────
     |                                                     |
     | Haiku disponible?                                   | Non
     | Oui                                                 |
     v                                                     v
  Claude Haiku                                     Regex/keyword
  (Bedrock ou direct)                              (_keyword_extract)
  ~1-3s, haute precision                           <5ms, basique
     |                                                     |
     └──────────── extracted JSON ─────────────────────────┘
                        |
                        v
 [2] FEATURE ENGINEERING  (27 features)
     _extracted_to_snake_features()
     segment, volume, interactions, ratios, grades...
                        |
                        v
 [3] SNAKE SAT CLASSIFICATION
     30 layers, ~600 lookalikes
     Chaud / Tiede / Froid + probabilities
                        |
                        v
 [4] ENRICHMENT
     Product matching, closing probability,
     CA estimation, plan d'action, XAI audit
                        |
                        v
 [5] RESPONSE JSON  (toujours 200, jamais 500)

Garanties

SituationComportement
Haiku OK + Snake OKOptimal extraction_method: haiku_*, mock: false
Haiku OK + Snake manquantDegrade extraction_method: haiku_*, mock: true (heuristic scoring)
Haiku KO + Snake OKFallback extraction_method: keyword_fallback, mock: false
Haiku KO + Snake manquantMinimal extraction_method: keyword_fallback, mock: true
Texte vide422 Validation error (text is required)

Le seul cas de non-200 est un texte vide. Tout le reste retourne un payload complet avec les informations disponibles.