Echolot
フロー

ブロック

フローに置けるすべての種類のブロックを、設定とポートとともに説明します。ブロック間で受け渡される値、テンプレート、条件の仕組みも扱います。

各ブロックは1つのことを行います。設定はブロックを選択したときにインスペクタに表示され、ポートはキャンバス上にあります(入力は左、出力は右)。このページでは、ブロックピッカーと同じグループ分けで、すべての種類を順に説明します。そのあとで、ブロック間を流れる値、{{body.id}}のようなテンプレート、条件を説明します。

実行の流れ

  • ブロックは、接続が入っているすべての入力に値が届くと実行されます。実行後は、いくつかの出力から値を送り出し、それらの出力に接続されたブロックだけが次に実行されます。
  • 最初に実行されるのは開始ブロックです。何も接続されていない値ブロックと変数を取得ブロックも、開始時に実行されます。
  • ブロックは、可能なら並行して実行されます。表示して待機ブロックがあなたの操作を待っている間も、ポーリングブロックは動き続けられます。
  • 失敗する可能性があるブロックがいくつかあります。リクエスト、ポーリング、ツール、フロー、評価、ファイルに書き込むにはfail出力があります。これが接続されていると、失敗はそこから出て、実行は続きます。接続されていないと、実行全体がそのブロックで失敗します。
  • 実行中のものが何もなくなると、実行は終了します。

どのブロックのインスペクタにもタイトル(ブロックに表示されます。空のときは種類の名前)と一時停止中(値はそのまま通過します)があります。一時停止したブロックは薄く表示されてスキップされ、入ってきた値は最初の出力からそのまま出ていきます。

トリガー

開始

実行が始まる場所です。実行ボタン、エージェント(フローがツールのとき)、スケジュール、Webhook、echolot flow runのいずれかから始まります。インスペクタには、フローのトリガーがあります。実行とトリガーを参照してください。

ポート向き運ぶ値
run出力フローのすべての入力を1つのオブジェクトにしたもの。
入力ごとに1つ出力その入力の値。

フローにある開始ブロックはちょうど1つです。ブロックピッカーには表示されません。

出力

実行が返す内容です。返す先は、フローを呼び出したエージェント、コマンドライン、Webhookの呼び出し元、または親フローです。1つのフローに最大1つです。

ポート向き運ぶ値
value入力結果。

アクション

リクエスト

ワークスペースの保存済みリクエスト(HTTP、GraphQL、MCPリクエスト)を、その認証、スクリプト、チェック、実行の環境とともに送信します。

設定内容
リクエスト保存済みリクエストを一覧から選びます(必須)。
変数名前をカンマで区切って指定します。それぞれがリクエストの{{variable}}を埋める入力になります。
ポート向き運ぶ値
send入力リクエストを送信します。オブジェクトが届くと、そのキーがそれぞれこの送信の変数になります。
変数の名前ごとに1つ入力その変数の値。
success出力リクエストが成功したときのレスポンス。
fail出力2xx以外で応答した、またはチェックに失敗したときはレスポンス。何も返ってこなかったときはエラー。

リクエストは、2xxで応答し、チェック、スクリプトのテスト、スクリプトがすべて成功したときに成功します。これはランナーと同じです。フローが渡した変数は、その送信に限り、環境の変数より優先されます。

フローPlace a test orderでは、Sign inのsuccess出力がCreate orderのsendに接続されています。注文はサインインが成功した後でのみ行われ、Sign inがキャプチャしたトークンはすでに{{token}}に入っています。

ツール

モックの起動、フォルダの実行、仕様のリント、MCPサーバのツールの呼び出しなど、Echolot自身のツールを1つ実行します。ルールはエージェントの場合と同じです。

設定内容
ツールツールを一覧から選びます(必須)。
引数ツールの引数をJSONで指定します({ "name": "{{value}}" }など)。テキストの値にはテンプレートを使えます。
ポート向き運ぶ値
run入力ツールを実行します。オブジェクトが届くと、そのキーが引数に追加されます。
result出力ツールが返した内容。
fail出力失敗した理由。

