Архитектура
Платформа и приложение
Ядро выполняет workflow, проверяет определения и связывает входы с выходами. Конструкции задают порядок выполнения. Блоки выполняют операции; плагины добавляют блоку драйвер, обработчик или формат.
Серверная поставка предоставляет UI, API и устойчивое хранилище состояния. Встраивание в Python и отдельный сервер используют одни определения и правила выполнения.
Где живут сценарии
Workflow, промпты, адреса сервисов и правила приложения находятся в его репозитории. База запусков, файлы и секреты принадлежат инсталляции и хранятся вне Git. Движок не импортирует код приложения.
Прикладная логика собирается в workflow. Повторяемую интеграцию можно вызывать как вложенный сценарий. CLI запускает установленные инструменты; оркестрация остаётся видимой в определении процесса.
Входы и выходы
Workflow объявляет JSON Schema входов и результата. Каждый блок и вложенный workflow имеет явный контракт. Внешнему вызывающему доступны только объявленные outputs.
Поля YAML
| Поле | Назначение |
|---|---|
schema_version | Версия формата определения |
name, description, version | Название, описание и авторская версия |
input_schema, output_schema | JSON Schema входов и результата |
inputs | Входные значения по умолчанию |
steps | Шаги выполнения |
outputs | Результат для вызывающего |
secrets | Объявления необходимых секретов |
timeout_seconds | Лимит активного выполнения |
triggers, on_finish | Условия запуска и последующее действие |
Блок, шаг и конструкция
block выбирает тип блока, id именует конкретный шаг. Один блок может использоваться в процессе несколько раз с разными параметрами. params.operation выбирает операцию, если у блока их несколько.
steps, loop, concurrency, call, approval — конструкции управления. Они также отображаются узлами графа, но не требуют поля block.
Параметры шага
- id: request
block: http
params:
url: "{inputs.source_url}"Параметры проверяются по схеме выбранной операции. Неизвестные поля отклоняются. Справочники операций находятся у соответствующих блоков в магазине.
Ссылки
{inputs.text} — вход workflow; {request.json} — результат шага; {secret.KEY} — объявленный секрет. Целая ссылка сохраняет тип значения. Отсутствующее поле считается ошибкой; null и пустая строка различаются.
Буквальные фигурные скобки экранируются удвоением. Данные подставляются один раз и не превращаются в код. Служебные пространства inputs, secret, state, loop нельзя подменять именами шагов. Внутренние имена групп имеют собственную область видимости.
Файлы
FileRef — ссылка на сохранённый файл: ID, имя, MIME-тип и размер. Между шагами передаётся ссылка, а не копия байтов. Доступ проверяется для текущего аккаунта.
Условия
when определяет, выполнять ли шаг. Условие проверяется до его параметров. Ложное условие пропускает шаг без создания результата.
| Поле | Назначение |
|---|---|
value | Проверяемое значение |
op | Оператор |
expected | Ожидаемое значение |
Операторы: equals, not_equals, in, gte, lte, min_length, max_length, matches, contains. Все три поля обязательны; типы автоматически не приводятся. В approval.when условие относится к необходимости согласования результата вызова.
Состояние выполнения · state
state содержит статусы шагов и решения по согласованию. Полезный результат шага и состояние его исполнения доступны отдельно:
| Ссылка | Значение |
|---|---|
{request.json} | Результат операции |
{state.request.status} | Статус шага |
{state.draft.approval.status} | Решение по согласованию |
{loop.state} | Данные, передаваемые между итерациями |
Пропущенный шаг не создаёт результата. Следующий шаг должен учитывать это в условии, прежде чем обращаться к его выходам.
Ошибки и ожидания
Ошибка останавливает текущий путь, если операция явно не возвращает её как данные. При on_error: collect ошибка пути возвращается как code, message, step_path. После ожидания используются сохранённые результаты; завершённые действия не повторяются.
Запуск сохраняет свои определения и зависимости. Изменение YAML влияет на новые запуски. on_finish создаёт отдельный последующий запуск с явными входами.
Поставка плагинов
Ядро, блоки и плагины выбираются независимо. Базовый блок означает часть основного инвентаря, а не обязательную зависимость ядра. Руководство по магазину объясняет выбор состава и совместимость.