Une application d'administration full-stack (React + Express) conçue pour gérer des bases de connaissances, uploader des documents, et les indexer sur le service Google File Search (via l'API Gemini) afin d'alimenter des requêtes dynamiques (ex: pour un chatbot type TypeBot).
Le programme est construit autour d'une architecture Full-Stack optimisée par Vite et Express :
- Frontend (React) :
- Interface d'administration sécurisée par mot de passe.
- Gestion des sujets (bases de connaissances).
- Téléchargement et suppression de fichiers.
- Outil "Sandbox" (bac à sable) pour tester en temps réel les requêtes IA sur les documents uploadés.
- Journal d'audit (Logs) enregistrant les actions des utilisateurs.
- Backend (Express / Node.js) :
server.ts- Fournit une API REST pour interagir avec l'interface React.
- Gère l'authentification et les sessions.
- S'occupe du traitement des fichiers (via
multer) et de leur distribution entre le stockage à long terme (Firebase/Local) et l'indexation Gemini.
- Base de Données et Stockage :
src/server/storage.ts- Utilise Firebase Firestore pour stocker la structure des sujets, l'historique et les fragments (chunks) des fichiers. Un fallback vers le système de fichiers local (
/data,/uploads) est inclus.
- Utilise Firebase Firestore pour stocker la structure des sujets, l'historique et les fragments (chunks) des fichiers. Un fallback vers le système de fichiers local (
Les documents sont regroupés par "Sujet". Créer un sujet permet de catégoriser les fichiers. Lorsqu'une requête de recherche (via TypeBot par exemple) est envoyée, elle peut cibler spécifiquement l'un de ces sujets pour limiter le contexte du modèle IA.
Lorsqu'un administrateur charge un document (PDF, TXT, CSV, etc.) :
- Upload vers le Backend : Le fichier est envoyé en multipart via l'interface React vers l'API Node.js (
/api/subjects/:name/files). - Stockage Permanent : Le fichier est stocké sur Firestore (ou localement en fallback) pour garantir la persistance.
- Indexation Gemini (Google File API) : Le fichier est transmis à l'API Gemini (
ai.files.upload) qui s'occupe de l'extraction de texte et de son indexation sémantique. Une URI unique (geminiUri) est générée et associée au fichier. - Auto-Réparation : Les fichiers hébergés par Gemini ayant une durée de vie limitée, le backend vérifie régulièrement (lors de requêtes) l'expiration des fichiers. S'ils sont expirés, ils sont automatiquement re-téléchargés depuis le stockage permanent vers Gemini grâce aux routines de
server.ts.
La plateforme inclut une "Sandbox" qui permet à l'administrateur de simuler la réponse du chatbot. En sélectionnant un sujet et en tapant un prompt, le backend utilise l'API Gemini en lui fournissant l'ensemble des geminiUri des fichiers appartenant au sujet pour générer une réponse contextuelle.
Le projet utilise le SDK officiel @google/genai pour communiquer avec les services d'IA de Google. L'utilisation de l'API se décompose en plusieurs étapes :
- Téléchargement (Upload) :
Le backend transfère le fichier en utilisant la méthode d'upload de Gemini.
const uploadRes = await ai.files.upload({ file: tempPath, config: { mimeType: file.mimetype } });
- Vérification de l'État :
L'API permet de vérifier si un fichier est prêt à être utilisé par le modèle, ou s'il a expiré (
file.state === "ACTIVE"ou"FAILED"). - Génération de Contenu :
Lorsqu'une réponse est demandée (dans le bac à sable ou via l'API d'interrogation publique), les fichiers sont attachés à la requête sous forme de ressources :
const response = await ai.models.generateContent({ model: "gemini-2.5-flash", contents: [ { role: "user", parts: [ { fileData: { fileUri: file.uri, mimeType: file.mimeType } } ] }, // ... Autres fichiers et prompt utilisateur ... ] });
Pour déployer et utiliser cette application, vous devez configurer certaines variables d'environnement et préparer l'intégration des services externes.
Créez un fichier .env à la racine de votre projet en vous basant sur .env.example :
# Clé API Google Gemini (Obligatoire)
# Obtenez-la sur Google AI Studio (aistudio.google.com)
GEMINI_API_KEY="AIzaSyYourGeminiKeyHere..."
# URL de l'Application (Obligatoire en production)
APP_URL="http://localhost:3000"
# (Optionnel) Bucket Google Cloud Storage
GCS_BUCKET_NAME=""
# Mot de Passe Administrateur (Obligatoire pour se connecter à l'interface)
ADMIN_PASSWORD="votre_mot_de_passe_secret"Le projet nécessite Firestore pour la persistance des métadonnées et du système de "chunks" de fichiers (lorsque l'on contourne les limites de taille mémoire).
Le backend lit le fichier de configuration firebase-applet-config.json qui contient vos clés Firebase (ID de projet, variables API). Assurez-vous que l'authentification et Firestore sont activés sur votre console Firebase.
Installez les dépendances :
npm installLancez le serveur de développement (Le serveur tournera sur le port 3000) :
npm run devPour construire l'application pour la production (Compilation React + Backend ESBuild) :
npm run build
npm startLe système s'exécutera sous forme d'un script Node auto-suffisant (dist/server.cjs) servant l'application frontale depuis le dossier dist/.
Pour que TypeBot (ou un autre agent externe) interroge un sujet, il doit effectuer une requête POST vers l'endpoint public (à configurer ou sécuriser selon les besoins) mis à disposition par le server.ts :
- Endpoint :
/api/sandbox(ou un endpoint dédié à créer) - Body JSON :
{ "subjectName": "NomDuSujet", "query": "Question de l'utilisateur" }
L'API s'occupe de valider l'expiration des documents, de remonter le contexte à Gemini et de retourner la réponse générée.