Суб-пайплайны
С определённого момента копирование одной и той же последовательности узлов по десяти pipeline превращается в технический долг. Суб-пайплайны позволяют одному pipeline вызывать другой как функцию: определите фрагмент логики один раз, переиспользуйте его повсюду — в том числе между организациями.
Два симметричных строительных блока:
pipeline_callable(получатель, объявленный на узле Start) раскрывает pipeline за URL, с типизированным контрактом входа и выхода.pipeline_call(узел) вызывает этот pipeline: он отображает свои входы из текущего контекста и сохраняет результат в выходной ключ.
Раскрытие pipeline (pipeline_callable)
На «сервисном» pipeline вы добавляете получатель pipeline_callable, который объявляет:
- Входы — список ожидаемых параметров (имя, тип, обязательный или опциональный).
- Выходы — ключи возвращаемого результата.
- Ключ ответа — какое значение контекста составляет ответ.
- Бюджет времени — максимальное время выполнения (30 с по умолчанию, 300 с максимум).
Затем pipeline получает публичный URL (с токеном) для передачи вызывающему pipeline. Токен можно ротировать в любой момент, чтобы отозвать доступ.
Вызов pipeline (pipeline_call)
На «потребляющем» pipeline узел pipeline_call настраивается с помощью:
- URL целевого pipeline.
- Отображения входов — для каждого ожидаемого параметра — селектор контекста, который его поставляет.
- Выходного ключа, где сохраняется результат.
При сбое (тайм-аут, ошибка, некорректный ответ) pipeline продолжается: выходной ключ получает null, а ключ ._error описывает произошедшее. Оркестрация запасного варианта — ответственность вашего pipeline (запасная ветвь, оповещение).
Межорганизационные вызовы: opt-in и с аудитом
Суб-пайплайн может быть вызван другой организацией — это основа для совместного использования возможностей между сущностями. Модель остаётся строгой:
- Отклоняется по умолчанию. Межорганизационные вызовы возможны только если администратор раскрытого pipeline явно их разрешает (
allow_cross_org). - Рекомендуется подпись HMAC. Как только межорганизационный вызов открыт, активируется общий секрет: каждый запрос подписывается, а получатель отклоняет любую отсутствующую или недействительную подпись.
- Всё трассируется. Каждый вызов записывает аудиторскую запись (вызывающая организация, узел, глубина, задержка, статус) — до выполнения, чтобы трасса существовала даже в случае инцидента. Обе стороны могут просматривать собственные логи (сторона вызывающего и сторона вызываемого), в соответствии с правами доступа GDPR.
Биллинг: вызываемая организация платит за ресурсы (LLM, голос…), потреблённые во время выполнения. Логика гостя: вы используете ресурсы своего хоста.
Предотвращение циклов
Pipeline, который вызвал бы сам себя — напрямую или через цепочку — потреблял бы кредиты бесконечно. Две защиты:
- Статическое обнаружение при регистрации (внутри организации): редактор отказывается публиковать прямой цикл (
A → A) или косвенный цикл (A → B → C → A), указывая на нарушающую цепочку. - Защита во время выполнения (между организациями, где статическая видимость невозможна): каждый вызов передаёт свою глубину; за пределами настроенного потолка вызов обрывается.
Режимы выполнения
- Синхронный — узел ждёт полного ответа. Подходит для коротких операций.
- Потоковый — для долго выполняющегося суб-пайплайна (рассуждение LLM, пакетная обработка) прогресс передаётся в реальном времени без фиксированного тайм-аута. Вызывающий pipeline может отобразить этот прогресс в UI.
Когда его использовать
- Вынесите последовательность, переиспользуемую несколькими pipeline (суммировать тред, квалифицировать лид, проверить документ).
- Разделите возможность между организациями — одна сущность раскрывает «проверить счёт по ERP», другая её потребляет, с аудиторским следом с обеих сторон.
- Распараллельте веерный запуск независимых подзадач из цикла.