# Автоматизация сценарием (/ru/docs/tutorials/automate-with-flows)

Сценарий связывает запросы и другие шаги на холсте, так что работа, которую вы делаете вручную, выполняется одним
щелчком, по расписанию или когда её вызывает другая система. В этом руководстве вы построите **Orders to ship**: он
входит в демо-магазин, получает заказы Хайди и отправляет уведомление, если какой-то заказ оплачен, но ещё не отправлен.

- **Время:** 20 минут.
- **Вам понадобится:** [рабочее пространство Alpenglow](/docs/tutorials#the-alpenglow-workspace) с выбранным
  **Без окружения**. Его сценарий **Morning stock check** — готовый пример такой же формы.
- **Вы узнаете:** про блоки и связи, блоки «Если» и «Уведомить», журнал запуска, расписания, вебхуки и
  `echolot flow run`.

## 1. Создайте сценарий [#1-make-a-flow]

1. Переключитесь на **Сценарии** (<kbd>⌘</kbd><kbd>5</kbd>).
2. Откройте меню **+** боковой панели (**Новый сценарий**) и выберите **Пустой сценарий**. Откроется сценарий
   **Новый сценарий** с блоком **Старт**, связанным с блоком **Результат**.
3. Щёлкните пустое место холста, чтобы ни один блок не был выбран. В инспекторе задайте **Имя** `Orders to ship` и
   **Описание** `Says when an order is paid but not shipped.`

Пока сценарий открыт, в боковой панели перечислены **Запросы** рабочего пространства, которые можно перетащить на холст.
Раздел **Из шаблона** в меню **+** вместо этого начинает с готового сценария, например **Постраничный экспорт**; см.
[шаблоны](/docs/flows/templates).

## 2. Добавьте запросы [#2-add-the-requests]

1. Наведите указатель на связь между **Старт** и **Результат** и нажмите её кнопку **Разорвать эту связь**.
2. Перетащите **Auth › Sign in** из боковой панели на холст. Он превратится в блок **Запрос** с названием **Sign in**,
   входом `send` и выходами `success` и `fail`.
3. Перетащите **Orders › List orders** на холст справа от него.
4. Свяжите их: протяните связь от порта `run` блока **Старт** к порту `send` блока **Sign in**, затем от порта
   `success` блока **Sign in** к порту `send` блока **List orders**.

**Sign in** сохраняет токен в `{{token}}` при каждом успехе, поэтому **List orders** отправляет новый. Выход `success`
блока «Запрос» несёт ответ: `status`, `headers`, `body`, `time` и `url`. `fail` срабатывает, когда запрос не получил
ответа или проверка не прошла.

## 3. Примите решение блоком «Если» [#3-decide-with-an-if-block]

1. Выберите **Блок** на панели инструментов (<kbd>⇧</kbd><kbd>⌘</kbd><kbd>B</kbd>), введите `If` в поле **Искать блоки или запросы** и нажмите <kbd>↩</kbd>.
2. В инспекторе задайте **Название** `Waiting to ship?` и **Условие**:

   ```js
   value.body.items.some(o => o.status === 'paid')
   ```

   Условие — это JavaScript. `value` — то, что пришло на вход: здесь это ответ **List orders**.
3. Свяжите `success` блока **List orders** со входом `value` блока «Если».

## 4. Уведомите себя [#4-notify-yourself]

1. Протяните связь от порта `true` блока «Если» и отпустите над пустым местом холста. Там откроется выбор блока. Выберите
   **Уведомить**: он сразу связан с `true`.
2. В настройках блока задайте **Название** `Orders to ship` и **Сообщение**:

   ```text
   {{value.body.total}} orders, at least one paid and waiting.
   ```

   `{{value…}}` подставляет части того, что пришло на вход; переменные рабочего пространства тоже работают.
3. Свяжите `success` блока **List orders** также со входом `value` блока **Результат**. Вебхук отвечает тем, что
   доходит до **Результат** (шаг 7).

Выберите **Упорядочить**, чтобы выстроить блоки в порядке выполнения, и **По размеру** (<kbd>⌥</kbd><kbd>⌘</kbd><kbd>0</kbd>),
чтобы увидеть их все.

<Shot id="tutorials-flows-canvas" alt="Сценарий на холсте после запуска: блок «Старт», блок «Запрос», блок «Если» и блок «Уведомить», связанный с его портом true, каждый с отметкой «Готово»" />

## 5. Запустите его [#5-run-it]

1. Нажмите **Запустить** (<kbd>⌘</kbd><kbd>R</kbd>).
2. Во время выполнения каждый блок показывает значок, затем **Готово**. Журнал запуска под холстом перечисляет все
   блоки с их временем.
3. Уведомление говорит **Orders to ship**: 3 orders, at least one paid and waiting. Заказ демо `ord_8Jm4Qx` оплачен.
   В первый раз macOS спросит, можно ли Echolot показывать уведомления.
4. Выберите **List orders**. **Последний запуск** в инспекторе показывает, что вошло и что вышло; переключайте **Показать**
   между **Входные данные** и **Результат**.

Измените условие на `o.status === 'cancelled'` и запустите снова: блок «Если» отправляет значение на `false`, который ни с
чем не связан, поэтому уведомления нет. Верните как было.

Когда запуск завершается ошибкой, блок с ошибкой показывает её. Там, где доступна встроенная модель Mac,
**Объяснить ошибку** в журнале запуска говорит, что пошло не так. Прошлые запуски остаются в меню **Запуски** на панели
инструментов. Подробнее — в разделе [запуск и триггеры](/docs/flows/running-and-triggers).

## 6. Запускайте по расписанию [#6-run-it-on-a-schedule]

1. Выберите блок **Старт**. В его инспекторе есть раздел **Триггеры**.
2. Включите **Расписание**. Задайте **Каждые (минуты)** `60` или введите строку cron в **Или строка cron (минута час день месяц день недели)**, например `0 7 * * 1-5` — семь часов утра по будням.
3. Нажмите **Разрешить**. Echolot просит вас разрешить сценарий, прежде чем что-либо запустит его без вас, и просит снова
   после его изменения (**Разрешить снова**). **Отозвать** это останавливает.

Инспектор показывает следующий запуск. Расписания работают, пока открыто окно рабочего пространства. Чтобы запускать их
без приложения, используйте `echolot flow serve -w Alpenglow.echolot` на Mac или сервере, который остаётся включённым.

## 7. Запускайте из вебхука [#7-start-it-from-a-webhook]

1. В **Триггеры** блока **Старт** включите **Вебхук**. Оставьте метод **POST** и задайте путь `/orders-to-ship`.
2. Нажмите **Разрешить**. Инспектор покажет адрес на `127.0.0.1` с кнопками **Скопировать URL** и **Скопировать токен**.
3. В Терминале вызовите его, передав токен как Bearer-токен:

   ```sh
   curl -X POST 'http://127.0.0.1:PORT/orders-to-ship' -H 'Authorization: Bearer TOKEN'
   ```

   Вставьте скопированные URL и токен. Сценарий запустится, а ответом будет то, что дошло до **Результат**: заказы.

Строка запроса и тело JSON заполняют входы сценария. Вебхук отвечает только на этом Mac и пока открыто окно;
`echolot flow serve` обслуживает вебхуки без приложения, по умолчанию на порту 4100. Ещё один пример — **Order status on webhook** в Alpenglow. Сценарий можно также предложить ИИ-агентам как инструмент (**Агенты (MCP-инструмент)**); см.
[агентов](/docs/ai/agents).

## 8. Запустите из Терминала [#8-run-it-from-terminal]

```sh
echolot flow list -w Alpenglow.echolot
echolot flow run "Orders to ship" -w Alpenglow.echolot
```

Он выводит каждый блок по мере завершения с его временем, затем текст уведомления и результат:

```text
✓ start  Start  0 ms
✓ …      Sign in  168 ms
✓ …      List orders  116 ms
✓ …      Waiting to ship?  4 ms
notification: Orders to ship — 3 orders, at least one paid and waiting.
✓ …      Notify  0 ms
Orders to ship: passed in 304 ms
```

В CI добавьте `--no-input`, чтобы сценарий, которому нужен человек, завершался ошибкой, а не ждал. Сценарий — это файл в
папке `flows` рабочего пространства, поэтому он попадает в Git вместе с запросами, которые использует. См.
[`echolot flow`](/docs/cli/flow).

## Дальше [#next-steps]

- [Блоки](/docs/flows/blocks): «Одобрить», «Спросить», «Для каждого», «Опрос», «Записать файл» и остальные.
- [Шаблоны](/docs/flows/templates): вход по коду устройства, обновление токена, постраничный экспорт, монитор доступности.
- [Безопасная работа агента с вашим рабочим пространством](/docs/tutorials/agents-safely): предложите сценарий агенту как
  один инструмент.
