/comprendre

Parlez comme un acheteur. Le benchmark se construit tout seul.

1. Ce que fait /comprendre

POST /comprendre prend du texte libre en francais (ou anglais) et retourne un benchmark fournisseur complet — classement, outliers, spider chart, recommandations. C'est le point d'entree naturel pour un acheteur qui n'a pas envie de remplir un formulaire JSON.

Garantie: /comprendre retourne toujours un payload viable, meme si aucune cle API n'est configuree. La qualite change, pas la disponibilite.

2. Comment le prompter

Le minimum

Mentionnez au moins 2 fournisseurs avec un prix chacun. Tout le reste a des defaults.

{
  "text": "GlassCorp a 54 euros, VitroSupply a 51 euros",
  "factory_id": 3
}

Le sweet spot

Nom du fournisseur + description produit + prix + delai + MOQ. Ecrivez comme vous enverriez un message a un collegue.

{
  "text": "GlassCorp propose du feuillete 44.2 LowE a 54EUR, delai 14 jours, MOQ 50. VitroSupply le fait a 51EUR mais 18 jours et MOQ 100. EuroVerre est a 48EUR mais 28 jours, MOQ 300 et ils sont pas toujours fiables.",
  "factory_id": 3
}

Le maximum

Ajoutez conditions de paiement, historique, contexte. Plus vous donnez, plus le benchmark est riche.

{
  "text": "On a recu trois offres pour du feuillete 44.2 LowE et du 33.1 clair. GlassCorp SA: 44.2 LowE a 54EUR MOQ 50 delai 14j 30j fin de mois, 33.1 clair a 28EUR MOQ 100 delai 10j. VitroSupply SARL: 44.2 Low-E a 51EUR MOQ 100 delai 18j 45j, 33.1 a 25.50EUR MOQ 200 delai 15j. EuroVerre SPA: Laminated 44.2 Low-E coated a 48EUR MOQ 300 delai 28j 60j, Laminated 33.1 clear a 22EUR MOQ 500 delai 25j. GlassCorp est notre fournisseur actuel, VitroSupply est credible mais jamais teste sur le 44.2, EuroVerre a des prix imbattables mais les delais sont un probleme.",
  "factory_id": 3
}

Ce que le parser detecte

ChampPattern reconnuDefault si absent
FournisseurNom propre suivi de SA/SARL/SPA/GmbH...Requis
Prix\d+ EUR, \d+€, a \d+ eurosRequis
DescriptionTexte entre le nom et le prixTexte brut tronque
Delaidelai \d+ jours, \d+j14 jours
MOQMOQ \d+50
Conditions\d+j fin de mois, \d+j net30j
Categoriefeuillete/trempe/isolant/miroir/floatvitrage_general

3. Deux modes, un seul endpoint

haiku Avec Bedrock

