[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"doc-\u002Fdocs\u002Fpipelines\u002Fediteur-visuel":3,"docs-nav-fr":576},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"body":10,"_type":570,"_id":571,"_source":572,"_file":573,"_stem":574,"_extension":575},"\u002Fdocs\u002Fpipelines\u002Fediteur-visuel","pipelines",false,"","L'éditeur visuel","Concevoir un pipeline par glisser-déposer, avec validation des contrats au plus tôt.",{"type":11,"children":12,"toc":556},"root",[13,29,36,46,80,86,93,113,125,171,182,188,199,205,217,223,241,253,299,316,322,418,424,436,469,481,487,492,539,551],{"type":14,"tag":15,"props":16,"children":17},"element","p",{},[18,21,27],{"type":19,"value":20},"text","Un pipeline betool est un ",{"type":14,"tag":22,"props":23,"children":24},"strong",{},[25],{"type":19,"value":26},"graphe de nœuds",{"type":19,"value":28}," que vous assemblez dans l'éditeur visuel. Chaque type de nœud déclare côté serveur sa configuration et les clés qu'il produit ; l'éditeur valide le graphe et la configuration avant de le laisser publier.",{"type":14,"tag":30,"props":31,"children":33},"h2",{"id":32},"anatomie-dun-pipeline",[34],{"type":19,"value":35},"Anatomie d'un pipeline",{"type":14,"tag":37,"props":38,"children":40},"pre",{"code":39},"[Start]──▶[agent]──▶[router]──┬──▶[agent]\n                              └──▶[webhook_action]\n",[41],{"type":14,"tag":42,"props":43,"children":44},"code",{"__ignoreMap":7},[45],{"type":19,"value":39},{"type":14,"tag":47,"props":48,"children":49},"ul",{},[50,70,75],{"type":14,"tag":51,"props":52,"children":53},"li",{},[54,56,61,63,68],{"type":19,"value":55},"Le nœud ",{"type":14,"tag":22,"props":57,"children":58},{},[59],{"type":19,"value":60},"Start",{"type":19,"value":62}," est créé automatiquement avec le modèle ; il porte les ",{"type":14,"tag":22,"props":64,"children":65},{},[66],{"type":19,"value":67},"récepteurs",{"type":19,"value":69}," (canaux d'entrée) qui déclenchent le pipeline. Un même Start peut en déclarer plusieurs.",{"type":14,"tag":51,"props":71,"children":72},{},[73],{"type":19,"value":74},"Chaque nœud aval lit les clés produites par les nœuds amont dans le contexte d'exécution.",{"type":14,"tag":51,"props":76,"children":77},{},[78],{"type":19,"value":79},"Un routeur ou des filtres créent des branches ; chaque exécution laisse une trace consultable.",{"type":14,"tag":30,"props":81,"children":83},{"id":82},"concepts-essentiels",[84],{"type":19,"value":85},"Concepts essentiels",{"type":14,"tag":87,"props":88,"children":90},"h3",{"id":89},"clé-de-flux",[91],{"type":19,"value":92},"Clé de flux",{"type":14,"tag":15,"props":94,"children":95},{},[96,98,103,105,111],{"type":19,"value":97},"Une ",{"type":14,"tag":22,"props":99,"children":100},{},[101],{"type":19,"value":102},"clé",{"type":19,"value":104}," est une donnée nommée qui circule entre les nœuds. Exemple : un nœud agent peut écrire sa sortie sous ",{"type":14,"tag":42,"props":106,"children":108},{"className":107},[],[109],{"type":19,"value":110},"exchange.intent",{"type":19,"value":112},", et un nœud aval (filtre, routeur) teste cette clé.",{"type":14,"tag":15,"props":114,"children":115},{},[116,118,123],{"type":19,"value":117},"Ce qu'un nœud ",{"type":14,"tag":22,"props":119,"children":120},{},[121],{"type":19,"value":122},"produit",{"type":19,"value":124}," est déclaré par son contrat, sous deux formes :",{"type":14,"tag":47,"props":126,"children":127},{},[128,154],{"type":14,"tag":51,"props":129,"children":130},{},[131,136,138,144,146,152],{"type":14,"tag":22,"props":132,"children":133},{},[134],{"type":19,"value":135},"Clé fixe",{"type":19,"value":137}," (",{"type":14,"tag":42,"props":139,"children":141},{"className":140},[],[142],{"type":19,"value":143},"fixed_key",{"type":19,"value":145},") — toujours la même, définie par le type de nœud (ex. ",{"type":14,"tag":42,"props":147,"children":149},{"className":148},[],[150],{"type":19,"value":151},"input.entry_kind",{"type":19,"value":153}," pour le Start).",{"type":14,"tag":51,"props":155,"children":156},{},[157,162,163,169],{"type":14,"tag":22,"props":158,"children":159},{},[160],{"type":19,"value":161},"Clé configurable",{"type":19,"value":137},{"type":14,"tag":42,"props":164,"children":166},{"className":165},[],[167],{"type":19,"value":168},"configurable_key",{"type":19,"value":170},") — choisie dans la configuration du nœud (ex. la clé de sortie d'un agent).",{"type":14,"tag":15,"props":172,"children":173},{},[174,175,180],{"type":19,"value":117},{"type":14,"tag":22,"props":176,"children":177},{},[178],{"type":19,"value":179},"lit",{"type":19,"value":181}," se règle dans sa configuration (le champ testé par un filtre, les entrées d'un agent…).",{"type":14,"tag":87,"props":183,"children":185},{"id":184},"contrat",[186],{"type":19,"value":187},"Contrat",{"type":14,"tag":15,"props":189,"children":190},{},[191,193,197],{"type":19,"value":192},"Chaque type de nœud expose un ",{"type":14,"tag":22,"props":194,"children":195},{},[196],{"type":19,"value":184},{"type":19,"value":198}," déclaré côté serveur : ses champs de configuration (type, valeurs autorisées, champs requis, valeurs par défaut) et les clés qu'il produit. L'éditeur s'appuie sur ce contrat pour construire le panneau de configuration et valider ce que vous saisissez.",{"type":14,"tag":87,"props":200,"children":202},{"id":201},"configuration",[203],{"type":19,"value":204},"Configuration",{"type":14,"tag":15,"props":206,"children":207},{},[208,210,215],{"type":19,"value":209},"Un nœud a aussi des ",{"type":14,"tag":22,"props":211,"children":212},{},[213],{"type":19,"value":214},"paramètres statiques",{"type":19,"value":216}," (sa configuration) — par exemple, pour un nœud agent : son rôle, sa mission, ses tools, son modèle LLM.",{"type":14,"tag":87,"props":218,"children":220},{"id":219},"secrets",[221],{"type":19,"value":222},"Secrets",{"type":14,"tag":15,"props":224,"children":225},{},[226,228,232,234,239],{"type":19,"value":227},"Les champs que le contrat d'un nœud ou d'un récepteur déclare ",{"type":14,"tag":22,"props":229,"children":230},{},[231],{"type":19,"value":219},{"type":19,"value":233}," (secret HMAC d'un webhook entrant, token ou mot de passe d'un appel HTTP, jeton d'accès d'une Page, secret d'un sous-pipeline…) ne sont ",{"type":14,"tag":22,"props":235,"children":236},{},[237],{"type":19,"value":238},"jamais renvoyés en clair",{"type":19,"value":240}," une fois enregistrés : ni à l'éditeur, ni par l'API, ni aux outils MCP et aux agents qui lisent un pipeline, ni dans les propositions.",{"type":14,"tag":15,"props":242,"children":243},{},[244,246,251],{"type":19,"value":245},"Dans l'inspecteur, un tel champ affiche ",{"type":14,"tag":22,"props":247,"children":248},{},[249],{"type":19,"value":250},"« •••••• enregistré — saisir pour remplacer »",{"type":19,"value":252}," :",{"type":14,"tag":47,"props":254,"children":255},{},[256,268,280],{"type":14,"tag":51,"props":257,"children":258},{},[259,261,266],{"type":19,"value":260},"laissé vide, il ",{"type":14,"tag":22,"props":262,"children":263},{},[264],{"type":19,"value":265},"conserve",{"type":19,"value":267}," le secret enregistré ;",{"type":14,"tag":51,"props":269,"children":270},{},[271,273,278],{"type":19,"value":272},"une saisie le ",{"type":14,"tag":22,"props":274,"children":275},{},[276],{"type":19,"value":277},"remplace",{"type":19,"value":279}," ;",{"type":14,"tag":51,"props":281,"children":282},{},[283,285,290,292,297],{"type":19,"value":284},"le bouton ",{"type":14,"tag":22,"props":286,"children":287},{},[288],{"type":19,"value":289},"Retirer",{"type":19,"value":291}," l'",{"type":14,"tag":22,"props":293,"children":294},{},[295],{"type":19,"value":296},"efface",{"type":19,"value":298}," (pour un secret HMAC, la vérification de signature est alors désactivée).",{"type":14,"tag":300,"props":301,"children":303},"alert",{"type":302},"info",[304],{"type":14,"tag":15,"props":305,"children":306},{},[307,309,314],{"type":19,"value":308},"Copier-coller ou dupliquer un nœud ",{"type":14,"tag":22,"props":310,"children":311},{},[312],{"type":19,"value":313},"ne recopie pas",{"type":19,"value":315}," ses secrets : ressaisissez-les sur la copie.",{"type":14,"tag":30,"props":317,"children":319},{"id":318},"créer-un-pipeline",[320],{"type":19,"value":321},"Créer un pipeline",{"type":14,"tag":323,"props":324,"children":325},"ol",{},[326,344,355,374,386,391,408],{"type":14,"tag":51,"props":327,"children":328},{},[329,334,336,342],{"type":14,"tag":22,"props":330,"children":331},{},[332],{"type":19,"value":333},"Modèles → Nouveau",{"type":19,"value":335}," — dans betool, un ",{"type":14,"tag":337,"props":338,"children":339},"em",{},[340],{"type":19,"value":341},"modèle",{"type":19,"value":343}," porte votre pipeline.",{"type":14,"tag":51,"props":345,"children":346},{},[347,349,353],{"type":19,"value":348},"Le canvas s'ouvre avec un nœud ",{"type":14,"tag":22,"props":350,"children":351},{},[352],{"type":19,"value":60},{"type":19,"value":354},". Configurez-le pour choisir le ou les canaux d'entrée.",{"type":14,"tag":51,"props":356,"children":357},{},[358,360,365,367,372],{"type":19,"value":359},"Ajoutez des nœuds avec le bouton ",{"type":14,"tag":22,"props":361,"children":362},{},[363],{"type":19,"value":364},"Ajouter un nœud",{"type":19,"value":366}," au survol d'un lien, ou par clic droit sur un nœud (",{"type":14,"tag":22,"props":368,"children":369},{},[370],{"type":19,"value":371},"Ajouter un nœud avant \u002F après",{"type":19,"value":373},"), puis choisissez leur type dans le catalogue de modules (recherche par nom).",{"type":14,"tag":51,"props":375,"children":376},{},[377,379,384],{"type":19,"value":378},"Reliez les nœuds entre eux. Le pipeline est un ",{"type":14,"tag":22,"props":380,"children":381},{},[382],{"type":19,"value":383},"arbre",{"type":19,"value":385}," : chaque nœud a un seul parent.",{"type":14,"tag":51,"props":387,"children":388},{},[389],{"type":19,"value":390},"Cliquez sur un nœud pour ouvrir sa configuration dans l'inspecteur.",{"type":14,"tag":51,"props":392,"children":393},{},[394,399,401,406],{"type":14,"tag":22,"props":395,"children":396},{},[397],{"type":19,"value":398},"Lancer un test",{"type":19,"value":400}," — exécutez la version publiée sur un payload saisi librement, en mode réel ou en ",{"type":14,"tag":22,"props":402,"children":403},{},[404],{"type":19,"value":405},"mode simulation",{"type":19,"value":407}," (les nœuds à effet externe sont sautés).",{"type":14,"tag":51,"props":409,"children":410},{},[411,416],{"type":14,"tag":22,"props":412,"children":413},{},[414],{"type":19,"value":415},"Publier",{"type":19,"value":417}," — un message de commit est obligatoire ; le pipeline est validé, puis la nouvelle version devient celle exécutée par le runtime.",{"type":14,"tag":30,"props":419,"children":421},{"id":420},"versionnage",[422],{"type":19,"value":423},"Versionnage",{"type":14,"tag":15,"props":425,"children":426},{},[427,429,434],{"type":19,"value":428},"Chaque publication crée une version. Depuis ",{"type":14,"tag":22,"props":430,"children":431},{},[432],{"type":19,"value":433},"Versions",{"type":19,"value":435},", vous pouvez :",{"type":14,"tag":47,"props":437,"children":438},{},[439,449,459],{"type":14,"tag":51,"props":440,"children":441},{},[442,447],{"type":14,"tag":22,"props":443,"children":444},{},[445],{"type":19,"value":446},"Comparer",{"type":19,"value":448}," une version à l'état courant (nœuds et liens ajoutés, retirés, modifiés).",{"type":14,"tag":51,"props":450,"children":451},{},[452,457],{"type":14,"tag":22,"props":453,"children":454},{},[455],{"type":19,"value":456},"Recharger",{"type":19,"value":458}," une version dans l'éditeur (le brouillon est réécrit, sans publier).",{"type":14,"tag":51,"props":460,"children":461},{},[462,467],{"type":14,"tag":22,"props":463,"children":464},{},[465],{"type":19,"value":466},"Republier",{"type":19,"value":468}," une version antérieure (rollback).",{"type":14,"tag":15,"props":470,"children":471},{},[472,474,479],{"type":19,"value":473},"Depuis l'historique, une exécution passée issue d'un récepteur peut aussi être ",{"type":14,"tag":22,"props":475,"children":476},{},[477],{"type":19,"value":478},"rejouée",{"type":19,"value":480}," sur la version publiée, avec un payload éventuellement modifié et en mode simulation si besoin.",{"type":14,"tag":30,"props":482,"children":484},{"id":483},"validation",[485],{"type":19,"value":486},"Validation",{"type":14,"tag":15,"props":488,"children":489},{},[490],{"type":19,"value":491},"À la publication, un validateur contrôle le graphe :",{"type":14,"tag":47,"props":493,"children":494},{},[495,529],{"type":14,"tag":51,"props":496,"children":497},{},[498,503,505,511,513,519,521,527],{"type":14,"tag":22,"props":499,"children":500},{},[501],{"type":19,"value":502},"Bloquant",{"type":19,"value":504}," — cycle dans le graphe ; nœud avec plusieurs parents ; sortie obligatoire non câblée (le corps d'une boucle ",{"type":14,"tag":42,"props":506,"children":508},{"className":507},[],[509],{"type":19,"value":510},"foreach",{"type":19,"value":512},", les enfants d'un ",{"type":14,"tag":42,"props":514,"children":516},{"className":515},[],[517],{"type":19,"value":518},"parallel",{"type":19,"value":520},", chaque route déclarée d'un ",{"type":14,"tag":42,"props":522,"children":524},{"className":523},[],[525],{"type":19,"value":526},"router",{"type":19,"value":528},") ; nombre de Start incorrect ; erreurs propres à un type de nœud (ex. rôle ou mission d'agent inexistant).",{"type":14,"tag":51,"props":530,"children":531},{},[532,537],{"type":14,"tag":22,"props":533,"children":534},{},[535],{"type":19,"value":536},"Avertissement",{"type":19,"value":538}," (non bloquant) — nœud non atteignable depuis le Start ; écart d'une configuration existante avec le contrat de son nœud.",{"type":14,"tag":15,"props":540,"children":541},{},[542,544,549],{"type":19,"value":543},"Lors de l'écriture d'une configuration (éditeur, propositions, API), une valeur hors des valeurs autorisées ou un champ requis manquant sont ",{"type":14,"tag":22,"props":545,"children":546},{},[547],{"type":19,"value":548},"refusés",{"type":19,"value":550},", avec la correction attendue.",{"type":14,"tag":15,"props":552,"children":553},{},[554],{"type":19,"value":555},"Conséquence : un pipeline publié a passé ces contrôles structurels. Les erreurs restantes relèvent de l'exécution (un appel API tiers qui échoue, un parsing inattendu).",{"title":7,"searchDepth":557,"depth":557,"links":558},2,[559,560,567,568,569],{"id":32,"depth":557,"text":35},{"id":82,"depth":557,"text":85,"children":561},[562,564,565,566],{"id":89,"depth":563,"text":92},3,{"id":184,"depth":563,"text":187},{"id":201,"depth":563,"text":204},{"id":219,"depth":563,"text":222},{"id":318,"depth":557,"text":321},{"id":420,"depth":557,"text":423},{"id":483,"depth":557,"text":486},"markdown","content:docs:3.pipelines:1.editeur-visuel.md","content","docs\u002F3.pipelines\u002F1.editeur-visuel.md","docs\u002F3.pipelines\u002F1.editeur-visuel","md",[577],{"title":578,"_path":579,"children":580},"Docs","\u002Fdocs",[581,594,622,648,661,677,690,751],{"title":582,"_path":583,"children":584},"Démarrer","\u002Fdocs\u002Fdemarrer",[585,588,591],{"title":586,"_path":587},"Bienvenue","\u002Fdocs\u002Fdemarrer\u002Fbienvenue",{"title":589,"_path":590},"Créer un compte","\u002Fdocs\u002Fdemarrer\u002Fcreer-un-compte",{"title":592,"_path":593},"Brancher une clé LLM","\u002Fdocs\u002Fdemarrer\u002Fbrancher-llm",{"title":595,"_path":596,"children":597},"Canaux","\u002Fdocs\u002Fcanaux",[598,601,604,607,610,613,616,619],{"title":599,"_path":600},"Vue d'ensemble des canaux","\u002Fdocs\u002Fcanaux\u002Fvue-densemble",{"title":602,"_path":603},"Téléphonie temps réel","\u002Fdocs\u002Fcanaux\u002Ftelephone",{"title":605,"_path":606},"Email","\u002Fdocs\u002Fcanaux\u002Femail",{"title":608,"_path":609},"Chat widget web","\u002Fdocs\u002Fcanaux\u002Fchat-widget",{"title":611,"_path":612},"Webhook HTTP","\u002Fdocs\u002Fcanaux\u002Fwebhook",{"title":614,"_path":615},"Messageries (WhatsApp, Messenger, Telegram, Mattermost)","\u002Fdocs\u002Fcanaux\u002Fmessageries",{"title":617,"_path":618},"Meta Lead Ads","\u002Fdocs\u002Fcanaux\u002Ffacebook-leads",{"title":620,"_path":621},"Planification (cron)","\u002Fdocs\u002Fcanaux\u002Fschedule",{"title":623,"_path":624,"children":625},"Pipelines","\u002Fdocs\u002Fpipelines",[626,627,630,633,636,639,642,645],{"title":8,"_path":4},{"title":628,"_path":629},"Agents IA","\u002Fdocs\u002Fpipelines\u002Fagents",{"title":631,"_path":632},"Opérateurs déterministes","\u002Fdocs\u002Fpipelines\u002Foperateurs",{"title":634,"_path":635},"Contrôle de flux","\u002Fdocs\u002Fpipelines\u002Fcontrole-flux",{"title":637,"_path":638},"Étapes de code","\u002Fdocs\u002Fpipelines\u002Fcode-step",{"title":640,"_path":641},"Sous-pipelines","\u002Fdocs\u002Fpipelines\u002Fsous-pipelines",{"title":643,"_path":644},"Actions sans code","\u002Fdocs\u002Fpipelines\u002Factions-no-code",{"title":646,"_path":647},"Base de connaissances","\u002Fdocs\u002Fpipelines\u002Fbase-de-connaissances",{"title":649,"_path":650,"children":651},"Supervision","\u002Fdocs\u002Fsupervision",[652,655,658],{"title":653,"_path":654},"Historique d'exécutions","\u002Fdocs\u002Fsupervision\u002Fexecutions",{"title":656,"_path":657},"Crédits & metering","\u002Fdocs\u002Fsupervision\u002Fcredits-metering",{"title":659,"_path":660},"Benchmarks","\u002Fdocs\u002Fsupervision\u002Fbenchmarks",{"title":662,"_path":663,"children":664},"Sécurité","\u002Fdocs\u002Fsecurite",[665,668,671,674],{"title":666,"_path":667},"Principes de sécurité","\u002Fdocs\u002Fsecurite\u002Fprincipes",{"title":669,"_path":670},"Multi-tenant strict","\u002Fdocs\u002Fsecurite\u002Fmulti-tenant",{"title":672,"_path":673},"Audit RGPD & journal d'accès","\u002Fdocs\u002Fsecurite\u002Faudit-rgpd",{"title":675,"_path":676},"Déploiement souverain","\u002Fdocs\u002Fsecurite\u002Fdeploiement-souverain",{"title":678,"_path":679,"children":680},"Développeurs","\u002Fdocs\u002Fdeveloppeurs",[681,684,687],{"title":682,"_path":683},"API admin","\u002Fdocs\u002Fdeveloppeurs\u002Fapi-admin",{"title":685,"_path":686},"Webhooks sortants","\u002Fdocs\u002Fdeveloppeurs\u002Fwebhooks-sortants",{"title":688,"_path":689},"Piloter betool depuis Claude (MCP)","\u002Fdocs\u002Fdeveloppeurs\u002Fmcp",{"title":691,"_path":692,"children":693},"Intégrations","\u002Fdocs\u002Fintegrations",[694,697,700,703,706,709,712,715,718,721,724,727,730,733,736,739,742,745,748],{"title":695,"_path":696},"Vue d'ensemble des intégrations","\u002Fdocs\u002Fintegrations\u002Fvue-densemble",{"title":698,"_path":699},"Stripe","\u002Fdocs\u002Fintegrations\u002Fstripe",{"title":701,"_path":702},"GitHub","\u002Fdocs\u002Fintegrations\u002Fgithub",{"title":704,"_path":705},"Google","\u002Fdocs\u002Fintegrations\u002Fgoogle",{"title":707,"_path":708},"LinkedIn Ads","\u002Fdocs\u002Fintegrations\u002Flinkedin-ads",{"title":710,"_path":711},"Kavkom","\u002Fdocs\u002Fintegrations\u002Fkavkom",{"title":713,"_path":714},"Jira","\u002Fdocs\u002Fintegrations\u002Fjira",{"title":716,"_path":717},"Slack","\u002Fdocs\u002Fintegrations\u002Fslack",{"title":719,"_path":720},"SMS","\u002Fdocs\u002Fintegrations\u002Fsms",{"title":722,"_path":723},"Enable Banking (open banking)","\u002Fdocs\u002Fintegrations\u002Fenable-banking",{"title":725,"_path":726},"CRM, marketing & productivité","\u002Fdocs\u002Fintegrations\u002Fcrm-marketing",{"title":728,"_path":729},"HeyGen (vidéo)","\u002Fdocs\u002Fintegrations\u002Fheygen",{"title":731,"_path":732},"La Poste","\u002Fdocs\u002Fintegrations\u002Fla-poste",{"title":734,"_path":735},"CRM métier (beTool Application, Qhare)","\u002Fdocs\u002Fintegrations\u002Fcrm-metier",{"title":737,"_path":738},"Mitti (inspections terrain)","\u002Fdocs\u002Fintegrations\u002Fmitti",{"title":740,"_path":741},"Meta (Messenger, Pages, Meta Ads)","\u002Fdocs\u002Fintegrations\u002Fmeta",{"title":743,"_path":744},"Onoff Business (Beta)","\u002Fdocs\u002Fintegrations\u002Fonoff",{"title":746,"_path":747},"Smart Life \u002F Tuya (objets connectés)","\u002Fdocs\u002Fintegrations\u002Fsmart-life",{"title":749,"_path":750},"Produits beTool (Desktop, Kiosk, Terminal)","\u002Fdocs\u002Fintegrations\u002Fproduits-betool",{"title":752,"_path":753,"children":754},"Cas d'usage","\u002Fdocs\u002Fcas-usage",[755,758,761,764,767,770],{"title":756,"_path":757},"Agents métier types","\u002Fdocs\u002Fcas-usage\u002Fvue-densemble",{"title":759,"_path":760},"CFO IA","\u002Fdocs\u002Fcas-usage\u002Fcfo-ia",{"title":762,"_path":763},"COO IA","\u002Fdocs\u002Fcas-usage\u002Fcoo-ia",{"title":765,"_path":766},"CTO IA","\u002Fdocs\u002Fcas-usage\u002Fcto-ia",{"title":768,"_path":769},"Product Manager IA","\u002Fdocs\u002Fcas-usage\u002Fproduct-manager-ia",{"title":771,"_path":772},"Assistant personnel","\u002Fdocs\u002Fcas-usage\u002Fassistant-personnel"]