Echolot
Сценарии

Блоки

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

Каждый блок делает одно дело. Его настройки — в инспекторе, когда вы выбираете блок; его порты — на холсте, входы слева и выходы справа. На этой странице перечислены все виды блоков в тех группах, которые использует список блоков, а затем объясняются значения, которые передаются между блоками, шаблоны вроде {{body.id}} и условия.

Как идёт запуск

  • Блок выполняется, когда у каждого входа, в который ведёт связь, есть значение. Затем он отправляет значения из некоторых своих выходов, и дальше выполняются только блоки, связанные с этими выходами.
  • Первым выполняется «Старт». Блоки «Значение» и «Получить переменную», в которые ничто не ведёт, тоже выполняются в самом начале.
  • Блоки выполняются параллельно, когда это возможно. Блок «Показать и ждать» может ждать вас, пока блок «Опрос» продолжает работу.
  • Несколько блоков могут завершиться ошибкой: у «Запрос», «Опрос», «Инструмент», «Сценарий», «Вычислить» и «Записать файл» есть выход fail. Если он связан, ошибка выходит через него, и запуск продолжается. Если нет, весь запуск завершается ошибкой на этом блоке.
  • Запуск заканчивается, когда ничего не остаётся в работе.

В инспекторе каждого блока есть также Название (показывается на блоке; если пусто, это название вида) и Приостановлен (значения проходят насквозь). Приостановленный блок затемнён и пропускается: то, что приходит в него, сразу выходит из его первого выхода.

Триггеры

Старт

Здесь начинается запуск: кнопка Запустить, агент (когда сценарий — инструмент), расписание, вебхук или echolot flow run. В его инспекторе находятся Триггеры сценария; см. Запуск и триггеры.

ПортСторонаЧто передаёт
runвыходВсе входы сценария одним объектом.
по одному на каждый входвыходЗначение этого входа.

В сценарии ровно один блок «Старт». В списке блоков его нет.

Результат

То, что возвращает запуск: агенту, вызвавшему сценарий, командной строке, вызывающему вебхук или родительскому сценарию. В сценарии не больше одного такого блока.

ПортСторонаЧто передаёт
valueвходРезультат.

Действия

Запрос

Отправляет сохранённый запрос рабочего пространства (HTTP, GraphQL или запрос MCP) с его авторизацией, скриптами, проверками и окружением запуска.

НастройкаЧто делает
ЗапросСохранённый запрос, выбирается из списка (обязательно).
ПеременныеИмена через запятую. Каждое становится входом, который заполняет эту {{variable}} запроса.
ПортСторонаЧто передаёт
sendвходОтправляет запрос. Если приходит объект, каждый его ключ становится переменной этой отправки.
по одному на каждое имя в ПеременныевходЗначение этой переменной.
successвыходОтвет, если запрос выполнен успешно.
failвыходОтвет, если он не 2xx или не прошла проверка, либо ошибка, если ответа нет.

Запрос успешен, если ответ 2xx, а его проверки, тесты скриптов и скрипты пройдены, как в Прогоне. Переменные, которые передаёт сценарий, побеждают переменные окружения только для этой отправки.

В сценарии Place a test order выход success блока Sign in связан с send блока Create order: заказ создаётся только после того, как вход удался, а токен, который захватывает Sign in, уже лежит в {{token}}.

Инструмент

Выполняет один из собственных инструментов Echolot, например запускает мок, прогоняет папку, проверяет спецификацию линтером или вызывает инструмент MCP-сервера, по тем же правилам, что и для агентов.

НастройкаЧто делает
ИнструментИнструмент, выбирается из списка (обязательно).
АргументыАргументы инструмента в JSON, например { "name": "{{value}}" }. В текстовых значениях можно использовать шаблоны.
ПортСторонаЧто передаёт
runвходЗапускает инструмент. Если приходит объект, его ключи добавляются к аргументам.
resultвыходТо, что вернул инструмент.
failвыходПочему он не удался.

