Raccourcis clavier

Appuyez sur ← ou → pour passer d'un chapitre à l'autre

Appuyez sur S ou / pour rechercher dans la documentation

Appuyez sur ? pour afficher cette aide

Appuyez sur Échap pour masquer cette aide

Architecture Chatbotaurus

Chatbotaurus est une plateforme MGaaS (MCP Gateway as a Service) européenne et souveraine, écrite en Rust. Elle combine un agent conversationnel, une passerelle MCP alimentée par des connecteurs déclarés en YAML, et une infrastructure auto-hébergeable sous Podman.

À la fin de ce chapitre, vous saurez situer chaque composant, dire dans quel plan il tourne et quelle page détaille son exploitation.

Vue d'ensemble

Quatre couches superposées, de haut en bas : l'interface forge-ui, le backend forge-api, la passerelle MCP forge-mcp, montée dans forge-api et empaquetée dans forge-gateway, et l'infrastructure Podman en deux plans.

La plateforme tient en quatre couches :

  • Interface : forge-ui, une seule base de code Dioxus 0.7 (binaire chatbotaurus). Elle se compile en wasm pour le navigateur (fonctionnalité web), ou en application bureau et mobile (fonctionnalités desktop et mobile de crates/forge-ui/Cargo.toml).
  • Backend : forge-api, un serveur Axum qui expose /api/v1/** (REST, SSE, multipart, WebSocket), adossé à SeaORM sur PostgreSQL. Authentification, jeton CSRF, limitation de débit et contrôles de conformité UE sont des middlewares de ce crate.
  • Passerelle MCP : le moteur forge-mcp (connecteurs, routage, sessions, transport Streamable HTTP). Il est monté dans forge-api (route /api/v1/mcp) et empaqueté seul dans forge-gateway, le binaire du service mcp-gateway du plan client.
  • Infrastructure : conteneurs Podman répartis en deux plans (voir la section « Deux plans, une règle de nommage »), avec PostgreSQL, Valkey, Qdrant, OpenBao, Authentik, Ollama, la chaîne vocale et l'observabilité.

Deux plans, une règle de nommage

Le déploiement est découpé en deux projets Podman, chacun avec son réseau :

PlanRéseau PodmanFichier composeServices
Backend (notre plan)chatbotaurus-vps1podman-compose.ymlforge-*
Clientmgaas-vps2podman-compose.vps2.ymlmcp-*

La règle tient au nom du service : un conteneur nommé mcp-* appartient au plan client, tout autre nom au plan backend. PostgreSQL et Valkey sont rattachés aux deux réseaux (alias DNS postgres et valkey sur mgaas-vps2) pour que les outils du plan client les joignent par leur nom.

Deux blocs superposés : le plan backend, avec l'API, son ingress, PostgreSQL et Valkey, et le plan client, avec la passerelle MCP, les outils du client et son ingress ; PostgreSQL et Valkey sont aussi joints depuis le réseau du plan client.

Figure 1 : les deux plans de déploiement, leur règle de nommage et les deux services rattachés aux deux réseaux.

En production, ces plans sont décrits par des unités Quadlet (containers/*/*.container), l'ingress du plan backend est forge-traefik et celui du plan client mcp-caddy. Le détail est dans Déploiement avec Podman.

Crates du workspace

Le fichier Cargo.toml à la racine déclare ces membres :

CrateRôle (description de son Cargo.toml)
forge-apiServeur HTTP Axum : API REST, transport MCP, WebSocket
forge-coreCœur métier : agents, RAG, workflows, anti-hallucination
forge-mcpMoteur de la passerelle MCP : connecteurs, routage, sessions
forge-gatewayBinaire « serveur gateway » du plan client (service mcp-gateway)
forge-authAuthentification, autorisation, OIDC, TOTP, politiques Cedar
forge-dbCouche base de données : entités SeaORM, migrations
forge-auditJournal d'audit à altération détectable, conformité AI Act, chaîne de Merkle
forge-commonPrimitives transverses : erreurs, cache, traces
forge-wireContrats de transmission partagés entre forge-api et forge-ui
forge-uiInterface Dioxus multiplateforme
forge-voiceService vocal (STT, TTS, WebRTC) avec fournisseurs européens
extraction documentairecrate prévu (spec 115, T-115-50), non encore suivi dans le dépôt ; son nom est déjà déclaré dans le Cargo.toml de l'arbre de travail (mesure du 2026-10-03)
forge-opsDéploiement, amorçage, diagnostics, reprise (CLI)
forge-cliCLI de gestion du serveur, des outils MCP et des modèles
forge-tuiInterface terminal
forge-docsPipeline de documentation mdBook (ce livre)
forge-replayBanc de rejeu de contrats V1/V2
forge-oracleOracle différentiel exécutable V1/V2
forge-test-utilsBanc de test de bout en bout
forge-pgtestPoint de vérité unique de l'image PostgreSQL des tests

Pile technique

