Documentation — IA
Assistant conversationnel (Qwen par défaut via Ollama). Contexte des modules Wiki et Documents. Historique des conversations, sélection des modules pour le contexte.
Les modules Blueprint Modular font partie de l'application Next.js. Il n'y a pas de package séparé par module (pas de pip install blueprint-modular-ia ni npm install blueprint-modular-ia) : on installe l'application une fois, puis on configure la base PostgreSQL et le serveur Ollama (ou Anthropic) pour l'assistant. Cette documentation décrit comment le module IA fonctionne, comment l'installer (application, base de données, serveur Ollama et modèle), comment choisir le modèle (Qwen, Mistral, Claude), les lignes de commande pour installer l'assistant IA et toutes ses dépendances (Node, Prisma, Ollama, Qwen ou Mistral), les lignes de code pour charger et utiliser le module (API, composant AIChat), et la gestion des $ dans la zone de saisie pour référencer les modules (Wiki, Documents, etc.) dans vos questions.
Comment fonctionne le module IA
Le module IA fournit un assistant conversationnel intégré à l'app. Par défaut, les réponses sont générées par un modèle local via Ollama (ex. Qwen3 8B). Le contexte envoyé au modèle peut inclure les données des modules Wiki et Documents : titres et contenu des articles wiki récents, liste des documents uploadés et métadonnées. L'utilisateur choisit quels modules activer dans le panneau de contexte ; le client construit alors un bloc de texte à partir du registry des modules et l'envoie en context_from_modules à l'API. L'historique des conversations est sauvegardé en base (AiConversation, AiMessage) ; chaque discussion peut être reprise, supprimée ou dupliquée.
- Providers : Qwen et Mistral via Ollama ; Claude (Anthropic) si
ANTHROPIC_API_KEYest défini. Seuls ces providers sont implémentés. - Transcription vocale (Whisper) : un bouton Micro dans la zone de saisie permet de dicter la question au lieu de la taper. L'audio est envoyé à
POST /api/wiki/transcribe(micro-service Whisper sur le VPS, port 9000) ; le texte transcrit est inséré dans la zone de saisie. Même service que pour le Wiki (nouvel article par dictée). - Streaming : les réponses sont streamées (Server-Sent Events) pour affichage progressif.
- Prompts : le prompt système (lib/ai/prompt-templates) précise le rôle de l'assistant (Blueprint Modular, français, pas de calcul ni d'hypothèses). Si un contexte modules est fourni, il est injecté dans le prompt système.
Implémentation (côté app)
Le module IA repose sur : (1) la route API POST /api/ai/chat qui reçoit le message, l'historique et le contexte modules, appelle le client Ollama ou Anthropic, et stream la réponse ; (2) le client lib/ai/vllm-client.ts qui envoie les requêtes à Ollama (/api/chat en streaming) ; (3) le module registry (lib/ai/module-registry.ts) dans lequel Wiki et Documents s'enregistrent au chargement de l'app (ModuleRegistryInit) ; (4) le composant AIChat qui gère la saisie, l'autocomplétion des tokens $, l'envoi des messages et l'affichage du flux. Les conversations sont persistées via saveConversationTurn dans l'API après chaque réponse complète.
Lignes de code pour charger et utiliser le module IA
Charger le module :
Le module IA est intégré à l'application Next.js ; il n'y a pas de import ou de script à exécuter pour le « charger » séparément. Au démarrage de l'app, le module registry est initialisé (ModuleRegistryInit) et enregistre les modules Wiki, Documents, etc. ; l'assistant IA consomme ce registry pour construire le contexte. Assurez-vous que les routes API (/api/ai/chat, /api/ai/conversations, etc.) et le schéma Prisma (AiConversation, AiMessage) sont en place — ce qui est le cas après prisma migrate deploy.
Utiliser le module :
Depuis l'interface : ouvrez la page /modules/ia. Vous pouvez envoyer des messages, sélectionner les modules (Wiki, Documents) dans le panneau de contexte pour inclure leur contenu dans le contexte envoyé au modèle, taper $ dans la zone de saisie pour insérer des références ($wiki, $doc), et consulter ou reprendre l'historique des conversations. Depuis du code : appelez POST /api/ai/chat avec message, provider_name, conversation_history, discussion_id (optionnel), context_from_modules (texte construit côté client à partir du module registry). Voir l'exemple d'appel côté client plus bas.
Installation du module IA et dépendances
Le module IA fait partie de l'application Next.js. Aucun package séparé n'est requis pour l'UI ; en revanche, pour des réponses réelles (hors mock), il faut un serveur Ollama (ou une clé Anthropic pour Claude). Les dépendances Node sont déjà dans le projet (@anthropic-ai/sdk pour Claude ; pas de SDK OpenAI pour l'instant, Ollama utilise l'API HTTP).
1. Installer l'application
npm install
npx prisma generate --schema=prisma/schema.prisma
npx prisma migrate deployLes modèles Prisma AiConversation et AiMessage sont créés par les migrations. DATABASE_URL doit être défini dans .env. Pour la liste des structures BDD et prérequis production par module, voir docs/DATABASE.md dans le dépôt.
2. Installer et lancer Ollama (modèle Qwen ou Mistral)
# Installer Ollama : https://ollama.com/download
# Lancer le serveur et télécharger le modèle :
ollama serve
ollama pull qwen3:8b
# Optionnel — autre modèle :
ollama pull mistral:7bPar défaut, l'app utilise AI_SERVER_URL=http://localhost:11434. En dev sans serveur, définir AI_MOCK=true pour des réponses mockées.
3. (Optionnel) Claude (Anthropic)
Pour utiliser Claude comme provider, définir ANTHROPIC_API_KEY dans .env. L'API chat détecte le provider demandé (vllm, qwen, mistral, claude) et appelle soit Ollama soit Anthropic.
Résumé des commandes (installer le module IA et toutes les dépendances)
Enchaînement complet pour avoir l'assistant IA opérationnel (app + base + Ollama + modèle) :
# 1. Dépendances Node et schéma Prisma
npm install
npx prisma generate --schema=prisma/schema.prisma
# 2. Base PostgreSQL
npx prisma migrate deploy
# 3. Serveur Ollama (terminal dédié ou arrière-plan)
ollama serve
ollama pull qwen3:8b
# 4. Lancer l'app
npm run dev
# 5. Ouvrir l'assistant IA
# http://localhost:3000/modules/iaDéfinir dans .env : DATABASE_URL, NEXTAUTH_SECRET, NEXTAUTH_URL, AI_SERVER_URL (ex. http://localhost:11434), AI_MODEL (ex. qwen3:8b). Sans Ollama : AI_MOCK=true pour des réponses simulées.
Comment choisir le modèle
L'assistant peut utiliser plusieurs providers. Le choix se fait dans l'interface (sélecteur de modèle) et/ou via les variables d'environnement.
- Ollama (Qwen, Mistral) : par défaut, l'app utilise le modèle configuré dans
AI_MODEL(ex.qwen3:8b). Pour Qwen et Mistral spécifiquement, vous pouvez définirAI_MODEL_QWENetAI_MODEL_MISTRAL. Téléchargez le modèle avecollama pull qwen3:8bouollama pull mistral:7b, puis sélectionnez le provider correspondant dans l'UI. - Claude (Anthropic) : définissez
ANTHROPIC_API_KEYdans.env. Le provider « claude » devient disponible dans l'assistant ; les requêtes sont envoyées à l'API Anthropic au lieu d'Ollama. - Mock : en développement sans serveur,
AI_MOCK=truedésactive les appels réels et renvoie une réponse factice (utile pour tester l'UI).
Variables d'environnement
AI_SERVER_URL— URL du serveur Ollama (ex.http://localhost:11434ouhttp://vps:11434).AI_MODEL— Modèle Ollama par défaut (ex.qwen3:8b).AI_MODEL_QWEN,AI_MODEL_MISTRAL— Override par provider si besoin.AI_MOCK—truepour désactiver les appels réels et renvoyer des réponses mockées (dév).AI_TIMEOUT— Délai max en secondes (ex. 120).AI_MAX_RETRIES— Nombre de tentatives en cas d'erreur réseau.ANTHROPIC_API_KEY— Clé API Anthropic pour le provider Claude.
Gestion des $ dans l'assistant (références aux modules)
Dans le champ de saisie de l'assistant IA, taper un $ affiche une liste de suggestions de tokens ($wiki, $doc, $metric, etc.). Ces tokens servent à l'autocomplétion : en sélectionnant un token, vous l'insérez dans le message. Ils n'injectent pas le contenu des modules à la place du $ ; ils rappellent quels types de données peuvent être inclus. Le contenu effectif (articles wiki, documents) est injecté dans le contexte envoyé au modèle lorsque les modules correspondants sont sélectionnés dans le panneau de contexte (Module Registry). En résumé : le $ permet de compléter rapidement une référence dans le texte ; la sélection des modules (Wiki, Documents) dans le panneau détermine ce qui est envoyé au modèle comme contexte.
Comment utiliser le $ dans l'assistant :
- Ouvrez l'assistant IA (page
/modules/ia). - Dans le panneau de contexte, cochez les modules dont vous voulez inclure le contenu (ex. Wiki, Documents) ; le texte de contexte sera construit et envoyé avec votre message.
- Dans la zone de saisie, tapez $ : une liste de tokens s'affiche (
$wiki,$doc,$metric, etc.). Sélectionnez un token pour l'insérer dans votre message (ex. « Résume $wiki »). - Le token
$wiki(ou autre) dans le message est un rappel ; le contenu réel des articles ou documents est ajouté au contexte grâce aux cases cochées dans le panneau. Envoyez le message ; l'IA répond en s'appuyant sur le contexte fourni.
Tokens disponibles :
$wiki— Wiki (articles).$doc— Documents (analyses, contrats).$metric— Métriques (dashboard).$table,$chart,$data— Références données (étendues possibles).
Où sont sauvegardées les conversations
Les conversations sont stockées en base PostgreSQL : table AiConversation (id, userId, preview, createdAt, updatedAt) et table AiMessage (id, conversationId, userMessage, aiResponse, providerName, createdAt). Chaque tour de dialogue est enregistré après la fin du streaming. L'historique est chargé via GET /api/ai/conversations et affiché dans le panneau latéral ; une discussion peut être supprimée via DELETE /api/ai/conversations/[id].
API du module IA (résumé)
POST /api/ai/chat— Envoyer un message et recevoir un stream de réponses. Body :message,provider_name(vllm, qwen, mistral, claude),conversation_history,discussion_id,context_from_modules(texte construit côté client depuis le module registry). Réponse : SSE avectype: chunk | done | error,discussion_iddans done.GET /api/ai/conversations— Liste des conversations de l'utilisateur (preview, messages).POST /api/ai/conversations— Créer une nouvelle conversation (retourne l'id).DELETE /api/ai/conversations/[id]— Supprimer une conversation.GET /api/ai/conversations/[id]/messages— Détail des messages d'une conversation (si exposé).GET /api/ai/health— Santé du serveur Ollama (disponibilité, latence).GET /api/ai/providers— Liste des providers (vllm, qwen, mistral, claude, etc.) et indicateur de configuration (ex. ANTHROPIC_API_KEY pour Claude).POST /api/wiki/transcribe— Transcription vocale (Whisper). Utilisée par le bouton Micro de la zone de saisie IA et par le Wiki (nouvel article par dictée). Body :multipart/form-dataavec champaudio(fichier webm/mp4). Réponse :{ transcription: string }. Prérequis : micro-service Whisper démarré (ex. port 9000, variableWHISPER_SERVICE_URLdans.env).
Exemple d'appel côté client (contexte modules)
// Le composant AIChat récupère le contexte des modules sélectionnés puis appelle l'API :
const moduleIds = moduleRegistry.getAllModules().map((m) => m.moduleId);
const { text: contextFromModules } = await moduleRegistry.buildContext(moduleIds);
const res = await fetch("/api/ai/chat", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
message: userMessage,
provider_name: "vllm",
conversation_history: recentMessages,
discussion_id: currentDiscussionId ?? undefined,
context_from_modules: contextFromModules?.trim() || undefined,
}),
credentials: "include",
});