Claude Haiku structure le texte libre en JSON, puis harmonise les references fournisseur (matching multilingue, normalisation semantique, resolution d'abbreviations).

  • "Laminated" (EN) → "Feuillete" (FR)
  • "Feuil." → "Feuillete"
  • "Low-E coated" → "LowE"
  • VS-FEU442 ↔ VTS-4420-LE ↔ EV-FEU-44.2-LE → meme article

quality_score: 0.89

Latence: ~2-4s

regex Sans Bedrock

Parser regex extrait prix, delais, MOQ par pattern matching. Pas de normalisation semantique, pas de matching multilingue. Chaque ligne produit reste independante.

  • Fonctionne hors-ligne
  • Pas de cout API
  • Pas de matching cross-fournisseur
  • Pas de resolution d'abbreviations

quality_score: 0.45

Latence: ~50ms

POST /comprendre {"text": "...", "factory_id": 3}
  │
  ├─ AWS_BEARER_TOKEN_BEDROCK set?
  │  ├─ oui → Claude Haiku structure le texte → JSON offres
  │  │      Claude Haiku harmonise refs → articles_harmonises
  │  │      mode: "haiku"
  │  └─ non → Regex parse le texte → JSON offres (best effort)
  │          Passthrough harmonise (1 ligne = 1 article)
  │          mode: "regex"
  │
  ├─ 10 Snake models (toujours, quel que soit le mode)
  │   supplier_score, outlier_prix, outlier_delai, outlier_moq
  │   tendance_prix, fiabilite, conditions_rating
  │   competitivite, risque_approvisionnement, recommandation
  │
  └─ JSON Response (benchmark complet + xai audit + mode flag)

4. Structure d'entree

{
  "text": "string — texte libre, francais ou anglais",
  "factory_id": 3,       // optionnel, default 3
  "anthropic": false     // optionnel, default false
}

anthropic controle si Claude Haiku est appele. Par defaut false: les 10 Snake models font le travail, le texte est parse par regex. Passez true pour activer le matching multilingue et la normalisation semantique.

Philosophie: l'intelligence est dans les Snake models, pas dans le LLM. Le LLM est un bonus qualite — le service fonctionne sans, et c'est par design. Un EC2 sans token Bedrock retourne un benchmark complet avec classement, outliers, et recommandations. Le quality_score passe de 0.89 a 0.45, mais la structure est identique.

5. Structure de sortie

{
  "factory_id": 3,
  "version": "v0.1.0410",
  "categorie": "vitrage_feuillete",       // detecte du texte
  "periode": {"debut": "...", "fin": "..."},
  "mode": "haiku" | "regex",              // ← quel pipeline a tourne
  "haiku_enabled": true | false,           // ← Bedrock dispo?

  "benchmark_par_article": [
    {
      "ref_interne": "VFEU-442-LE",        // harmonise par Haiku, ou AUTO-001 en regex
      "denomination": "Feuillete 44.2 LowE",
      "classement": [
        {
          "rang": 1,
          "fournisseur": "GlassCorp SA",
          "score_global": 0.88,
          "Prediction": "Optimal",          // Snake supplier_score
          "Probability": {"Optimal": 0.71, "Acceptable": 0.24, "Outlier": 0.05},
          "detail": {                       // scores par axe
            "prix": 54.0, "score_prix": 0.65,
            "delai": 14,  "score_delai": 0.92,
            "moq": 50,    "score_moq": 0.95,
            "fiabilite": 0.92,
            "conditions_j": 30, "score_conditions": 0.80
          },
          "forces": ["Delai court (14j)", "MOQ faible (50)"],
          "faiblesses": ["Prix le plus eleve"]
        }
        // ... autres fournisseurs
      ],
      "outliers_detectes": [...],           // Snake outlier_prix/delai/moq
      "tendance_prix": {...},               // Snake tendance_prix
      "economie_potentielle": {...}
    }
  ],

  "synthese_fournisseurs": {
    "FRN-00023": {
      "nom": "GlassCorp SA",
      "score_moyen": 0.86,
      "rang_moyen": 1.0,
      "profil": "Premium — ...",
      "recommandation": "Maintenir..."     // Snake recommandation
    }
  },

  "recommandation_globale": {
    "strategie": "Dual sourcing GlassCorp (70%) + VitroSupply (30%)",
    "economie_annuelle_estimee": 14400,
    "risque": "Faible — ...",
    "action_immediate": "Lancer appel d'offre..."
  },

  "quality_score": 0.89,                   // 0.89 haiku, 0.45 regex
  "latency_ms": 2400,
  "mock": false,

  "xai": {
    "matching_audit": "...",               // trace harmonisation
    "scoring_audit": "...",                // formule composite
    "outlier_audit": "...",                // 3 modeles outlier
    "recommandation_audit": "..."          // modele reco + source
  }
}

6. Differences haiku vs regex

Capacitehaikuregex
Structuration texteSemantique (comprend le contexte)Pattern matching (regex)
Matching refs cross-fournisseurVS-FEU442 ↔ VTS-4420-LE → meme articleChaque ref = article separe
Multilingue"Laminated" → "Feuillete"Non
Abbreviations"Feuil." → "Feuillete"Non
Conditions implicitesDeduit "30j fin de mois" du contexte30j par defaut
Qualite matchingConfidence 0.87-0.91Aucune — passthrough
10 Snake modelsIdentiqueIdentique
quality_score output0.890.45
Latence2-4s~50ms
Cout~$0.001/requete (Haiku)$0
En mode regex: les Snake models tournent sur des features moins propres. Le supplier_score reste fiable (il voit prix/delai/moq bruts), mais les modeles qui dependent de l'harmonisation (competitivite, tendance_prix) seront moins precis car ils comparent des articles non-apparies.

7. Activer Haiku sur l'EC2

L'endpoint detecte automatiquement si un token Bedrock est present. Pour l'activer:

# Sur l'EC2, editer le fichier .env du service:
sudo nano /home/ubuntu/benchmarkclassifier/.env

# Ajouter:
AWS_BEARER_TOKEN_BEDROCK=ABSK...votre_token...

# Redemarrer:
sudo systemctl restart benchmarkclassifier

Le token est le meme que celui dans votre .zshrc local (AWS_BEARER_TOKEN_BEDROCK). Il authentifie les appels vers Bedrock Runtime eu-west-3.

Verifier le mode actif

curl -s https://benchmarkclassifier.aws.monce.ai/health
# Ou envoyer un /comprendre et checker le champ "mode" dans la reponse

8. Exemples concrets

Avec Haiku — matching multilingue

curl -X POST https://benchmarkclassifier.aws.monce.ai/comprendre \
  -H "Content-Type: application/json" \
  -d '{"text": "GlassCorp propose du feuillete 44.2 LowE a 54EUR delai 14j MOQ 50. EuroVerre a du Laminated 44.2 Low-E coated a 48EUR delai 28j MOQ 300."}'

# → mode: "haiku"
# → 1 article (Feuillete 44.2 LowE), 2 fournisseurs classes
# → GlassCorp rang 1 (Optimal), EuroVerre rang 2 (Outlier delai)
# → matching_notes: "Laminated (EN) → Feuillete (FR)"

Sans Haiku — regex fallback

# Meme requete, sans token Bedrock:
# → mode: "regex"
# → 2 articles separes (pas de matching cross-ref)
# → Chaque fournisseur classe independamment
# → quality_score: 0.45 (vs 0.89)

Texte minimal — toujours un resultat

{"text": "GlassCorp a 54 euros, VitroSupply a 51 euros"}

# → 2 fournisseurs, 1 ligne chacun
# → Classement par prix (VitroSupply rang 1)
# → Description: texte brut, pas de normalisation
# → Ca marche. C'est pauvre, mais ca marche.