feat(media): Phase 8.G noeuds-ecoles + popup RAG info + lien Bonpote + migration Nebius

- CartePensees: noeuds ecole visibles (cercles proportionnels count auteurs, cliquables, emit select-ecole)
- CartePensees: collision D3 ajustee pour repulsion auteurs autour des noeuds ecole
- FicheEcole: nouveau composant modal (liste auteurs ingeres/non-ingeres, interroger RAG)
- media: header lien Bonpote V2 cliquable + bouton i info RAG
- media: popup FRACAS (description RAG, 662 dimensions, 3 couches, localStorage 1ere visite)
- media: FicheEcole branchee (select-ecole, select-auteur-from-ecole, interroger-ecole)
- ChatbotPensees: suppression mention corpusCount hardcoded (double source de verite)
- chatbot, chatbot-v2, chatbot-reseaux, chatbot-taff: migration Mistral -> Nebius DeepSeek-V3.2
- nuxt.config: ajout nebiusApiKey runtime config

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Jules Neny
2026-05-14 05:56:09 +02:00
parent 46f57ae5fe
commit 40b406bd41
9 changed files with 286 additions and 41 deletions

View File

@@ -145,19 +145,22 @@ export default defineEventHandler(async (event) => {
const systemPrompt = SYSTEM_PROMPT_V2.replace('{{CONTEXTE_RAG}}', contextStr)
// 7. Mistral Small - génération réponse
// 7. Nebius DeepSeek-V3.2 - génération réponse
const nebiusApiKey = config.nebiusApiKey as string
if (!nebiusApiKey) throw createError({ statusCode: 500, statusMessage: 'Clé API Nebius manquante.' })
let mistralRaw: string
try {
const mistralRes = await $fetch<{
const nebiusRes = await $fetch<{
choices: { message: { content: string } }[]
}>('https://api.mistral.ai/v1/chat/completions', {
}>('https://api.tokenfactory.nebius.com/v1/chat/completions', {
method: 'POST',
headers: {
Authorization: `Bearer ${mistralApiKey}`,
Authorization: `Bearer ${nebiusApiKey}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
model: 'mistral-small-latest',
model: 'deepseek-ai/DeepSeek-V3.2',
temperature: 0.3,
max_tokens: 600,
response_format: { type: 'json_object' },
@@ -167,10 +170,10 @@ export default defineEventHandler(async (event) => {
]
})
})
mistralRaw = mistralRes.choices?.[0]?.message?.content ?? '{}'
mistralRaw = nebiusRes.choices?.[0]?.message?.content ?? '{}'
} catch (e: any) {
console.error('[chatbot-v2] Erreur Mistral Small :', e?.message ?? e)
throw createError({ statusCode: 502, statusMessage: 'Erreur appel Mistral Small.' })
console.error('[chatbot-v2] Erreur Nebius DeepSeek :', e?.message ?? e)
throw createError({ statusCode: 502, statusMessage: 'Erreur appel Nebius DeepSeek.' })
}
// 8. Parse JSON