Блок «Инструмент» не может запустить другой сценарий; для этого есть блок «Сценарий».

Только в версии для прямой загрузки

Блок «Инструмент», вызывающий MCP-сервер, который работает как локальная программа (stdio), работает в загрузке с сайта. В редакции для App Store Echolot не может запустить эту программу: блок показывает предупреждение и завершается ошибкой при выполнении.

Сравнить версии

Сценарий

Запускает другой сценарий рабочего пространства и отправляет то, что получил его блок «Результат».

НастройкаЧто делает
СценарийДругой сценарий (обязательно). Сценарий не может запустить сам себя, и сценарии не могут запускать друг друга по кругу.
ПортСторонаЧто передаёт
inputвходОбъект со входами другого сценария.
outputвыходТо, что вернул другой сценарий.
failвыходПочему другой сценарий не удался.

Сценарии запускают друг друга на глубину не более 8. Секреты не передаются между сценариями как значения: сохраняйте их как переменные.

Люди

Блоки группы «Люди» приостанавливают запуск и о чём-то спрашивают вас. В приложении открывается лист; если запуск начал агент, вопрос уходит клиенту агента; в командной строке вопрос задаётся в терминале. У запусков, которые начинают расписания и вебхуки, спросить некого, поэтому блок группы «Люди» там завершается ошибкой, как и при echolot flow run --no-input.

Спросить

Запрашивает значения небольшой формой.

НастройкаЧто делает
СообщениеЧто спросить. Шаблоны разрешены.
ПоляПоля формы (обязательно). У каждого есть name (его порт и ключ), label, показываемая рядом с ним, type (text, number, bool, secret или choice), choices для выбора, через запятую, и default.
ПортСторонаЧто передаёт
runвходСпрашивает. Объект заполняет шаблоны сообщения.
answersвыходВсе ответы одним объектом.
по одному на каждое полевыходОтвет на это поле.
cancelledвыходtrue, если человек нажал Отменить.

В листе есть Отменить и Продолжить. Ответы на поля secret скрыты в журнале запуска.

Показать и ждать

Показывает сообщение, код для копирования и ссылку для открытия, затем ждёт Продолжить или пока значение не придёт на until. Используйте для входа по коду устройства: показывайте код, пока блок «Опрос» ждёт одобрения.

НастройкаЧто делает
НазваниеЗаголовок листа.
СообщениеЧто показать (обязательно).
КодПоказывается крупно, с кнопкой Скопировать код (код устройства).
СсылкаПоказывается с кнопкой Открыть в браузере.
QRПоказывать ссылку и как QR-код. По умолчанию выключено.

Во всех пяти можно использовать шаблоны.

ПортСторонаЧто передаёт
runвходПоказывает лист. Объект заполняет шаблоны.
untilвходПродолжает само, когда приходит значение, например success блока «Опрос».
doneвыходТо, что пришло в run.

Если until связан, в листе написано Продолжится само, когда это будет сделано. Прекратить ожидание закрывает его и завершает блок ошибкой.

Одобрить

Просит вас одобрить, прежде чем сценарий пойдёт дальше, перед тем, что нельзя отменить.

НастройкаЧто делает
СообщениеВопрос (обязательно). Шаблоны разрешены.
ПортСторонаЧто передаёт
runвходСпрашивает. Объект заполняет шаблоны сообщения.
approvedвыходТо, что пришло в run, после Одобрить.
declinedвыходТо, что пришло в run, после Отклонить.

Одобрение всегда остаётся за человеком. Когда агент запускает сценарий и отвечает на блок «Одобрить», Echolot сначала задаёт вопрос вам. В Place a test order блок «Одобрить» Keep the order? спрашивает Keep order {{body.id}} for CHF {{body.total.amount}}? о заказе, который магазин только что создал; Отклонить отправляет его в Cancel order.

