← Agent Vente

/genesis

Comment fonctionne POST /comprendre — avec et sans Haiku

1. Ce que fait /comprendre

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 :

Haiku ON Double sandwich LLM

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.

Haiku OFF Keyword + Snake + template

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.

Snake tourne toujours. Meme sans Haiku, les 5 modeles Snake (scoring, objection, action, canal, timing) s'executent localement. La classification est identique — seule la qualite des features d'entree change.

2. Comment prompter /comprendre

Le minimum viable

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.

Un bon prompt

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 :

ElementImpactExemple
Nom + contactPersonnalisation du message"Marc Lefevre directeur achats"
SegmentScoring + canal"miroitier", "facade", "grossiste"
CA / volumeScoring + action (abandon vs escalade)"500 vitrages/mois", "120K/an"
TempsTiming + scoring"il y a 3 semaines", "depuis 2 mois"
ObjectionType + action"trop cher", "delais trop longs"
ConcurrentObjection + strategie"vs GlassTech", "AGC propose moins cher"
HistoriquePhase + signaux"devis envoye", "visite faite", "relance sans reponse"

3. Datastructure IN

{
  "text": string,     // Texte libre du commercial (obligatoire)
  "factory_id": int   // ID usine Monce (defaut: 3)
}

4. Datastructure OUT

{
  "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
}

5. Haiku ON vs OFF — ce qui change

DimensionHaiku ONHaiku OFF
haiku_enabledtruefalse
extraction_method"haiku""keywords"
ExtractionSemantique (Claude comprend le contexte)Regex/keywords (pattern matching)
NomsPrecis (entreprise + contact + poste)Approximatifs (regex sur majuscules)
CAEstime intelligemment ("500/mois miroitier ~ 120K")Extrait les nombres bruts ou defaut 50K
Objection detailResumee semantiquementContexte brut autour du mot-cle
Snake classificationIdentique — memes 5 modeles, memes features
MessagePersonnalise 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)

6. Setup sur EC2

Activer Haiku

# 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_BEDROCKANTHROPIC_API_KEY. Si aucun n'est defini, le mode keyword s'active automatiquement.

Tester depuis le terminal

# 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

7. Graceful degradation

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).

Le contrat : 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.