# フロー (/ja/docs/flows)

フローは、自分で描く小さなプログラムです。ブロックを接続でつないで作ります。各ブロックは1つのことを行います。保存したリクエストを送信する、レスポンスから値を取り出す、分岐する、繰り返す、あなたに確認する、変数を保存する、ファイルを書き出す、などです。普段は複数の手順で手作業していることにフローを使います。デバイスコードでサインインする、結果をページ送りで取得する、テストデータを投入して後片付けする、毎朝APIをチェックする、5つのリクエストを行う1つのツールをAIエージェントに渡す、といった作業です。

フローはワークスペースの`flows`フォルダに、フロー1つにつき1ファイルで保存されます。リクエストと同じように、Gitでレビューや共有ができます。フローが送信するリクエストはどれも、リクエストページから送信する場合と同じ経路を通ります。変数、認証、スクリプト、チェック、プロキシ、[履歴](/docs/workspaces/history)がすべて適用されます。

## フローのページ [#the-flows-page]

サイドバーの上部にあるモジュールの切り替えで**フロー**を選ぶか、<kbd>⌘</kbd><kbd>5</kbd>を押します。サイドバーにはワークスペースのフローが一覧表示されます。各フローの名前の下には、開始方法が表示されます。`manual`、`agent tool`、`every hour`、`scheduled`、`webhook`のいずれかです。フローの横に警告マークがある場合は、実行する前に修正が必要な問題があります。

<Shot id="flows-canvas" alt="フロー「Place a test order」を開いたフローのページ。サイドバーのフロー一覧、Start、2つのリクエストブロック、承認ブロック、ログブロック、Cancel orderブロックが並ぶキャンバス、右側にフローの設定が表示されている" />

ページは3つの部分でできています。

- **ツールバー**はキャンバスの上にあります。フローの名前（変更が未保存の間は**編集済み**と表示）、問題の数、**整頓**、**全体表示**、ズームのレベル、**複製**、**実行**、**実行ログ**、**ブロック**、**メモ**、**実行**が並びます。
- **キャンバス**は中央にあり、左下にフロー全体の小さなマップがあります。マップをクリックすると、その位置に表示が移動します。
- **インスペクタ**は右側にあります。何も選択していないときは、フロー自体の**名前**、**説明**、**入力**が表示されます。ブロックを1つ選択しているときは、そのブロックの設定が表示されます。

フローを開いている間、サイドバーには、そのフローの実行（**（フロー名）の実行**。このウインドウでの実行で、新しいものが先頭）と、キャンバスにドラッグできるワークスペースの**リクエスト**も表示されます。

### フローを作成する [#create-a-flow]

1. サイドバーで、<strong>フロー</strong>の横にある<strong>+</strong>をクリックします。
2. 開始ブロックを出力ブロックにつないだものから始めるには**空のフロー**を選びます。テンプレートから始めるには**テンプレートから**の下から選びます（[テンプレート](/docs/flows/templates)を参照）。
3. 新しいフローがキャンバスに開きます。インスペクタの**名前**で名前を変更します。

ワークスペースにまだフローがない場合、ページには代わりに**新規フロー**ボタンが表示されます。

フローを削除するには、フローを選択して<strong>フロー</strong>の横の<strong>−</strong>をクリックするか、Controlキーを押しながらクリックして<strong>削除…</strong>を選びます。Echolotは先に確認し、ファイルをゴミ箱に入れます。削除したフローを実行するフローは、動作しなくなります。

## キャンバス上で組み立てる [#build-on-the-canvas]

### ブロックを追加する [#add-blocks]

