Promise Block
并行执行多个分支,根据完成策略决定何时结束,适用于需要同时处理多个独立任务的场景。
功能说明
Promise Block 是一个并行执行容器,将多个分支(Branch)同时启动执行。每个分支可以包含任意数量的 Block,所有分支并行运行,互不干扰。通过完成策略(n 参数)控制何时结束:可以等待全部完成、等待第一个成功(race 模式)、或等待前 N 个成功。
当你需要同时调用多个 AI 模型对比结果、并行处理多个数据源、或执行多路任务择优选取时,使用 Promise Block。
使用场景
- 多模型竞速:将同一 prompt 发送给不同 AI 模型,取最快返回的结果(n=1 race 模式)
- 并行数据处理:同时查询多个数据源或 API,汇总所有结果(n=0 all 模式)
- 批量展开执行:将一个列表展开为多个并行任务,每个任务处理列表中的一个元素(expand 模式)
配置参数
Promise 容器
| 属性名 | 类型 | 说明 | 默认值 |
|---|---|---|---|
n | number | 完成策略:0=全部成功, 1=第一个成功(race), N=前N个成功 | 0 |
exposeInternalVariables | boolean | 是否将完成分支的内部变量暴露到父上下文 | true |
完成策略详解:
| n 值 | 模式 | 行为 |
|---|---|---|
0 | all | 全部分支必须成功才算 fulfilled |
1 | race | 第一个成功即完成,取消其余分支 |
2,3,... | first N | 前 N 个成功即完成,取消其余分支 |
Branch 分支
| 属性名 | 类型 | 说明 | 默认值 |
|---|---|---|---|
mode | 'single' | 'expand' | 执行模式:单次执行 / 展开为多个并行任务 | 'single' |
condition | Condition | null | 门控条件,不满足时跳过该分支 | null |
list | ValueSource | null | expand 模式下的列表来源(与 count 互斥) | null |
count | number | null | expand 模式下的固定展开次数(与 list 互斥) | null |
expand 模式:
- list 模式:从变量获取数组,按数组长度展开,每个任务注入
item(当前元素)和index(0-based 索引) - count 模式:固定展开 N 次,每个任务注入
index(0-based 索引)
输出变量
聚合变量
| 变量名 | 类型 | 说明 |
|---|---|---|
__default__ | array | 所有成功结果的 outputs 数组(按完成顺序) |
count | number | 成功分支的数量 |
status | string | 'fulfilled'(达到 n 目标)或 'partial'(未达到) |
failed | array | 失败/跳过的分支记录,含 branchId、branchName、error |
cancelled | array | 被取消的分支记录,含 branchId、branchName |
按索引访问
| 变量名 | 类型 | 说明 |
|---|---|---|
0, 1, 2... | object | 按完成顺序的各分支 outputs 对象 |
{branchId} | object | array | 指定分支的 outputs;expand 模式下为数组 |
引用语法
{{promise_0.status}} -- 'fulfilled' 或 'partial'
{{promise_0.count}} -- 成功数量
{{promise_0.__default__}} -- 全部成功结果数组
{{promise_0.0}} -- 第一个完成的分支 outputs
{{promise_0.failed}} -- 失败/跳过记录数组使用示例
示例 1:多模型竞速
使用 race 模式(n=1),将同一问题发给两个模型,取最快的结果:
[Promise Block: compare] — n=1 (race)
├─ Branch 1:
│ └─ [Generation Block: gpt] — 模型: GPT-4, prompt: "解释量子计算"
└─ Branch 2:
└─ [Generation Block: claude] — 模型: Claude, prompt: "解释量子计算"
后续引用: {{compare.0}} — 最快返回的结果示例 2:列表展开并行处理
使用 expand 模式批量处理数组中的每个元素:
[Code Block: urls] — 输出 URL 列表 ["url1", "url2", "url3"]
|
[Promise Block: fetch_all] — n=0 (all)
└─ Branch 1 (expand, list=@urls):
└─ [Generation Block] — "总结 {{item}} 的内容"
(自动展开为 3 个并行任务,每个任务的 item 为对应 URL)
后续引用: {{fetch_all.__default__}} — 所有结果数组运行时约束
- 适用文档类型:workflow(Slash 菜单中排除了 skill 类型文档)
- 可插入上下文:顶层文档内容区域
- 不可嵌套场景:
- Promise 内不可包含 Ask Block(Ask 需要用户交互,与并行执行冲突)。前端 Slash 菜单已过滤,后端运行时会检测并跳过含 Ask 的分支
- Promise 内不可包含 Exit Block
注意事项
- 分支隔离:所有分支基于启动前的变量快照独立执行,分支之间不会互相看到对方的中间结果。完成后的内部变量在所有任务结束后才统一写入父上下文
- 最大并发数:系统限制同时运行的最大任务数为 10,超出部分排队等待
- 早停机制:达到完成条件后,未完成的分支会被自动取消(AbortController)
- expand 列表为非数组:如果 list 解析结果不是数组,该分支会被跳过并记入
failed - n > 分支数:当所需成功数大于实际任务数时,
status会返回'partial',不会静默降级 - SSE 事件互斥:并行分支的输出事件通过 Mutex 序列化,保证前端接收到完整的消息序列