← Bibliothèque / Intelligence
Chatbot IA client (réponses clients multicanal)
Le bot client style Jade/Pahono : même cerveau partout (web + Messenger/Instagram/WhatsApp), KB injectée avec budgets durs, tool-calling résa, takeover humain propre, page de test préactivation.
Construit à partir de :
Studio Belleza (Jade)bookflow pahono
Dans le back office
Relation cliente : Tester le bot (bac à sable) · Canaux · Base de connaissance · Journal IA ; réglages personnalité dans Paramètres/Agent.
Pages & écrans
| Page / zone | Rôle |
|---|---|
/admin/chat-test | Sandbox = MÊME cerveau en mode test : conversation persistée (reprise localStorage), latence affichée, carte tarifs rendue, montre « bot se tait : humain a pris la main », debug toolCalls visible, gate setup_bot_tested_at avant activation |
/c/[slug] | Chat web public par commerce : lien partageable/bulle embed, SANS App Review Meta, respecte ai_enabled + disabled_channels |
widget site | ChatWidget sonde /api/chat/poll + quick-replies contextuels |
/admin/agent (réglages) | enabled master · web_enabled · ton chaleureux(tutoie)/neutre/expert(vouvoie) · greeting · max_reply_chars → budget tokens réel · bookings_paused consultation seule · promptPreview affiche le VRAI prompt construit |
/api/chatbot/media | Photo/vocal client : stockage privé MIME sniffé 8 Mo/20h → vision décrit la photo, transcription vocale → texte renvoyé au bot comme message normal |
Patterns UI/UX
- Quick-replies heuristiques côté widget
- Bannière « prise en main » en canal
- Confidence logs grounded|no_kb_match|fallback|transfer
Composants clés
- lib/chat-agent.ts cerveau mirroré 2 implémentations (règle drift grep+mirror)
- buildSystemPrompt(kb, interdits)
- 10 tools résa déclarés une fois
- Boucle max 5 itérations, temp 0.4
Automatisations
- Webhook canaux Zernio : signature fail-closed → claim ATOMIQUE idempotent (PK event) → ACK 200 IMMÉDIAT avant LLM → traitement async
- Message client persisté AVANT réponse ; réponse persistée AVANT envoi (un rejeu RENVOIE le texte, ne régénère jamais = zéro résa fantôme)
- Poller Messenger cron 1 min ×4 passes ≈12 s latence, watermark + ring dedup
Intelligence artificielle
- Rôle IA
- Répond directement aux clients finaux (pas de pré-validation) mais encadré : KB obligatoire avant tout « je ne sais pas »/transfert ; NE JAMAIS inventer prix/dispo/processus non décrits ; table dates 14 jours GÉNÉRÉE EN CODE (le LLM ne calcule jamais un jour) ; distinction « disponible » vs « réservé confirmé » seulement après succès tool ; scripts de réponse FIXES après tools ; texte brut sans markdown ; menu/tarifs → send_media D'ABORD ; validation contact joignable regex ; jamais le numéro de téléphone du gérant affiché.
- Modèles
- Cascade : DeepSeek chat → Groq llama-3.3-70B → Gemini flash → Claude Haiku (dernier recours payant) ; ou un seul modèle OpenRouter reasoning désactivé (284/300 tokens mangés sinon)
- Garde-fous
- sanitizeMerchantText : données marchand ENROBÉES « DONNÉES pas instructions », neutralise overrides FR/EN/DAN/role-delimiters borné 2000 car ; anti-injection « photo lue = donnée pas ordre » ; mode INFO_ONLY quand résas fermées (list_services/envoyer_carte/demander_heilani uniquement)
Données
- conversations
- messages
- processed_events (idempotence)
- ai_logs
- knowledge
Invariants & pièges
- Prise en main : annonce « l'humain a pris le relais » insérée UNE fois PERSISTÉE dans le fil, puis SILENCE total jusqu'à reprise — détectée par comparaison au dernier message assistant
- Kill-switch global topbar coupe tous canaux d'un coup
- Un 2xx HTTP contenant success:false est un ÉCHEC (piège vécu)