- ツールバーの**ブロック**をクリックするか、<kbd>⇧</kbd><kbd>⌘</kbd><kbd>B</kbd>を押します。ブロックピッカーが開きます。入力して検索し、ブロックの種類をクリックします。<kbd>↩</kbd>を押すと、最初に一致したものが追加されます。新しいブロックは表示の中央に置かれ、選択された状態になります。
- ピッカーには、ワークスペースの保存済みリクエストも**リクエスト**の下に表示されます。1つ選ぶと、そのリクエストを送信するリクエストブロックが追加されます。
- サイドバーの**リクエスト**からリクエストをキャンバスにドラッグします。離した場所にリクエストブロックができます。リクエストをControlキーを押しながらクリックして**フローに追加**を選ぶと、そのブロックがフローの右側に置かれます。

ブロックの種類ごとの設定とポートは、すべて[ブロック](/docs/flows/blocks)にあります。

<Shot id="flows-block-picker" alt="キャンバスの上に開いたブロックピッカー。検索フィールドと、トリガー、アクション、人の操作、ロジック、ループ、データ、出力に分けたブロックの種類、末尾に保存済みリクエストが並んでいる" />

### ポートを接続する [#link-ports]

入力はブロックの左端、出力は右端にあります。値は出力から出て、接続をたどり、入力に届きます。ブロックは、接続されたすべての入力に値が届くと実行されます。

- 出力から入力へドラッグすると、2つが接続されます。接続できる場合は、ポインタの下のポートが光ります。入力から出力へドラッグして始めることもできます。
- 入力に接続できるのは1つだけです。別の出力をつなぐと、古い接続は置き換わります。1つの出力は複数の入力につなげます。
- 新しい接続を何もないキャンバスの上で離すと、その場所にブロックピッカーが開きます。ピッカーにはその接続を受け取れるブロックだけが表示され、選んだブロックは接続済みの状態で配置されます。
- 接続を移すには、接続の終点になっている入力からドラッグして離し、別の入力にドロップします。何もないキャンバスの上にドロップすると、接続が切れます。
- 接続にポインタを合わせると、中央に接続を切るボタンが表示されます。

### 選択、移動、整列 [#select-move-and-arrange]

- ブロックをクリックすると選択されます。<kbd>⇧</kbd>キーまたは<kbd>⌘</kbd>キーを押しながらクリックすると、ブロックを選択に追加したり、選択から外したりできます。
- <kbd>⇧</kbd>キーまたは<kbd>⌘</kbd>キーを押しながら何もないキャンバスをドラッグすると、選択ボックスを描けます。ボックスに触れたブロックが選択に加わります。
- ブロックをドラッグすると移動します。<kbd>Esc</kbd>キーを押すと、選択が解除されます。
- 矢印キーを押すと、その方向にいちばん近いブロックが選択され、表示もそれに追従します。何も選択していないときは、開始ブロックから始まります。
- **整頓**は、ブロックを実行される順に列に並べます。
- **複製**（<kbd>⌘</kbd><kbd>D</kbd>）は、選択したブロックを、それらの間の接続ごとコピーします。
- <kbd>⌫</kbd>は、選択したブロックを接続ごと削除するか、選択した接続を削除します。

ブロックを選択したときのインスペクタには、**ブロックを削除**があります。複数のブロックを選択している場合は、その数と**ブロックを削除**が表示されます。フローにある開始ブロックはちょうど1つです。開始ブロックはコピーも複製もされず、一時停止できず、インスペクタにも**ブロックを削除**はありません。

### パンとズーム [#pan-and-zoom]

- 何もないキャンバスをドラッグするか、2本指またはマウスホイールでスクロールすると、表示が移動します。
- ピンチするか、<kbd>⌘</kbd>キーを押しながらスクロールすると、ズームします。ズームは20 %から250 %までで、ツールバーにレベルが表示されます。
- **全体表示**（<kbd>⌥</kbd><kbd>⌘</kbd><kbd>0</kbd>）は、フロー全体を表示します。文字が読めるよう、50 %より小さくはなりません。それより大きなフローは、左端から表示されます。

### コピーとペースト [#copy-and-paste]

