[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"doc-\u002Fen\u002Fdocs\u002Fpipelines\u002Fcode-step":3,"docs-nav-en":433},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"body":10,"_type":427,"_id":428,"_source":429,"_file":430,"_stem":431,"_extension":432},"\u002Fen\u002Fdocs\u002Fpipelines\u002Fcode-step","pipelines",false,"","Code Steps","The code_step node executes custom logic in a Starlark sandbox — freely editable, bounded by a tool allowlist.",{"type":11,"children":12,"toc":420},"root",[13,49,61,68,101,144,149,155,317,323,328,351,361,367],{"type":14,"tag":15,"props":16,"children":17},"element","p",{},[18,21,28,30,40,42,47],{"type":19,"value":20},"text","Some logic is too specific for a ",{"type":14,"tag":22,"props":23,"children":25},"code",{"className":24},[],[26],{"type":19,"value":27},"compute",{"type":19,"value":29}," operator, yet too deterministic to warrant a LLM agent: multi-source reconciliations, bespoke business computations, exotic normalizations. For these cases, the ",{"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}," node executes code ",{"type":14,"tag":31,"props":43,"children":44},{},[45],{"type":19,"value":46},"inside a sandbox",{"type":19,"value":48},", with no LLM call and a predictable output.",{"type":14,"tag":15,"props":50,"children":51},{},[52,54,59],{"type":19,"value":53},"The code is edited directly, like any other configuration field: no ",{"type":14,"tag":22,"props":55,"children":57},{"className":56},[],[58],{"type":19,"value":39},{"type":19,"value":60}," key is locked, and no code-specific approval is required. A change takes effect as soon as the pipeline is published, on the next execution.",{"type":14,"tag":62,"props":63,"children":65},"h2",{"id":64},"the-execution-model",[66],{"type":19,"value":67},"The execution model",{"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}," executes ",{"type":14,"tag":31,"props":79,"children":80},{},[81],{"type":19,"value":82},"Starlark",{"type":19,"value":84}," — a Python dialect designed for isolation: no filesystem access, no network, no ",{"type":14,"tag":22,"props":86,"children":88},{"className":87},[],[89],{"type":19,"value":90},"import",{"type":19,"value":92},", no ",{"type":14,"tag":22,"props":94,"children":96},{"className":95},[],[97],{"type":19,"value":98},"while",{"type":19,"value":100}," loop or recursion, deterministic, bounded by a time budget. The code only sees:",{"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},"The ",{"type":14,"tag":31,"props":112,"children":113},{},[114],{"type":19,"value":115},"inputs",{"type":19,"value":117}," you explicitly map to it (",{"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}," you authorise it to call (",{"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},"Everything else is out of reach. A code step cannot access a resource you have not handed to it.",{"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},"Field",{"type":14,"tag":168,"props":174,"children":175},{},[176],{"type":19,"value":177},"Purpose",{"type":14,"tag":179,"props":180,"children":181},"tbody",{},[182,199,238,269,293],{"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},"The Starlark source that is executed, edited directly.",{"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},"Inputs",{"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,228,230,236],{"type":14,"tag":22,"props":223,"children":225},{"className":224},[],[226],{"type":19,"value":227},"variable → selector",{"type":19,"value":229}," mapping. Only these context keys are exposed to the code. Internal keys (",{"type":14,"tag":22,"props":231,"children":233},{"className":232},[],[234],{"type":19,"value":235},"_*",{"type":19,"value":237},") are rejected.",{"type":14,"tag":164,"props":239,"children":240},{},[241,256],{"type":14,"tag":186,"props":242,"children":243},{},[244,249,250,255],{"type":14,"tag":31,"props":245,"children":246},{},[247],{"type":19,"value":248},"Tool allowlist",{"type":19,"value":211},{"type":14,"tag":22,"props":251,"children":253},{"className":252},[],[254],{"type":19,"value":142},{"type":19,"value":218},{"type":14,"tag":186,"props":257,"children":258},{},[259,261,267],{"type":19,"value":260},"The tools callable via ",{"type":14,"tag":22,"props":262,"children":264},{"className":263},[],[265],{"type":19,"value":266},"tool(name, args)",{"type":19,"value":268},", 50 calls maximum per execution. Each call inherits the tool's own safeguards (SSRF protection, billing, audit, killswitch).",{"type":14,"tag":164,"props":270,"children":271},{},[272,288],{"type":14,"tag":186,"props":273,"children":274},{},[275,280,281,287],{"type":14,"tag":31,"props":276,"children":277},{},[278],{"type":19,"value":279},"Output key",{"type":19,"value":211},{"type":14,"tag":22,"props":282,"children":284},{"className":283},[],[285],{"type":19,"value":286},"output_key",{"type":19,"value":218},{"type":14,"tag":186,"props":289,"children":290},{},[291],{"type":19,"value":292},"Where to place the result (JSON-serializable) in the context. Downstream nodes read this key. Empty = result not stored.",{"type":14,"tag":164,"props":294,"children":295},{},[296,312],{"type":14,"tag":186,"props":297,"children":298},{},[299,304,305,311],{"type":14,"tag":31,"props":300,"children":301},{},[302],{"type":19,"value":303},"Execution budget",{"type":19,"value":211},{"type":14,"tag":22,"props":306,"children":308},{"className":307},[],[309],{"type":19,"value":310},"timeout_ms",{"type":19,"value":218},{"type":14,"tag":186,"props":313,"children":314},{},[315],{"type":19,"value":316},"Time ceiling: 5,000 ms by default, 30,000 ms maximum. A step that exceeds it fails.",{"type":14,"tag":62,"props":318,"children":320},{"id":319},"where-the-security-boundary-is",[321],{"type":19,"value":322},"Where the security boundary is",{"type":14,"tag":15,"props":324,"children":325},{},[326],{"type":19,"value":327},"The language is not the threat: Starlark is sandboxed by design — on its own it can neither read a file, reach the network, nor loop forever. Pure computation is harmless.",{"type":14,"tag":15,"props":329,"children":330},{},[331,333,342,344,349],{"type":19,"value":332},"The only real capability is the ",{"type":14,"tag":31,"props":334,"children":335},{},[336],{"type":14,"tag":22,"props":337,"children":339},{"className":338},[],[340],{"type":19,"value":341},"tool()",{"type":19,"value":343}," bridge, and it is bounded by the ",{"type":14,"tag":31,"props":345,"children":346},{},[347],{"type":19,"value":348},"allowlist",{"type":19,"value":350}," enforced at runtime: the code can only call the tools you have listed (any other call is refused), and each one carries its own safeguards (SSRF protection, billing, audit, killswitch). The allowlist is as freely editable as the code: the choice of tools is where you scope what a step is allowed to do.",{"type":14,"tag":352,"props":353,"children":355},"alert",{"type":354},"info",[356],{"type":14,"tag":15,"props":357,"children":358},{},[359],{"type":19,"value":360},"An empty allowlist = no side-effect capability: the step merely computes over its inputs and produces an output.",{"type":14,"tag":62,"props":362,"children":364},{"id":363},"when-to-use-it",[365],{"type":19,"value":366},"When to use it",{"type":14,"tag":102,"props":368,"children":369},{},[370,387,404],{"type":14,"tag":106,"props":371,"children":372},{},[373,378,380,385],{"type":14,"tag":31,"props":374,"children":375},{},[376],{"type":19,"value":377},"Yes",{"type":19,"value":379},": deterministic logic you can describe precisely, but which exceeds the built-in ",{"type":14,"tag":22,"props":381,"children":383},{"className":382},[],[384],{"type":19,"value":27},{"type":19,"value":386}," operations (reconciling multiple lists, composite business rules, proprietary formats).",{"type":14,"tag":106,"props":388,"children":389},{},[390,395,397,402],{"type":14,"tag":31,"props":391,"children":392},{},[393],{"type":19,"value":394},"No",{"type":19,"value":396},": a simple filter, aggregation, or projection → a ",{"type":14,"tag":22,"props":398,"children":400},{"className":399},[],[401],{"type":19,"value":27},{"type":19,"value":403}," operator is sufficient.",{"type":14,"tag":106,"props":405,"children":406},{},[407,411,413,418],{"type":14,"tag":31,"props":408,"children":409},{},[410],{"type":19,"value":394},{"type":19,"value":412},": a task that requires ",{"type":14,"tag":31,"props":414,"children":415},{},[416],{"type":19,"value":417},"judgment",{"type":19,"value":419}," or open-ended writing → that is an agent, not code.",{"title":7,"searchDepth":421,"depth":421,"links":422},2,[423,424,425,426],{"id":64,"depth":421,"text":67},{"id":151,"depth":421,"text":154},{"id":319,"depth":421,"text":322},{"id":363,"depth":421,"text":366},"markdown","content:en:docs:3.pipelines:5.code-step.md","content","en\u002Fdocs\u002F3.pipelines\u002F5.code-step.md","en\u002Fdocs\u002F3.pipelines\u002F5.code-step","md",[434],{"title":435,"_path":436,"children":437},"En","\u002Fen",[438],{"title":439,"_path":440,"children":441},"Docs","\u002Fen\u002Fdocs",[442,455,483,509,522,538,551,612],{"title":443,"_path":444,"children":445},"Getting started","\u002Fen\u002Fdocs\u002Fdemarrer",[446,449,452],{"title":447,"_path":448},"Welcome","\u002Fen\u002Fdocs\u002Fdemarrer\u002Fbienvenue",{"title":450,"_path":451},"Create an account","\u002Fen\u002Fdocs\u002Fdemarrer\u002Fcreer-un-compte",{"title":453,"_path":454},"Connect an LLM key","\u002Fen\u002Fdocs\u002Fdemarrer\u002Fbrancher-llm",{"title":456,"_path":457,"children":458},"Channels","\u002Fen\u002Fdocs\u002Fcanaux",[459,462,465,468,471,474,477,480],{"title":460,"_path":461},"Channels overview","\u002Fen\u002Fdocs\u002Fcanaux\u002Fvue-densemble",{"title":463,"_path":464},"Real-time telephony","\u002Fen\u002Fdocs\u002Fcanaux\u002Ftelephone",{"title":466,"_path":467},"Email","\u002Fen\u002Fdocs\u002Fcanaux\u002Femail",{"title":469,"_path":470},"Web chat widget","\u002Fen\u002Fdocs\u002Fcanaux\u002Fchat-widget",{"title":472,"_path":473},"HTTP Webhook","\u002Fen\u002Fdocs\u002Fcanaux\u002Fwebhook",{"title":475,"_path":476},"Messaging (WhatsApp, Messenger, Telegram, Mattermost)","\u002Fen\u002Fdocs\u002Fcanaux\u002Fmessageries",{"title":478,"_path":479},"Meta Lead Ads","\u002Fen\u002Fdocs\u002Fcanaux\u002Ffacebook-leads",{"title":481,"_path":482},"Schedule (cron)","\u002Fen\u002Fdocs\u002Fcanaux\u002Fschedule",{"title":484,"_path":485,"children":486},"Pipelines","\u002Fen\u002Fdocs\u002Fpipelines",[487,490,493,496,499,500,503,506],{"title":488,"_path":489},"The Visual Editor","\u002Fen\u002Fdocs\u002Fpipelines\u002Fediteur-visuel",{"title":491,"_path":492},"AI Agents","\u002Fen\u002Fdocs\u002Fpipelines\u002Fagents",{"title":494,"_path":495},"Deterministic Operators","\u002Fen\u002Fdocs\u002Fpipelines\u002Foperateurs",{"title":497,"_path":498},"Flow Control","\u002Fen\u002Fdocs\u002Fpipelines\u002Fcontrole-flux",{"title":8,"_path":4},{"title":501,"_path":502},"Sub-pipelines","\u002Fen\u002Fdocs\u002Fpipelines\u002Fsous-pipelines",{"title":504,"_path":505},"No-code actions","\u002Fen\u002Fdocs\u002Fpipelines\u002Factions-no-code",{"title":507,"_path":508},"Knowledge base","\u002Fen\u002Fdocs\u002Fpipelines\u002Fbase-de-connaissances",{"title":510,"_path":511,"children":512},"Supervision","\u002Fen\u002Fdocs\u002Fsupervision",[513,516,519],{"title":514,"_path":515},"Execution History","\u002Fen\u002Fdocs\u002Fsupervision\u002Fexecutions",{"title":517,"_path":518},"Credits & Metering","\u002Fen\u002Fdocs\u002Fsupervision\u002Fcredits-metering",{"title":520,"_path":521},"Benchmarks","\u002Fen\u002Fdocs\u002Fsupervision\u002Fbenchmarks",{"title":523,"_path":524,"children":525},"Security","\u002Fen\u002Fdocs\u002Fsecurite",[526,529,532,535],{"title":527,"_path":528},"Security principles","\u002Fen\u002Fdocs\u002Fsecurite\u002Fprincipes",{"title":530,"_path":531},"Strict multi-tenancy","\u002Fen\u002Fdocs\u002Fsecurite\u002Fmulti-tenant",{"title":533,"_path":534},"GDPR audit & access log","\u002Fen\u002Fdocs\u002Fsecurite\u002Faudit-rgpd",{"title":536,"_path":537},"Sovereign deployment","\u002Fen\u002Fdocs\u002Fsecurite\u002Fdeploiement-souverain",{"title":539,"_path":540,"children":541},"Developers","\u002Fen\u002Fdocs\u002Fdeveloppeurs",[542,545,548],{"title":543,"_path":544},"Admin API","\u002Fen\u002Fdocs\u002Fdeveloppeurs\u002Fapi-admin",{"title":546,"_path":547},"Outbound webhooks","\u002Fen\u002Fdocs\u002Fdeveloppeurs\u002Fwebhooks-sortants",{"title":549,"_path":550},"Drive betool from Claude (MCP)","\u002Fen\u002Fdocs\u002Fdeveloppeurs\u002Fmcp",{"title":552,"_path":553,"children":554},"Integrations","\u002Fen\u002Fdocs\u002Fintegrations",[555,558,561,564,567,570,573,576,579,582,585,588,591,594,597,600,603,606,609],{"title":556,"_path":557},"Integrations overview","\u002Fen\u002Fdocs\u002Fintegrations\u002Fvue-densemble",{"title":559,"_path":560},"Stripe","\u002Fen\u002Fdocs\u002Fintegrations\u002Fstripe",{"title":562,"_path":563},"GitHub","\u002Fen\u002Fdocs\u002Fintegrations\u002Fgithub",{"title":565,"_path":566},"Google","\u002Fen\u002Fdocs\u002Fintegrations\u002Fgoogle",{"title":568,"_path":569},"LinkedIn Ads","\u002Fen\u002Fdocs\u002Fintegrations\u002Flinkedin-ads",{"title":571,"_path":572},"Kavkom","\u002Fen\u002Fdocs\u002Fintegrations\u002Fkavkom",{"title":574,"_path":575},"Jira","\u002Fen\u002Fdocs\u002Fintegrations\u002Fjira",{"title":577,"_path":578},"Slack","\u002Fen\u002Fdocs\u002Fintegrations\u002Fslack",{"title":580,"_path":581},"SMS","\u002Fen\u002Fdocs\u002Fintegrations\u002Fsms",{"title":583,"_path":584},"Enable Banking (open banking)","\u002Fen\u002Fdocs\u002Fintegrations\u002Fenable-banking",{"title":586,"_path":587},"CRM, marketing & productivity","\u002Fen\u002Fdocs\u002Fintegrations\u002Fcrm-marketing",{"title":589,"_path":590},"HeyGen (video)","\u002Fen\u002Fdocs\u002Fintegrations\u002Fheygen",{"title":592,"_path":593},"La Poste","\u002Fen\u002Fdocs\u002Fintegrations\u002Fla-poste",{"title":595,"_path":596},"Industry CRM (beTool Application, Qhare)","\u002Fen\u002Fdocs\u002Fintegrations\u002Fcrm-metier",{"title":598,"_path":599},"Mitti (field inspections)","\u002Fen\u002Fdocs\u002Fintegrations\u002Fmitti",{"title":601,"_path":602},"Meta (Messenger, Pages, Meta Ads)","\u002Fen\u002Fdocs\u002Fintegrations\u002Fmeta",{"title":604,"_path":605},"Onoff Business (Beta)","\u002Fen\u002Fdocs\u002Fintegrations\u002Fonoff",{"title":607,"_path":608},"Smart Life \u002F Tuya (connected devices)","\u002Fen\u002Fdocs\u002Fintegrations\u002Fsmart-life",{"title":610,"_path":611},"beTool products (Desktop, Kiosk, Terminal)","\u002Fen\u002Fdocs\u002Fintegrations\u002Fproduits-betool",{"title":613,"_path":614,"children":615},"Use cases","\u002Fen\u002Fdocs\u002Fcas-usage",[616,619,622,625,628,631],{"title":617,"_path":618},"Typical business agents","\u002Fen\u002Fdocs\u002Fcas-usage\u002Fvue-densemble",{"title":620,"_path":621},"CFO IA","\u002Fen\u002Fdocs\u002Fcas-usage\u002Fcfo-ia",{"title":623,"_path":624},"COO IA","\u002Fen\u002Fdocs\u002Fcas-usage\u002Fcoo-ia",{"title":626,"_path":627},"CTO IA","\u002Fen\u002Fdocs\u002Fcas-usage\u002Fcto-ia",{"title":629,"_path":630},"Product Manager IA","\u002Fen\u002Fdocs\u002Fcas-usage\u002Fproduct-manager-ia",{"title":632,"_path":633},"Personal assistant","\u002Fen\u002Fdocs\u002Fcas-usage\u002Fassistant-personnel"]