[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"doc-\u002Fes\u002Fdocs\u002Fpipelines\u002Foperateurs":3,"docs-nav-es":1354},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"body":10,"_type":1348,"_id":1349,"_source":1350,"_file":1351,"_stem":1352,"_extension":1353},"\u002Fes\u002Fdocs\u002Fpipelines\u002Foperateurs","pipelines",false,"","Operadores deterministas","Nodos de acción que evitan el LLM — HTTP, BD, transformaciones, cálculos.",{"type":11,"children":12,"toc":1324},"root",[13,36,43,55,60,66,80,85,198,216,263,272,277,342,354,389,527,584,636,660,669,674,797,803,858,867,886,927,936,972,977,982,1014,1026,1035,1061,1067,1086,1091,1152,1165,1213,1254,1259,1265,1270,1298],{"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},"operador",{"type":19,"value":28}," es un nodo que ejecuta una acción ",{"type":14,"tag":22,"props":30,"children":31},{},[32],{"type":19,"value":33},"determinista",{"type":19,"value":35},": sin LLM, sin aleatoriedad. Para una entrada dada, la salida es predecible.",{"type":14,"tag":37,"props":38,"children":40},"h2",{"id":39},"por-qué-usarlos",[41],{"type":19,"value":42},"Por qué usarlos",{"type":14,"tag":15,"props":44,"children":45},{},[46,48,53],{"type":19,"value":47},"Cualquier lógica que se pueda escribir explícitamente ",{"type":14,"tag":22,"props":49,"children":50},{},[51],{"type":19,"value":52},"debería",{"type":19,"value":54}," escribirse así. Un LLM que «calcula un total» o «formatea una fecha» es un antipatrón: es más lento, más caro y puede equivocarse.",{"type":14,"tag":15,"props":56,"children":57},{},[58],{"type":19,"value":59},"Regla práctica: si puedes escribir la función en 5 líneas de Python, es un operador — no un agente.",{"type":14,"tag":37,"props":61,"children":63},{"id":62},"tipos-disponibles",[64],{"type":19,"value":65},"Tipos disponibles",{"type":14,"tag":67,"props":68,"children":70},"h3",{"id":69},"webhook_action-llamada-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}," (llamada HTTP)",{"type":14,"tag":15,"props":81,"children":82},{},[83],{"type":19,"value":84},"Realiza una llamada HTTP saliente. Configuración:",{"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étodo, cabeceras y parámetros de consulta (con marcadores de posición del contexto)",{"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},"Cuerpo: ",{"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}," o ",{"type":14,"tag":72,"props":138,"children":140},{"className":139},[],[141],{"type":19,"value":142},"mapper",{"type":19,"value":144}," (cuerpo compuesto por el lenguaje de mapeo, ver más abajo)",{"type":14,"tag":90,"props":146,"children":147},{},[148,150,156,157,163,164,170,172,178],{"type":19,"value":149},"Autenticación: ",{"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}," (cabecera personalizada), u ",{"type":14,"tag":72,"props":173,"children":175},{"className":174},[],[176],{"type":19,"value":177},"oauth2",{"type":19,"value":179}," (ver más abajo)",{"type":14,"tag":90,"props":181,"children":182},{},[183,185,191],{"type":19,"value":184},"Estados HTTP aceptados, tiempo máximo y número de reintentos (",{"type":14,"tag":72,"props":186,"children":188},{"className":187},[],[189],{"type":19,"value":190},"retry_count",{"type":19,"value":192},", 0 por defecto, backoff exponencial)",{"type":14,"tag":90,"props":194,"children":195},{},[196],{"type":19,"value":197},"Clave de salida donde se publica la respuesta",{"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,255,261],{"type":14,"tag":72,"props":220,"children":222},{"className":221},[],[223],{"type":19,"value":207},{"type":19,"value":225}," lee filas en una base no-code de betool o en una base externa (Postgres, MySQL, MongoDB) registrada en ",{"type":14,"tag":22,"props":227,"children":228},{},[229],{"type":19,"value":230},"Aplicaciones → Bases de datos → Conexiones",{"type":19,"value":232},": filtro ",{"type":14,"tag":72,"props":234,"children":236},{"className":235},[],[237],{"type":19,"value":238},"where",{"type":19,"value":240},", búsqueda de texto completo, límite. ",{"type":14,"tag":72,"props":242,"children":244},{"className":243},[],[245],{"type":19,"value":215},{"type":19,"value":247}," escribe en ella (",{"type":14,"tag":72,"props":249,"children":251},{"className":250},[],[252],{"type":19,"value":253},"create",{"type":19,"value":136},{"type":14,"tag":72,"props":256,"children":258},{"className":257},[],[259],{"type":19,"value":260},"update",{"type":19,"value":262},"), con el contenido compuesto por el lenguaje de mapeo.",{"type":14,"tag":67,"props":264,"children":266},{"id":265},"file_transform",[267],{"type":14,"tag":72,"props":268,"children":270},{"className":269},[],[271],{"type":19,"value":265},{"type":14,"tag":15,"props":273,"children":274},{},[275],{"type":19,"value":276},"Transforma un archivo. Transformadores integrados:",{"type":14,"tag":86,"props":278,"children":279},{},[280,291,302,313,331],{"type":14,"tag":90,"props":281,"children":282},{},[283,289],{"type":14,"tag":72,"props":284,"children":286},{"className":285},[],[287],{"type":19,"value":288},"pdf_extract_text",{"type":19,"value":290}," — texto seleccionable de un PDF (sin OCR: un PDF escaneado no devuelve texto)",{"type":14,"tag":90,"props":292,"children":293},{},[294,300],{"type":14,"tag":72,"props":295,"children":297},{"className":296},[],[298],{"type":19,"value":299},"pdf_split",{"type":19,"value":301}," — división de un PDF",{"type":14,"tag":90,"props":303,"children":304},{},[305,311],{"type":14,"tag":72,"props":306,"children":308},{"className":307},[],[309],{"type":19,"value":310},"pdf_to_images",{"type":19,"value":312}," — renderizado de las páginas de un PDF en imágenes",{"type":14,"tag":90,"props":314,"children":315},{},[316,322,323,329],{"type":14,"tag":72,"props":317,"children":319},{"className":318},[],[320],{"type":19,"value":321},"xlsx_to_json",{"type":19,"value":209},{"type":14,"tag":72,"props":324,"children":326},{"className":325},[],[327],{"type":19,"value":328},"xls_to_json",{"type":19,"value":330}," — lectura de un libro de Excel en filas JSON",{"type":14,"tag":90,"props":332,"children":333},{},[334,340],{"type":14,"tag":72,"props":335,"children":337},{"className":336},[],[338],{"type":19,"value":339},"unzip",{"type":19,"value":341}," — extracción de un archivo comprimido",{"type":14,"tag":67,"props":343,"children":345},{"id":344},"file_link-enlaces-de-descarga",[346,352],{"type":14,"tag":72,"props":347,"children":349},{"className":348},[],[350],{"type":19,"value":351},"file_link",{"type":19,"value":353}," (enlaces de descarga)",{"type":14,"tag":15,"props":355,"children":356},{},[357,359,364,366,371,373,378,380,387],{"type":19,"value":358},"Entrega archivos a un tercero ",{"type":14,"tag":22,"props":360,"children":361},{},[362],{"type":19,"value":363},"mediante enlace",{"type":19,"value":365},", sin poner su contenido en el flujo: para cada archivo de una lista del contexto (los archivos de una descarga, adjuntos recibidos, las fotos de una inspección…), el nodo ",{"type":14,"tag":22,"props":367,"children":368},{},[369],{"type":19,"value":370},"Enlaces de descarga",{"type":19,"value":372}," produce un ",{"type":14,"tag":22,"props":374,"children":375},{},[376],{"type":19,"value":377},"enlace de descarga firmado",{"type":19,"value":379}," con vida útil limitada. Un paso siguiente compone lo que recibe el destinatario: respuesta de un ",{"type":14,"tag":381,"props":382,"children":384},"a",{"href":383},"\u002Fes\u002Fdocs\u002Fcanaux\u002Fwebhook",[385],{"type":19,"value":386},"webhook entrante",{"type":19,"value":388},", email…",{"type":14,"tag":390,"props":391,"children":392},"table",{},[393,412],{"type":14,"tag":394,"props":395,"children":396},"thead",{},[397],{"type":14,"tag":398,"props":399,"children":400},"tr",{},[401,407],{"type":14,"tag":402,"props":403,"children":404},"th",{},[405],{"type":19,"value":406},"Ajuste",{"type":14,"tag":402,"props":408,"children":409},{},[410],{"type":19,"value":411},"Función",{"type":14,"tag":413,"props":414,"children":415},"tbody",{},[416,446,466,479,499],{"type":14,"tag":398,"props":417,"children":418},{},[419,433],{"type":14,"tag":420,"props":421,"children":422},"td",{},[423,425,431],{"type":19,"value":424},"Lista de archivos que enlazar (",{"type":14,"tag":72,"props":426,"children":428},{"className":427},[],[429],{"type":19,"value":430},"input_path",{"type":19,"value":432},")",{"type":14,"tag":420,"props":434,"children":435},{},[436,438,444],{"type":19,"value":437},"Dónde leer la lista en el flujo — cada entrada lleva ",{"type":14,"tag":72,"props":439,"children":441},{"className":440},[],[442],{"type":19,"value":443},"path",{"type":19,"value":445}," (clave del archivo en el almacenamiento de la organización) y opcionalmente un nombre de archivo. Obligatorio.",{"type":14,"tag":398,"props":447,"children":448},{},[449,461],{"type":14,"tag":420,"props":450,"children":451},{},[452,454,460],{"type":19,"value":453},"Subcarpetas permitidas (",{"type":14,"tag":72,"props":455,"children":457},{"className":456},[],[458],{"type":19,"value":459},"path_scope",{"type":19,"value":432},{"type":14,"tag":420,"props":462,"children":463},{},[464],{"type":19,"value":465},"Opcional: restringe los archivos que se pueden firmar a ciertas subcarpetas del almacenamiento de la organización.",{"type":14,"tag":398,"props":467,"children":468},{},[469,474],{"type":14,"tag":420,"props":470,"children":471},{},[472],{"type":19,"value":473},"Vida de los enlaces",{"type":14,"tag":420,"props":475,"children":476},{},[477],{"type":19,"value":478},"15 minutos por defecto, de 1 minuto a 24 horas.",{"type":14,"tag":398,"props":480,"children":481},{},[482,494],{"type":14,"tag":420,"props":483,"children":484},{},[485,487,493],{"type":19,"value":486},"Número máximo de archivos (",{"type":14,"tag":72,"props":488,"children":490},{"className":489},[],[491],{"type":19,"value":492},"max_files",{"type":19,"value":432},{"type":14,"tag":420,"props":495,"children":496},{},[497],{"type":19,"value":498},"20 por defecto, 100 como máximo.",{"type":14,"tag":398,"props":500,"children":501},{},[502,514],{"type":14,"tag":420,"props":503,"children":504},{},[505,507,513],{"type":19,"value":506},"Clave de salida (",{"type":14,"tag":72,"props":508,"children":510},{"className":509},[],[511],{"type":19,"value":512},"output_key",{"type":19,"value":432},{"type":14,"tag":420,"props":515,"children":516},{},[517,519,525],{"type":19,"value":518},"Por defecto ",{"type":14,"tag":72,"props":520,"children":522},{"className":521},[],[523],{"type":19,"value":524},"linked.files",{"type":19,"value":526},".",{"type":14,"tag":15,"props":528,"children":529},{},[530,532,538,540,546,548,554,556,562,563,569,570,576,577,583],{"type":19,"value":531},"La salida contiene ",{"type":14,"tag":72,"props":533,"children":535},{"className":534},[],[536],{"type":19,"value":537},"files",{"type":19,"value":539}," (cada entrada original, enriquecida con ",{"type":14,"tag":72,"props":541,"children":543},{"className":542},[],[544],{"type":19,"value":545},"url",{"type":19,"value":547}," y ",{"type":14,"tag":72,"props":549,"children":551},{"className":550},[],[552],{"type":19,"value":553},"expires_at",{"type":19,"value":555},"), ",{"type":14,"tag":72,"props":557,"children":559},{"className":558},[],[560],{"type":19,"value":561},"file_count",{"type":19,"value":107},{"type":14,"tag":72,"props":564,"children":566},{"className":565},[],[567],{"type":19,"value":568},"failed",{"type":19,"value":107},{"type":14,"tag":72,"props":571,"children":573},{"className":572},[],[574],{"type":19,"value":575},"requested",{"type":19,"value":547},{"type":14,"tag":72,"props":578,"children":580},{"className":579},[],[581],{"type":19,"value":582},"ttl_seconds",{"type":19,"value":526},{"type":14,"tag":86,"props":585,"children":586},{},[587,597,607,624],{"type":14,"tag":90,"props":588,"children":589},{},[590,595],{"type":14,"tag":22,"props":591,"children":592},{},[593],{"type":19,"value":594},"Nunca fuera de tu organización",{"type":19,"value":596},": un archivo fuera de su almacenamiento se rechaza.",{"type":14,"tag":90,"props":598,"children":599},{},[600,605],{"type":14,"tag":22,"props":601,"children":602},{},[603],{"type":19,"value":604},"Existencia verificada antes de firmar",{"type":19,"value":606},": un archivo ausente nunca se firma.",{"type":14,"tag":90,"props":608,"children":609},{},[610,615,617,622],{"type":14,"tag":22,"props":611,"children":612},{},[613],{"type":19,"value":614},"Nada omitido",{"type":19,"value":616},": un archivo no enlazado (fuera de perímetro, no encontrado, por encima del límite, firma imposible) figura en ",{"type":14,"tag":72,"props":618,"children":620},{"className":619},[],[621],{"type":19,"value":568},{"type":19,"value":623}," con su motivo.",{"type":14,"tag":90,"props":625,"children":626},{},[627,629,634],{"type":19,"value":628},"Los enlaces se ",{"type":14,"tag":22,"props":630,"children":631},{},[632],{"type":19,"value":633},"vuelven a crear en cada ejecución",{"type":19,"value":635},", y cada enlace emitido queda registrado.",{"type":14,"tag":637,"props":638,"children":640},"alert",{"type":639},"warning",[641],{"type":14,"tag":15,"props":642,"children":643},{},[644,646,651,653,658],{"type":19,"value":645},"El enlace es ",{"type":14,"tag":22,"props":647,"children":648},{},[649],{"type":19,"value":650},"al portador",{"type":19,"value":652},": quien lo tenga descarga el archivo hasta su expiración. Mantén una duración corta, y rellena las ",{"type":14,"tag":22,"props":654,"children":655},{},[656],{"type":19,"value":657},"subcarpetas permitidas",{"type":19,"value":659}," en cuanto la lista proceda de un dato modificable (una fila de tabla) — si no, cualquiera que pueda escribir ese dato podría hacer firmar un enlace hacia cualquier archivo de la organización.",{"type":14,"tag":67,"props":661,"children":663},{"id":662},"compute",[664],{"type":14,"tag":72,"props":665,"children":667},{"className":666},[],[668],{"type":19,"value":662},{"type":14,"tag":15,"props":670,"children":671},{},[672],{"type":19,"value":673},"Cálculos deterministas sobre los datos del contexto. Operaciones integradas:",{"type":14,"tag":86,"props":675,"children":676},{},[677,709,720,731,742,753,764,775,786],{"type":14,"tag":90,"props":678,"children":679},{},[680,686,688,694,695,701,702,708],{"type":14,"tag":72,"props":681,"children":683},{"className":682},[],[684],{"type":19,"value":685},"column_stats",{"type":19,"value":687}," — por columna de una lista de filas, cuántas valen un valor dado (",{"type":14,"tag":72,"props":689,"children":691},{"className":690},[],[692],{"type":19,"value":693},"count",{"type":19,"value":107},{"type":14,"tag":72,"props":696,"children":698},{"className":697},[],[699],{"type":19,"value":700},"total",{"type":19,"value":107},{"type":14,"tag":72,"props":703,"children":705},{"className":704},[],[706],{"type":19,"value":707},"pct",{"type":19,"value":432},{"type":14,"tag":90,"props":710,"children":711},{},[712,718],{"type":14,"tag":72,"props":713,"children":715},{"className":714},[],[716],{"type":19,"value":717},"compose_text",{"type":19,"value":719}," — composición de un texto a partir de una plantilla y de valores del flujo",{"type":14,"tag":90,"props":721,"children":722},{},[723,729],{"type":14,"tag":72,"props":724,"children":726},{"className":725},[],[727],{"type":19,"value":728},"regex_extract",{"type":19,"value":730}," — extracción de valores mediante expresión regular",{"type":14,"tag":90,"props":732,"children":733},{},[734,740],{"type":14,"tag":72,"props":735,"children":737},{"className":736},[],[738],{"type":19,"value":739},"select_by_substring",{"type":19,"value":741}," — reparto de una lista en grupos según predicados «contiene \u002F no contiene»",{"type":14,"tag":90,"props":743,"children":744},{},[745,751],{"type":14,"tag":72,"props":746,"children":748},{"className":747},[],[749],{"type":19,"value":750},"list_compare",{"type":19,"value":752}," — coherencia de varias listas por clave pivote",{"type":14,"tag":90,"props":754,"children":755},{},[756,762],{"type":14,"tag":72,"props":757,"children":759},{"className":758},[],[760],{"type":19,"value":761},"multi_source_compliance",{"type":19,"value":763}," — auditoría de conformidad multidimensión y multifuente",{"type":14,"tag":90,"props":765,"children":766},{},[767,773],{"type":14,"tag":72,"props":768,"children":770},{"className":769},[],[771],{"type":19,"value":772},"contact_extract",{"type":19,"value":774}," — direcciones de email y números de teléfono encontrados en un texto, con su procedencia",{"type":14,"tag":90,"props":776,"children":777},{},[778,784],{"type":14,"tag":72,"props":779,"children":781},{"className":780},[],[782],{"type":19,"value":783},"free_slots",{"type":19,"value":785}," — franjas libres deducidas de periodos ocupados",{"type":14,"tag":90,"props":787,"children":788},{},[789,795],{"type":14,"tag":72,"props":790,"children":792},{"className":791},[],[793],{"type":19,"value":794},"url_expand",{"type":19,"value":796}," — composición de URL a partir de bases y rutas",{"type":14,"tag":67,"props":798,"children":800},{"id":799},"lenguaje-de-mapeo",[801],{"type":19,"value":802},"Lenguaje de mapeo",{"type":14,"tag":15,"props":804,"children":805},{},[806,808,814,815,821,822,828,830,835,837,842,844,849,851,857],{"type":19,"value":807},"No es un nodo: es el lenguaje que compone una carga útil de salida a partir de los datos del contexto (funciones ",{"type":14,"tag":72,"props":809,"children":811},{"className":810},[],[812],{"type":19,"value":813},"$now",{"type":19,"value":107},{"type":14,"tag":72,"props":816,"children":818},{"className":817},[],[819],{"type":19,"value":820},"$uuid",{"type":19,"value":107},{"type":14,"tag":72,"props":823,"children":825},{"className":824},[],[826],{"type":19,"value":827},"$concat",{"type":19,"value":829},"…). Sirve para el cuerpo ",{"type":14,"tag":72,"props":831,"children":833},{"className":832},[],[834],{"type":19,"value":142},{"type":19,"value":836}," de ",{"type":14,"tag":72,"props":838,"children":840},{"className":839},[],[841],{"type":19,"value":77},{"type":19,"value":843},", para el contenido escrito por ",{"type":14,"tag":72,"props":845,"children":847},{"className":846},[],[848],{"type":19,"value":215},{"type":19,"value":850}," y para las variables de una llamada saliente ",{"type":14,"tag":72,"props":852,"children":854},{"className":853},[],[855],{"type":19,"value":856},"phone_call",{"type":19,"value":526},{"type":14,"tag":67,"props":859,"children":861},{"id":860},"data_to_file",[862],{"type":14,"tag":72,"props":863,"children":865},{"className":864},[],[866],{"type":19,"value":860},{"type":14,"tag":15,"props":868,"children":869},{},[870,872,884],{"type":19,"value":871},"Produce un ",{"type":14,"tag":22,"props":873,"children":874},{},[875,877,883],{"type":19,"value":876},"archivo Excel (",{"type":14,"tag":72,"props":878,"children":880},{"className":879},[],[881],{"type":19,"value":882},".xlsx",{"type":19,"value":432},{"type":19,"value":885}," a partir de datos del contexto — una lista de filas, una cuadrícula o varias listas (una pestaña cada una). Opciones: nombre del archivo (con plantilla), nombre de la pestaña, elección y orden de las columnas, fila de encabezado. El archivo se guarda en el almacenamiento de tu organización, listo para enviarse por email o depositarse en un Drive.",{"type":14,"tag":15,"props":887,"children":888},{},[889,891,897,898,904,905,911,912,918,920,925],{"type":19,"value":890},"Por seguridad, las celdas que empiezan por ",{"type":14,"tag":72,"props":892,"children":894},{"className":893},[],[895],{"type":19,"value":896},"=",{"type":19,"value":107},{"type":14,"tag":72,"props":899,"children":901},{"className":900},[],[902],{"type":19,"value":903},"+",{"type":19,"value":107},{"type":14,"tag":72,"props":906,"children":908},{"className":907},[],[909],{"type":19,"value":910},"-",{"type":19,"value":136},{"type":14,"tag":72,"props":913,"children":915},{"className":914},[],[916],{"type":19,"value":917},"@",{"type":19,"value":919}," se escriben como ",{"type":14,"tag":22,"props":921,"children":922},{},[923],{"type":19,"value":924},"texto",{"type":19,"value":926}," por defecto (sin fórmula inyectada). Cuando los límites de Excel obligan a cortar, el archivo se marca como truncado.",{"type":14,"tag":67,"props":928,"children":930},{"id":929},"web_fetch",[931],{"type":14,"tag":72,"props":932,"children":934},{"className":933},[],[935],{"type":19,"value":929},{"type":14,"tag":15,"props":937,"children":938},{},[939,941,946,948,954,956,962,964,970],{"type":19,"value":940},"Lee una o varias ",{"type":14,"tag":22,"props":942,"children":943},{},[944],{"type":19,"value":945},"páginas web",{"type":19,"value":947}," y publica su texto legible en el contexto (por defecto ",{"type":14,"tag":72,"props":949,"children":951},{"className":950},[],[952],{"type":19,"value":953},"web.pages",{"type":19,"value":955},"). Ajustes: número de páginas, concurrencia, tiempo de espera, tamaño máximo. El veredicto de ",{"type":14,"tag":72,"props":957,"children":959},{"className":958},[],[960],{"type":19,"value":961},"robots.txt",{"type":19,"value":963}," siempre se calcula y se informa; solo se aplica si lo activas (",{"type":14,"tag":72,"props":965,"children":967},{"className":966},[],[968],{"type":19,"value":969},"respect_robots",{"type":19,"value":971},").",{"type":14,"tag":15,"props":973,"children":974},{},[975],{"type":19,"value":976},"Las páginas renderizadas únicamente por JavaScript no se ejecutan: solo se lee el HTML servido. Una página fallida se informa en el resultado, sin hacer fallar el pipeline.",{"type":14,"tag":15,"props":978,"children":979},{},[980],{"type":19,"value":981},"En el lado del agente, dos herramientas equivalentes:",{"type":14,"tag":86,"props":983,"children":984},{},[985,996],{"type":14,"tag":90,"props":986,"children":987},{},[988,994],{"type":14,"tag":72,"props":989,"children":991},{"className":990},[],[992],{"type":19,"value":993},"web_scrape.fetch_page",{"type":19,"value":995}," — lee una página (título, texto, enlaces de email y teléfono encontrados).",{"type":14,"tag":90,"props":997,"children":998},{},[999,1005,1007,1012],{"type":14,"tag":72,"props":1000,"children":1002},{"className":1001},[],[1003],{"type":19,"value":1004},"web_search.search",{"type":19,"value":1006}," — ",{"type":14,"tag":22,"props":1008,"children":1009},{},[1010],{"type":19,"value":1011},"búsqueda web",{"type":19,"value":1013}," mediante un motor SearXNG autoalojado por la plataforma: hasta 5 resultados (título, URL, extracto).",{"type":14,"tag":15,"props":1015,"children":1016},{},[1017,1019,1024],{"type":19,"value":1018},"Todas las lecturas web pasan por la misma protección ",{"type":14,"tag":22,"props":1020,"children":1021},{},[1022],{"type":19,"value":1023},"anti-SSRF",{"type":19,"value":1025},": direcciones internas, privadas y de metadatos cloud rechazadas tras la resolución DNS, redirecciones verificadas de nuevo en cada salto.",{"type":14,"tag":67,"props":1027,"children":1029},{"id":1028},"code_step",[1030],{"type":14,"tag":72,"props":1031,"children":1033},{"className":1032},[],[1034],{"type":19,"value":1028},{"type":14,"tag":15,"props":1036,"children":1037},{},[1038,1040,1045,1047,1052,1054,1060],{"type":19,"value":1039},"Cuando la lógica determinista supera lo que ",{"type":14,"tag":72,"props":1041,"children":1043},{"className":1042},[],[1044],{"type":19,"value":662},{"type":19,"value":1046}," puede manejar, un ",{"type":14,"tag":22,"props":1048,"children":1049},{},[1050],{"type":19,"value":1051},"code step",{"type":19,"value":1053}," ejecuta código personalizado en un sandbox Starlark — editable directamente, ejecutado nada más guardarlo y acotado por una allowlist de tools. Consulta ",{"type":14,"tag":381,"props":1055,"children":1057},{"href":1056},"\u002Fes\u002Fdocs\u002Fpipelines\u002Fcode-step",[1058],{"type":19,"value":1059},"Code steps",{"type":19,"value":526},{"type":14,"tag":37,"props":1062,"children":1064},{"id":1063},"autenticación-y-secretos",[1065],{"type":19,"value":1066},"Autenticación y secretos",{"type":14,"tag":15,"props":1068,"children":1069},{},[1070,1072,1077,1079,1084],{"type":19,"value":1071},"Los operadores que se comunican con un sistema externo (HTTP, BD) referencian una ",{"type":14,"tag":22,"props":1073,"children":1074},{},[1075],{"type":19,"value":1076},"cuenta",{"type":19,"value":1078}," registrada dentro de la organización. Las credenciales ",{"type":14,"tag":22,"props":1080,"children":1081},{},[1082],{"type":19,"value":1083},"nunca",{"type":19,"value":1085}," son visibles dentro del propio pipeline — solo se referencia un nombre de cuenta.",{"type":14,"tag":15,"props":1087,"children":1088},{},[1089],{"type":19,"value":1090},"Como resultado, rotar una contraseña no requiere ninguna edición en ningún pipeline.",{"type":14,"tag":15,"props":1092,"children":1093},{},[1094,1096,1101,1103,1108,1110,1115,1116,1121,1123,1128,1130,1135,1137,1143,1145,1151],{"type":19,"value":1095},"Cuando se introduce un secreto directamente en un nodo (token ",{"type":14,"tag":72,"props":1097,"children":1099},{"className":1098},[],[1100],{"type":19,"value":155},{"type":19,"value":1102},", contraseña ",{"type":14,"tag":72,"props":1104,"children":1106},{"className":1105},[],[1107],{"type":19,"value":162},{"type":19,"value":1109}," o valor ",{"type":14,"tag":72,"props":1111,"children":1113},{"className":1112},[],[1114],{"type":19,"value":169},{"type":19,"value":836},{"type":14,"tag":72,"props":1117,"children":1119},{"className":1118},[],[1120],{"type":19,"value":77},{"type":19,"value":1122},", contraseña de un PDF o de un archivo comprimido cifrados para ",{"type":14,"tag":72,"props":1124,"children":1126},{"className":1125},[],[1127],{"type":19,"value":265},{"type":19,"value":1129},"), queda ",{"type":14,"tag":22,"props":1131,"children":1132},{},[1133],{"type":19,"value":1134},"enmascarado",{"type":19,"value":1136}," en cuanto se guarda: el editor, la API y las herramientas MCP solo muestran un marcador. Consulta ",{"type":14,"tag":381,"props":1138,"children":1140},{"href":1139},"\u002Fes\u002Fdocs\u002Fpipelines\u002Fediteur-visuel",[1141],{"type":19,"value":1142},"El editor visual",{"type":19,"value":1144},", sección ",{"type":14,"tag":1146,"props":1147,"children":1148},"em",{},[1149],{"type":19,"value":1150},"Secretos",{"type":19,"value":526},{"type":14,"tag":67,"props":1153,"children":1155},{"id":1154},"oauth2-saliente-client_credentials",[1156,1158,1164],{"type":19,"value":1157},"OAuth2 saliente (",{"type":14,"tag":72,"props":1159,"children":1161},{"className":1160},[],[1162],{"type":19,"value":1163},"client_credentials",{"type":19,"value":432},{"type":14,"tag":15,"props":1166,"children":1167},{},[1168,1170,1175,1177,1182,1184,1190,1191,1197,1198,1204,1205,1211],{"type":19,"value":1169},"Para las API que requieren un token OAuth2 (cloud empresarial, ERP, proveedores de terceros), el operador HTTP admite el modo ",{"type":14,"tag":72,"props":1171,"children":1173},{"className":1172},[],[1174],{"type":19,"value":177},{"type":19,"value":1176},". Registras una ",{"type":14,"tag":22,"props":1178,"children":1179},{},[1180],{"type":19,"value":1181},"credencial OAuth2",{"type":19,"value":1183}," en la organización — ",{"type":14,"tag":72,"props":1185,"children":1187},{"className":1186},[],[1188],{"type":19,"value":1189},"token_url",{"type":19,"value":107},{"type":14,"tag":72,"props":1192,"children":1194},{"className":1193},[],[1195],{"type":19,"value":1196},"client_id",{"type":19,"value":107},{"type":14,"tag":72,"props":1199,"children":1201},{"className":1200},[],[1202],{"type":19,"value":1203},"client_secret",{"type":19,"value":107},{"type":14,"tag":72,"props":1206,"children":1208},{"className":1207},[],[1209],{"type":19,"value":1210},"scope",{"type":19,"value":1212}," — y el nodo referencia solo un identificador no sensible.",{"type":14,"tag":15,"props":1214,"children":1215},{},[1216,1218,1223,1225,1230,1232,1236,1238,1244,1246,1252],{"type":19,"value":1217},"En el momento de la llamada, betool obtiene un token y lo reutiliza mientras siga siendo válido; lo ",{"type":14,"tag":22,"props":1219,"children":1220},{},[1221],{"type":19,"value":1222},"refresca de forma perezosa",{"type":19,"value":1224}," al expirar, sin tarea en segundo plano. El ",{"type":14,"tag":72,"props":1226,"children":1228},{"className":1227},[],[1229],{"type":19,"value":1203},{"type":19,"value":1231}," ",{"type":14,"tag":22,"props":1233,"children":1234},{},[1235],{"type":19,"value":1083},{"type":19,"value":1237}," lo devuelve la API de administración (solo se expone un indicador ",{"type":14,"tag":72,"props":1239,"children":1241},{"className":1240},[],[1242],{"type":19,"value":1243},"has_secret",{"type":19,"value":1245},"), y el token obtenido se coloca como ",{"type":14,"tag":72,"props":1247,"children":1249},{"className":1248},[],[1250],{"type":19,"value":1251},"Authorization: Bearer …",{"type":19,"value":1253}," en la petición saliente.",{"type":14,"tag":15,"props":1255,"children":1256},{},[1257],{"type":19,"value":1258},"Rotar el secreto tras una rotación del lado del proveedor no requiere ninguna edición del pipeline: la siguiente llamada se refresca automáticamente.",{"type":14,"tag":37,"props":1260,"children":1262},{"id":1261},"idempotencia",[1263],{"type":19,"value":1264},"Idempotencia",{"type":14,"tag":15,"props":1266,"children":1267},{},[1268],{"type":19,"value":1269},"Todo operador que produzca un efecto secundario (HTTP POST, DB INSERT, envío de email) debe diseñarse para ser idempotente del lado del destino. Práctica recomendada:",{"type":14,"tag":86,"props":1271,"children":1272},{},[1273,1293],{"type":14,"tag":90,"props":1274,"children":1275},{},[1276,1278,1284,1286,1292],{"type":19,"value":1277},"Incluye una ",{"type":14,"tag":72,"props":1279,"children":1281},{"className":1280},[],[1282],{"type":19,"value":1283},"idempotency_key",{"type":19,"value":1285}," en la carga útil (típicamente ",{"type":14,"tag":72,"props":1287,"children":1289},{"className":1288},[],[1290],{"type":19,"value":1291},"exchange_id",{"type":19,"value":971},{"type":14,"tag":90,"props":1294,"children":1295},{},[1296],{"type":19,"value":1297},"Comprueba del lado del destino si la clave ya ha sido procesada.",{"type":14,"tag":15,"props":1299,"children":1300},{},[1301,1303,1308,1310,1315,1317,1322],{"type":19,"value":1302},"Fuera de los reintentos que configures explícitamente en ",{"type":14,"tag":72,"props":1304,"children":1306},{"className":1305},[],[1307],{"type":19,"value":77},{"type":19,"value":1309}," (",{"type":14,"tag":72,"props":1311,"children":1313},{"className":1312},[],[1314],{"type":19,"value":190},{"type":19,"value":1316},"), betool no reintenta automáticamente un operador fallido: es responsabilidad de tu pipeline orquestar la estrategia de reintento. Además, ",{"type":14,"tag":72,"props":1318,"children":1320},{"className":1319},[],[1321],{"type":19,"value":77},{"type":19,"value":1323}," está protegido contra el doble envío durante un re-dispatch interno: una petición ya entregada con un estado aceptado no se reenvía.",{"title":7,"searchDepth":1325,"depth":1325,"links":1326},2,[1327,1328,1343,1347],{"id":39,"depth":1325,"text":42},{"id":62,"depth":1325,"text":65,"children":1329},[1330,1333,1335,1336,1338,1339,1340,1341,1342],{"id":69,"depth":1331,"text":1332},3,"webhook_action (llamada HTTP)",{"id":200,"depth":1331,"text":1334},"database_query \u002F database_manage",{"id":265,"depth":1331,"text":265},{"id":344,"depth":1331,"text":1337},"file_link (enlaces de descarga)",{"id":662,"depth":1331,"text":662},{"id":799,"depth":1331,"text":802},{"id":860,"depth":1331,"text":860},{"id":929,"depth":1331,"text":929},{"id":1028,"depth":1331,"text":1028},{"id":1063,"depth":1325,"text":1066,"children":1344},[1345],{"id":1154,"depth":1331,"text":1346},"OAuth2 saliente (client_credentials)",{"id":1261,"depth":1325,"text":1264},"markdown","content:es:docs:3.pipelines:3.operateurs.md","content","es\u002Fdocs\u002F3.pipelines\u002F3.operateurs.md","es\u002Fdocs\u002F3.pipelines\u002F3.operateurs","md",[1355],{"title":1356,"_path":1357,"children":1358},"Es","\u002Fes",[1359],{"title":1360,"_path":1361,"children":1362},"Docs","\u002Fes\u002Fdocs",[1363,1376,1403,1426,1439,1455,1468,1529],{"title":1364,"_path":1365,"children":1366},"Primeros pasos","\u002Fes\u002Fdocs\u002Fdemarrer",[1367,1370,1373],{"title":1368,"_path":1369},"Bienvenido","\u002Fes\u002Fdocs\u002Fdemarrer\u002Fbienvenue",{"title":1371,"_path":1372},"Crear una cuenta","\u002Fes\u002Fdocs\u002Fdemarrer\u002Fcreer-un-compte",{"title":1374,"_path":1375},"Conectar una clave LLM","\u002Fes\u002Fdocs\u002Fdemarrer\u002Fbrancher-llm",{"title":1377,"_path":1378,"children":1379},"Canales","\u002Fes\u002Fdocs\u002Fcanaux",[1380,1383,1386,1389,1392,1394,1397,1400],{"title":1381,"_path":1382},"Visión general de los canales","\u002Fes\u002Fdocs\u002Fcanaux\u002Fvue-densemble",{"title":1384,"_path":1385},"Telefonía en tiempo real","\u002Fes\u002Fdocs\u002Fcanaux\u002Ftelephone",{"title":1387,"_path":1388},"Email","\u002Fes\u002Fdocs\u002Fcanaux\u002Femail",{"title":1390,"_path":1391},"Widget de chat web","\u002Fes\u002Fdocs\u002Fcanaux\u002Fchat-widget",{"title":1393,"_path":383},"Webhook HTTP",{"title":1395,"_path":1396},"Mensajería (WhatsApp, Messenger, Telegram, Mattermost)","\u002Fes\u002Fdocs\u002Fcanaux\u002Fmessageries",{"title":1398,"_path":1399},"Meta Lead Ads","\u002Fes\u002Fdocs\u002Fcanaux\u002Ffacebook-leads",{"title":1401,"_path":1402},"Schedule (cron)","\u002Fes\u002Fdocs\u002Fcanaux\u002Fschedule",{"title":1404,"_path":1405,"children":1406},"Pipelines","\u002Fes\u002Fdocs\u002Fpipelines",[1407,1408,1411,1412,1415,1417,1420,1423],{"title":1142,"_path":1139},{"title":1409,"_path":1410},"Agentes IA","\u002Fes\u002Fdocs\u002Fpipelines\u002Fagents",{"title":8,"_path":4},{"title":1413,"_path":1414},"Control de flujo","\u002Fes\u002Fdocs\u002Fpipelines\u002Fcontrole-flux",{"title":1416,"_path":1056},"Code Steps",{"title":1418,"_path":1419},"Sub-pipelines","\u002Fes\u002Fdocs\u002Fpipelines\u002Fsous-pipelines",{"title":1421,"_path":1422},"Acciones no-code","\u002Fes\u002Fdocs\u002Fpipelines\u002Factions-no-code",{"title":1424,"_path":1425},"Base de conocimiento","\u002Fes\u002Fdocs\u002Fpipelines\u002Fbase-de-connaissances",{"title":1427,"_path":1428,"children":1429},"Supervisión","\u002Fes\u002Fdocs\u002Fsupervision",[1430,1433,1436],{"title":1431,"_path":1432},"Historial de ejecuciones","\u002Fes\u002Fdocs\u002Fsupervision\u002Fexecutions",{"title":1434,"_path":1435},"Créditos y medición","\u002Fes\u002Fdocs\u002Fsupervision\u002Fcredits-metering",{"title":1437,"_path":1438},"Benchmarks","\u002Fes\u002Fdocs\u002Fsupervision\u002Fbenchmarks",{"title":1440,"_path":1441,"children":1442},"Seguridad","\u002Fes\u002Fdocs\u002Fsecurite",[1443,1446,1449,1452],{"title":1444,"_path":1445},"Principios de seguridad","\u002Fes\u002Fdocs\u002Fsecurite\u002Fprincipes",{"title":1447,"_path":1448},"Multi-tenancy estricto","\u002Fes\u002Fdocs\u002Fsecurite\u002Fmulti-tenant",{"title":1450,"_path":1451},"Auditoría RGPD y registro de accesos","\u002Fes\u002Fdocs\u002Fsecurite\u002Faudit-rgpd",{"title":1453,"_path":1454},"Despliegue soberano","\u002Fes\u002Fdocs\u002Fsecurite\u002Fdeploiement-souverain",{"title":1456,"_path":1457,"children":1458},"Desarrolladores","\u002Fes\u002Fdocs\u002Fdeveloppeurs",[1459,1462,1465],{"title":1460,"_path":1461},"API de administración","\u002Fes\u002Fdocs\u002Fdeveloppeurs\u002Fapi-admin",{"title":1463,"_path":1464},"Webhooks salientes","\u002Fes\u002Fdocs\u002Fdeveloppeurs\u002Fwebhooks-sortants",{"title":1466,"_path":1467},"Pilota betool desde Claude (MCP)","\u002Fes\u002Fdocs\u002Fdeveloppeurs\u002Fmcp",{"title":1469,"_path":1470,"children":1471},"Integraciones","\u002Fes\u002Fdocs\u002Fintegrations",[1472,1475,1478,1481,1484,1487,1490,1493,1496,1499,1502,1505,1508,1511,1514,1517,1520,1523,1526],{"title":1473,"_path":1474},"Visión general de las integraciones","\u002Fes\u002Fdocs\u002Fintegrations\u002Fvue-densemble",{"title":1476,"_path":1477},"Stripe","\u002Fes\u002Fdocs\u002Fintegrations\u002Fstripe",{"title":1479,"_path":1480},"GitHub","\u002Fes\u002Fdocs\u002Fintegrations\u002Fgithub",{"title":1482,"_path":1483},"Google","\u002Fes\u002Fdocs\u002Fintegrations\u002Fgoogle",{"title":1485,"_path":1486},"LinkedIn Ads","\u002Fes\u002Fdocs\u002Fintegrations\u002Flinkedin-ads",{"title":1488,"_path":1489},"Kavkom","\u002Fes\u002Fdocs\u002Fintegrations\u002Fkavkom",{"title":1491,"_path":1492},"Jira","\u002Fes\u002Fdocs\u002Fintegrations\u002Fjira",{"title":1494,"_path":1495},"Slack","\u002Fes\u002Fdocs\u002Fintegrations\u002Fslack",{"title":1497,"_path":1498},"SMS","\u002Fes\u002Fdocs\u002Fintegrations\u002Fsms",{"title":1500,"_path":1501},"Enable Banking (open banking)","\u002Fes\u002Fdocs\u002Fintegrations\u002Fenable-banking",{"title":1503,"_path":1504},"CRM, marketing y productividad","\u002Fes\u002Fdocs\u002Fintegrations\u002Fcrm-marketing",{"title":1506,"_path":1507},"HeyGen (vídeo)","\u002Fes\u002Fdocs\u002Fintegrations\u002Fheygen",{"title":1509,"_path":1510},"La Poste","\u002Fes\u002Fdocs\u002Fintegrations\u002Fla-poste",{"title":1512,"_path":1513},"CRM de negocio (beTool Application, Qhare)","\u002Fes\u002Fdocs\u002Fintegrations\u002Fcrm-metier",{"title":1515,"_path":1516},"Mitti (inspecciones de campo)","\u002Fes\u002Fdocs\u002Fintegrations\u002Fmitti",{"title":1518,"_path":1519},"Meta (Messenger, Páginas, Meta Ads)","\u002Fes\u002Fdocs\u002Fintegrations\u002Fmeta",{"title":1521,"_path":1522},"Onoff Business (Beta)","\u002Fes\u002Fdocs\u002Fintegrations\u002Fonoff",{"title":1524,"_path":1525},"Smart Life \u002F Tuya (objetos conectados)","\u002Fes\u002Fdocs\u002Fintegrations\u002Fsmart-life",{"title":1527,"_path":1528},"Productos beTool (Desktop, Kiosk, Terminal)","\u002Fes\u002Fdocs\u002Fintegrations\u002Fproduits-betool",{"title":1530,"_path":1531,"children":1532},"Casos de uso","\u002Fes\u002Fdocs\u002Fcas-usage",[1533,1536,1539,1542,1545,1548],{"title":1534,"_path":1535},"Agentes de negocio tipo","\u002Fes\u002Fdocs\u002Fcas-usage\u002Fvue-densemble",{"title":1537,"_path":1538},"CFO IA","\u002Fes\u002Fdocs\u002Fcas-usage\u002Fcfo-ia",{"title":1540,"_path":1541},"COO IA","\u002Fes\u002Fdocs\u002Fcas-usage\u002Fcoo-ia",{"title":1543,"_path":1544},"CTO IA","\u002Fes\u002Fdocs\u002Fcas-usage\u002Fcto-ia",{"title":1546,"_path":1547},"Product Manager IA","\u002Fes\u002Fdocs\u002Fcas-usage\u002Fproduct-manager-ia",{"title":1549,"_path":1550},"Asistente personal","\u002Fes\u002Fdocs\u002Fcas-usage\u002Fassistant-personnel"]