Перейти к содержимому

Создать шаблон конвейера

Шаблоны конвейеров создаются в настройках рабочего пространства. Пункт Конвейеры в боковой панели рабочего пространства — это очередь запусков, а не список шаблонов: в нём нет действия «создать шаблон».

Что означает каждый вид шага, ключ тела и поле конфигурации, смотрите в справочнике по шагам конвейера.

  1. Перейдите в Настройки → Рабочее пространство → Шаблоны конвейеров (/workspaces/<workspace-id>/settings/pipelines).
  2. Нажмите Новый шаблон.

Диалога для идентификатора нет. Редактор сразу открывается на заготовке с именем Новый конвейер и автоматически выделенным идентификатором (pipeline_1, затем pipeline_2, …). Чтобы переименовать её, нажмите на её название в заголовке редактора.

Холст не пуст: на нём есть входной узел Trigger, один узел промпт-агента с меткой Step и терминальный сторожевой элемент, завершающий запуск. Сторожевой элемент не рисуется. Редактор переподключает этот скрытый терминал к каждому достижимому стоку, поэтому работа, прикреплённая после Step, всё равно выполняется.

Боковая панель Библиотека узлов постоянно находится слева от редактора. Отфильтруйте её в поле Поиск узлов и перетащите элемент на холст — узел встанет там, где вы его отпустите, без входящей связи.

Узел палитры Вид шага Что делает
Bash script listen Запускает shell-скрипт с подстановкой {{state}}; агент не запускается
Open conversation listen Открывает единственное видимое пространство запуска и его checkout; агентские узлы присоединяются к этой комнате
Clone PR branch listen Определяет head-ветку PR через gh pr view и клонирует её в каталог запуска
Post PR comment listen Публикует сводные результаты проверки в PR как комментарий ревью GitHub
Reviewer (prompt) listen Запускает специализированного агента-ревьюера; приостанавливается, пока агент не отправит результат
Consolidate (join) join Ждёт несколько вышестоящих ветвей, затем просит агента объединить их результаты
Custom prompt listen Обобщённый узел на основе промпта, работающий через тело promptAgent
Post to space listen Отправляет сообщение в пространство обмена сообщениями
Condition / switch (router) router Разветвляет поток по значению состояния
If file exists (router) router Направляет "true", если путь существует в клоне, иначе "false"
Any file exists (OR router) router Направляет "true", если существует любой из перечисленных путей
All conditions (AND router) router Направляет "true", только если существуют все перечисленные пути
Team dispatch listen Запускает целую команду и приостанавливается до её завершения
Approval gate listen Приостанавливается в ожидании решения об одобрении
For each (map) forEach Формирует промпт для каждого элемента, затем один раз запускает агента с объединёнными промптами
Call sub-pipeline listen Выполняет другой шаблон как вложенный шаг
Clean up worktrees listen Удаляет устаревшие изолированные рабочие деревья; детерминированно, агент не запускается

Библиотека группирует их в разделы Поток и логика, Ревью PR, Агенты, Сообщения и Код. Группы Demo нет.

У каждого рабочего узла на правом краю есть круглый порт выхода. Перетащите из этого порта на другой узел, чтобы соединить их. Стартовые триггеры устроены так же: у каждого свой порт, поэтому провод от Расписание не выходит также и из Ручной запуск. Нажмите Добавить шаг (+) сразу после узла, чтобы вставить после него тип. Наведите курсор на середину существующего ребра и нажмите ×, чтобы разорвать связь.

Связи можно редактировать и со стороны узла, который их принимает:

  1. Выберите нижестоящий узел. Справа откроется панель его настроек.
  2. Прокрутите до Triggers from и нажмите чип каждого вышестоящего узла, к которому этот узел должен прислушиваться. Нажатие на выбранный чип удаляет связь.
  3. Если вышестоящий узел — маршрутизатор, под чипами появляется блок Ключи маршрута с полем Ключ маршрута от <node> на каждое ребро маршрутизатора. Введите ключ, по которому срабатывает это ребро, — true или false для маршрутизаторов «файл существует», либо имя варианта для переключателя.