ツールブロックから別のフローは実行できません。その場合はフローブロックを使います。

直接ダウンロード版のみ

ローカルのプログラム(stdio)として動くMCPサーバを呼び出すツールブロックは、ダイレクトダウンロード版で使えます。 App Store版ではEcholotがそのプログラムを起動できないため、ブロックに警告が表示され、実行すると失敗します。

エディションを比較

フロー

ワークスペースの別のフローを実行し、その出力ブロックが受け取った内容を送ります。

設定内容
フロー実行する別のフロー(必須)。フローは自分自身を実行できず、フロー同士が循環して実行し合うこともできません。
ポート向き運ぶ値
input入力別のフローの入力を持つオブジェクト。
output出力別のフローが返した内容。
fail出力別のフローが失敗した理由。

フローが互いに呼び出せるのは、最大8階層までです。シークレットは値としてはフロー間で渡されません。代わりに変数として保存してください。

人の操作

人の操作のブロックは、実行を一時停止してあなたに確認します。アプリではシートが開きます。エージェントが開始した場合は、質問がエージェントのクライアントに届きます。コマンドラインでは、ターミナルで質問されます。スケジュールやWebhookが開始した実行には確認できる相手がいないため、人の操作のブロックはそこで失敗します。echolot flow run --no-inputでも同様です。

確認

小さなフォームで値を尋ねます。

設定内容
メッセージ尋ねる内容。テンプレートを使えます。
フィールドフォームのフィールド(必須)。それぞれに、name(ポートとキー)、横に表示されるlabel、type(text、number、bool、secret、choice)、選択肢の場合はカンマ区切りのchoices、defaultがあります。
ポート向き運ぶ値
run入力尋ねます。オブジェクトはメッセージのテンプレートを埋めます。
answers出力すべての回答を1つのオブジェクトにしたもの。
フィールドごとに1つ出力そのフィールドの回答。
cancelled出力ユーザーがキャンセルをクリックしたときはtrue。

シートにはキャンセルと続けるがあります。secretフィールドの回答は、実行ログでは隠されます。

表示して待機

メッセージ、コピー用のコード、開くリンクを表示し、続けるが押されるか、untilに値が届くまで待ちます。デバイスでのサインインに使います。ポーリングブロックが承認を待つ間、コードを表示します。

設定内容
タイトルシートのタイトル。
メッセージ表示する内容(必須)。
コード大きく表示され、コードをコピーが付きます(デバイスコード)。
リンクブラウザで開くが付いて表示されます。
QRコードリンクをQRコードでも表示します。 デフォルトではオフです。

5つすべてでテンプレートを使えます。

ポート向き運ぶ値
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に送ります。

設定内容
条件value.status == 200のようなJavaScriptの式(必須)。
ポート向き運ぶ値
value入力判定する値。
true、false出力同じ値が、2つのうちどちらかから出ます。

Morning stock checkでは、ショップが返した商品に対して、条件分岐ブロックRunning low?がvalue.body.items.some(p => p.stock.bern < 5)を使っています。

場合分け

入ってきた値を、条件が成り立つ最初のケースに送ります。どれも成り立たなければdefaultに送ります。

設定内容
ケースリスト(必須)。各ケースには、name(出力ポート)とconditionがあります。
ポート向き運ぶ値
value入力判定する値。
ケースごとに1つ出力そのケースが最初に成り立ったときの値。
default出力どのケースも成り立たなかったときの値。

評価

入ってきた値に対してJavaScriptを実行します。最後の式が結果になります(({ id: value.body.id })やa + bなど)。独自にreturnを持つコードは関数の本体として実行され、returnが返す値が結果になります。Promiseは待機されます。pm.testとpm.expectはスクリプトと同じように使え、その結果は実行のテストとして数えられます。console.logの行は実行ログに出ます。

