// 01 · le-contexte
Le contexte
Un cabinet d'expertise comptable multi-sites avec 260 collaborateurs. Le quotidien : des outils métier partout (Pennylane pour la gestion clients, 360Learning pour les formations, un drive partagé, des emails), des saisies manuelles redondantes, du copier-coller permanent.
L'objectif de la mission : construire une plateforme interne unique qui centralise tout, qui automatise les flux entre outils, et qui intègre l'IA là où elle apporte vraiment de la valeur métier.
Un enjeu business clé en parallèle : réduire la dépendance à des outils tiers coûteux. Côté formations notamment, internaliser les contenus pour s'affranchir progressivement de l'abonnement 360Learning.
// 02 · la-solution
La solution
Je suis intervenu sur un projet déjà initialisé par un autre développeur, en architecture Domain-Driven Design / Hexagonale. J'ai pris le temps de comprendre la structure existante avant d'étendre — domain, application, infrastructure clairement séparés — pour rester cohérent avec ce qui était en place.
Les modules sur lesquels j'ai contribué :
- →Gestion clients : intégration avec l'API Pennylane, fiches clients enrichies, suivi des missions et des échéances fiscales
- →Module formations : import depuis 360Learning (récupération des 50 formations existantes en base interne, pour s'affranchir progressivement de l'abonnement)
- →Module IA de génération de formations (le morceau le plus intéressant — détail ci-dessous)
- →Onboarding collaborateurs : workflow documents RH, attribution des accès
- →Base de connaissances interne : recherche full-text pour tous les collaborateurs
- →Tableaux de bord de pilotage : missions, deadlines, charge par associé
L'intégration IA : génération de formations à partir de documents bruts
Avant, créer une formation interne demandait des heures à un formateur : prendre un PDF ou des slides, structurer une trame, écrire des objectifs pédagogiques, découper en modules.
J'ai construit un module de génération de formations qui prend en entrée un document brut (PDF, slides, document interne) et produit en sortie une formation structurée prête à diffuser : titre, objectifs, modules, points clés.
5 formations ont déjà été générées par IA et déployées en interne, en parallèle des 50 importées de 360Learning. La logique : importer pour récupérer l'existant, générer pour ne plus dépendre d'un outil externe.
// Pipeline simplifié
async function generateTrainingFromDocument(
documentUrl: string,
options: TrainingOptions,
): Promise<Training> {
// 1. Extraction du contenu (PDF, slides, .docx)
const content = await extractContent(documentUrl);
// 2. Génération structurée via Claude API
const training = await claude.generate({
schema: TrainingSchema, // Validation Zod stricte
prompt: buildTrainingPrompt(content, options),
});
// 3. Validation métier + persistence
await validateTrainingRules(training);
return await trainingRepository.save(training);
}
Le module enforce une structure de sortie validée par Zod : Claude ne renvoie jamais du texte libre, mais un objet typé qu'on peut directement insérer en base. Si le LLM dévie du schéma (rare), on relance avec un prompt enrichi par l'erreur de validation.
Les automatisations entre outils
J'ai également développé des automatisations pour éliminer les saisies redondantes entre les outils du cabinet — notamment via l'API Pennylane pour la gestion clients, et l'import 360Learning pour les formations.
// 03 · les-dfis-techniques
Les défis techniques
S'inscrire dans une architecture existante. Le projet était déjà parti en DDD/Hexagonal quand je suis arrivé. Plutôt que d'imposer mes habitudes, j'ai pris le temps de comprendre les patterns en place et d'étendre dans le même style. C'est rarement le réflexe par défaut d'un nouveau dev sur un projet, mais c'est ce qui fait qu'au bout de quelques mois la codebase reste cohérente.
Garantir la qualité du contenu généré par l'IA. Une formation mal générée, c'est pire qu'une formation absente : ça décrédibilise l'outil et personne ne s'en sert. Validation Zod stricte de la sortie, revue humaine obligatoire avant publication, possibilité d'éditer librement après génération.
Intégrer une API tierce critique (Pennylane). Pennylane gère les données clients du cabinet. Une intégration mal faite peut corrompre la source de vérité. Mise en place d'une couche d'abstraction propre avec gestion des erreurs et retry, pour qu'une panne tierce ne bloque jamais l'utilisateur côté CRM.
// 04 · rsultats-business
Résultats business
- →260 collaborateurs utilisent quotidiennement la plateforme
- →50 formations importées de 360Learning consolidées dans le CRM interne
- →5 formations générées par IA déjà en production
- →Environ 60k€ d'économies estimées sur 2 ans côté client, principalement liées à la réduction de dépendance à 360Learning et à la consolidation des outils
// 05 · stack-technique
Stack technique
| Layer | Technos |
|---|---|
| Frontend | Next.js, TypeScript, Tailwind |
| Backend | NestJS, TypeScript, architecture DDD / Hexagonale |
| Database | PostgreSQL, TypeORM, Redis (cache + queues) |
| IA | Claude API (Anthropic), prompting structuré, validation Zod |
| Auth & Storage | Supabase Auth, AWS S3 |
| Intégrations | Pennylane API, 360Learning API (import) |
| Infra | Docker, CI/CD |
// 06 · ce-que-je-retiens
Ce que je retiens
Cette mission m'a confirmé que l'IA n'est utile qu'intégrée aux workflows existants. Un assistant IA standalone, personne ne s'en sert. Un module IA qui prend un document que tu as déjà sous la main et qui te livre une formation structurée prête à l'emploi — ça, ça s'utilise tous les jours.
Et la vraie compétence sur ce type de mission n'est pas la prouesse technique côté LLM. C'est l'intégration propre dans une architecture existante, avec des validations strictes, des fallbacks, et une expérience utilisateur qui rend l'IA invisible.