Каждый узел-триггер — точка входа. Узел может слушать несколько вышестоящих узлов (fan-in) и питать несколько нижестоящих (fan-out), но граф должен оставаться ациклическим: ничто в редакторе не мешает вам замкнуть цикл, поэтому проверяйте работу сами.

Терминальный сторожевой элемент отфильтрован с холста, поэтому его нельзя выбрать. При каждом изменении графа редактор переподключает его к каждому достижимому стоку, поэтому работа, прикреплённая после предзаполненного Step, всё равно выполняется. Пустой граф (триггер без рабочих наследников) указывает сам триггер, чтобы запуск сразу завершался.

Выберите узел, чтобы открыть панель его настроек. Набор полей зависит от тела узла.

У каждого узла есть Метка, Входные ключи (ключи состояния через запятую, читаемые во время выполнения), а под Дополнительно — Редьюсер, Таймаут (мс), Число повторов, Продолжить при ошибке шага и Схема выхода (JSON). Узлы видов listen и join могут также переключать Тип между этими двумя.

Добавляет выбор Репозитории для клонирования (какие репозитории рабочего пространства извлекать; пусто означает ни одного), поле Название пространства и флажок Открыть в нём разговор. Когда флажок включён, поле Название разговора задаёт поток, с которого открывается комната. Агентские узлы присоединяются к этой комнате и не открывают собственную.

Добавляет Агент (какого агента запускать), Шаблон промпта (используйте {{key}}, чтобы сослаться на входные данные или результаты вышестоящих шагов) и Ключ выхода.

Таймаут (мс) задаётся в миллисекундах, а не в секундах: 900000 — это 15 минут. Значение 900 даёт шагу 0,9 секунды.

Режим разговора, в котором работает узел промпт-агента, не имеет поля в редакторе на агентском узле. Он передаётся в extras['mode'] (chat, plan или review) на узле Open conversation, создавшем комнату (по умолчанию review). Если задать его на агентском шаге, он игнорируется. Ключ сопоставляется точно: любое другое написание молча игнорируется.

Добавляет Скрипт bash. Полей рабочего каталога и переменных окружения нет, потому что ни то, ни другое не настраивается:

  • Все шаги bash одного запуска используют общий рабочий каталог <cc_root>/pipelines/<runId>/.
  • GITHUB_TOKEN подставляется из хранилища учётных данных, поэтому gh и git clone https://x-access-token:$GITHUB_TOKEN@… работают без настройки.
  • Скрипт запускается как буквально указанный исполняемый файл bash, поэтому bash должен быть в PATH на хосте сервера. Это важно учитывать в Windows.

Маршрутизатор вычисляет условие и возвращает ключ маршрута; движок активирует только то исходящее ребро, чей ключ маршрута совпал, а остальные ветви помечает пропущенными.

При выборе маршрутизатора поле Ключ выхода заменяется редактором условий. Выберите один из четырёх режимов:

  • Файл(ы) существуют — любой — направляет "true", когда существует любой из перечисленных путей.
  • Файлы существуют — все — направляет "true", только когда существуют все перечисленные пути.
  • Сравнение — сравнивает значение состояния с литералом.
  • Переключить — направляет по значению ключа состояния, с вариантом по умолчанию.

Затем задайте соответствующие ключи маршрута на исходящих рёбрах (см. Соединить узлы).

Логические группы and / or / not поддерживаются телом, но их нельзя собрать из этой формы — нужно написанное вручную дерево предикатов в extras.predicate. Полный словарь предикатов и операторов приведён в справочнике по шагам конвейера.

Собственной конфигурации нет: он ждёт все свои вышестоящие шаги.