Лист одобрения в Place a test order: Keep the order? с ID заказа и его суммой в швейцарских франках, кнопки «Отклонить» и «Одобрить»

Логика

Если

Отправляет то, что пришло, в true или false по условию.

НастройкаЧто делает
УсловиеВыражение JavaScript (обязательно), например value.status == 200.
ПортСторонаЧто передаёт
valueвходПроверяемое значение.
true, falseвыходТо же значение, из одного из двух.

Morning stock check использует блок «Если» Running low? с value.body.items.some(p => p.stock.bern < 5) для товаров, которые вернул магазин.

Ветвление

Отправляет то, что пришло, в первый вариант, условие которого выполняется, иначе в default.

НастройкаЧто делает
ВариантыСписок (обязательно). У каждого варианта есть name (его выходной порт) и condition.
ПортСторонаЧто передаёт
valueвходПроверяемое значение.
по одному на каждый вариантвыходЗначение, если этот вариант — первый из выполняющихся.
defaultвыходЗначение, если не выполняется ни один вариант.

Вычислить

Выполняет JavaScript над тем, что пришло. Результат — последнее выражение: ({ id: value.body.id }) или a + b. Код с собственным return выполняется как тело функции, и результат — то, что вернул return. Promise ожидается. pm.test и pm.expect работают как в скриптах, а их результаты учитываются как тесты запуска. Строки console.log попадают в журнал запуска.

НастройкаЧто делает
КодJavaScript (обязательно).
ВходыИмена входов через запятую; каждое — переменная в коде. Если пусто, то value.
ПортСторонаЧто передаёт
по одному на каждое имя в ВходывходЗначение этой переменной.
resultвыходРезультат.
failвыходОшибка, если код выбросил исключение.
// Inputs: pages. Joins the lists that Collect gathered.
return pages.flat();

Задержка

Ждёт, затем передаёт значение дальше.

НастройкаЧто делает
МиллисекундыСколько ждать (обязательно). Число или шаблон вроде {{wait}}.

Порты: value на входе, value на выходе.

Циклы

Повторить

Отправляет index столько раз, сколько указано в Количество, считая с 0, затем done.

НастройкаЧто делает
КоличествоСколько раз (обязательно): от 0 до 100 000. Число или шаблон вроде {{pages}}.
ПортСторонаЧто передаёт
runвходЗапускает цикл.
indexвыход0, 1, 2… по разу за круг.
doneвыходТо, что пришло в run, после последнего круга.

Для каждого

По очереди отправляет каждый элемент списка, затем done. Настроек нет.

ПортСторонаЧто передаёт
listвходСписок. Всё остальное завершает блок ошибкой.
itemвыходПо одному элементу за круг.
indexвыходПозиция элемента, с 0.
doneвыходВесь список после последнего круга.

Собрать

Собирает в один список то, что приходит во время цикла, и отправляет его, когда цикл закончится. Настроек нет.

ПортСторонаЧто передаёт
itemвходПо одному значению за круг.
listвыходВсё собранное, когда цикл, к которому он относится, закончился.

Каждый круг цикла заканчивается до начала следующего, а блоки, до которых он доходит, выполняются заново в каждом круге. Значения извне цикла, например вход из «Старта», доступны каждому кругу.

Опрос

Отправляет сохранённый запрос снова и снова, пока не выполнится условие (вход одобрен, задача завершена) или не истечёт срок.

НастройкаЧто делает
ЗапросСохранённый запрос (обязательно).
ПеременныеИмена через запятую; каждое становится входом, который заполняет эту {{variable}}.
Пока неУсловие для response, последнего ответа. По умолчанию: response.status >= 200 && response.status < 300.
ИнтервалСекунд между отправками. По умолчанию 5. Число или шаблон.
СрокЧерез сколько секунд сдаться. По умолчанию 300. Число или шаблон.
ПортСторонаЧто передаёт
sendвходНачинает опрос. Если приходит объект, его ключи становятся переменными.
по одному на каждое имя в ПеременныевходЗначение этой переменной.
successвыходОтвет, удовлетворивший условию.
timeoutвыходПоследний ответ, если срок истёк. Если timeout не связан, блок вместо этого завершается ошибкой.
failвыходОшибка, если отправка не удалась.