CoucheTechnologie
InterfaceRust + Dioxus 0.7
BackendRust + Axum + SeaORM + PostgreSQL + Valkey
Client HTTPreqwest avec rustls (pas d'OpenSSL)
AuthentificationJWT HS256, TOTP (RFC 6238), OIDC avec Authentik
ChiffrementAES-256-GCM (aes-gcm), TLS par rustls
AutorisationCedar, politiques dans le dossier policies/
VecteursQdrant (RAG)
SecretsOpenBao
Observabilité et détectionVictoriaMetrics et VictoriaLogs (plan de développement), Beszel et CrowdSec (déployés). Falco : unité écrite, retirée du déploiement le 2026-09-19
Stockage objetSeaweedFS (S3, Apache-2.0)

Moteur MGaaS : quatre couches

Le moteur d'orchestration vit dans crates/forge-core/src/mgaas/ :

COUCHE 1 : raisonnement
  ToTLite, SelfConsistency, ChainOfVerification, MCTSLite

COUCHE 2 : orchestration d'agents
  routeur MoELite, TaskDecomposer, AgentMCPRegistry

COUCHE 3 : intelligence des outils
  RAREngine, DynamicToolPruner, ToolPatternMemory

COUCHE 4 : exécution et validation
  SpeculativeDecoder, ParallelStreamingExecutor, GroundingEngine

Sous pression de ressources, ce moteur est conçu pour désactiver ses techniques coûteuses par paliers : voir Gestion des erreurs.

État mesuré : la route GET /api/v1/mgaas/engines (crates/forge-api/src/routes/mgaas.rs) déclare « dormants », sans appelant de production, neuf des douze moteurs qu'elle liste. Seuls MoELiteRouter, TaskDecomposer et StructuredOutputValidator sont appelés en production.

Transport MCP : JSON-RPC 2.0 en Streamable HTTP

Dans forge-api, la route est montée dans crates/forge-api/src/router.rs :

POST   /api/v1/mcp   → JSON-RPC (initialize, tools/list, tools/call)
GET    /api/v1/mcp   → flux SSE de notifications
DELETE /api/v1/mcp   → terminer la session
  • La session est portée par l'en-tête Mcp-Session-Id. Sa durée de vie par défaut est de 30 minutes d'inactivité (crates/forge-mcp/src/session.rs).
  • La version de protocole annoncée à initialize est 2025-03-26 (crates/forge-mcp/src/protocol.rs).
  • Ces routes exigent un utilisateur authentifié, et la surface MCP peut être coupée par l'interrupteur MCP_ENABLED.
  • Le binaire forge-gateway expose, lui, POST /mcp et GET /health sur le port 8811 du plan client.

Pour explorer la flotte de connecteurs depuis l'API : GET /api/v1/mcp/catalogue (alias GET /api/v1/mcp/catalog) et GET /api/v1/mcp-gateway/servers.

Connecteurs MCP

Chaque fichier connectors/*.yaml déclare un connecteur. Au démarrage de forge-api, le CatalogueLoader (crates/forge-mcp/src/connector/catalogue.rs) lit ce dossier, résout les variables d'environnement et enregistre le connecteur dans le registre. Le nombre de connecteurs évolue avec le dépôt : il se compte avec ls connectors/*.yaml, jamais avec un chiffre recopié dans une page.

Un connecteur n'est accepté que s'il passe le contrôle de conformité UE du registre : voir Conception des connecteurs MCP.

Les connecteurs couvrent notamment les ERP et CRM (Odoo, ERPNext), les outils de collaboration, le support, l'analytique, les workflows (n8n), la sécurité, l'IA et un grand nombre de sources de données publiques européennes.

Modèles et chaîne vocale

  • LLM : exécutés par Ollama (service forge-ollama). Le modèle par défaut se règle par la variable OLLAMA_MODEL, et forge-cli model pull télécharge un modèle.
  • Embeddings : calculés localement (crate fastembed, crates/forge-core/src/rag/embedder.rs). La dimension des vecteurs est lue à l'exécution depuis le modèle chargé, pas fixée dans la documentation.
  • Voix : synthèse par forge-kokoro-tts, transcription par forge-faster-whisper, temps réel par forge-livekit.

Les fournisseurs LLM tiers sont optionnels et désactivés par défaut.

Authentification

Les méthodes sont cumulables selon la configuration de l'organisation : mot de passe, second facteur TOTP (application d'authentification) et SSO OIDC via Authentik.

  • Le jeton d'accès est un JWT signé en HS256 (l'algorithme est épinglé côté serveur). Sa durée se règle par JWT_EXPIRY ; le défaut du code est de 7 jours (crates/forge-api/src/state.rs).
  • Protection CSRF par double soumission : cookie csrf-token et en-tête x-csrf-token sur les requêtes POST, PUT et DELETE.
  • Les secrets de connecteurs sont chiffrés en AES-256-GCM avant stockage ; les locataires soumis à une exigence réglementaire peuvent les loger dans OpenBao.

Cloisonnement des locataires

Le filtre de locataire canonique repose sur l'organisation (organization_id), appliqué par accessible_workspace_filter (crates/forge-api/src/extractors/mod.rs). Un contrôle de pré-commit sur le cloisonnement des locataires protège les handlers du backend.

Gestion des erreurs

Chaque niveau capture et traduit ses erreurs :

  • Transport MCP : JSON-RPC invalide, session expirée ;
  • Connecteurs : délai dépassé, authentification, limite amont atteinte ;
  • Moteur IA : dégradation par paliers sous pression de ressources.

Détails : Gestion des erreurs.

Compilation et contrôles

# Workspace complet
cargo build --workspace --release

# Interface web (wasm)
cargo build -p forge-ui --target wasm32-unknown-unknown --bin chatbotaurus

# Tests
cargo test --workspace

# Lint strict
cargo clippy --workspace --all-targets -- -D warnings

Les contrôles de pré-commit refusent notamment un fichier Rust de plus de 300 lignes sans exemption motivée et l'usage des termes « parity » ou « parité » sans preuve associée.

Voir aussi