設定内容
コードJavaScript(必須)。
入力入力名をカンマで区切って指定します。それぞれがコード内の変数になります。空のときはvalueです。
ポート向き運ぶ値
入力の名前ごとに1つ入力その変数の値。
result出力結果。
fail出力コードが例外を投げたときのエラー。
// 入力: pages。収集ブロックが集めたリストを1つにつなげます。
return pages.flat();

遅延

待機してから、値をそのまま渡します。

設定内容
ミリ秒待機する時間(必須)。数値、または{{wait}}のようなテンプレート。

ポート: valueが入力、valueが出力。

ループ

繰り返す

回数の分だけ、0から数えたindexを送り、最後にdoneを送ります。

設定内容
回数繰り返す回数(必須)。0から100,000まで。数値、または{{pages}}のようなテンプレート。
ポート向き運ぶ値
run入力ループを開始します。
index出力1回ごとに0、1、2…。
done出力最後の回が終わった後に、runに入ってきた内容。

各項目を繰り返す

リストの各項目を順に送り、最後にdoneを送ります。設定はありません。

ポート向き運ぶ値
list入力リスト。それ以外が届くと、ブロックは失敗します。
item出力1回につき1項目。
index出力項目の位置(0から数えます)。
done出力最後の回が終わった後の、リスト全体。

収集

ループ中に届いた値を1つのリストにまとめ、ループが終わったときに送ります。設定はありません。

ポート向き運ぶ値
item入力1回につき1つの値。
list出力集めたすべての値。属しているループが終わったときに出ます。

ループの各回は、前の回が終わってから始まり、その回で到達したブロックは毎回実行し直されます。開始ブロックの入力のようにループの外にある値は、どの回でも使えます。

ポーリング

条件が成り立つ(サインインが承認された、ジョブが完了したなど)か、期限が過ぎるまで、保存済みリクエストを繰り返し送信します。

設定内容
リクエスト保存済みリクエスト(必須)。
変数名前をカンマで区切って指定します。それぞれが{{variable}}を埋める入力になります。
終了条件直近のレスポンスであるresponseに対する条件。デフォルト: response.status >= 200 && response.status < 300。
間隔送信の間隔(秒)。デフォルトは5。数値またはテンプレート。
期限あきらめるまでの秒数。デフォルトは300。数値またはテンプレート。
ポート向き運ぶ値
send入力ポーリングを開始します。オブジェクトが届くと、そのキーが変数になります。
変数の名前ごとに1つ入力その変数の値。
success出力条件を満たしたレスポンス。
timeout出力期限が過ぎたときの、直近のレスポンス。timeoutが接続されていないと、代わりにブロックが失敗します。
fail出力送信が失敗したときのエラー。

リクエストと違い、2xx以外のレスポンスでもポーリングは失敗しません。終了条件が成り立つまで、再び送信します。

データ

値

固定の値です。テキスト、数値、trueまたはfalse、リスト、オブジェクトが使えます。

設定内容
値テキスト、数値、またはJSON(必須)。
ポート向き運ぶ値
run入力何かが届くたびに、値を再び送ります。
value出力その値。runに何も接続されていないと、開始時に1回送られます。

テンプレート

届いたオブジェクトと実行の変数で{{name}}を埋めたテキストです。

設定内容
テキストテンプレートを含むテキスト(必須)。

ポート: valuesが入力(オブジェクト)、textが出力。

抽出

入ってきた値からパスで値を取り出し、1つずつ別の出力に送ります。

設定内容
フィールドリスト(必須)。各フィールドには、name(出力ポート)と、$.body.user_codeのようなpathがあります。
ポート向き運ぶ値
value入力取り出す元の値。多くの場合はレスポンス。
フィールドごとに1つ出力そのパスにある値。何もなければnull。
all出力すべてのフィールドを1つのオブジェクトにしたもの。

パスは、JSONPathの共通部分です。

パス取り出すもの
$.body.items[0].skuキーを取り出し、続けてリストの最初の項目。
$.body.items[-1]最後の項目。
$.body.items[*].skuすべての項目のskuをリストにしたもの。
$['content-type']ドットでは指定できない文字を含むキー。
body.id$がなければ、パスは値の先頭から始まります。