**編集 › コピー**（<kbd>⌘</kbd><kbd>C</kbd>）、**カット**（<kbd>⌘</kbd><kbd>X</kbd>）、**ペースト**（<kbd>⌘</kbd><kbd>V</kbd>）は、選択したブロックとそれらの間の接続に対して働きます。ペーストしたブロックには新しいIDが付き、選択された状態になります。同じフローでは元のブロックの隣に、別のフローでは表示の中央に置かれます。別のワークスペースのフローにもペーストできます。コピーしたブロックはJSONテキストなので、メッセージやIssueにペーストすることもできます。

### メモ [#notes]

ツールバーの**メモ**をクリックすると付箋のメモが追加され、そのまま入力できます。メモはブロックの背面に置かれ、実行されません。

- メモをドラッグすると移動し、右下のグリップをドラッグするとサイズを変更できます。
- メモをダブルクリックするか、Controlキーを押しながらクリックして<strong>メモを編集…</strong>を選ぶと、テキストを変更できます。
- Controlキーを押しながらクリックして**メモを削除**を選ぶと、メモが削除されます。

テンプレートでは、どのリクエストを選ぶかをメモで案内しています。

### 取り消しと保存 [#undo-and-saving]

キャンバスとインスペクタでの変更は、すべて**編集 › 取り消す**（<kbd>⌘</kbd><kbd>Z</kbd>）と**やり直す**（<kbd>⇧</kbd><kbd>⌘</kbd><kbd>Z</kbd>）で取り消せます。対象は、追加、移動、接続、削除、設定、メモ、整頓です。

フローを自分で保存する必要はありません。Echolotは最後の変更の少し後にファイルを書き込みます。それまでは名前の横に**編集済み**と表示されます。保存に失敗した場合、Echolotは理由を表示し、**再試行**、**変更内容を破棄**（ディスク上のファイルの状態に戻す）、**編集を続ける**を提示します。保存されるまで、編集内容はキャンバス上に残ります。

### 問題 [#problems]

Echolotは、編集中のフローをチェックします。ツールバーに問題の数が表示されます。クリックすると一覧が開き、問題をクリックするとそのブロックが選択されます。問題のあるブロックには警告マークが付き、そのインスペクタに問題が一覧表示されます。

