diff --git a/app/components/ChatBot.js b/app/components/ChatBot.js index 3f30e07..869ec3f 100644 --- a/app/components/ChatBot.js +++ b/app/components/ChatBot.js @@ -2,6 +2,8 @@ import Link from "next/link"; import { useEffect, useRef, useState } from "react"; +import ReactMarkdown from "react-markdown"; +import remarkGfm from "remark-gfm"; import { askAI } from "../utils/askAI"; /** @@ -18,6 +20,11 @@ import { askAI } from "../utils/askAI"; * info si réponse générale faute de contexte pertinent). * - Timeout 45 s côté fetch (géré dans `askAI.js`) avec message éditorial. * + * v3.2 (2026-04-26) : + * - Réponses bot rendues en Markdown (`ReactMarkdown` + `remark-gfm`) : gras, + * listes, liens cliquables. Texte justifié dans la bulle. Les messages + * utilisateur restent en texte brut. + * * Design : * - Fond `surface-container-lowest/95 backdrop-blur-vellum rounded-sheet shadow-ambient`. * - Bulles : user = `bg-primary text-white` à droite, bot = `bg-surface-container` à gauche. @@ -141,8 +148,38 @@ export default function ChatBot({ onClose }) { } return (
-
- {msg.text} +
+ + {children} + + ); + }, + }} + > + {msg.text} +
{(msg.sources?.length > 0 || msg.grounded !== undefined) && !msg.error && !msg.timeout && ( diff --git a/llm-api/search.py b/llm-api/search.py index 0b6f473..59548f2 100644 --- a/llm-api/search.py +++ b/llm-api/search.py @@ -593,13 +593,14 @@ Ton rôle : Règles de ton : - Réponds en français, ton sobre et précis, sans emojis. -- Cite tes sources entre crochets carrés en utilisant le slug (ex. [push-swap], [ia]). +- N'inclus **pas** de références entre crochets du type `[slug-de-la-note]` dans ta réponse : l'interface liste déjà les fiches du vault sous le message (liens cliquables). Tu peux nommer un projet ou une compétence dans la phrase si utile, sans notation `[slug]`. +- Pour les **liens externes** (site personnel, GitHub, LinkedIn, etc.), utilise le Markdown `[libellé court](url)`. Ne répète pas l'URL en texte brut après le lien. Les listes à puces conviennent pour les coordonnées (téléphone, email, adresse). - Reste concis (3 à 6 phrases en général), sauf demande explicite de détail. - Si la question est hors sujet (ex. question généraliste sans rapport avec Fernand), indique poliment ton rôle et invite à poser une question sur son parcours. Règles de fidélité aux sources (important) : - Chaque source fournie est annotée `type=parcours | projet | moc | competence | glossaire`. -- Pour toute question biographique (qui est Fernand, âge, situation, école, objectif, contact, localisation), appuie-toi **en priorité** sur les sources de `type=parcours` (ex. [bio-fernand], [cv-grascalvet-fernand]). Ne **déduis jamais** d'informations biographiques depuis une source `type=projet` ou `type=moc`. +- Pour toute question biographique (qui est Fernand, âge, situation, école, objectif, contact, localisation), appuie-toi **en priorité** sur les sources de `type=parcours` visibles dans le contexte (bio, CV). Ne **déduis jamais** d'informations biographiques depuis une source `type=projet` ou `type=moc`. - Ne **jamais inventer** un fait factuel (âge, date, diplôme, école, entreprise, technologie utilisée) qui n'apparaît pas littéralement dans les sources. Si l'info n'est pas présente, écris « non précisé dans les notes » et oriente vers /portfolio, /competences ou /contact. - En cas de contradiction entre deux sources, privilégie la source de plus haut score, mentionne brièvement la divergence, et ne choisis jamais une valeur absente des deux. - Une note dont le body se termine par « note tronquée » a été résumée : signale-le si tu t'appuies dessus pour un point précis, ou invite à consulter la note complète.""" diff --git a/strapi_extraction/docs/nouveauCV_grascalvet.pdf b/strapi_extraction/docs/CV/Gras_Calvet_CV.pdf similarity index 60% rename from strapi_extraction/docs/nouveauCV_grascalvet.pdf rename to strapi_extraction/docs/CV/Gras_Calvet_CV.pdf index b5012fd..ae15c0b 100644 --- a/strapi_extraction/docs/nouveauCV_grascalvet.pdf +++ b/strapi_extraction/docs/CV/Gras_Calvet_CV.pdf @@ -1,60 +1,68 @@ - Gras-Calvet Fernand + Gras-Calvet Fernand - Etudiant Informatique / - Recherche alternance Data-IA + 04/11/1978he - Expérience pro + Étudiant Informatique – Recherche + alternance Data / IA - Ostréiculture 1999-2012 + (Automatisation & LLM) -Présentation Pendant plus de 12 ans, j’ai travaillé dans l’ostréiculture à Leucate, - assurant la gestion complète de l’entreprise familiale (Port-Leucate). -Ancien infirmier de 46 ans, actuellement -étudiant en informatique à l’École 42 Infirmier 2014-2023 -Perpignan, je recherche une alternance de -2 ans pour me spécialiser dans Suite à une reconversion professionnelle, j’ai exercé la profession -l’automatisation agentique au sein des -entreprises, en y apportant mon d’infirmier pendant près de 10 ans. Dernier poste clinique Supervaltech -expérience sur le traitement de Data et les -nouveaux process basés sur les LLM. Mon à St Estève en gériatrie de 2018-2023. -parcours atypique reflète ma capacité -d’adaptation, ma rigueur et mon esprit Etudiant Ecole 42 2023- 2025 -d’équipe. - Après des problèmes de santé, bénéficiant d’une RQTH, j’ai entamé une -Contact - nouvelle reconversion professionnelle dans le domaine de - 06.12.01.01.72 - grascalvet.fernand@gmail.com l’informatique. Durant cette période j’ai validé le tronc commun de - fernandgrascalvet.com - https://github.com/Ladebeze66 l’école. Réalisant un stage dans un entreprise logiciel métier spécialisée + Expérience pro - 13 rue de Belfort 66600 dans le béton. L’objectif du stage étant basé sur l’élaboration d’un + Etudiant Ecole 42 / Stage 2023- 2025 - Rivesaltes chatbot, multi-agent, automatisation (interfaçage) entre les différents + Après des problèmes de santé, bénéficiant d’une RQTH, j’ai entamé une -Expérience outils de l’entreprise (support, commercial, CRM ...). +Présentation nouvelle reconversion professionnelle dans le domaine de - Objectifs Alternance +Ancien infirmier en reconversion vers l’informatique. Lors de mon stage en entreprise logicielle spécialisée +l’ingénierie informatique et l’intelligence +artificielle, je me spécialise aujourd’hui dans dans le béton, j’ai conçu une architecture de chatbot multi-agent +la conception de systèmes basés sur des +LLM, l’automatisation de processus métier intégrant analyse de tickets support, traitement d’images techniques +et le traitement de données techniques. +Mon parcours atypique m’apporte rigueur, et pipeline RAG. +adaptabilité et une forte capacité +d’apprentissage autonome. Infirmier 2014-2023 - Mes objectifs de stage sont d’approfondir mon expertise en - programmation, tout en renforçant mes compétences en travail - collaboratif et en gestion de projet. Je souhaite également maîtriser - des outils et technologies avancés afin d’apporter une réelle valeur - ajoutée aux équipes avec lesquelles je travaillerai. - - Intérêts techniques et ambitions - professionnelles - -Python, PHP, HTML, C, C++ Passionné d’informatique depuis mon plus jeune âge, j’ai suivi -Windows, Linux, VM, Server , Shell ... l’évolution des générations de PC et acquis une solide expertise en -Docker assemblage, maintenance et dépannage matériel. -Ollama, LLMs , VLMs open-source, API Également passionné par l’impression 3D, je possède plusieurs -LangChain, Serveurs MCP ... machines et maîtrise des logiciels spécialisés tels que Fusion 360, ainsi - que des slicers (PrusaSlicer, Orca) et firmwares (Klipper, Marlin). -Hardware informatique, Impression 3d En parallèle, j’ai des notions en domotique, un domaine que j’aimerais - approfondir. Enfin, je m’intéresse particulièrement à l’intelligence - Language artificielle, dans laquelle je souhaite me spécialiser après mon stage à - l’École 42. - Anglais - Espagnol +Contact Suite à une reconversion professionnelle, j’ai exercé la profession + d’infirmier pendant près de 10 ans. Dernier poste clinique Supervaltech + 06.12.01.01.72 à St Estève en gériatrie de 2018-2023. + grascalvet.fernand@gmail.com + Ostréiculture 1999-2012 + https://fernandgrascalvet.com + https://github.com/Ladebeze66 Pendant plus de 12 ans, j’ai travaillé dans l’ostréiculture à Leucate, + assurant la gestion complète de l’entreprise familiale (Port-Leucate). + 13 rue de Belfort 66600 Rivesaltes + Objectifs Alternance +Compétences techniques + Intégrer une alternance de 2 ans orientée Data / IA appliquée afin de + Python, PHP, HTML, C, C++ concevoir des outils intelligents pour l’automatisation des processus + bases Node.js / FastAPI métier : + Next, Strapi + Windows, Linux, VM, Git agents IA et workflows LLM + Server , Shell, Docker analyse documentaire et RAG + Architecture serveur et self-hosting IA interfaçage avec systèmes existants (CRM, support, ERP) + Ollama, LLMs , VLMs open-source, API + LangChain, MCP Servers Projets personnels et environnement + Ragflow technique + Obsidian + Hardware Passionné d’informatique et d’innovation technologique, je développe + Impression 3D un environnement personnel orienté intelligence artificielle, + automatisation et auto-hébergement. Je conçois et maintiens mes + Language propres infrastructures (serveurs Windows/Linux, virtualisation, + services cloud personnels, dépôt Git auto-hébergé, observabilité avec + Anglais Langfuse, expérimentation d’outils IA comme Searxng, Firecrawl et + Espagnol Ollama). + J’explore activement les architectures RAG, en combinant LLM open- + source, bases vectorielles et pipelines documentaires afin d’améliorer + la recherche d’information et l’analyse technique. + J’utilise également Obsidian comme un environnement de gestion de + connaissances moderne et évolutif. Au-delà de la simple prise de notes, + il me permet de structurer, relier et tracer l’information technique dans + le temps. Couplé à des LLM et à des bases vectorielles, cet outil devient + un véritable support d’ingénierie personnelle. + En parallèle, je pratique l’impression 3D (Fusion 360, PrusaSlicer, Orca, + Klipper, Marlin), ce qui renforce mon approche concrète de la + conception et du prototypage technique.