feat(aep-v1.1): PA5 chatbot pratiques regeneratives

- Nouveau endpoint server/api/chatbot-pratiques.post.ts qui interroge
  le JSON statique pratiques-regeneratives.json (52 fiches V1) avec
  Mistral Small. Prompt systeme adapte aux 8 criteres rege et types
  d'entites. Rate limit 10/jour, circuit breaker partage.
- ChatbotPlaceholder + ChatbotSheet rendus generiques via props
  (endpoint, title, placeholder, ficheBasePath) + slot onboarding.
  La carte ecosysteme AEP continue d'utiliser /api/chatbot, la carte
  pratiques rege utilise /api/chatbot-pratiques.
- pratiques-regeneratives.vue : ChatbotPlaceholder integre sous la
  carte Europe desktop (replie par defaut), FAB mobile + ChatbotSheet
  bottom sheet, handler highlightOrgs pour surligner la fiche reco.
This commit is contained in:
Jules Neny
2026-04-30 02:29:16 +02:00
parent a6fff9a950
commit 914759a815
4 changed files with 421 additions and 29 deletions

View File

@@ -27,7 +27,7 @@
</div>
<span class="flex-1 text-sm" style="color: var(--nav-text-muted);">
{{ isExpanded ? 'Chatbot AEP' : 'Pose une question sur le réseau…' }}
{{ isExpanded ? title : placeholder }}
</span>
<!-- Chevron -->
@@ -52,18 +52,20 @@
<div class="chatbot-body-inner" ref="messagesContainer">
<!-- Onboarding -->
<div v-if="messages.length === 0" class="onboarding-bubble">
<p>Ce chatbot fonctionne sur un serveur européen souverain
<slot name="onboarding">
<p>Ce chatbot fonctionne sur un serveur européen souverain
(Mistral FR, zéro rétention), conçu sobre en énergie.</p>
<p>Pour m'aider à te répondre efficacement,
<p>Pour m'aider à te répondre efficacement,
formule ta requête ainsi :</p>
<ul>
<li>• Besoin : [ce que tu cherches]</li>
<li>• Thématique : [juridique / technique / économique / ...]</li>
<li>• Lieu : [région ou ville]</li>
</ul>
<p class="example">Exemple : "Je suis salarié d'agence, litige avec mon
<ul>
<li>• Besoin : [ce que tu cherches]</li>
<li>• Thématique : [juridique / technique / économique / ...]</li>
<li>• Lieu : [région ou ville]</li>
</ul>
<p class="example">Exemple : "Je suis salarié d'agence, litige avec mon
employeur, besoin conseil juridique droit du travail,
Île-de-France."</p>
</slot>
</div>
<!-- Messages -->
@@ -76,7 +78,7 @@ employeur, besoin conseil juridique droit du travail,
<a
v-for="fiche in msg.fiches"
:key="fiche.id"
:href="`/fiche/${fiche.id}`"
:href="`${ficheBasePath}/${fiche.id}`"
class="fiche-card"
>
<span class="fiche-nom">{{ fiche.nom }}</span>
@@ -134,6 +136,18 @@ interface ChatMessage {
fiches?: FicheReco[]
}
const props = withDefaults(defineProps<{
endpoint?: string
title?: string
placeholder?: string
ficheBasePath?: string
}>(), {
endpoint: '/api/chatbot',
title: 'Chatbot AEP',
placeholder: 'Pose une question sur le réseau…',
ficheBasePath: '/fiche',
})
const emit = defineEmits<{
'highlightOrgs': [ids: (number | string)[]]
}>()
@@ -165,7 +179,7 @@ async function sendMessage() {
const res = await $fetch<{
reponse_texte: string
fiches_recommandees: { id: number | string; nom: string; explication: string }[]
}>('/api/chatbot', {
}>(props.endpoint, {
method: 'POST',
body: { question },
})