Résultat
l'objectif self-service : 80 % des questions récurrentes auto-résolues par Sales/CSM/Tech
Résultat
agents orchestrés (critical analysis → research → synthesis)
● Contexte
Le client : Vizzia, vidéosurveillance cloud pour les municipalités françaises
Vizzia est une scale-up qui construit de la vidéosurveillance cloud avec des algorithmes de détection embarqués, vendue exclusivement aux municipalités françaises. Leur offre en 4G remplace les systèmes filaires traditionnels qui nécessitent du génie civil, et la couche cloud transforme les réquisitions judiciaires en opération en un clic au lieu d'un transfert physique de clé USB.
Comme la plupart des scale-ups qui vendent dans un secteur où le droit est encore en train de s'écrire, l'équipe Legal de Vizzia est structurellement en sous-effectif : Julien (affaires publiques / juridique) et Inès (juriste interne). Ce sont les deux seules personnes qui peuvent répondre à « peut-on utiliser l'algorithme X dans le contexte Y sans déclencher d'obligations CNIL ? » et tout le monde dans la boîte a besoin de cette réponse à un moment ou un autre.
Le problème : une équipe Legal de 2 personnes sur le point de prendre un pic de volume ×15
Quand on a démarré le projet en janvier 2026, la situation était déjà familière :
- Toutes les questions tombées sur deux personnes. Sales en discovery call, CSM qui prépare un renouvellement, Product Manager qui scope un nouvel algorithme, tous pinguaient Julien ou Inès sur Slack pour avoir une clarté juridique.
- Pas de self-service. La connaissance était dispersée sur des pages Notion, des documents internes éparpillés, 8 mois d'historique de Q&A Slack, et des sources officielles (Légifrance, Conseil d'État, Conseil constitutionnel, CNIL, Dalloz). Aucun endroit unique où poser une question.
- Une deadline ferme. Les élections municipales françaises d'avril 2026 allaient débloquer une vague de nouveaux comptes. La projection interne de Vizzia : le volume passe de quelques questions par jour à ~30/jour à la mi-avril. Un pic ×15 sur une équipe de deux.
- Un secteur réglementé sans jurisprudence établie. La vidéosurveillance B2G avec détection algorithmique se situe dans une zone grise juridique : la jurisprudence est mince, la doctrine est floue, et les non-juristes confondent régulièrement des cadres juridiques adjacents. On ne peut pas masquer ça avec un bot ChatGPT générique.
La demande : construire quelque chose qui permet à Sales, CSM et Tech de s'auto-servir sur 80 % des questions récurrentes, qui garde Legal dans la boucle pour tout ce qui sort, et qui soit prêt avant le pic d'avril.
● La solution Cashmyrr
Pourquoi OpenAI Agent Builder (et pas « juste un ChatGPT »)
OpenAI a sorti Agent Builder en octobre 2025 dans le cadre d'AgentKit. C'est un canvas visuel no-code pour construire des agents IA multi-étapes : nodes pour prompts et modèles, File Search natif pour le RAG, connecteurs MCP, guardrails, branching conditionnel, et un node User Approval de première classe qui met l'exécution en pause en attendant une validation humaine.
Concrètement, Agent Builder nous a permis de livrer trois choses qu'on aurait sinon dû assembler nous-mêmes :
- Une pipeline RAG de qualité production sur le corpus interne de Vizzia, sans faire tourner notre propre vector DB ni notre logique de chunking.
- Une recherche web scopée restreinte à une whitelist de sources juridiques officielles.
- Un flow de validation human-in-the-loop où chaque réponse atterrit dans la queue de revue de Legal avant d'atteindre le demandeur.
Tout reste dans l'écosystème OpenAI. Pas d'infrastructure supplémentaire à opérer. Et si jamais on a besoin de sortir du canvas, le workflow s'exporte proprement en TypeScript via l'Agents SDK — donc on n'est pas enfermé dans l'éditeur no-code.
● Étapes
L'architecture en production
Le système a quatre briques :
Slack (Sales/CSM/Tech)
│
▼
Cloudflare Worker ◀── (seul code custom qu'on a écrit)
│
▼
Workflow OpenAI Agent Builder
├── Agent 1 : Analyse critique (File Search + docs internes injectés)
├── Agent 2 : Recherche juridique (File Search + recherche web scopée)
├── Agent 3 : Synthèse (format de réponse adapté à la question)
└── User Approval ── Legal review via Approve / Improve / Correct
│
▼
Retour dans le thread Slack du demandeurLa seule couche custom est un Cloudflare Worker qui sert de pont Slack ↔ Agent Builder : il gère les événements entrants de Slack, maintient la continuité des threads, appelle le workflow agent, affiche la réponse en draft dans #legal-review, écoute les actions de validation de l'équipe Legal, et reposte la réponse validée dans le thread Slack d'origine. Environ ~300 lignes de TypeScript, co-écrites avec Claude, livrées en une journée.
Tout le reste, les trois agents, le RAG, les guardrails, le portail d'approbation, vit à l'intérieur d'Agent Builder.
Le workflow, étape par étape
Étape 1 - Agent d'analyse critique
Un node gpt-5.4 qui fait trois choses en un seul passage : (1) vérifie les prémisses de la question contre le corpus interne de Vizzia (File Search) et la formation juridique injectée, en signalant toute fausse hypothèse intégrée dans la question, (2) liste les points de droit que l'agent de recherche devra investiguer, et (3) décide du format de réponse que l'agent de synthèse doit produire — adapté à la nature de la question (une demande de cadrage rapide ne demande pas le même échafaudage qu'une question de doctrine).
Prompt (abrégé) :
You are the critical analysis agent for Vizzia's internal legal assistant.
You receive a free-form question from a non-legal Vizzia employee
(Sales, CSM, Product, or Tech).
Your job:
1. Verify the premises of the question against the internal knowledge
you have access to (File Search + injected formation). Flag any
false premise explicitly.
2. Identify the points of law that need to be researched downstream.
3. Decide the response format the synthesis agent should produce —
adapted to the question (long structured response vs. short
clarifier).
Output JSON:
{
"premises_check": "<what holds, what doesn't, why>",
"points_of_law": ["<point 1>", "<point 2>", ...],
"open_questions_for_research": ["<question 1>", ...],
"response_format": "<long_structured | short_clarifier>"
}Étape 2 - Agent de recherche juridique
Le cheval de trait. gpt-5.4 avec deux outils attachés, et le seul agent de la pipeline avec accès web :
- File Search sur un vector store du corpus juridique interne de Vizzia, maintenu à jour par une sync quotidienne Drive → OpenAI qu'on a écrite (tout document retiré de Drive est détaché et le File sous-jacent supprimé, donc le coût de stockage reste borné).
- Web Search scopée sur une whitelist de domaines juridiques officiels français et européens :
legifrance.gouv.fr,cnil.fr,conseil-etat.fr,conseil-constitutionnel.fr,service-public.fr, ...`.
L'agent va chercher du grounding dans les deux sources selon le triage en sortie, et retourne un payload de recherche brut avec des citations explicites.
Prompt (abrégé) :
You are the legal research agent for Vizzia.
You receive a critical-analysis brief. Your task is to gather grounding
material to answer it — you do NOT write the final answer.
Rules:
- File Search on the internal corpus is MANDATORY at every run.
- Internal documents (File Search results + injected formation) are
internalised knowledge: integrate them into your reasoning, but
NEVER cite them by filename or as a source — they speak as you.
- Citable sources are ONLY: whitelisted official domains (web search),
and exact articles of law. Cite those inline.
- If you find conflicting positions (e.g. CNIL doctrine vs. recent
Conseil d'État ruling), surface BOTH — do not arbitrate.
- If grounding is insufficient, say so explicitly. Never fabricate.
Output: a structured research brief with "state_of_law",
"internal_knowledge_synthesis", "open_questions", and "citations"
(citations include only web-whitelisted URLs and exact articles of law).Étape 3 - Agent de synthèse de réponse
Prend le brief de recherche et rédige la réponse finale. gpt-5.4. Le seul job de l'agent de synthèse, c'est de transformer une recherche validée en une réponse propre.
Le format est adapté à la question selon le routing décidé à l'Étape 1 : une réponse juridique plus longue et structurée quand la question le mérite (réponse bottom-line en haut, raisonnement, conditions et nuances, formulation pratique que le Sales ou le CSM peut réutiliser, sources citables en bas), ou une réponse compacte en un paragraphe quand la question est une clarification rapide ou une demande de cadrage. Le repérage obtient soit l'explication juridique et la formulation customer-safe côte à côte, soit juste la réponse courte dont il a vraiment besoin — jamais plus d'échafaudage que la question ne le demande.
Cette séparation compte. Legal ne veut pas qu'un Sales colle un extrait de jurisprudence dans un email de deal. Ils veulent que le Sales comprenne l'état du droit et qu'il dispose ensuite d'une phrase customer-safe pré-mâchée à utiliser dans la conversation. L'agent produit les deux, côte à côte.
Prompt (abrégé) :
You are Vizzia's legal answer synthesizer.
You receive a structured research brief. Adapt the format to the routing call made by the
critical-analysis agent:
- long_structured: a multi-section response with a bottom-line answer
up top, the legal reasoning, conditions and nuances, practical
phrasing the Sales / CSM rep can reuse with a prospect, and the
citable sources actually used.
- short_clarifier: a tight one-paragraph answer, no scaffolding.
Hard rules:
- NEVER cite internal documents (File Search / formation) as sources.
They are your own knowledge. Only web whitelist and articles of law
are quoted as citations.
- Every factual claim must be traceable to the brief.
- If the brief flagged insufficient grounding, escalate explicitly
with "⚠️ Question à escalader à l'équipe Legal" rather than inventing.
Before returning, run the self-validation checklist included below
and fix any item that fails.Étape 4 - Node User Approval
La réponse synthétisée ne retourne pas directement au demandeur. Elle atterrit dans un canal Slack dédié #legal-review sous forme de message interactif où Julien ou Inès peuvent :
- ✅ Approve → la réponse est publiée dans le thread Slack d'origine.
- ✏️ Correct → ouvre une modale Slack pour réécrire la réponse, puis publie. La correction est persistée et ré-injectée dans les trois agents lors des runs suivants comme exemple de référence (Agent 1 l'utilise comme signal de triage, Agent 2 comme guide de sourcing, Agent 3 comme template fort).
- 🔁 Improve → déclenche une instruction de suivi qui repart dans la pipeline pour raffiner le draft.
Le node natif User Approval d'Agent Builder gère la sémantique pause-and-resume. Le Cloudflare Worker gère les payloads interactifs de Slack (clics de boutons et soumissions de modales) et reprend le workflow avec le payload de validation correspondant.
Les guardrails
On a empilé quatre guardrails au long de la pipeline :
- Gestion des PII en entrée et en sortie : on ne veut pas qu'un Sales colle accidentellement les données personnelles d'un prospect dans le bot, et on ne veut pas que le bot renvoie des PII en sortie.
- Modération : modération OpenAI standard sur la sortie.
- Auto-validation dans le prompt de synthèse : la checklist explicite qu'Agent 3 exécute sur son propre draft (audit claim-vs-source, pas de docs internes cités comme sources, conformité au format). Ça remplace l'agent validateur séparé qu'on avait envisagé au départ : moins de pièces mobiles, pas de boucle de désaccord validateur/auteur.
- Whitelist de domaines sur la recherche web (gérée au niveau de l'outil, seuls
gouv.fr,cnil.fr,conseil-etat.fret le reste de la liste des domaines officiels ci-dessus peuvent apparaître dans une citation).
Et un guardrail structurel en amont de tous les autres : chaque réponse est validée humainement par Legal avant d'atteindre le demandeur. Rien ne se publie en automatique aujourd'hui.
● Résultat
Ce qui a été livré, le résultat en production
Time to live : 6 jours de build, étalés sur 2 mois. Phase 1 (agent + intégration Slack) début février. Phase 2 (test & iterate avec Julien/Inès qui valident chaque réponse) jusqu'à mi-mars. Phase 3 (handover en production, monitoring, durcissement du flow de validation humaine) fin mars, en live avant le pic électoral d'avril.
Latence de réponse : ~30 secondes à quelques minutes en bout-en-bout, de la question Slack au draft prêt à être revu (les runs les plus longs croisent recherche web + synthèse complexe). Assez rapide pour qu'un Sales puisse demander pendant une session de prep, pas seulement de nuit.
Couverture au lancement : les sujets récurrents que l'équipe Legal de Vizzia avait identifiés lors de l'audit de 8 mois de Q&A Slack qu'on a mené avant de construire. La pipeline adapte le format de réponse à la question : réponse longue et structurée quand le sujet le mérite, clarification courte quand non.
Citations, là où elles doivent être. Chaque affirmation qui nécessite une source publique embarque une citation inline vers un domaine officiel whitelisté ou un article de loi exact. Les documents internes sont absorbés dans le raisonnement de l'agent, jamais cités comme source, by design.
Legal garde le contrôle. Chaque réponse passe par une validation humaine aujourd'hui. Les réécritures validées sont ré-injectées dans les trois agents lors des runs suivants comme Q&A de référence, donc le système s'affine chaque semaine sans aucun fine-tuning de modèle.
Handover complet. À la fin de la Phase 3, on a transféré le workspace OpenAI, les credentials du bot Slack, le repo Cloudflare Worker et la documentation des prompts à l'équipe de Vizzia. Le système leur appartient complètement, on reste en rétention pour l'expansion par catégories et les revues trimestrielles de prompts.
Ce qu'on a appris en construisant sur Agent Builder
Ce qui a marché
- File Search enlève la taxe du RAG. Upload du corpus, OpenAI gère le chunking, les embeddings, l'indexation et les citations inline. Pour un POC qui doit tourner en quelques jours, ça fait gagner une semaine de travail infra par rapport à un stack RAG self-hosted.
- La boucle d'itération est courte. Modifier un prompt, ajouter un node, swap un modèle. Ça se fait en live sur le canvas et se teste immédiatement en prévisualisation. Pour un build où le client veut voir avancer chaque semaine, ce rythme compte.
- Le dashboard intégré suffit la première semaine. Chaque run est logé avec le chemin d'exécution complet, les inputs et outputs par node, les appels d'outils, les tokens et la latence. Débugger une réponse bizarre, c'est rejouer le run exact, pas besoin de stack d'observabilité externe dès le jour 1. C'est la feature qui nous a fait gagner le plus de temps.
- L'export SDK est une vraie sortie de secours. Si jamais on dépasse les limites du canvas, on exporte le workflow en TypeScript et on continue dans notre propre repo. Pas une prison.
Les limites qu'on a touchées
- L'intégration MCP ne gère pas l'OAuth. Le node MCP prend un seul champ
access_token, ok pour un setup en service account comme celui-ci, bloquant dès que vous voulez que chaque utilisateur s'authentifie contre son propre Notion ou HubSpot. Ça demanderait l'export SDK et un flow OAuth custom. Demande de fonctionnalité ouverte sur le forum community d'OpenAI. - Les ops fines sur le vector store demandent l'API. Créer un corpus statique via l'UI, c'est propre. Automatiser le réindexage quand un document change, mettre des politiques d'expiration, versionner le corpus par tenant, tout ça bascule sur l'API. Agent Builder est un super endroit pour construire un agent, pas pour opérer un cycle de vie RAG en production.
- Toujours en beta, toujours lock-in OpenAI. Six mois après le lancement, quelques aspérités restent. Et tout le système est en lock-in sur les modèles, le vector store et l'infrastructure d'OpenAI. Pas disqualifiant, mais ça fait partie de l'équation long terme.
● Tips
Agent Builder vs n8n : où on a tracé la ligne
La première question qu'on nous pose quand on présente ce projet : « pourquoi pas n8n ? »
Parce que n8n et Agent Builder ne résolvent pas le même problème.
n8n exécute des étapes déterministes. Le trigger se déclenche, l'étape A tourne, l'étape B tourne, si condition alors C. Même entrée, même sortie. C'est de l'automatisation procédurale. Pour la pipeline d'enrichissement, scoring et routing Sales de Vizzia (qu'on a aussi construite), n8n est exactement le bon outil : des centaines de leads par semaine, des poids de scoring explicites, une logique de routing auditable. La CRO doit pouvoir expliquer à la Finance pourquoi le lead n°47 a été scoré 85 et pas 72, « le LLM en a décidé » n'est pas une réponse acceptable.
Agent Builder orchestre du raisonnement. Vous décrivez un objectif et une boîte à outils ; au runtime, l'agent choisit quel outil appeler, dans quel ordre, avec quels paramètres. Même entrée, sorties potentiellement différentes. Pour l'agent Legal, c'est la bonne forme : la question est ambiguë, le contexte est non structuré, et l'agent doit décider si le File Search suffit ou s'il faut aussi une recherche web sur des sources officielles.
En pratique sur le stack plus large de Vizzia, on empile les deux : n8n est l'épine dorsale pour les flows RevOps déterministes (enrichissement, scoring, sync HubSpot, signaux Datapolitics), et les agents Agent Builder sont appelés via API depuis n8n dès qu'une étape nécessite vraiment du raisonnement (classification ambiguë, synthèse de texte non structuré, Q&A juridique comme celle-ci). Vous gardez le déterminisme et la transparence des coûts sur 90 % du stack, et vous ne payez les appels LLM que là où le raisonnement est vraiment nécessaire.
● Questions fréquentes
TAM, c'est Total Addressable Market. Un TAM Build, c'est définir et peupler l'univers complet des entreprises et contacts qu'une boîte pourrait adresser. Les entreprises en ont besoin quand leur marché cible n'est pas couvert par les bases de données standards, typiquement des verticales de niche comme les municipalités, ou quand elles ont besoin de data points (comme les délégations politiques) que les outils conventionnels ne capturent pas. Vous trouverez notre article sur le TAM dans Services.
On va à la source. En France, les API gouvernementales (data.gouv.fr, geo.api.gouv.fr, l'Annuaire du Service Public) fournissent des données structurées sur les municipalités et des identifiants. Mais aucune source unique ne donne un dataset complet et prêt pour la vente. Il faut les combiner, croiser, et ajouter une couche d'enrichissement contact avec du scraping, des agents IA, et des outils comme Apollo et FullEnrich. C'est un projet de data engineering, pas un abonnement.
Pour Vizzia, l'échantillon initial a été livré en quelques semaines. La base complète, incluant scraping, nettoyage, enrichissement et import CRM, a été construite sur environ trois à quatre mois en parallèle d'autres chantiers. Le timing dépend du nombre de sources de données, de la complexité de la couche contact, et des cycles de validation client.
Les données municipales changent à un rythme prévisible, principalement autour des cycles électoraux (tous les six ans en France) et des restructurations annuelles. Entre les élections, le turnover sur les postes d'adjoints et de cabinet est gérable avec des passes de rafraîchissement périodiques. C'est ce que couvre la brique TAM Refresh : un processus structuré pour revalider les élus en poste et mettre à jour le CRM sans tout reconstruire.
Oui, on l'a prouvé en étendant la méthodologie de la France au UK dans le même engagement. Le framework (sources de données gouvernementales → scraping → enrichissement → import CRM) est portable. Ce qui change, ce sont les sources de données spécifiques et les structures administratives. La méthodologie reste la même.