[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"doc-\u002Fdocs\u002Fpipelines\u002Foperateurs":3,"docs-nav-fr":1355},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"body":10,"_type":1349,"_id":1350,"_source":1351,"_file":1352,"_stem":1353,"_extension":1354},"\u002Fdocs\u002Fpipelines\u002Foperateurs","pipelines",false,"","Opérateurs déterministes","Nœuds d'action qui ne passent pas par un LLM — HTTP, DB, transformations, calculs.",{"type":11,"children":12,"toc":1325},"root",[13,36,43,55,60,66,80,85,198,216,264,273,278,343,355,390,528,585,637,661,670,675,798,804,859,868,887,928,937,973,978,983,1015,1027,1036,1062,1068,1087,1092,1153,1166,1214,1255,1260,1266,1271,1299],{"type":14,"tag":15,"props":16,"children":17},"element","p",{},[18,21,27,29,34],{"type":19,"value":20},"text","Un ",{"type":14,"tag":22,"props":23,"children":24},"strong",{},[25],{"type":19,"value":26},"opérateur",{"type":19,"value":28}," est un nœud qui exécute une action ",{"type":14,"tag":22,"props":30,"children":31},{},[32],{"type":19,"value":33},"déterministe",{"type":19,"value":35}," : pas de LLM, pas d'aléatoire. Pour chaque entrée donnée, la sortie est prévisible.",{"type":14,"tag":37,"props":38,"children":40},"h2",{"id":39},"pourquoi-les-utiliser",[41],{"type":19,"value":42},"Pourquoi les utiliser",{"type":14,"tag":15,"props":44,"children":45},{},[46,48,53],{"type":19,"value":47},"Toute logique qui peut être écrite explicitement ",{"type":14,"tag":22,"props":49,"children":50},{},[51],{"type":19,"value":52},"doit",{"type":19,"value":54}," l'être. Un LLM qui « calcule un total » ou « formate une date » est un anti-pattern : il est plus lent, plus cher, et peut se tromper.",{"type":14,"tag":15,"props":56,"children":57},{},[58],{"type":19,"value":59},"Règle pratique : si vous savez écrire la fonction en 5 lignes de Python, c'est un opérateur — pas un agent.",{"type":14,"tag":37,"props":61,"children":63},{"id":62},"types-disponibles",[64],{"type":19,"value":65},"Types disponibles",{"type":14,"tag":67,"props":68,"children":70},"h3",{"id":69},"webhook_action-appel-http",[71,78],{"type":14,"tag":72,"props":73,"children":75},"code",{"className":74},[],[76],{"type":19,"value":77},"webhook_action",{"type":19,"value":79}," (appel HTTP)",{"type":14,"tag":15,"props":81,"children":82},{},[83],{"type":19,"value":84},"Effectue un appel HTTP sortant. Configuration :",{"type":14,"tag":86,"props":87,"children":88},"ul",{},[89,95,145,180,193],{"type":14,"tag":90,"props":91,"children":92},"li",{},[93],{"type":19,"value":94},"URL, méthode, headers et paramètres de requête (avec placeholders depuis le contexte)",{"type":14,"tag":90,"props":96,"children":97},{},[98,100,106,108,114,115,121,122,128,129,135,137,143],{"type":19,"value":99},"Body : ",{"type":14,"tag":72,"props":101,"children":103},{"className":102},[],[104],{"type":19,"value":105},"none",{"type":19,"value":107},", ",{"type":14,"tag":72,"props":109,"children":111},{"className":110},[],[112],{"type":19,"value":113},"json",{"type":19,"value":107},{"type":14,"tag":72,"props":116,"children":118},{"className":117},[],[119],{"type":19,"value":120},"form",{"type":19,"value":107},{"type":14,"tag":72,"props":123,"children":125},{"className":124},[],[126],{"type":19,"value":127},"raw",{"type":19,"value":107},{"type":14,"tag":72,"props":130,"children":132},{"className":131},[],[133],{"type":19,"value":134},"multipart",{"type":19,"value":136},", ou ",{"type":14,"tag":72,"props":138,"children":140},{"className":139},[],[141],{"type":19,"value":142},"mapper",{"type":19,"value":144}," (body composé par le langage de mapping, voir ci-dessous)",{"type":14,"tag":90,"props":146,"children":147},{},[148,150,156,157,163,164,170,172,178],{"type":19,"value":149},"Authentification : ",{"type":14,"tag":72,"props":151,"children":153},{"className":152},[],[154],{"type":19,"value":155},"bearer",{"type":19,"value":107},{"type":14,"tag":72,"props":158,"children":160},{"className":159},[],[161],{"type":19,"value":162},"basic",{"type":19,"value":107},{"type":14,"tag":72,"props":165,"children":167},{"className":166},[],[168],{"type":19,"value":169},"api_key_header",{"type":19,"value":171}," (header custom) ou ",{"type":14,"tag":72,"props":173,"children":175},{"className":174},[],[176],{"type":19,"value":177},"oauth2",{"type":19,"value":179}," (voir ci-dessous)",{"type":14,"tag":90,"props":181,"children":182},{},[183,185,191],{"type":19,"value":184},"Statuts HTTP acceptés, délai maximal, et nombre de réessais (",{"type":14,"tag":72,"props":186,"children":188},{"className":187},[],[189],{"type":19,"value":190},"retry_count",{"type":19,"value":192},", 0 par défaut, backoff exponentiel)",{"type":14,"tag":90,"props":194,"children":195},{},[196],{"type":19,"value":197},"Clé de sortie où la réponse est publiée",{"type":14,"tag":67,"props":199,"children":201},{"id":200},"database_query-database_manage",[202,208,210],{"type":14,"tag":72,"props":203,"children":205},{"className":204},[],[206],{"type":19,"value":207},"database_query",{"type":19,"value":209}," \u002F ",{"type":14,"tag":72,"props":211,"children":213},{"className":212},[],[214],{"type":19,"value":215},"database_manage",{"type":14,"tag":15,"props":217,"children":218},{},[219,224,226,231,233,239,241,246,248,254,256,262],{"type":14,"tag":72,"props":220,"children":222},{"className":221},[],[223],{"type":19,"value":207},{"type":19,"value":225}," lit des lignes dans une base no-code betool ou dans une base externe (Postgres, MySQL, MongoDB) enregistrée dans ",{"type":14,"tag":22,"props":227,"children":228},{},[229],{"type":19,"value":230},"Applications → Bases de données → Connexions",{"type":19,"value":232}," : filtre ",{"type":14,"tag":72,"props":234,"children":236},{"className":235},[],[237],{"type":19,"value":238},"where",{"type":19,"value":240},", recherche plein texte, limite. ",{"type":14,"tag":72,"props":242,"children":244},{"className":243},[],[245],{"type":19,"value":215},{"type":19,"value":247}," y écrit (",{"type":14,"tag":72,"props":249,"children":251},{"className":250},[],[252],{"type":19,"value":253},"create",{"type":19,"value":255}," ou ",{"type":14,"tag":72,"props":257,"children":259},{"className":258},[],[260],{"type":19,"value":261},"update",{"type":19,"value":263},"), le contenu étant composé par le langage de mapping.",{"type":14,"tag":67,"props":265,"children":267},{"id":266},"file_transform",[268],{"type":14,"tag":72,"props":269,"children":271},{"className":270},[],[272],{"type":19,"value":266},{"type":14,"tag":15,"props":274,"children":275},{},[276],{"type":19,"value":277},"Transforme un fichier. Transformers livrés :",{"type":14,"tag":86,"props":279,"children":280},{},[281,292,303,314,332],{"type":14,"tag":90,"props":282,"children":283},{},[284,290],{"type":14,"tag":72,"props":285,"children":287},{"className":286},[],[288],{"type":19,"value":289},"pdf_extract_text",{"type":19,"value":291}," — texte sélectionnable d'un PDF (pas d'OCR : un PDF scanné ne rend pas de texte)",{"type":14,"tag":90,"props":293,"children":294},{},[295,301],{"type":14,"tag":72,"props":296,"children":298},{"className":297},[],[299],{"type":19,"value":300},"pdf_split",{"type":19,"value":302}," — découpe d'un PDF",{"type":14,"tag":90,"props":304,"children":305},{},[306,312],{"type":14,"tag":72,"props":307,"children":309},{"className":308},[],[310],{"type":19,"value":311},"pdf_to_images",{"type":19,"value":313}," — rendu des pages d'un PDF en images",{"type":14,"tag":90,"props":315,"children":316},{},[317,323,324,330],{"type":14,"tag":72,"props":318,"children":320},{"className":319},[],[321],{"type":19,"value":322},"xlsx_to_json",{"type":19,"value":209},{"type":14,"tag":72,"props":325,"children":327},{"className":326},[],[328],{"type":19,"value":329},"xls_to_json",{"type":19,"value":331}," — lecture d'un classeur Excel en lignes JSON",{"type":14,"tag":90,"props":333,"children":334},{},[335,341],{"type":14,"tag":72,"props":336,"children":338},{"className":337},[],[339],{"type":19,"value":340},"unzip",{"type":19,"value":342}," — extraction d'une archive",{"type":14,"tag":67,"props":344,"children":346},{"id":345},"file_link-liens-de-téléchargement",[347,353],{"type":14,"tag":72,"props":348,"children":350},{"className":349},[],[351],{"type":19,"value":352},"file_link",{"type":19,"value":354}," (liens de téléchargement)",{"type":14,"tag":15,"props":356,"children":357},{},[358,360,365,367,372,374,379,381,388],{"type":19,"value":359},"Livre des fichiers à un tiers ",{"type":14,"tag":22,"props":361,"children":362},{},[363],{"type":19,"value":364},"par lien",{"type":19,"value":366},", sans mettre leur contenu dans le flux : pour chaque fichier d'une liste du contexte (les fichiers d'un téléchargement, des pièces jointes reçues, les photos d'une inspection…), le nœud ",{"type":14,"tag":22,"props":368,"children":369},{},[370],{"type":19,"value":371},"Liens de téléchargement",{"type":19,"value":373}," produit un ",{"type":14,"tag":22,"props":375,"children":376},{},[377],{"type":19,"value":378},"lien de téléchargement signé",{"type":19,"value":380}," à durée de vie limitée. Une étape suivante compose ce que reçoit le destinataire : réponse d'un ",{"type":14,"tag":382,"props":383,"children":385},"a",{"href":384},"\u002Fdocs\u002Fcanaux\u002Fwebhook",[386],{"type":19,"value":387},"webhook entrant",{"type":19,"value":389},", email…",{"type":14,"tag":391,"props":392,"children":393},"table",{},[394,413],{"type":14,"tag":395,"props":396,"children":397},"thead",{},[398],{"type":14,"tag":399,"props":400,"children":401},"tr",{},[402,408],{"type":14,"tag":403,"props":404,"children":405},"th",{},[406],{"type":19,"value":407},"Réglage",{"type":14,"tag":403,"props":409,"children":410},{},[411],{"type":19,"value":412},"Rôle",{"type":14,"tag":414,"props":415,"children":416},"tbody",{},[417,447,467,480,500],{"type":14,"tag":399,"props":418,"children":419},{},[420,434],{"type":14,"tag":421,"props":422,"children":423},"td",{},[424,426,432],{"type":19,"value":425},"Liste des fichiers à lier (",{"type":14,"tag":72,"props":427,"children":429},{"className":428},[],[430],{"type":19,"value":431},"input_path",{"type":19,"value":433},")",{"type":14,"tag":421,"props":435,"children":436},{},[437,439,445],{"type":19,"value":438},"Où lire la liste dans le flux — chaque entrée porte ",{"type":14,"tag":72,"props":440,"children":442},{"className":441},[],[443],{"type":19,"value":444},"path",{"type":19,"value":446}," (clé du fichier dans le stockage de l'organisation) et éventuellement un nom de fichier. Obligatoire.",{"type":14,"tag":399,"props":448,"children":449},{},[450,462],{"type":14,"tag":421,"props":451,"children":452},{},[453,455,461],{"type":19,"value":454},"Sous-dossiers autorisés (",{"type":14,"tag":72,"props":456,"children":458},{"className":457},[],[459],{"type":19,"value":460},"path_scope",{"type":19,"value":433},{"type":14,"tag":421,"props":463,"children":464},{},[465],{"type":19,"value":466},"Facultatif : restreint les fichiers signables à certains sous-dossiers du stockage de l'organisation.",{"type":14,"tag":399,"props":468,"children":469},{},[470,475],{"type":14,"tag":421,"props":471,"children":472},{},[473],{"type":19,"value":474},"Durée de vie des liens",{"type":14,"tag":421,"props":476,"children":477},{},[478],{"type":19,"value":479},"15 minutes par défaut, de 1 minute à 24 heures.",{"type":14,"tag":399,"props":481,"children":482},{},[483,495],{"type":14,"tag":421,"props":484,"children":485},{},[486,488,494],{"type":19,"value":487},"Nombre maximum de fichiers (",{"type":14,"tag":72,"props":489,"children":491},{"className":490},[],[492],{"type":19,"value":493},"max_files",{"type":19,"value":433},{"type":14,"tag":421,"props":496,"children":497},{},[498],{"type":19,"value":499},"20 par défaut, 100 au plus.",{"type":14,"tag":399,"props":501,"children":502},{},[503,515],{"type":14,"tag":421,"props":504,"children":505},{},[506,508,514],{"type":19,"value":507},"Clé de sortie (",{"type":14,"tag":72,"props":509,"children":511},{"className":510},[],[512],{"type":19,"value":513},"output_key",{"type":19,"value":433},{"type":14,"tag":421,"props":516,"children":517},{},[518,520,526],{"type":19,"value":519},"Défaut ",{"type":14,"tag":72,"props":521,"children":523},{"className":522},[],[524],{"type":19,"value":525},"linked.files",{"type":19,"value":527},".",{"type":14,"tag":15,"props":529,"children":530},{},[531,533,539,541,547,549,555,557,563,564,570,571,577,578,584],{"type":19,"value":532},"La sortie contient ",{"type":14,"tag":72,"props":534,"children":536},{"className":535},[],[537],{"type":19,"value":538},"files",{"type":19,"value":540}," (chaque entrée d'origine, enrichie de ",{"type":14,"tag":72,"props":542,"children":544},{"className":543},[],[545],{"type":19,"value":546},"url",{"type":19,"value":548}," et ",{"type":14,"tag":72,"props":550,"children":552},{"className":551},[],[553],{"type":19,"value":554},"expires_at",{"type":19,"value":556},"), ",{"type":14,"tag":72,"props":558,"children":560},{"className":559},[],[561],{"type":19,"value":562},"file_count",{"type":19,"value":107},{"type":14,"tag":72,"props":565,"children":567},{"className":566},[],[568],{"type":19,"value":569},"failed",{"type":19,"value":107},{"type":14,"tag":72,"props":572,"children":574},{"className":573},[],[575],{"type":19,"value":576},"requested",{"type":19,"value":548},{"type":14,"tag":72,"props":579,"children":581},{"className":580},[],[582],{"type":19,"value":583},"ttl_seconds",{"type":19,"value":527},{"type":14,"tag":86,"props":586,"children":587},{},[588,598,608,625],{"type":14,"tag":90,"props":589,"children":590},{},[591,596],{"type":14,"tag":22,"props":592,"children":593},{},[594],{"type":19,"value":595},"Jamais hors de votre organisation",{"type":19,"value":597}," : un fichier hors de son stockage est refusé.",{"type":14,"tag":90,"props":599,"children":600},{},[601,606],{"type":14,"tag":22,"props":602,"children":603},{},[604],{"type":19,"value":605},"Existence vérifiée avant de signer",{"type":19,"value":607}," : un fichier absent n'est jamais signé.",{"type":14,"tag":90,"props":609,"children":610},{},[611,616,618,623],{"type":14,"tag":22,"props":612,"children":613},{},[614],{"type":19,"value":615},"Rien d'omis",{"type":19,"value":617}," : un fichier non lié (hors périmètre, introuvable, au-delà du plafond, signature impossible) figure dans ",{"type":14,"tag":72,"props":619,"children":621},{"className":620},[],[622],{"type":19,"value":569},{"type":19,"value":624}," avec sa raison.",{"type":14,"tag":90,"props":626,"children":627},{},[628,630,635],{"type":19,"value":629},"Les liens sont ",{"type":14,"tag":22,"props":631,"children":632},{},[633],{"type":19,"value":634},"recréés à chaque exécution",{"type":19,"value":636},", et chaque lien émis est journalisé.",{"type":14,"tag":638,"props":639,"children":641},"alert",{"type":640},"warning",[642],{"type":14,"tag":15,"props":643,"children":644},{},[645,647,652,654,659],{"type":19,"value":646},"Le lien est un ",{"type":14,"tag":22,"props":648,"children":649},{},[650],{"type":19,"value":651},"porteur",{"type":19,"value":653}," : quiconque le détient télécharge le fichier jusqu'à son expiration. Gardez une durée courte, et renseignez les ",{"type":14,"tag":22,"props":655,"children":656},{},[657],{"type":19,"value":658},"sous-dossiers autorisés",{"type":19,"value":660}," dès que la liste vient d'une donnée modifiable (une ligne de table) — sinon quiconque peut écrire cette donnée ferait signer un lien vers n'importe quel fichier de l'organisation.",{"type":14,"tag":67,"props":662,"children":664},{"id":663},"compute",[665],{"type":14,"tag":72,"props":666,"children":668},{"className":667},[],[669],{"type":19,"value":663},{"type":14,"tag":15,"props":671,"children":672},{},[673],{"type":19,"value":674},"Calculs déterministes sur les données du contexte. Opérations livrées :",{"type":14,"tag":86,"props":676,"children":677},{},[678,710,721,732,743,754,765,776,787],{"type":14,"tag":90,"props":679,"children":680},{},[681,687,689,695,696,702,703,709],{"type":14,"tag":72,"props":682,"children":684},{"className":683},[],[685],{"type":19,"value":686},"column_stats",{"type":19,"value":688}," — par colonne d'une liste de lignes, combien valent une valeur donnée (",{"type":14,"tag":72,"props":690,"children":692},{"className":691},[],[693],{"type":19,"value":694},"count",{"type":19,"value":107},{"type":14,"tag":72,"props":697,"children":699},{"className":698},[],[700],{"type":19,"value":701},"total",{"type":19,"value":107},{"type":14,"tag":72,"props":704,"children":706},{"className":705},[],[707],{"type":19,"value":708},"pct",{"type":19,"value":433},{"type":14,"tag":90,"props":711,"children":712},{},[713,719],{"type":14,"tag":72,"props":714,"children":716},{"className":715},[],[717],{"type":19,"value":718},"compose_text",{"type":19,"value":720}," — composition d'un texte à partir d'un gabarit et de valeurs du flux",{"type":14,"tag":90,"props":722,"children":723},{},[724,730],{"type":14,"tag":72,"props":725,"children":727},{"className":726},[],[728],{"type":19,"value":729},"regex_extract",{"type":19,"value":731}," — extraction de valeurs par expression régulière",{"type":14,"tag":90,"props":733,"children":734},{},[735,741],{"type":14,"tag":72,"props":736,"children":738},{"className":737},[],[739],{"type":19,"value":740},"select_by_substring",{"type":19,"value":742}," — répartition d'une liste en groupes selon des prédicats « contient \u002F ne contient pas »",{"type":14,"tag":90,"props":744,"children":745},{},[746,752],{"type":14,"tag":72,"props":747,"children":749},{"className":748},[],[750],{"type":19,"value":751},"list_compare",{"type":19,"value":753}," — cohérence de plusieurs listes par clé pivot",{"type":14,"tag":90,"props":755,"children":756},{},[757,763],{"type":14,"tag":72,"props":758,"children":760},{"className":759},[],[761],{"type":19,"value":762},"multi_source_compliance",{"type":19,"value":764}," — audit de conformité multi-dimensions et multi-sources",{"type":14,"tag":90,"props":766,"children":767},{},[768,774],{"type":14,"tag":72,"props":769,"children":771},{"className":770},[],[772],{"type":19,"value":773},"contact_extract",{"type":19,"value":775}," — adresses email et numéros de téléphone trouvés dans un texte, avec leur provenance",{"type":14,"tag":90,"props":777,"children":778},{},[779,785],{"type":14,"tag":72,"props":780,"children":782},{"className":781},[],[783],{"type":19,"value":784},"free_slots",{"type":19,"value":786}," — créneaux libres déduits de périodes occupées",{"type":14,"tag":90,"props":788,"children":789},{},[790,796],{"type":14,"tag":72,"props":791,"children":793},{"className":792},[],[794],{"type":19,"value":795},"url_expand",{"type":19,"value":797}," — composition d'URL à partir de bases et de chemins",{"type":14,"tag":67,"props":799,"children":801},{"id":800},"langage-de-mapping",[802],{"type":19,"value":803},"Langage de mapping",{"type":14,"tag":15,"props":805,"children":806},{},[807,809,815,816,822,823,829,831,836,838,843,845,850,852,858],{"type":19,"value":808},"Ce n'est pas un nœud : c'est le langage qui compose un payload de sortie depuis les données du contexte (fonctions ",{"type":14,"tag":72,"props":810,"children":812},{"className":811},[],[813],{"type":19,"value":814},"$now",{"type":19,"value":107},{"type":14,"tag":72,"props":817,"children":819},{"className":818},[],[820],{"type":19,"value":821},"$uuid",{"type":19,"value":107},{"type":14,"tag":72,"props":824,"children":826},{"className":825},[],[827],{"type":19,"value":828},"$concat",{"type":19,"value":830},"…). Il sert au body ",{"type":14,"tag":72,"props":832,"children":834},{"className":833},[],[835],{"type":19,"value":142},{"type":19,"value":837}," de ",{"type":14,"tag":72,"props":839,"children":841},{"className":840},[],[842],{"type":19,"value":77},{"type":19,"value":844},", au contenu écrit par ",{"type":14,"tag":72,"props":846,"children":848},{"className":847},[],[849],{"type":19,"value":215},{"type":19,"value":851}," et aux variables d'un appel sortant ",{"type":14,"tag":72,"props":853,"children":855},{"className":854},[],[856],{"type":19,"value":857},"phone_call",{"type":19,"value":527},{"type":14,"tag":67,"props":860,"children":862},{"id":861},"data_to_file",[863],{"type":14,"tag":72,"props":864,"children":866},{"className":865},[],[867],{"type":19,"value":861},{"type":14,"tag":15,"props":869,"children":870},{},[871,873,885],{"type":19,"value":872},"Produit un ",{"type":14,"tag":22,"props":874,"children":875},{},[876,878,884],{"type":19,"value":877},"fichier Excel (",{"type":14,"tag":72,"props":879,"children":881},{"className":880},[],[882],{"type":19,"value":883},".xlsx",{"type":19,"value":433},{"type":19,"value":886}," à partir de données du contexte — une liste de lignes, une grille, ou plusieurs listes (un onglet chacune). Options : nom du fichier (templatable), nom d'onglet, choix et ordre des colonnes, ligne d'en-tête. Le fichier est rangé dans le stockage de votre organisation, prêt à être envoyé par email ou déposé sur un Drive.",{"type":14,"tag":15,"props":888,"children":889},{},[890,892,898,899,905,906,912,913,919,921,926],{"type":19,"value":891},"Par sécurité, les cellules qui commencent par ",{"type":14,"tag":72,"props":893,"children":895},{"className":894},[],[896],{"type":19,"value":897},"=",{"type":19,"value":107},{"type":14,"tag":72,"props":900,"children":902},{"className":901},[],[903],{"type":19,"value":904},"+",{"type":19,"value":107},{"type":14,"tag":72,"props":907,"children":909},{"className":908},[],[910],{"type":19,"value":911},"-",{"type":19,"value":255},{"type":14,"tag":72,"props":914,"children":916},{"className":915},[],[917],{"type":19,"value":918},"@",{"type":19,"value":920}," sont écrites comme du ",{"type":14,"tag":22,"props":922,"children":923},{},[924],{"type":19,"value":925},"texte",{"type":19,"value":927}," par défaut (pas de formule injectée). Quand les limites d'Excel obligent à couper, le fichier est marqué comme tronqué.",{"type":14,"tag":67,"props":929,"children":931},{"id":930},"web_fetch",[932],{"type":14,"tag":72,"props":933,"children":935},{"className":934},[],[936],{"type":19,"value":930},{"type":14,"tag":15,"props":938,"children":939},{},[940,942,947,949,955,957,963,965,971],{"type":19,"value":941},"Lit une ou plusieurs ",{"type":14,"tag":22,"props":943,"children":944},{},[945],{"type":19,"value":946},"pages web",{"type":19,"value":948}," et publie leur texte lisible dans le contexte (défaut ",{"type":14,"tag":72,"props":950,"children":952},{"className":951},[],[953],{"type":19,"value":954},"web.pages",{"type":19,"value":956},"). Réglages : nombre de pages, concurrence, délai, taille maximale. Le verdict ",{"type":14,"tag":72,"props":958,"children":960},{"className":959},[],[961],{"type":19,"value":962},"robots.txt",{"type":19,"value":964}," est toujours calculé et rapporté ; il n'est appliqué que si vous l'activez (",{"type":14,"tag":72,"props":966,"children":968},{"className":967},[],[969],{"type":19,"value":970},"respect_robots",{"type":19,"value":972},").",{"type":14,"tag":15,"props":974,"children":975},{},[976],{"type":19,"value":977},"Les pages rendues uniquement par JavaScript ne sont pas exécutées : seul le HTML servi est lu. Une page en échec est rapportée dans le résultat, sans faire échouer le pipeline.",{"type":14,"tag":15,"props":979,"children":980},{},[981],{"type":19,"value":982},"Côté agent, deux tools équivalents :",{"type":14,"tag":86,"props":984,"children":985},{},[986,997],{"type":14,"tag":90,"props":987,"children":988},{},[989,995],{"type":14,"tag":72,"props":990,"children":992},{"className":991},[],[993],{"type":19,"value":994},"web_scrape.fetch_page",{"type":19,"value":996}," — lit une page (titre, texte, liens email et téléphone trouvés).",{"type":14,"tag":90,"props":998,"children":999},{},[1000,1006,1008,1013],{"type":14,"tag":72,"props":1001,"children":1003},{"className":1002},[],[1004],{"type":19,"value":1005},"web_search.search",{"type":19,"value":1007}," — ",{"type":14,"tag":22,"props":1009,"children":1010},{},[1011],{"type":19,"value":1012},"recherche web",{"type":19,"value":1014}," via un moteur SearXNG auto-hébergé par la plateforme : jusqu'à 5 résultats (titre, URL, extrait).",{"type":14,"tag":15,"props":1016,"children":1017},{},[1018,1020,1025],{"type":19,"value":1019},"Toutes les lectures web passent par la même protection ",{"type":14,"tag":22,"props":1021,"children":1022},{},[1023],{"type":19,"value":1024},"anti-SSRF",{"type":19,"value":1026}," : adresses internes, privées et de métadonnées cloud refusées après résolution DNS, redirections revérifiées à chaque saut.",{"type":14,"tag":67,"props":1028,"children":1030},{"id":1029},"code_step",[1031],{"type":14,"tag":72,"props":1032,"children":1034},{"className":1033},[],[1035],{"type":19,"value":1029},{"type":14,"tag":15,"props":1037,"children":1038},{},[1039,1041,1046,1048,1053,1055,1061],{"type":19,"value":1040},"Quand une logique déterministe dépasse ce que ",{"type":14,"tag":72,"props":1042,"children":1044},{"className":1043},[],[1045],{"type":19,"value":663},{"type":19,"value":1047}," sait faire, une ",{"type":14,"tag":22,"props":1049,"children":1050},{},[1051],{"type":19,"value":1052},"étape de code",{"type":19,"value":1054}," exécute du code custom en sandbox Starlark — éditable directement, exécuté dès sauvegarde, et borné par une allowlist de tools. Voir ",{"type":14,"tag":382,"props":1056,"children":1058},{"href":1057},"\u002Fdocs\u002Fpipelines\u002Fcode-step",[1059],{"type":19,"value":1060},"Étapes de code",{"type":19,"value":527},{"type":14,"tag":37,"props":1063,"children":1065},{"id":1064},"authentification-secrets",[1066],{"type":19,"value":1067},"Authentification & secrets",{"type":14,"tag":15,"props":1069,"children":1070},{},[1071,1073,1078,1080,1085],{"type":19,"value":1072},"Les opérateurs qui parlent à un système externe (HTTP, DB) référencent un ",{"type":14,"tag":22,"props":1074,"children":1075},{},[1076],{"type":19,"value":1077},"compte",{"type":19,"value":1079}," enregistré dans l'organisation. Les credentials ne sont ",{"type":14,"tag":22,"props":1081,"children":1082},{},[1083],{"type":19,"value":1084},"jamais",{"type":19,"value":1086}," visibles dans le pipeline lui-même — juste un nom de compte.",{"type":14,"tag":15,"props":1088,"children":1089},{},[1090],{"type":19,"value":1091},"Conséquence : changer un mot de passe ne nécessite pas de rééditer chaque pipeline.",{"type":14,"tag":15,"props":1093,"children":1094},{},[1095,1097,1102,1104,1109,1111,1116,1117,1122,1124,1129,1131,1136,1138,1144,1146,1152],{"type":19,"value":1096},"Quand un secret est saisi directement dans un nœud (token ",{"type":14,"tag":72,"props":1098,"children":1100},{"className":1099},[],[1101],{"type":19,"value":155},{"type":19,"value":1103},", mot de passe ",{"type":14,"tag":72,"props":1105,"children":1107},{"className":1106},[],[1108],{"type":19,"value":162},{"type":19,"value":1110}," ou valeur ",{"type":14,"tag":72,"props":1112,"children":1114},{"className":1113},[],[1115],{"type":19,"value":169},{"type":19,"value":837},{"type":14,"tag":72,"props":1118,"children":1120},{"className":1119},[],[1121],{"type":19,"value":77},{"type":19,"value":1123},", mot de passe d'un PDF ou d'une archive chiffrés pour ",{"type":14,"tag":72,"props":1125,"children":1127},{"className":1126},[],[1128],{"type":19,"value":266},{"type":19,"value":1130},"), il est ",{"type":14,"tag":22,"props":1132,"children":1133},{},[1134],{"type":19,"value":1135},"masqué",{"type":19,"value":1137}," dès son enregistrement : l'éditeur, l'API et les outils MCP n'en montrent qu'un marqueur. Voir ",{"type":14,"tag":382,"props":1139,"children":1141},{"href":1140},"\u002Fdocs\u002Fpipelines\u002Fediteur-visuel",[1142],{"type":19,"value":1143},"L'éditeur visuel",{"type":19,"value":1145},", section ",{"type":14,"tag":1147,"props":1148,"children":1149},"em",{},[1150],{"type":19,"value":1151},"Secrets",{"type":19,"value":527},{"type":14,"tag":67,"props":1154,"children":1156},{"id":1155},"oauth2-sortant-client_credentials",[1157,1159,1165],{"type":19,"value":1158},"OAuth2 sortant (",{"type":14,"tag":72,"props":1160,"children":1162},{"className":1161},[],[1163],{"type":19,"value":1164},"client_credentials",{"type":19,"value":433},{"type":14,"tag":15,"props":1167,"children":1168},{},[1169,1171,1176,1178,1183,1185,1191,1192,1198,1199,1205,1206,1212],{"type":19,"value":1170},"Pour les APIs qui exigent un jeton OAuth2 (cloud d'entreprise, ERP, providers tiers), l'opérateur HTTP supporte le mode ",{"type":14,"tag":72,"props":1172,"children":1174},{"className":1173},[],[1175],{"type":19,"value":177},{"type":19,"value":1177},". Vous enregistrez un ",{"type":14,"tag":22,"props":1179,"children":1180},{},[1181],{"type":19,"value":1182},"credential OAuth2",{"type":19,"value":1184}," dans l'organisation — ",{"type":14,"tag":72,"props":1186,"children":1188},{"className":1187},[],[1189],{"type":19,"value":1190},"token_url",{"type":19,"value":107},{"type":14,"tag":72,"props":1193,"children":1195},{"className":1194},[],[1196],{"type":19,"value":1197},"client_id",{"type":19,"value":107},{"type":14,"tag":72,"props":1200,"children":1202},{"className":1201},[],[1203],{"type":19,"value":1204},"client_secret",{"type":19,"value":107},{"type":14,"tag":72,"props":1207,"children":1209},{"className":1208},[],[1210],{"type":19,"value":1211},"scope",{"type":19,"value":1213}," — et le nœud n'y référence qu'un identifiant non secret.",{"type":14,"tag":15,"props":1215,"children":1216},{},[1217,1219,1224,1226,1231,1233,1237,1239,1245,1247,1253],{"type":19,"value":1218},"Au moment de l'appel, betool obtient un jeton et le réutilise tant qu'il est valide ; il le ",{"type":14,"tag":22,"props":1220,"children":1221},{},[1222],{"type":19,"value":1223},"rafraîchit paresseusement",{"type":19,"value":1225}," à expiration, sans tâche de fond. Le ",{"type":14,"tag":72,"props":1227,"children":1229},{"className":1228},[],[1230],{"type":19,"value":1204},{"type":19,"value":1232}," n'est ",{"type":14,"tag":22,"props":1234,"children":1235},{},[1236],{"type":19,"value":1084},{"type":19,"value":1238}," renvoyé en lecture par l'API d'administration (seul un indicateur ",{"type":14,"tag":72,"props":1240,"children":1242},{"className":1241},[],[1243],{"type":19,"value":1244},"a un secret",{"type":19,"value":1246}," est exposé), et le jeton obtenu est posé en ",{"type":14,"tag":72,"props":1248,"children":1250},{"className":1249},[],[1251],{"type":19,"value":1252},"Authorization: Bearer …",{"type":19,"value":1254}," sur la requête sortante.",{"type":14,"tag":15,"props":1256,"children":1257},{},[1258],{"type":19,"value":1259},"Changer le secret après une rotation côté provider ne demande aucune réédition de pipeline : le prochain appel rafraîchit automatiquement.",{"type":14,"tag":37,"props":1261,"children":1263},{"id":1262},"idempotence",[1264],{"type":19,"value":1265},"Idempotence",{"type":14,"tag":15,"props":1267,"children":1268},{},[1269],{"type":19,"value":1270},"Tout opérateur qui produit un effet de bord (POST HTTP, INSERT DB, envoi d'email) doit être pensé idempotent côté cible. Pratique recommandée :",{"type":14,"tag":86,"props":1272,"children":1273},{},[1274,1294],{"type":14,"tag":90,"props":1275,"children":1276},{},[1277,1279,1285,1287,1293],{"type":19,"value":1278},"Inclure un ",{"type":14,"tag":72,"props":1280,"children":1282},{"className":1281},[],[1283],{"type":19,"value":1284},"idempotency_key",{"type":19,"value":1286}," dans le payload (typiquement ",{"type":14,"tag":72,"props":1288,"children":1290},{"className":1289},[],[1291],{"type":19,"value":1292},"exchange_id",{"type":19,"value":972},{"type":14,"tag":90,"props":1295,"children":1296},{},[1297],{"type":19,"value":1298},"Vérifier côté cible si la clé a déjà été traitée.",{"type":14,"tag":15,"props":1300,"children":1301},{},[1302,1304,1309,1311,1316,1318,1323],{"type":19,"value":1303},"En dehors des réessais que vous configurez explicitement sur ",{"type":14,"tag":72,"props":1305,"children":1307},{"className":1306},[],[1308],{"type":19,"value":77},{"type":19,"value":1310}," (",{"type":14,"tag":72,"props":1312,"children":1314},{"className":1313},[],[1315],{"type":19,"value":190},{"type":19,"value":1317},"), betool ne réessaie pas automatiquement un opérateur qui a échoué : c'est à votre pipeline d'orchestrer la stratégie de retry. ",{"type":14,"tag":72,"props":1319,"children":1321},{"className":1320},[],[1322],{"type":19,"value":77},{"type":19,"value":1324}," est de plus protégé contre le double envoi lors d'un re-dispatch interne : une requête déjà livrée avec un statut accepté n'est pas renvoyée.",{"title":7,"searchDepth":1326,"depth":1326,"links":1327},2,[1328,1329,1344,1348],{"id":39,"depth":1326,"text":42},{"id":62,"depth":1326,"text":65,"children":1330},[1331,1334,1336,1337,1339,1340,1341,1342,1343],{"id":69,"depth":1332,"text":1333},3,"webhook_action (appel HTTP)",{"id":200,"depth":1332,"text":1335},"database_query \u002F database_manage",{"id":266,"depth":1332,"text":266},{"id":345,"depth":1332,"text":1338},"file_link (liens de téléchargement)",{"id":663,"depth":1332,"text":663},{"id":800,"depth":1332,"text":803},{"id":861,"depth":1332,"text":861},{"id":930,"depth":1332,"text":930},{"id":1029,"depth":1332,"text":1029},{"id":1064,"depth":1326,"text":1067,"children":1345},[1346],{"id":1155,"depth":1332,"text":1347},"OAuth2 sortant (client_credentials)",{"id":1262,"depth":1326,"text":1265},"markdown","content:docs:3.pipelines:3.operateurs.md","content","docs\u002F3.pipelines\u002F3.operateurs.md","docs\u002F3.pipelines\u002F3.operateurs","md",[1356],{"title":1357,"_path":1358,"children":1359},"Docs","\u002Fdocs",[1360,1373,1400,1422,1435,1451,1464,1525],{"title":1361,"_path":1362,"children":1363},"Démarrer","\u002Fdocs\u002Fdemarrer",[1364,1367,1370],{"title":1365,"_path":1366},"Bienvenue","\u002Fdocs\u002Fdemarrer\u002Fbienvenue",{"title":1368,"_path":1369},"Créer un compte","\u002Fdocs\u002Fdemarrer\u002Fcreer-un-compte",{"title":1371,"_path":1372},"Brancher une clé LLM","\u002Fdocs\u002Fdemarrer\u002Fbrancher-llm",{"title":1374,"_path":1375,"children":1376},"Canaux","\u002Fdocs\u002Fcanaux",[1377,1380,1383,1386,1389,1391,1394,1397],{"title":1378,"_path":1379},"Vue d'ensemble des canaux","\u002Fdocs\u002Fcanaux\u002Fvue-densemble",{"title":1381,"_path":1382},"Téléphonie temps réel","\u002Fdocs\u002Fcanaux\u002Ftelephone",{"title":1384,"_path":1385},"Email","\u002Fdocs\u002Fcanaux\u002Femail",{"title":1387,"_path":1388},"Chat widget web","\u002Fdocs\u002Fcanaux\u002Fchat-widget",{"title":1390,"_path":384},"Webhook HTTP",{"title":1392,"_path":1393},"Messageries (WhatsApp, Messenger, Telegram, Mattermost)","\u002Fdocs\u002Fcanaux\u002Fmessageries",{"title":1395,"_path":1396},"Meta Lead Ads","\u002Fdocs\u002Fcanaux\u002Ffacebook-leads",{"title":1398,"_path":1399},"Planification (cron)","\u002Fdocs\u002Fcanaux\u002Fschedule",{"title":1401,"_path":1402,"children":1403},"Pipelines","\u002Fdocs\u002Fpipelines",[1404,1405,1408,1409,1412,1413,1416,1419],{"title":1143,"_path":1140},{"title":1406,"_path":1407},"Agents IA","\u002Fdocs\u002Fpipelines\u002Fagents",{"title":8,"_path":4},{"title":1410,"_path":1411},"Contrôle de flux","\u002Fdocs\u002Fpipelines\u002Fcontrole-flux",{"title":1060,"_path":1057},{"title":1414,"_path":1415},"Sous-pipelines","\u002Fdocs\u002Fpipelines\u002Fsous-pipelines",{"title":1417,"_path":1418},"Actions sans code","\u002Fdocs\u002Fpipelines\u002Factions-no-code",{"title":1420,"_path":1421},"Base de connaissances","\u002Fdocs\u002Fpipelines\u002Fbase-de-connaissances",{"title":1423,"_path":1424,"children":1425},"Supervision","\u002Fdocs\u002Fsupervision",[1426,1429,1432],{"title":1427,"_path":1428},"Historique d'exécutions","\u002Fdocs\u002Fsupervision\u002Fexecutions",{"title":1430,"_path":1431},"Crédits & metering","\u002Fdocs\u002Fsupervision\u002Fcredits-metering",{"title":1433,"_path":1434},"Benchmarks","\u002Fdocs\u002Fsupervision\u002Fbenchmarks",{"title":1436,"_path":1437,"children":1438},"Sécurité","\u002Fdocs\u002Fsecurite",[1439,1442,1445,1448],{"title":1440,"_path":1441},"Principes de sécurité","\u002Fdocs\u002Fsecurite\u002Fprincipes",{"title":1443,"_path":1444},"Multi-tenant strict","\u002Fdocs\u002Fsecurite\u002Fmulti-tenant",{"title":1446,"_path":1447},"Audit RGPD & journal d'accès","\u002Fdocs\u002Fsecurite\u002Faudit-rgpd",{"title":1449,"_path":1450},"Déploiement souverain","\u002Fdocs\u002Fsecurite\u002Fdeploiement-souverain",{"title":1452,"_path":1453,"children":1454},"Développeurs","\u002Fdocs\u002Fdeveloppeurs",[1455,1458,1461],{"title":1456,"_path":1457},"API admin","\u002Fdocs\u002Fdeveloppeurs\u002Fapi-admin",{"title":1459,"_path":1460},"Webhooks sortants","\u002Fdocs\u002Fdeveloppeurs\u002Fwebhooks-sortants",{"title":1462,"_path":1463},"Piloter betool depuis Claude (MCP)","\u002Fdocs\u002Fdeveloppeurs\u002Fmcp",{"title":1465,"_path":1466,"children":1467},"Intégrations","\u002Fdocs\u002Fintegrations",[1468,1471,1474,1477,1480,1483,1486,1489,1492,1495,1498,1501,1504,1507,1510,1513,1516,1519,1522],{"title":1469,"_path":1470},"Vue d'ensemble des intégrations","\u002Fdocs\u002Fintegrations\u002Fvue-densemble",{"title":1472,"_path":1473},"Stripe","\u002Fdocs\u002Fintegrations\u002Fstripe",{"title":1475,"_path":1476},"GitHub","\u002Fdocs\u002Fintegrations\u002Fgithub",{"title":1478,"_path":1479},"Google","\u002Fdocs\u002Fintegrations\u002Fgoogle",{"title":1481,"_path":1482},"LinkedIn Ads","\u002Fdocs\u002Fintegrations\u002Flinkedin-ads",{"title":1484,"_path":1485},"Kavkom","\u002Fdocs\u002Fintegrations\u002Fkavkom",{"title":1487,"_path":1488},"Jira","\u002Fdocs\u002Fintegrations\u002Fjira",{"title":1490,"_path":1491},"Slack","\u002Fdocs\u002Fintegrations\u002Fslack",{"title":1493,"_path":1494},"SMS","\u002Fdocs\u002Fintegrations\u002Fsms",{"title":1496,"_path":1497},"Enable Banking (open banking)","\u002Fdocs\u002Fintegrations\u002Fenable-banking",{"title":1499,"_path":1500},"CRM, marketing & productivité","\u002Fdocs\u002Fintegrations\u002Fcrm-marketing",{"title":1502,"_path":1503},"HeyGen (vidéo)","\u002Fdocs\u002Fintegrations\u002Fheygen",{"title":1505,"_path":1506},"La Poste","\u002Fdocs\u002Fintegrations\u002Fla-poste",{"title":1508,"_path":1509},"CRM métier (beTool Application, Qhare)","\u002Fdocs\u002Fintegrations\u002Fcrm-metier",{"title":1511,"_path":1512},"Mitti (inspections terrain)","\u002Fdocs\u002Fintegrations\u002Fmitti",{"title":1514,"_path":1515},"Meta (Messenger, Pages, Meta Ads)","\u002Fdocs\u002Fintegrations\u002Fmeta",{"title":1517,"_path":1518},"Onoff Business (Beta)","\u002Fdocs\u002Fintegrations\u002Fonoff",{"title":1520,"_path":1521},"Smart Life \u002F Tuya (objets connectés)","\u002Fdocs\u002Fintegrations\u002Fsmart-life",{"title":1523,"_path":1524},"Produits beTool (Desktop, Kiosk, Terminal)","\u002Fdocs\u002Fintegrations\u002Fproduits-betool",{"title":1526,"_path":1527,"children":1528},"Cas d'usage","\u002Fdocs\u002Fcas-usage",[1529,1532,1535,1538,1541,1544],{"title":1530,"_path":1531},"Agents métier types","\u002Fdocs\u002Fcas-usage\u002Fvue-densemble",{"title":1533,"_path":1534},"CFO IA","\u002Fdocs\u002Fcas-usage\u002Fcfo-ia",{"title":1536,"_path":1537},"COO IA","\u002Fdocs\u002Fcas-usage\u002Fcoo-ia",{"title":1539,"_path":1540},"CTO IA","\u002Fdocs\u002Fcas-usage\u002Fcto-ia",{"title":1542,"_path":1543},"Product Manager IA","\u002Fdocs\u002Fcas-usage\u002Fproduct-manager-ia",{"title":1545,"_path":1546},"Assistant personnel","\u002Fdocs\u002Fcas-usage\u002Fassistant-personnel"]