変数を設定

値を変数として保存し、後のブロックやリクエストが{{name}}で読めるようにします。

設定内容
変数リスト(必須)。それぞれに、name、入ってきた値の中のpath(空のときは全体)、scope、secretがあります。
スコープ値の保存先
runこの実行と、それが送信するリクエストのみ。
environmentアクティブな環境(デフォルト)。環境が選ばれていないと、実行はここで失敗します。
workspaceワークスペース自身の変数。
globalフローからは書き込めません。実行が失敗し、環境かワークスペースに保存するよう促されます。

secretをオンにすると、値はファイルではなくキーチェーンに保存され、その前のブロックから出た時点から、実行ログとエージェントに見える内容では隠されます。pathで何も見つからないときは、変数は古い値のままです。そのため、新しいリフレッシュトークンを含まないトークンのレスポンスが、すでに持っているリフレッシュトークンを消すことはありません。シークレットを参照してください。

ポート: valueが入力、valueが出力(入ってきた値をそのまま渡します)。

変数を取得

リクエストから見えるとおりに変数を読み取ります。実行自身の変数、次に環境、ワークスペース、グローバルの変数の順です。

設定内容
名前変数(必須)。
ポート向き運ぶ値
run入力何かが届くたびに、再び読み取ります。
value出力その値。なければnull。runに何も接続されていないと、開始時に1回読み取られます。

出力

表示

入ってきた値をそのまま渡し、確認できるようにします。実行後にこのブロックを選択して、インスペクタの前回の実行を読んでください。

設定内容
フォーマットauto、text、json、table、image。デフォルトはauto。

ポート: valueが入力、valueが出力。

ログ

実行ログに1行書き込みます。

設定内容
メッセージ書き込む行。テンプレートを使えます。{{value}}は入ってきた値で、メッセージが空のときは値全体です。

ポート: valueが入力、valueが出力。Place a test orderでは、注文できなかったときにOrder failedがCreate order answered {{status}}をログに書きます。

アサート

入ってきた値をチェックします。各チェックは実行のテスト結果になり、失敗したチェックがあるとecholot flow runは失敗します。

設定内容
チェックリスト(必須)。各チェックには、nameと、valueに対するconditionがあります。
ポート向き運ぶ値
value入力チェックする値。
passed出力すべてのチェックが成り立ったときの値。
failed出力いずれかのチェックが失敗したときの値。
value.status === 200   // 200で応答する
value.time < 2000      // 2秒以内

通知

Echolotからの通知をmacOSで表示します。初回はmacOSが許可を求めます。コマンドラインでは、通知の代わりに内容が出力されます。

設定内容
タイトル通知のタイトル(必須)。テンプレートを使えます。
メッセージ通知の本文。テンプレートを使えます。

ポート: valueが入力、valueが出力。Morning stock checkは、タイトルがRestock Bernの通知ブロックRestockで終わります。

ファイルに書き込む

入ってきた値を、ワークスペースフォルダ内のファイルに書き込みます。

設定内容
パスワークスペースフォルダからの相対パス(exports/items.jsonなど、必須)。テンプレートを使えます。
フォーマットjson(整形あり)、text、csv。デフォルトはjson。
ポート向き運ぶ値
value入力書き込む内容。
path出力ファイルのパス(ワークスペースからの相対パス)。
fail出力書き込めなかった理由。

すでにあるファイルは置き換えられます。ワークスペース自身のファイルは書き込み禁止です。requests、flows、environments、mocks、mcp-servers、specsフォルダ、workspace.toml、隠しファイルが該当します。CSVでは、オブジェクトのリストはオブジェクト1つにつき1行、キー1つにつき1列になり、それ以外は1行に1つの値で書き込まれます。

ブロック間の値

値は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 MBを超えるボディは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回に達するか、1時間たつと停止します。Webhookが開始した実行は、2分で停止します。

このページの内容