Шаги с кодом (code_step)
Некоторая логика слишком специфична для оператора compute, но при этом слишком детерминирована, чтобы оправдывать LLM-агента: сверки из нескольких источников, специализированные бизнес-вычисления, экзотические нормализации. Для таких случаев узел code_step выполняет код внутри песочницы, без вызова LLM и с предсказуемым выводом.
Код редактируется напрямую, как любое другое поле конфигурации: ни один ключ code_step не заблокирован, и никакого специального одобрения для кода не требуется. Изменение вступает в силу с публикацией pipeline, при следующем выполнении.
Модель выполнения
code_step выполняет Starlark — диалект Python, спроектированный для изоляции: без доступа к файловой системе, без сети, без import, без цикла while и рекурсии, детерминированный, ограниченный бюджетом времени. Код видит только:
- Входы (
input_paths), которые вы явно на него отображаете. - Инструменты (
allowed_tools), которые вы разрешаете ему вызывать.
Всё остальное недосягаемо. Шаг с кодом не может получить доступ к ресурсу, который вы ему не передали.
Конфигурация
| Поле | Назначение |
|---|---|
| Code | Исходный код Starlark, который выполняется, редактируется напрямую. |
Inputs (input_paths) | Отображение variable → selector. Коду раскрываются только эти ключи контекста. Внутренние ключи (_*) отклоняются. |
Tool allowlist (allowed_tools) | Инструменты, вызываемые через tool(name, args), не более 50 вызовов за выполнение. Каждый вызов наследует собственные защитные механизмы инструмента (защита от SSRF, биллинг, аудит, killswitch). |
Output key (output_key) | Куда поместить результат (сериализуемый в JSON) в контексте. Нижестоящие узлы читают этот ключ. Пусто = результат не сохраняется. |
Execution budget (timeout_ms) | Потолок времени: 5 000 мс по умолчанию, максимум 30 000 мс. Шаг, который его превышает, завершается ошибкой. |
Где проходит граница безопасности
Язык не является угрозой: Starlark изолирован по своей природе — сам по себе он не может ни прочитать файл, ни выйти в сеть, ни зациклиться навечно. Чистое вычисление безвредно.
Единственная реальная возможность — это мост tool(), и он ограничен списком разрешённых инструментов, применяемым во время выполнения: код может вызывать только те инструменты, которые вы перечислили (любой другой вызов отклоняется), и каждый из них несёт собственные защитные механизмы (защита от SSRF, биллинг, аудит, killswitch). Список разрешённых инструментов редактируется так же свободно, как и код: именно выбором инструментов вы задаёте область того, что шагу разрешено делать.
Пустой список разрешённых инструментов = отсутствие возможности побочных эффектов: шаг просто вычисляет по своим входам и производит вывод.
Когда его использовать
- Да: детерминированная логика, которую вы можете описать точно, но которая выходит за пределы встроенных операций
compute(сверка нескольких списков, составные бизнес-правила, проприетарные форматы). - Нет: простой фильтр, агрегация или проекция → достаточно оператора
compute. - Нет: задача, требующая суждения или открытого письма → это agent, а не код.