Un commercial colle du texte brut. L'API retourne une analyse complete : scoring prospect, type d'objection, action recommandee, canal optimal, timing, message personnalise, KPIs, et audit XAI.
Deux modes :
1. Claude Haiku structure le texte → 20 features JSON
2. Snake SAT classifie → 5 predictions
3. Claude Haiku redige le message → personnalise, contraint
Extraction semantique — comprend le contexte, deduit les valeurs implicites (CA estime, dates relatives, ton de la relation).
Message sur-mesure — adapte au poste, au canal, a l'objection.
1. Regex/keywords extraient → 20 features JSON
2. Snake SAT classifie → 5 predictions (identique)
3. Template genere le message → generique mais correct
Extraction degradee — noms approximatifs, CA estime par defaut, pas de comprehension semantique.
Message template — structure correcte, pas de personnalisation profonde.
POST /comprendre { "text": "Verrerie du Nord, trop cher, 3 semaines sans nouvelles" }
Ca suffit. Le systeme deduit : entreprise = Verrerie du Nord, objection = prix, jours = 21, segment = verrier.
POST /comprendre { "text": "Verrerie du Nord, Marc Lefevre directeur achats. Miroitier, 500 vitrages/mois potentiel (~120K/an). Devis feuillete 44.2 + acoustique envoye il y a 3 semaines (87K). Marc dit trop cher vs GlassTech, demande -12%. Pas de nouvelles depuis relance tel.", "factory_id": 3 }
Plus vous donnez, mieux c'est. Les elements qui font la difference :
| Element | Impact | Exemple |
|---|---|---|
| Nom + contact | Personnalisation du message | "Marc Lefevre directeur achats" |
| Segment | Scoring + canal | "miroitier", "facade", "grossiste" |
| CA / volume | Scoring + action (abandon vs escalade) | "500 vitrages/mois", "120K/an" |
| Temps | Timing + scoring | "il y a 3 semaines", "depuis 2 mois" |
| Objection | Type + action | "trop cher", "delais trop longs" |
| Concurrent | Objection + strategie | "vs GlassTech", "AGC propose moins cher" |
| Historique | Phase + signaux | "devis envoye", "visite faite", "relance sans reponse" |
{
"text": string, // Texte libre du commercial (obligatoire)
"factory_id": int // ID usine Monce (defaut: 3)
}
{
"factory_id": 3,
"version": "v0.1.0410",
"haiku_enabled": true | false,
"extraction_method": "haiku" | "keywords",
"prospects_analyses": [{
"prospect_id": "AUTO-001",
"nom": "Verrerie du Nord",
"scoring": {
"Prediction": "B", // A (chaud) | B (tiede) | C (froid) | D (perdu)
"Probability": {"A": 0.22, "B": 0.58, "C": 0.16, "D": 0.04},
"method": "snake_sat",
"evolution": "A -> B (...)" // ou null
},
"objection": {
"Prediction": "Prix", // Prix | Delai | Qualite | Relation | Inertie | Concurrent
"Probability": {...},
"detail": "Trop cher vs GlassTech",
"sous_type": "benchmark_concurrent" // ou null
},
"action": {
"Prediction": "Contre-offre", // Relancer | Attendre | Contre-offre | Escalade_direction | Abandonner
"Probability": {...}
},
"canal": {
"Prediction": "Email", // Email | Telephone | Visite | LinkedIn
"Probability": {...},
"raison": "Accessibilite difficile + 21j silence = email prioritaire."
},
"timing": {
"Prediction": "Immediat", // Immediat | Sous_3j | Sous_7j | Attendre_signal
"raison": "21j silence + concurrent = risque perte."
},
"message_genere": {
"objet": "Feuillete + acoustique — proposition ajustee",
"corps": "Bonjour Marc, ...",
"strategie": "Concession partielle (-7% vs -12% demande) + ...",
"contraintes_snake": ["Remise max -10%", "Marge min 18%", ...]
},
"kpis": {
"ca_potentiel": 120000,
"marge_estimee_avec_remise": 26400,
"probabilite_closing": 0.48,
"expected_value": 57600,
"jours_avant_perte_estimee": 14
},
"quality_score": 0.85,
"xai": {
"scoring_audit": "Score B: signaux positifs (...) mais ...",
"objection_audit": "Prix (0.81): ...",
"action_audit": "Contre-offre (0.62): ...",
"message_audit": "Message contraint par les regles Snake ..."
}
}],
"latency_ms": 2100
}
| Dimension | Haiku ON | Haiku OFF |
|---|---|---|
haiku_enabled | true | false |
extraction_method | "haiku" | "keywords" |
| Extraction | Semantique (Claude comprend le contexte) | Regex/keywords (pattern matching) |
| Noms | Precis (entreprise + contact + poste) | Approximatifs (regex sur majuscules) |
| CA | Estime intelligemment ("500/mois miroitier ~ 120K") | Extrait les nombres bruts ou defaut 50K |
| Objection detail | Resumee semantiquement | Contexte brut autour du mot-cle |
| Snake classification | Identique — memes 5 modeles, memes features | |
| Message | Personnalise par Claude (ton, canal, strategie) | Template generique (correct mais plat) |
| Latence | ~2-3s (2 appels Claude) | ~50ms (local uniquement) |
| Cout | ~0.002$ par requete (Haiku) | 0$ (pas d'appel API) |
# Sur le serveur EC2 : echo 'AWS_BEARER_TOKEN_BEDROCK=votre_cle_ici' > ~/salesagentclassifier/.env sudo systemctl restart salesagentclassifier # Verifier : curl -s https://salesagentclassifier.aws.monce.ai/health # {"status":"ok","service":"salesagentclassifier"}
L'API cherche dans l'ordre : AWS_BEARER_TOKEN_BEDROCK → ANTHROPIC_API_KEY. Si aucun n'est defini, le mode keyword s'active automatiquement.
# Texte libre : curl -s -X POST https://salesagentclassifier.aws.monce.ai/comprendre \ -H "Content-Type: application/json" \ -d '{"text": "Verrerie du Nord, Marc Lefevre directeur achats. Trop cher vs GlassTech. 3 semaines sans nouvelles."}' \ | python3 -m json.tool # Minimum viable : curl -s -X POST https://salesagentclassifier.aws.monce.ai/comprendre \ -H "Content-Type: application/json" \ -d '{"text": "prospect verre, prix trop cher, 2 semaines sans reponse"}' \ | python3 -m json.tool
La chaine de fallback :
1. Haiku extraction → echoue ? → keyword extraction
2. Snake classification → toujours OK (local)
3. Haiku generation → echoue ? → template message
Meme si la cle API est invalide, expiree, ou absente : /comprendre retourne toujours un payload complet. Le champ haiku_enabled dans la reponse indique quel mode a ete utilise. Le commercial sait si le message a ete genere par Claude (personnalise) ou par template (generique).
POST /comprendre ne renvoie jamais une erreur 5xx pour un texte valide. Le pire cas est un payload avec "haiku_enabled": false et "extraction_method": "keywords" — degrade mais fonctionnel.