エラーがあるとフローは実行できません。開始ブロックがない、必須の設定が空（リクエストのないリクエストブロックなど）、存在しないリクエストやフローを指している、接続が循環している、といったものです。警告があっても実行できます。たとえば、何も接続されておらず実行されないブロックなどです。何かをやり直したいときは、接続を循環させず、[繰り返す、各項目を繰り返す、ポーリング](/docs/flows/blocks#loops)を使ってください。

## 入力と出力 [#inputs-and-outputs]

<strong>入力</strong>は、実行を開始するときの値です。何も選択していない状態でインスペクタに追加します。<strong>入力</strong>の横の<strong>+</strong>をクリックし、名前を入力して型（`any`、`text`、`number`、`bool`、`object`、`list`、`secret`）を選びます。開始ブロックには、入力ごとに1つの出力と、すべての入力を1つのオブジェクトとして送る`run`が追加されます。

入力は、**実行**シート、`echolot flow run`の`--input`オプション、エージェントのツール呼び出し、Webhookのクエリ文字列とJSONボディから渡されます。テキストは入力の型に変換されます。`3`は数値に、`true`と`yes`は真偽値に、JSONテキストはオブジェクトまたはリストになります。`secret`型の入力は、実行ログとエージェントに見える内容では隠されます。

デフォルト値、説明、入力が必須かどうかは、フローのファイルで設定します（`[[inputs]]`テーブルの`default`、`description`、`required`。[ワークスペースのファイル](/docs/reference/workspace-files)を参照）。**実行**シートでは、説明がフィールドのプレースホルダとして表示され、デフォルト値が入力済みになります。

**出力**ブロックは、実行が返す内容を保持します。返す先は、フローを呼び出したエージェント、`echolot flow run`、Webhookの呼び出し元、または親フローのフローブロックです。出力ブロックは、1つのフローに最大1つです。

## フローを実行して様子を見る [#run-a-flow-and-watch-it]

**実行**をクリックするか、<kbd>⌘</kbd><kbd>R</kbd>を押します。入力があるフローでは、最初にシートが開いて入力を埋めます。空のフィールドには、その入力のデフォルト値が使われます。フローが保存され、ウインドウのアクティブな環境で実行されます。フローにエラーがある間は、**実行**は使えません。

実行中は、次のようになります。

- 各ブロックの枠線が状態を示します。実行中またはあなたの操作待ち、成功（緑）、失敗（赤）です。
- **実行**ログがキャンバスの下に開きます。各ブロックが終了するたびに、その時間、ログ行、テスト結果（ヘッダーの**テスト** 3/3）、実行の終わり方が一覧表示されます。行をクリックすると、そのブロックが選択されます。
- あなたに確認するブロック（確認、表示して待機、承認）は、シートを開きます。[人の操作のブロック](/docs/flows/blocks#people)を参照してください。
- **停止**（<kbd>⌘</kbd><kbd>.</kbd>）が**実行**の代わりに表示され、実行を終了します。画面に出ている質問は消えます。

実行が終わったら、ブロックを選択すると、インスペクタに**前回の実行**が表示されます。かかった時間と、**表示**の下にポートごとの**入力**値と**出力**値が出ます。抽出ブロックやテンプレートに使う値のパスを調べるのに役立ちます。

<Shot id="flows-run-log" alt="「Place a test order」を実行した後のキャンバス。緑の枠線のブロック、キャンバスの下の実行ログ、Create orderの前回の実行の出力を表示したインスペクタ" />

以前の実行はウインドウ内に残ります。サイドバーの<strong>（フロー名）の実行</strong>で実行をクリックするか、ツールバーの<strong>実行</strong>から選ぶと、キャンバスに再び表示されます。そのメニューの<strong>キャンバスを消去</strong>、または実行ログの<strong>消去</strong>で、実行状態が消えます。実行が失敗し、Macのオンデバイスモデルが利用できる場合は、実行ログのヘッダーにあるボタンで失敗の理由を説明してもらえます。

[保護された環境](/docs/workspaces/protected-environments)がアクティブなときは、ボタンが<strong>Productionで実行…</strong>と表示され、Echolotは実行を開始する前に1回確認します。

実行、スケジュール、Webhook、エージェント、コマンドラインについては、[実行とトリガー](/docs/flows/running-and-triggers)を参照してください。
手順に沿った例は、[フローで自動化する](/docs/tutorials/automate-with-flows)にあります。

## キーボードショートカット [#keyboard-shortcuts]

| ショートカット | 操作 |
| --- | --- |
| <kbd>⌘</kbd><kbd>5</kbd> | フローモジュールを表示する |
| <kbd>⌘</kbd><kbd>R</kbd> | フローを実行する |
| <kbd>⌘</kbd><kbd>.</kbd> | 実行を停止する |
| <kbd>⇧</kbd><kbd>⌘</kbd><kbd>B</kbd> | ブロックを追加する |
| <kbd>⌘</kbd><kbd>D</kbd> | 選択したブロックを複製する |
| <kbd>⌥</kbd><kbd>⌘</kbd><kbd>0</kbd> | フロー全体を表示する |
| <kbd>⌘</kbd><kbd>C</kbd>、<kbd>⌘</kbd><kbd>X</kbd>、<kbd>⌘</kbd><kbd>V</kbd> | ブロックをコピー、カット、ペーストする |
| <kbd>⌫</kbd> | 選択したものを削除する |
| <kbd>⌘</kbd><kbd>Z</kbd>、<kbd>⇧</kbd><kbd>⌘</kbd><kbd>Z</kbd> | 取り消す、やり直す |
| 矢印キー | その方向にいちばん近いブロックを選択する |
| <kbd>Esc</kbd> | 選択を解除する |