В отличие от «Запроса», ответ не 2xx не считается ошибкой «Опроса»: он отправляет снова, пока не выполнится Пока не.

Данные

Значение

Постоянное значение: текст, число, true или false, список или объект.

НастройкаЧто делает
ЗначениеТекст, число или JSON (обязательно).
ПортСторонаЧто передаёт
runвходОтправляет значение заново каждый раз, когда что-то приходит.
valueвыходЗначение. Если в run ничто не ведёт, оно отправляется один раз в начале.

Шаблон

Текст, в котором {{name}} заполняется из пришедшего объекта и переменных запуска.

НастройкаЧто делает
ТекстТекст с шаблонами (обязательно).

Порты: values на входе (объект), text на выходе.

Выбрать

Достаёт значения из пришедшего по пути, по одному выходу на каждое.

НастройкаЧто делает
ПоляСписок (обязательно). У каждого поля есть name (его выходной порт) и path, например $.body.user_code.
ПортСторонаЧто передаёт
valueвходЗначение, из которого берут, часто ответ.
по одному на каждое полевыходЗначение по этому пути или null, если там ничего нет.
allвыходВсе поля одним объектом.

Пути — это общая часть JSONPath:

ПутьЧто достаёт
$.body.items[0].skuКлюч, затем первый элемент списка.
$.body.items[-1]Последний элемент.
$.body.items[*].skusku каждого элемента, списком.
$['content-type']Ключ с символами, которые не может принять точка.
body.idБез $ путь начинается от самого значения.

Задать переменную

Сохраняет значения как переменные, чтобы последующие блоки и запросы читали их как {{name}}.

НастройкаЧто делает
ПеременныеСписок (обязательно). У каждой есть name, path в пришедшее (всё, если пусто), scope и secret.
ОбластьКуда попадает значение
runТолько в этот запуск и в запросы, которые он отправляет.
environmentВ активное окружение (по умолчанию). Если окружение не выбрано, запуск здесь завершается ошибкой.
workspaceВ собственные переменные рабочего пространства.
globalИз сценариев запись невозможна: запуск завершается ошибкой и просит сохранить в окружение или рабочее пространство.

Если включён secret, значение попадает в связку ключей и никогда в файл, а в журнале запуска и в том, что видят агенты, оно скрыто с момента выхода из предыдущего блока. Если path ничего не находит, переменная сохраняет прежнее значение, поэтому ответ с токеном без нового токена обновления не стирает имеющийся. См. секреты.

Порты: value на входе, value на выходе (то, что пришло, передаётся дальше).

Получить переменную

Читает переменную так, как её видят запросы: сначала собственные переменные запуска, затем окружения, рабочего пространства и глобальные.

НастройкаЧто делает
ИмяПеременная (обязательно).
ПортСторонаЧто передаёт
runвходЧитает её заново каждый раз, когда что-то приходит.
valueвыходЕё значение или null, если его нет. Если в run ничто не ведёт, она читается один раз в начале.

Результат

Показать

Передаёт пришедшее дальше без изменений, чтобы вы могли на него посмотреть: выберите блок после запуска и прочитайте Последний запуск в инспекторе.

НастройкаЧто делает
Форматauto, text, json, table или image. По умолчанию auto.

Порты: value на входе, value на выходе.

Журнал

Пишет строку в журнал запуска.

НастройкаЧто делает
СообщениеСтрока, с шаблонами. {{value}} — то, что пришло; если сообщение пусто, то всё пришедшее.

Порты: value на входе, value на выходе. В Place a test order блок Order failed записывает Create order answered {{status}}, когда заказ создать не удаётся.