Шлюз запускает агента-утверждающего в скрытый разговор с промптом шлюза и приостанавливается. Утверждающий выясняет ваше решение в разговоре и отправляет его через submit_output в виде { "decision": "approved" | "rejected", "reason": "..." }. Решение попадает под ключ выхода (по умолчанию approval_decision), поэтому нижестоящий маршрутизатор-переключатель может по нему ветвиться.

Укажите в Агент утверждающего, а в Шаблон промпта — вопрос шлюза. Шлюз разрешается через submit_output в виде { "decision": "approved" | "rejected", "reason": "..." }. Узлы Reviewer (prompt) отправляют результат так же.

Добавляет ID команды и Режим диспетчеризации. В списке ровно два режима:

  • allParallel — по одной задаче на участника, приостанавливается до завершения всех.
  • manager — запускает лидера, который делегирует.

Любое другое сохранённое значение ведёт себя как allParallel. Установите Редьюсер в append, чтобы собрать результат каждого участника в список под ключом выхода.

For each по умолчанию проходит по ключу состояния items (extras.iterableKey / extras.itemKey на узле). Он формирует свой промпт отдельно для каждого элемента ({{item}} по умолчанию) и запускает агента один раз с объединёнными промптами. Пустая коллекция завершается сразу с пустым списком. Это не отдельный параллельный запуск на каждый элемент.

Call sub-pipeline приостанавливается, пока дочерний запуск не достигнет терминального состояния, а затем объединяет конечное состояние дочернего запуска под ключом выхода (по умолчанию subflow_result). Укажите дочерний шаблон через extras.templateId. Шаблон не может вызывать сам себя; неудачный или отменённый дочерний запуск проваливает родительский шаг, и тогда вступают в силу политика повторов и продолжения при ошибке этого шага.

Объявить входные данные и разрешить ручные запуски

Заголовок раздела «Объявить входные данные и разрешить ручные запуски»

И то, и другое находится за пунктом Ручной запуск в заголовке редактора.

  1. Нажмите Ручной запуск.
  2. Включите Разрешить ручной запуск. Этот переключатель сохраняется сразу — он создаёт (или удаляет) строку триггера manual, благодаря которой шаблон появляется в окне запуска.
  3. Задайте Макс. параллельных запусков, если нужен предел (пусто — без ограничений). Лишние запуски ждут в состоянии queued, пока не освободится слот.
  4. Нажмите Добавить поле для каждого поля формы, которое должен собирать ручной запуск:
Поле Описание
Ключ Ключ состояния, под которым хранится значение; ссылайтесь на него как {{key}}
Подпись Отображаемая подпись (по умолчанию — ключ)
Тип Текст, Многострочный текст, Число, Переключатель, Список, Репозиторий
Варианты (через запятую) Варианты через запятую, только для типа «Список»
Значение по умолчанию Предзаполненное значение
Заполнитель Подсказка внутри пустого поля
Текст справки Вспомогательный текст под полем
Обязательное Блокирует ли форма запуска отправку при пустом значении

Поле Репозиторий показывает выбор репозиториев рабочего пространства и записывает в полезную нагрузку запуска repo_id, repo_local_path, repo_full_name, а если у репозитория есть GitHub-remote, то ещё и repo_owner и repo_name.

  1. Нажмите Сохранить в диалоге. Изменения полей входят в черновик и сохраняются, когда вы сохраняете шаблон.
  1. Нажмите Сохранить в заголовке редактора. До этого в заголовке отображается «Несохранённые изменения».
  2. Вернитесь в Настройки → Рабочее пространство → Шаблоны конвейеров и убедитесь, что переключатель в строке шаблона включён. Движок отказывается запускать отключённый шаблон, и отключённый шаблон никогда не появляется в окне запуска.
  3. Чтобы он запускался автоматически, перетащите триггер из библиотеки узлов на холст — см. Настроить триггеры конвейера.