Code Steps (code_step)
Cierta lógica es demasiado específica para un operador compute, y sin embargo demasiado determinista como para justificar un agente LLM: reconciliaciones multi-fuente, cálculos de negocio a medida, normalizaciones exóticas. Para estos casos, el nodo code_step ejecuta código dentro de un sandbox, sin llamada a un LLM y con una salida predecible.
El código se edita directamente, como cualquier otro campo de configuración: ninguna clave de code_step está bloqueada y no se exige ninguna aprobación específica para el código. Un cambio se aplica en cuanto se publica el pipeline, en la siguiente ejecución.
El modelo de ejecución
code_step ejecuta Starlark — un dialecto de Python diseñado para el aislamiento: sin acceso al sistema de archivos, sin red, sin import, sin bucle while ni recursión, determinista, acotado por un presupuesto de tiempo. El código solo ve:
- Las entradas que le mapeas explícitamente (
input_paths). - Las herramientas que autorizas a llamar (
allowed_tools).
Todo lo demás está fuera de alcance. Un code step no puede acceder a un recurso que no le hayas entregado.
Configuración
| Campo | Propósito |
|---|---|
| Code | El código fuente Starlark que se ejecuta, editado directamente. |
Inputs (input_paths) | Mapeo variable → selector. Solo estas claves de contexto se exponen al código. Las claves internas (_*) se rechazan. |
Lista de herramientas permitidas (allowed_tools) | Las herramientas llamables vía tool(name, args), 50 llamadas como máximo por ejecución. Cada llamada hereda las propias salvaguardas de la herramienta (protección SSRF, facturación, auditoría, killswitch). |
Clave de salida (output_key) | Dónde colocar el resultado (serializable en JSON) en el contexto. Los nodos aguas abajo leen esta clave. Vacía = resultado no almacenado. |
Presupuesto de ejecución (timeout_ms) | Techo de tiempo: 5 000 ms por defecto, 30 000 ms como máximo. Un step que lo supera falla. |
Dónde está el límite de seguridad
El lenguaje no es la amenaza: Starlark está aislado por diseño — por sí solo no puede ni leer un archivo, ni alcanzar la red, ni entrar en un bucle infinito. El cálculo puro es inofensivo.
La única capacidad real es el puente tool(), y está acotado por la lista de permitidas aplicada en tiempo de ejecución: el código solo puede llamar a las herramientas que hayas enumerado (cualquier otra llamada se rechaza), y cada una lleva sus propias salvaguardas (protección SSRF, facturación, auditoría, killswitch). La lista de permitidas se edita con la misma libertad que el código: es en la elección de las herramientas donde delimitas lo que un step tiene permitido hacer.
Una lista de permitidas vacía = ninguna capacidad de efecto secundario: el step simplemente calcula sobre sus entradas y produce una salida.
Cuándo usarlo
- Sí: lógica determinista que puedes describir con precisión, pero que supera las operaciones
computeintegradas (reconciliar varias listas, reglas de negocio compuestas, formatos propietarios). - No: un simple filtro, agregación o proyección → un operador
computees suficiente. - No: una tarea que requiere juicio o escritura abierta → eso es un agente, no código.