La carte du systĂšme
Ce que fait le produit (en une phrase)
Un copilot de vente B2B : il lit des commandes qui arrivent en vrac (emails, PDF, Excel), en extrait les lignes, matche chaque ligne avec le bon produit du catalogue, applique les prix, crĂ©e le devis â et offre un chat agentique qui rĂ©pond aux questions et agit sur les donnĂ©es. Deux surfaces IA distinctes :
- le pipeline d'extraction : un document entre, des lignes matchĂ©es sortent â un workflow orchestrĂ© (LangGraph, module 6) ;
- le copilot conversationnel : une boucle agent ReAct avec des outils (module 4).
Le modular monolith
Pas de microservices : un monolithe modulaire, assemblé au démarrage. Chaque domaine est un package Python indépendant (workspace uv) :
api/ â bootstrap FastAPI : create_app(), lifespan, montage des routers
modules/
auth/ â OIDC Logto, JWT, rĂ©solution du tenant, wiring RLS
copilot/ â l'agent conversationnel + ses tools
catalog/ â produits, prix, stocks
requests/ â commandes multi-canal
engine/ â le pipeline d'extraction+matching (LangGraph)
libs/
shared/ â modĂšles SQLAlchemy, schĂ©mas, db/RLS, Protocols â la FEUILLE
ai_runtime/ â runtime LLM, bus de tools, streaming, observabilitĂ©
web/ â Nuxt 4 SSR
La rĂšgle d'or : les modules domaine ne s'importent pas entre eux (c'est vĂ©rifiĂ© en CI par import-linter â l'architecture est un test qui casse). Le module engine ne connaĂźt mĂȘme pas catalog : il consomme des interfaces (typing.Protocol : CatalogProvider, PriceProvider, OrderSink) dont les implĂ©mentations sont injectĂ©es au boot.
Le chemin d'une requĂȘte (Ă garder en tĂȘte tout le cours)
HTTP â middleware auth (JWT Logto â tenant_id)
â session DB scoppĂ©e tenant (RLS, module 3 â le concept le plus structurant)
â service du module â [LLM / recherche hybride / tools]
â rĂ©ponse streamĂ©e en SSE vers Nuxt (module 8)
Chaque module de ce cours Ă©claire un segment de ce chemin. Ă la fin, tu pourras suivre n'importe quelle requĂȘte de bout en bout.
Comment le module engine accĂšde-t-il au catalogue sans l'importer ?