Parlez comme un acheteur. Le benchmark se construit tout seul.
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.
/comprendre retourne toujours un payload viable, meme si aucune cle API n'est configuree. La qualite change, pas la disponibilite.
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
}
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
}
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
}
| Champ | Pattern reconnu | Default si absent |
|---|---|---|
| Fournisseur | Nom propre suivi de SA/SARL/SPA/GmbH... | Requis |
| Prix | \d+ EUR, \d+€, a \d+ euros | Requis |
| Description | Texte entre le nom et le prix | Texte brut tronque |
| Delai | delai \d+ jours, \d+j | 14 jours |
| MOQ | MOQ \d+ | 50 |
| Conditions | \d+j fin de mois, \d+j net | 30j |
| Categorie | feuillete/trempe/isolant/miroir/float | vitrage_general |
Claude Haiku structure le texte libre en JSON, puis harmonise les references fournisseur (matching multilingue, normalisation semantique, resolution d'abbreviations).
quality_score: 0.89
Latence: ~2-4s
Parser regex extrait prix, delais, MOQ par pattern matching. Pas de normalisation semantique, pas de matching multilingue. Chaque ligne produit reste independante.
quality_score: 0.45
Latence: ~50ms
{
"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.
quality_score passe de 0.89 a 0.45, mais la structure est identique.
{
"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
}
}
| Capacite | haiku | regex |
|---|---|---|
| Structuration texte | Semantique (comprend le contexte) | Pattern matching (regex) |
| Matching refs cross-fournisseur | VS-FEU442 ↔ VTS-4420-LE → meme article | Chaque ref = article separe |
| Multilingue | "Laminated" → "Feuillete" | Non |
| Abbreviations | "Feuil." → "Feuillete" | Non |
| Conditions implicites | Deduit "30j fin de mois" du contexte | 30j par defaut |
| Qualite matching | Confidence 0.87-0.91 | Aucune — passthrough |
| 10 Snake models | Identique | Identique |
| quality_score output | 0.89 | 0.45 |
| Latence | 2-4s | ~50ms |
| Cout | ~$0.001/requete (Haiku) | $0 |
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.
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.
curl -s https://benchmarkclassifier.aws.monce.ai/health # Ou envoyer un /comprendre et checker le champ "mode" dans la reponse
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)"
# 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)
{"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.