Проверить

Проверяет пришедшее. Каждая проверка — результат теста запуска, а непройденная проверка заставляет echolot flow run завершиться с ошибкой.

НастройкаЧто делает
ПроверкиСписок (обязательно). У каждой проверки есть name и condition для value.
ПортСторонаЧто передаёт
valueвходПроверяемое значение.
passedвыходЗначение, если выполняются все проверки.
failedвыходЗначение, если какая-то проверка не выполняется.
value.status === 200   // Answers 200
value.time < 2000      // Within two seconds

Уведомить

Показывает уведомление macOS от Echolot. При первом разе macOS запрашивает разрешение. В командной строке уведомление вместо этого печатается.

НастройкаЧто делает
НазваниеЗаголовок уведомления (обязательно). Шаблоны разрешены.
СообщениеЕго текст. Шаблоны разрешены.

Порты: value на входе, value на выходе. Morning stock check заканчивается блоком «Уведомить» Restock с заголовком Restock Bern.

Записать файл

Записывает пришедшее в файл внутри папки рабочего пространства.

НастройкаЧто делает
ПутьОтносительно папки рабочего пространства, например exports/items.json (обязательно). Шаблоны разрешены.
Форматjson (форматированный), text или csv. По умолчанию json.
ПортСторонаЧто передаёт
valueвходЧто записать.
pathвыходПуть к файлу относительно рабочего пространства.
failвыходПочему записать не удалось.

Уже существующий файл заменяется. Собственные файлы рабочего пространства трогать нельзя: папки requests, flows, environments, mocks, mcp-servers и specs, workspace.toml и скрытые файлы. Для CSV список объектов становится строкой на каждый объект со столбцом на каждый ключ; всё остальное записывается по одному значению в строке.

Значения между блоками

Значения — это JSON: текст, числа, true и false, списки, объекты или null.

Объект ответа

«Запрос» и «Опрос» отправляют ответ как объект:

{
  "status": 201,
  "reason": "Created",
  "headers": { "content-type": "application/json", "location": "/v1/orders/ord_9Px3Kd" },
  "body": { "id": "ord_9Px3Kd", "total": { "amount": 449, "currency": "CHF" } },
  "time": 182.4,
  "url": "https://demo.echolot.dev/v1/orders"
}
  • body — разобранный JSON, если ответ в формате JSON, иначе текст, а если ответ пуст, то null.
  • Имена заголовков в нижнем регистре. Заголовок, отправленный несколько раз, объединяется через , .
  • time — весь обмен в миллисекундах.
  • Тело больше 8 МБ приходит как null с "truncated": true. Полный ответ по-прежнему лежит в истории.

Шаблоны

Настройки с пометкой «шаблоны разрешены» заполняют {{name}} из того, что пришло в блок:

  • {{status}}, {{body.id}} или {{body.items[0].sku}}: ключ или путь в пришедшем объекте.
  • {{value}} в «Журнале», «Уведомить» и «Записать файл»: всё пришедшее значение.
  • Переменные, которые сохранил блок «Задать переменную» с областью run.

Имя, которое ни с чем не совпадает, остаётся как есть, так что собственные {{variables}} блока «Запрос» по-прежнему разрешаются из окружения при отправке. Объекты и списки записываются как текст JSON.

Условия

«Если», «Ветвление», «Опрос» и «Проверить» принимают выражение JavaScript, истинное или ложное. value — это то, что пришло; Пока не в «Опросе» читает его как response, что работает и везде.

value.status == 200
response.status === 200 && !!(response.body && response.body.access_token)
value.body.items.length > 0

Выражение, которое выбрасывает исключение, завершает блок ошибкой (в «Проверить» оно проваливает эту проверку).

Ограничения

Чтобы неверная связь не могла работать бесконечно, запуск останавливается после 10 000 выполнений блоков или через час. Запуски, которые начинают вебхуки, останавливаются через две минуты.

На этой странице