# 流程 (/zh/docs/flows)

流程是你画出来的小程序：由连线连接的若干块组成。每个块只做一件事：发送一个已存储的请求、从响应中取出一个值、分支、循环、向你提问、存储变量或写入文件。
流程适合那些原本要手动分好几步完成的工作：用设备代码登录、逐页遍历结果、填充和清理测试数据、每天早上检查一次 API，或者给 AI 智能体提供一个能完成五次请求的工具。

流程保存在工作区中，`flows` 文件夹里每个流程一个文件，因此可以像请求一样在 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 的“流程”页面：边栏中的流程列表，画布上有“开始”块、两个“请求”块、一个“批准”块、一个“日志”块和一个 Cancel order 块，右侧是流程的设置" />

页面分为三部分：

- **工具栏**位于画布上方：流程名称（更改尚未存储时旁边显示**已编辑**）、问题数量、**整理**、**适应窗口**、缩放比例、**复制**、**运行**、**运行日志**、**块**、**提示**和**运行**。
- **画布**在中间，左下角有整个流程的小地图。点按地图可把视图移到那里。
- **检查器**在右侧。未选择任何内容时，它显示流程本身：**名称**、**描述**和**输入**。选择一个块时，它显示该块的设置。

打开流程时，边栏还会列出该流程的**运行**（本窗口中的运行，最新的在前）和工作区的**请求**，可以直接拖到画布上。

### 创建流程 [#create-a-flow]

1. 在边栏中点按**流程**旁的 **+**。
2. 选择**空白流程**会得到一个连到“输出”块的“开始”块，也可以在**从模板**下选一个（见[模板](/docs/flows/templates)）。
3. 新流程会在画布上打开。在检查器的**名称**中为它重新命名。

工作区还没有流程时，页面会显示**新流程**按钮。

要删除流程，选择它并点按**流程**旁的 **−**，或按住 Control 键点按它并选择**删除…**。Echolot 会先询问，然后把文件移到废纸篓。运行已删除流程的其他流程将无法工作。

## 在画布上搭建 [#build-on-the-canvas]

### 添加块 [#add-blocks]

- 点按工具栏中的**块**，或按 <kbd>⇧</kbd><kbd>⌘</kbd><kbd>B</kbd>，打开块选取器：输入文字搜索，然后点按某种块。按 <kbd>↩</kbd> 添加第一个匹配项。新块出现在视图中央并处于选中状态。
- 选取器还会在**请求**下列出工作区中已存储的请求。选择其中一个会添加一个已经设置好发送该请求的“请求”块。
- 把边栏**请求**中的请求拖到画布上，松开的位置就会出现一个“请求”块。按住 Control 键点按请求并选择**添加到流程**，会把它的块放在流程右侧。

每种块的设置和端口见[块](/docs/flows/blocks)。

<Shot id="flows-block-picker" alt="画布上打开的块选取器：一个搜索栏，按“触发器”“动作”“人员”“逻辑”“循环”“数据”和“输出”分组的块种类，最后是已存储的请求" />

### 连接端口 [#link-ports]

输入在块的左边缘，输出在右边缘。值从输出出发，沿连线前进，到达输入；当所有已连线的输入都有值时，块才会运行。

- 从输出拖到输入即可连线。连线能够接上时，指针下方的端口会亮起。也可以从输入开始，拖到输出。
- 一个输入只接受一条连线。把另一个输出连到它上面，会替换旧的连线。一个输出可以连到多个输入。
- 把新连线松开在空白画布上，块选取器会在那里打开。它只列出能接上这条连线的块，选中的块出现时已经连好线。
- 要移动连线，把它从终点的输入上拖开，放到另一个输入上。放在空白画布上则会断开。
- 指向连线，其中间会出现一个按钮，用来断开它。

### 选择、移动和排列 [#select-move-and-arrange]

- 点按块来选择它。按住 <kbd>⇧</kbd> 或 <kbd>⌘</kbd> 点按，可把块加入选择或从中移除。
- 按住 <kbd>⇧</kbd> 或 <kbd>⌘</kbd> 在空白画布上拖移，会画出选框。选框碰到的块都会加入选择。
- 拖移块即可移动它。按 <kbd>Esc</kbd> 取消选择。
- 方向键会选择该方向上最近的块，视图随之移动。未选择任何内容时，方向键从“开始”块起步。
- **整理**会按运行顺序把块排成列。
- **复制**（<kbd>⌘</kbd><kbd>D</kbd>）会复制所选的块以及它们之间的连线。
- <kbd>⌫</kbd> 会删除所选的块及其连线，或删除所选的连线。

所选块的检查器中有**删除块**。选择了多个块时，它会显示数量和**删除块**。一个流程恰好有一个“开始”块：它不会被拷贝或复制，不能暂停，其检查器中也没有**删除块**。

### 平移和缩放 [#pan-and-zoom]

- 在空白画布上拖移，或用双指或鼠标滚轮滚动，即可平移。
- 双指张合，或按住 <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 键点按它并选择**编辑备注…**，即可修改文字。
- 按住 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]

**输入**是运行开始时的值。在未选择任何内容时，于检查器中添加：点按**输入**旁的 **+**，输入名称并选择类型（`any`、`text`、`number`、`bool`、`object`、`list` 或 `secret`）。
“开始”块会为每个输入提供一个输出，另外还有 `run`，它把所有输入作为一个对象发送。

输入来自“运行”面板、`echolot flow run` 的 `--input` 选项、智能体的工具调用，或 Webhook 的查询参数和 JSON 正文。文本会转换成输入的类型：`3` 转成数字，`true` 或 `yes` 转成布尔值，JSON 文本转成对象或列表。`secret` 输入在运行日志和智能体能看到的内容中会被隐藏。

默认值、描述以及输入是否必填，在流程文件中设置（`[[inputs]]` 表：`default`、`description`、`required`；见[工作区文件](/docs/reference/workspace-files)）。
“运行”面板会把描述显示为字段的占位符，并填入默认值。

“输出”块保存运行返回的内容：返回给调用流程的智能体、`echolot flow run`、Webhook 的调用方，或父流程的“流程”块。一个流程最多有一个“输出”块。

## 运行流程并观察 [#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 的上次运行输出" />

之前的运行会保留在窗口中：点按边栏**运行**下的某一次，或从工具栏的**运行**菜单中选择，即可在画布上再次显示。该菜单中的**清空画布**，或运行日志中的**清除**，会移除运行状态。
运行失败且这台 Mac 的设备端模型可用时，运行日志标题栏中会出现一个按钮，用来解释失败原因。

当[受保护的环境](/docs/workspaces/protected-environments)处于使用中时，按钮会显示为**在 Production 中运行…**，Echolot 会在运行开始前询问一次。

有关运行、计划、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> | 取消选择 |
