フローで自動化する
サインインして注文を一覧し、判断して通知するフローをキャンバスで作り、実行し、スケジュールし、Webhookから開始します。
フローは、リクエストなどのステップをキャンバス上でつなぎます。手作業で行っている作業を、ワンクリックで、スケジュールに従って、または別のシステムから呼び出されたときに実行できます。 このチュートリアルでは、Orders to shipを作ります。デモショップにサインインしてHeidiの注文を一覧し、支払い済みでまだ発送されていない注文があれば通知を送ります。
- 所要時間:20分。
- 必要なもの:Alpenglowワークスペースで環境なしを選んだ状態。フローMorning stock checkは、同じ形をした完成例です。
- 学べること:ブロックと接続、条件分岐ブロックと通知ブロック、実行ログ、スケジュール、Webhook、
echolot flow run。
1. フローを作る
- フローに切り替えます(⌘5)。
- サイドバーの+メニュー(新規フロー)を開いて、空のフローを選びます。開始ブロックが出力ブロックに接続された、新規フローが開きます。
- キャンバスの空いている場所をクリックして、ブロックが選択されていない状態にします。インスペクタで、名前を
Orders to ship、説明をSays when an order is paid but not shipped.にします。
フローを開いている間、サイドバーにはワークスペースのリクエストが一覧され、キャンバスにドラッグできます。+メニューのテンプレートからセクションでは、ページを取得して書き出すのような用意済みのフローから始められます。テンプレートを参照してください。
2. リクエストを追加する
- 開始と出力の間の接続にポインタを重ねて、この接続を切断ボタンを選びます。
- サイドバーからAuth › Sign inをキャンバスにドラッグします。Sign inというタイトルのリクエストブロックになり、入力
sendと出力success、failを持ちます。 - Orders › List ordersを、その右側のキャンバスにドラッグします。
- 接続します。開始の
runポートからSign inのsendポートへ、次にSign inのsuccessポートからList ordersのsendポートへドラッグします。
Sign inは成功するたびにトークンを{{token}}に保存するので、List ordersは新しいトークンを送信します。リクエストブロックのsuccess出力は、レスポンスを渡します。status、headers、body、time、urlです。failは、リクエストにレスポンスがない場合やチェックが失敗した場合に発火します。
3. 条件分岐ブロックで判断する
-
ツールバーのブロックを選び(⇧⌘B)、ブロックまたはリクエストを検索に
Ifと入力して↩を押します。 -
インスペクタで、タイトルを
Waiting to ship?にし、条件を次のようにします。value.body.items.some(o => o.status === 'paid')条件はJavaScriptです。
valueは入ってきた値で、ここではList ordersのレスポンスです。 -
List ordersの
successを、条件分岐ブロックのvalueに接続します。
4. 自分に通知する
-
条件分岐ブロックの
trueポートからドラッグして、何もないキャンバスの上で離します。その場所にブロックピッカーが開きます。通知を選びます。trueに接続された状態で追加されます。 -
ブロックの設定で、タイトルを
Orders to shipにし、メッセージを次のようにします。{{value.body.total}} orders, at least one paid and waiting.{{value…}}は、入ってきた値の一部を埋め込みます。ワークスペースの変数も使えます。 -
List ordersの
successを、出力ブロックのvalueにも接続します。Webhookは、出力に届いたものを応答として返します(ステップ7)。
整頓を選ぶとブロックが実行順に並び、全体表示(⌥⌘0)を選ぶとすべてが見えるようになります。

5. 実行する
- 実行を選びます(⌘R)。
- 各ブロックには、実行中はバッジが表示され、その後完了と表示されます。キャンバスの下の実行ログには、すべてのブロックとその時間が並びます。
- 通知にOrders to ship:3 orders, at least one paid and waiting.と表示されます。デモの注文
ord_8Jm4Qxが支払い済みだからです。初回は、Echolotが通知を表示してよいかをmacOSが尋ねます。 - List ordersを選びます。インスペクタの前回の実行に、入ってきた値と出ていった値が表示されます。表示で入力と出力を切り替えます。
条件をo.status === 'cancelled'に変更してもう一度実行します。条件分岐ブロックは値をfalseに送りますが、そこには何も接続されていないので、通知は来ません。元に戻してください。
実行が失敗したときは、失敗したブロックにエラーが表示されます。Macのオンデバイスモデルが使える環境では、実行ログの失敗の理由を説明で、何が問題だったかがわかります。 過去の実行は、ツールバーの実行メニューに残ります。詳しくは実行とトリガーを参照してください。
6. スケジュールで実行する
- 開始ブロックを選びます。インスペクタにトリガーセクションがあります。
- スケジュールをオンにします。間隔を選んだ状態で、
60分ごとに設定します。または時刻を指定(cron)を選んで、平日の7時なら0 7 * * 1-5のように、cronの行(分、時、日、月、曜日)を入力します。 - 許可を選びます。Echolotは、フローが自分の操作なしに開始される前に許可を求め、フローが変更されたときにも再び尋ねます(再び許可)。許可を取り消すと止まります。
インスペクタには次回の実行が表示されます。スケジュールは、ワークスペースのウインドウを開いている間に実行されます。アプリなしで実行するには、電源を入れたままのMacやサーバでecholot flow serve -w Alpenglow.echolotを使います。
7. Webhookから開始する
-
開始ブロックのトリガーで、Webhookをオンにします。メソッドはPOSTのままにして、パスを
/orders-to-shipにします。 -
許可を選びます。インスペクタに、
127.0.0.1上のアドレスが、URLをコピーとトークンをコピーとともに表示されます。 -
ターミナルで、トークンをBearerトークンとして呼び出します。
curl -X POST 'http://127.0.0.1:PORT/orders-to-ship' -H 'Authorization: Bearer TOKEN'コピーしたURLとトークンをペーストしてください。フローが実行され、レスポンスは出力に届いたもの、つまり注文になります。
クエリ文字列とJSONボディは、フローの入力に渡されます。Webhookが応答するのはこのMacだけで、ウインドウを開いている間に限られます。echolot flow serveは、アプリなしでWebhookを提供します(デフォルトのポートは4100)。
AlpenglowのOrder status on webhookも別の例です。フローは、AIエージェントにツールとして提供することもできます(エージェント(MCPツール))。エージェントを参照してください。
8. ターミナルから実行する
echolot flow list -w Alpenglow.echolot
echolot flow run "Orders to ship" -w Alpenglow.echolot各ブロックが完了するたびに時間とともに出力され、続いて通知のテキストと結果が出力されます。
✓ 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 msCIでは--no-inputを付けると、人の操作が必要なフローは待たずに失敗します。フローはワークスペースのflowsフォルダにあるファイルなので、使っているリクエストとともにGitに入ります。echolot flowを参照してください。
次のステップ
- ブロック:承認、確認、各項目を繰り返す、ポーリング、ファイルに書き込む、その他。
- テンプレート:デバイスサインイン、トークンの更新、ページを取得して書き出す、死活監視。
- エージェントにワークスペースを安全に使わせる:フローを1つのツールとしてエージェントに提供します。
