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