[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"doc-\u002Fdocs\u002Fpipelines\u002Fcode-step":3,"docs-nav-fr":435},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"body":10,"_type":429,"_id":430,"_source":431,"_file":432,"_stem":433,"_extension":434},"\u002Fdocs\u002Fpipelines\u002Fcode-step","pipelines",false,"","Étapes de code","Le nœud code_step exécute une logique custom en sandbox Starlark — éditable librement, bornée par une allowlist de tools.",{"type":11,"children":12,"toc":422},"root",[13,49,61,68,101,144,149,155,319,325,330,353,363,369],{"type":14,"tag":15,"props":16,"children":17},"element","p",{},[18,21,28,30,40,42,47],{"type":19,"value":20},"text","Certaines logiques sont trop spécifiques pour un opérateur ",{"type":14,"tag":22,"props":23,"children":25},"code",{"className":24},[],[26],{"type":19,"value":27},"compute",{"type":19,"value":29},", mais trop déterministes pour mériter un agent LLM : recoupements multi-sources, calculs métier sur-mesure, normalisations exotiques. Pour ces cas, le nœud ",{"type":14,"tag":31,"props":32,"children":33},"strong",{},[34],{"type":14,"tag":22,"props":35,"children":37},{"className":36},[],[38],{"type":19,"value":39},"code_step",{"type":19,"value":41}," exécute du code ",{"type":14,"tag":31,"props":43,"children":44},{},[45],{"type":19,"value":46},"dans une sandbox",{"type":19,"value":48},", sans appel LLM, avec une sortie prévisible.",{"type":14,"tag":15,"props":50,"children":51},{},[52,54,59],{"type":19,"value":53},"Le code s'édite directement, comme n'importe quel champ de configuration : aucune clé de ",{"type":14,"tag":22,"props":55,"children":57},{"className":56},[],[58],{"type":19,"value":39},{"type":19,"value":60}," n'est verrouillée, et aucune approbation spécifique au code n'est exigée. Une modification s'applique dès la publication du pipeline, à la prochaine exécution.",{"type":14,"tag":62,"props":63,"children":65},"h2",{"id":64},"le-modèle-dexécution",[66],{"type":19,"value":67},"Le modèle d'exécution",{"type":14,"tag":15,"props":69,"children":70},{},[71,76,78,83,85,91,93,99],{"type":14,"tag":22,"props":72,"children":74},{"className":73},[],[75],{"type":19,"value":39},{"type":19,"value":77}," exécute du ",{"type":14,"tag":31,"props":79,"children":80},{},[81],{"type":19,"value":82},"Starlark",{"type":19,"value":84}," — un dialecte de Python conçu pour l'isolation : pas d'accès au système de fichiers, pas de réseau, pas d'",{"type":14,"tag":22,"props":86,"children":88},{"className":87},[],[89],{"type":19,"value":90},"import",{"type":19,"value":92},", ni boucle ",{"type":14,"tag":22,"props":94,"children":96},{"className":95},[],[97],{"type":19,"value":98},"while",{"type":19,"value":100}," ni récursion, déterministe, borné par un budget de temps. Le code ne voit que :",{"type":14,"tag":102,"props":103,"children":104},"ul",{},[105,126],{"type":14,"tag":106,"props":107,"children":108},"li",{},[109,111,116,118,124],{"type":19,"value":110},"Les ",{"type":14,"tag":31,"props":112,"children":113},{},[114],{"type":19,"value":115},"entrées",{"type":19,"value":117}," que vous lui mappez explicitement (",{"type":14,"tag":22,"props":119,"children":121},{"className":120},[],[122],{"type":19,"value":123},"input_paths",{"type":19,"value":125},").",{"type":14,"tag":106,"props":127,"children":128},{},[129,130,135,137,143],{"type":19,"value":110},{"type":14,"tag":31,"props":131,"children":132},{},[133],{"type":19,"value":134},"tools",{"type":19,"value":136}," que vous l'autorisez à appeler (",{"type":14,"tag":22,"props":138,"children":140},{"className":139},[],[141],{"type":19,"value":142},"allowed_tools",{"type":19,"value":125},{"type":14,"tag":15,"props":145,"children":146},{},[147],{"type":19,"value":148},"Tout le reste est hors de portée. Une étape de code ne peut pas atteindre une ressource que vous ne lui avez pas tendue.",{"type":14,"tag":62,"props":150,"children":152},{"id":151},"configuration",[153],{"type":19,"value":154},"Configuration",{"type":14,"tag":156,"props":157,"children":158},"table",{},[159,178],{"type":14,"tag":160,"props":161,"children":162},"thead",{},[163],{"type":14,"tag":164,"props":165,"children":166},"tr",{},[167,173],{"type":14,"tag":168,"props":169,"children":170},"th",{},[171],{"type":19,"value":172},"Champ",{"type":14,"tag":168,"props":174,"children":175},{},[176],{"type":19,"value":177},"Rôle",{"type":14,"tag":179,"props":180,"children":181},"tbody",{},[182,199,240,271,295],{"type":14,"tag":164,"props":183,"children":184},{},[185,194],{"type":14,"tag":186,"props":187,"children":188},"td",{},[189],{"type":14,"tag":31,"props":190,"children":191},{},[192],{"type":19,"value":193},"Code",{"type":14,"tag":186,"props":195,"children":196},{},[197],{"type":19,"value":198},"La source Starlark exécutée, éditable directement.",{"type":14,"tag":164,"props":200,"children":201},{},[202,219],{"type":14,"tag":186,"props":203,"children":204},{},[205,210,212,217],{"type":14,"tag":31,"props":206,"children":207},{},[208],{"type":19,"value":209},"Entrées",{"type":19,"value":211}," (",{"type":14,"tag":22,"props":213,"children":215},{"className":214},[],[216],{"type":19,"value":123},{"type":19,"value":218},")",{"type":14,"tag":186,"props":220,"children":221},{},[222,224,230,232,238],{"type":19,"value":223},"Mapping ",{"type":14,"tag":22,"props":225,"children":227},{"className":226},[],[228],{"type":19,"value":229},"variable → sélecteur",{"type":19,"value":231},". Seules ces clés du contexte sont exposées au code. Les clés internes (",{"type":14,"tag":22,"props":233,"children":235},{"className":234},[],[236],{"type":19,"value":237},"_*",{"type":19,"value":239},") sont refusées.",{"type":14,"tag":164,"props":241,"children":242},{},[243,258],{"type":14,"tag":186,"props":244,"children":245},{},[246,251,252,257],{"type":14,"tag":31,"props":247,"children":248},{},[249],{"type":19,"value":250},"Allowlist tools",{"type":19,"value":211},{"type":14,"tag":22,"props":253,"children":255},{"className":254},[],[256],{"type":19,"value":142},{"type":19,"value":218},{"type":14,"tag":186,"props":259,"children":260},{},[261,263,269],{"type":19,"value":262},"Les tools appelables via ",{"type":14,"tag":22,"props":264,"children":266},{"className":265},[],[267],{"type":19,"value":268},"tool(nom, args)",{"type":19,"value":270},", 50 appels maximum par exécution. Chaque appel hérite des garde-fous du tool (SSRF, facturation, audit, killswitch).",{"type":14,"tag":164,"props":272,"children":273},{},[274,290],{"type":14,"tag":186,"props":275,"children":276},{},[277,282,283,289],{"type":14,"tag":31,"props":278,"children":279},{},[280],{"type":19,"value":281},"Clé de sortie",{"type":19,"value":211},{"type":14,"tag":22,"props":284,"children":286},{"className":285},[],[287],{"type":19,"value":288},"output_key",{"type":19,"value":218},{"type":14,"tag":186,"props":291,"children":292},{},[293],{"type":19,"value":294},"Où poser le résultat (sérialisable JSON) dans le contexte. Les nœuds aval lisent cette clé. Vide = résultat non stocké.",{"type":14,"tag":164,"props":296,"children":297},{},[298,314],{"type":14,"tag":186,"props":299,"children":300},{},[301,306,307,313],{"type":14,"tag":31,"props":302,"children":303},{},[304],{"type":19,"value":305},"Budget d'exécution",{"type":19,"value":211},{"type":14,"tag":22,"props":308,"children":310},{"className":309},[],[311],{"type":19,"value":312},"timeout_ms",{"type":19,"value":218},{"type":14,"tag":186,"props":315,"children":316},{},[317],{"type":19,"value":318},"Plafond de temps : 5 000 ms par défaut, 30 000 ms maximum. Une étape qui dépasse échoue.",{"type":14,"tag":62,"props":320,"children":322},{"id":321},"où-est-la-frontière-de-sécurité",[323],{"type":19,"value":324},"Où est la frontière de sécurité",{"type":14,"tag":15,"props":326,"children":327},{},[328],{"type":19,"value":329},"Le langage n'est pas la menace : Starlark est sandboxé par conception — il ne peut, à lui seul, ni lire un fichier, ni atteindre le réseau, ni boucler indéfiniment. Du code purement calculatoire est sans danger.",{"type":14,"tag":15,"props":331,"children":332},{},[333,335,344,346,351],{"type":19,"value":334},"La seule capacité réelle est le pont ",{"type":14,"tag":31,"props":336,"children":337},{},[338],{"type":14,"tag":22,"props":339,"children":341},{"className":340},[],[342],{"type":19,"value":343},"tool()",{"type":19,"value":345},", et il est borné par l'",{"type":14,"tag":31,"props":347,"children":348},{},[349],{"type":19,"value":350},"allowlist",{"type":19,"value":352}," appliquée au runtime : le code ne peut appeler que les tools que vous avez listés (un autre appel est refusé), et chacun porte ses propres garde-fous (SSRF, facturation, audit, killswitch). L'allowlist s'édite aussi librement que le code : c'est sur le choix des tools que vous cadrez ce qu'une étape peut faire.",{"type":14,"tag":354,"props":355,"children":357},"alert",{"type":356},"info",[358],{"type":14,"tag":15,"props":359,"children":360},{},[361],{"type":19,"value":362},"Une allowlist vide = aucune capacité d'effet de bord : l'étape ne fait que calculer sur ses entrées et produire une sortie.",{"type":14,"tag":62,"props":364,"children":366},{"id":365},"quand-lutiliser",[367],{"type":19,"value":368},"Quand l'utiliser",{"type":14,"tag":102,"props":370,"children":371},{},[372,389,406],{"type":14,"tag":106,"props":373,"children":374},{},[375,380,382,387],{"type":14,"tag":31,"props":376,"children":377},{},[378],{"type":19,"value":379},"Oui",{"type":19,"value":381}," : une logique déterministe que vous savez décrire précisément, mais qui dépasse les opérations ",{"type":14,"tag":22,"props":383,"children":385},{"className":384},[],[386],{"type":19,"value":27},{"type":19,"value":388}," livrées (réconciliation de plusieurs listes, règle métier composite, format propriétaire).",{"type":14,"tag":106,"props":390,"children":391},{},[392,397,399,404],{"type":14,"tag":31,"props":393,"children":394},{},[395],{"type":19,"value":396},"Non",{"type":19,"value":398}," : un simple filtre, une agrégation, une projection → un opérateur ",{"type":14,"tag":22,"props":400,"children":402},{"className":401},[],[403],{"type":19,"value":27},{"type":19,"value":405}," suffit.",{"type":14,"tag":106,"props":407,"children":408},{},[409,413,415,420],{"type":14,"tag":31,"props":410,"children":411},{},[412],{"type":19,"value":396},{"type":19,"value":414}," : une tâche qui demande du ",{"type":14,"tag":31,"props":416,"children":417},{},[418],{"type":19,"value":419},"jugement",{"type":19,"value":421}," ou de la rédaction → c'est un agent, pas du code.",{"title":7,"searchDepth":423,"depth":423,"links":424},2,[425,426,427,428],{"id":64,"depth":423,"text":67},{"id":151,"depth":423,"text":154},{"id":321,"depth":423,"text":324},{"id":365,"depth":423,"text":368},"markdown","content:docs:3.pipelines:5.code-step.md","content","docs\u002F3.pipelines\u002F5.code-step.md","docs\u002F3.pipelines\u002F5.code-step","md",[436],{"title":437,"_path":438,"children":439},"Docs","\u002Fdocs",[440,453,481,507,520,536,549,610],{"title":441,"_path":442,"children":443},"Démarrer","\u002Fdocs\u002Fdemarrer",[444,447,450],{"title":445,"_path":446},"Bienvenue","\u002Fdocs\u002Fdemarrer\u002Fbienvenue",{"title":448,"_path":449},"Créer un compte","\u002Fdocs\u002Fdemarrer\u002Fcreer-un-compte",{"title":451,"_path":452},"Brancher une clé LLM","\u002Fdocs\u002Fdemarrer\u002Fbrancher-llm",{"title":454,"_path":455,"children":456},"Canaux","\u002Fdocs\u002Fcanaux",[457,460,463,466,469,472,475,478],{"title":458,"_path":459},"Vue d'ensemble des canaux","\u002Fdocs\u002Fcanaux\u002Fvue-densemble",{"title":461,"_path":462},"Téléphonie temps réel","\u002Fdocs\u002Fcanaux\u002Ftelephone",{"title":464,"_path":465},"Email","\u002Fdocs\u002Fcanaux\u002Femail",{"title":467,"_path":468},"Chat widget web","\u002Fdocs\u002Fcanaux\u002Fchat-widget",{"title":470,"_path":471},"Webhook HTTP","\u002Fdocs\u002Fcanaux\u002Fwebhook",{"title":473,"_path":474},"Messageries (WhatsApp, Messenger, Telegram, Mattermost)","\u002Fdocs\u002Fcanaux\u002Fmessageries",{"title":476,"_path":477},"Meta Lead Ads","\u002Fdocs\u002Fcanaux\u002Ffacebook-leads",{"title":479,"_path":480},"Planification (cron)","\u002Fdocs\u002Fcanaux\u002Fschedule",{"title":482,"_path":483,"children":484},"Pipelines","\u002Fdocs\u002Fpipelines",[485,488,491,494,497,498,501,504],{"title":486,"_path":487},"L'éditeur visuel","\u002Fdocs\u002Fpipelines\u002Fediteur-visuel",{"title":489,"_path":490},"Agents IA","\u002Fdocs\u002Fpipelines\u002Fagents",{"title":492,"_path":493},"Opérateurs déterministes","\u002Fdocs\u002Fpipelines\u002Foperateurs",{"title":495,"_path":496},"Contrôle de flux","\u002Fdocs\u002Fpipelines\u002Fcontrole-flux",{"title":8,"_path":4},{"title":499,"_path":500},"Sous-pipelines","\u002Fdocs\u002Fpipelines\u002Fsous-pipelines",{"title":502,"_path":503},"Actions sans code","\u002Fdocs\u002Fpipelines\u002Factions-no-code",{"title":505,"_path":506},"Base de connaissances","\u002Fdocs\u002Fpipelines\u002Fbase-de-connaissances",{"title":508,"_path":509,"children":510},"Supervision","\u002Fdocs\u002Fsupervision",[511,514,517],{"title":512,"_path":513},"Historique d'exécutions","\u002Fdocs\u002Fsupervision\u002Fexecutions",{"title":515,"_path":516},"Crédits & metering","\u002Fdocs\u002Fsupervision\u002Fcredits-metering",{"title":518,"_path":519},"Benchmarks","\u002Fdocs\u002Fsupervision\u002Fbenchmarks",{"title":521,"_path":522,"children":523},"Sécurité","\u002Fdocs\u002Fsecurite",[524,527,530,533],{"title":525,"_path":526},"Principes de sécurité","\u002Fdocs\u002Fsecurite\u002Fprincipes",{"title":528,"_path":529},"Multi-tenant strict","\u002Fdocs\u002Fsecurite\u002Fmulti-tenant",{"title":531,"_path":532},"Audit RGPD & journal d'accès","\u002Fdocs\u002Fsecurite\u002Faudit-rgpd",{"title":534,"_path":535},"Déploiement souverain","\u002Fdocs\u002Fsecurite\u002Fdeploiement-souverain",{"title":537,"_path":538,"children":539},"Développeurs","\u002Fdocs\u002Fdeveloppeurs",[540,543,546],{"title":541,"_path":542},"API admin","\u002Fdocs\u002Fdeveloppeurs\u002Fapi-admin",{"title":544,"_path":545},"Webhooks sortants","\u002Fdocs\u002Fdeveloppeurs\u002Fwebhooks-sortants",{"title":547,"_path":548},"Piloter betool depuis Claude (MCP)","\u002Fdocs\u002Fdeveloppeurs\u002Fmcp",{"title":550,"_path":551,"children":552},"Intégrations","\u002Fdocs\u002Fintegrations",[553,556,559,562,565,568,571,574,577,580,583,586,589,592,595,598,601,604,607],{"title":554,"_path":555},"Vue d'ensemble des intégrations","\u002Fdocs\u002Fintegrations\u002Fvue-densemble",{"title":557,"_path":558},"Stripe","\u002Fdocs\u002Fintegrations\u002Fstripe",{"title":560,"_path":561},"GitHub","\u002Fdocs\u002Fintegrations\u002Fgithub",{"title":563,"_path":564},"Google","\u002Fdocs\u002Fintegrations\u002Fgoogle",{"title":566,"_path":567},"LinkedIn Ads","\u002Fdocs\u002Fintegrations\u002Flinkedin-ads",{"title":569,"_path":570},"Kavkom","\u002Fdocs\u002Fintegrations\u002Fkavkom",{"title":572,"_path":573},"Jira","\u002Fdocs\u002Fintegrations\u002Fjira",{"title":575,"_path":576},"Slack","\u002Fdocs\u002Fintegrations\u002Fslack",{"title":578,"_path":579},"SMS","\u002Fdocs\u002Fintegrations\u002Fsms",{"title":581,"_path":582},"Enable Banking (open banking)","\u002Fdocs\u002Fintegrations\u002Fenable-banking",{"title":584,"_path":585},"CRM, marketing & productivité","\u002Fdocs\u002Fintegrations\u002Fcrm-marketing",{"title":587,"_path":588},"HeyGen (vidéo)","\u002Fdocs\u002Fintegrations\u002Fheygen",{"title":590,"_path":591},"La Poste","\u002Fdocs\u002Fintegrations\u002Fla-poste",{"title":593,"_path":594},"CRM métier (beTool Application, Qhare)","\u002Fdocs\u002Fintegrations\u002Fcrm-metier",{"title":596,"_path":597},"Mitti (inspections terrain)","\u002Fdocs\u002Fintegrations\u002Fmitti",{"title":599,"_path":600},"Meta (Messenger, Pages, Meta Ads)","\u002Fdocs\u002Fintegrations\u002Fmeta",{"title":602,"_path":603},"Onoff Business (Beta)","\u002Fdocs\u002Fintegrations\u002Fonoff",{"title":605,"_path":606},"Smart Life \u002F Tuya (objets connectés)","\u002Fdocs\u002Fintegrations\u002Fsmart-life",{"title":608,"_path":609},"Produits beTool (Desktop, Kiosk, Terminal)","\u002Fdocs\u002Fintegrations\u002Fproduits-betool",{"title":611,"_path":612,"children":613},"Cas d'usage","\u002Fdocs\u002Fcas-usage",[614,617,620,623,626,629],{"title":615,"_path":616},"Agents métier types","\u002Fdocs\u002Fcas-usage\u002Fvue-densemble",{"title":618,"_path":619},"CFO IA","\u002Fdocs\u002Fcas-usage\u002Fcfo-ia",{"title":621,"_path":622},"COO IA","\u002Fdocs\u002Fcas-usage\u002Fcoo-ia",{"title":624,"_path":625},"CTO IA","\u002Fdocs\u002Fcas-usage\u002Fcto-ia",{"title":627,"_path":628},"Product Manager IA","\u002Fdocs\u002Fcas-usage\u002Fproduct-manager-ia",{"title":630,"_path":631},"Assistant personnel","\u002Fdocs\u002Fcas-usage\u002Fassistant-personnel"]