If-Else Block
容器节点,根据条件判断选择执行不同的分支。
功能说明
If-Else Block 是一个条件分支容器节点。它包含一个或多个 if 分支和一个可选的 else 分支。运行时按顺序检测每个 if 分支的条件,命中第一个满足条件的分支后执行其内部 Block,跳过其余分支。如果所有 if 条件都不满足,则执行 else 分支(如存在)。
If-Else Block 本身不产生直接输出,内部 Block 的执行结果写入全局上下文。
使用场景
- 结果分流:根据上游 Block 的输出值,决定走不同的处理路径(如成功/失败分支)。
- 条件过滤:检查某个变量是否满足特定条件,满足时才执行后续操作。
- 多路分支:添加多个
if分支实现类似switch-case的多路选择逻辑。
配置参数
If-Else 容器节点
| 属性名 | 类型 | 说明 | 默认值 |
|---|---|---|---|
id | string | 节点唯一标识(自动生成) | — |
name | string | 节点名称(自动生成,可自定义) | — |
outputDecisionDetail | boolean | 是否产出 @{块名.decision} 判断详情变量(见「输出判断详情」) | false |
If 分支节点
| 属性名 | 类型 | 说明 | 默认值 |
|---|---|---|---|
id | string | 分支唯一标识(自动生成) | — |
name | string | 分支名称(自动生成,可自定义) | — |
condition | Condition | 分支执行条件 | 空条件 |
Else 分支节点
| 属性名 | 类型 | 说明 | 默认值 |
|---|---|---|---|
id | string | 分支唯一标识(自动生成) | — |
name | string | 分支名称(自动生成,可自定义) | — |
Condition 结构
条件支持两种模式:
比较模式(默认):结构化三段比较。
| 字段 | 类型 | 说明 |
|---|---|---|
first | ValueSource | 左值(变量引用或字面量) |
compare | Compare | 比较操作符 |
second | ValueSource | 右值(变量引用或字面量) |
AI Prompt 模式:自然语言逐句判断(详见下文「AI Prompt 判断模式」)。
| 字段 | 类型 | 说明 |
|---|---|---|
mode | 'prompt' | 固定为 prompt;旧数据没有 mode/prompts 字段时按比较模式解析 |
prompts | string[] | 1 句或多句判断语句,每句由决策模型独立判定 true/false |
combine | 'all' | 'any' | all = 全部为真才为真(默认);any = 任一为真即真 |
modelId | string | 决策模型(可选,默认 jev-latest) |
ValueSource 结构(比较模式的左/右值通用):
sourceType | sourceValue 形态 | 说明 |
|---|---|---|
variable | [blockId, varName] 数组(新格式)或字符串 '@blockName.varName'(旧格式) | 变量引用 |
string / number / boolean | 对应类型的字面量 | 字面量 |
array | ValueSource[](每项递归解析) | 数组值源,Loop 列表循环的数据源即此类型 |
literal | 字符串 | 已弃用(等同于 string),仅为旧文档保留读兼容 |
变量引用的写法与语义:
- 新格式为
[blockId, varName]数组;varName里可以继续带路径(如struct_1.items.0.title)。 - 旧格式字符串
@blockName.varName、@blockName > varName均可解析;没有@前缀的blockName.varName也会尝试解析。 __default__解包:[blockId]、[blockId, '__default__']、@name、@name > __default__四种写法等价。- 引用密钥/凭据(
@{secrets.…})会被拒绝,解析结果为 undefined。
可用比较操作符及其求值语义:
| 操作符 | 说明 |
|---|---|
Equals / NotEquals | 严格相等(===):字符串 "60" 与数字 60 不相等 |
GreaterThan / GreaterThanOrEqual / LessThan / LessThanOrEqual | 数值比较:两侧经 Number() 强转,任一侧为 null/undefined/NaN 时结果为 false |
Contains / NotContains | 文本包含:两侧经 String() 强转后做子串判断(数字也会转成文本) |
输出变量
If-Else Block 本身不产生输出变量。被执行分支内各 Block 的输出直接写入全局上下文(可在外部引用);未走到的分支变量不存在,If-Else 之后不要同时引用两个分支里的变量。
开启「输出判断详情」开关(AI Prompt 条件,见下文)后额外产出:
| 变量名 | 类型 | 说明 |
|---|---|---|
@{块名.decision} | object | 整组 AI 判断详情(形状见下文) |
引用语法示例:
命中分支序号:{{ifElse_1.decision.matched}}
是否走了 else:{{ifElse_1.decision.else}}
某分支某题概率:{{ifElse_1.decision.branches.0.results.0.probability}}使用示例
示例 1:成功/失败分支处理
[Code Block] name: code_1
const score = {{struct_1.score}}
return score
[If-Else Block] name: ifElse_1
[If] condition: code_1.output GreaterThanOrEqual 60
[Generation Block] name: gen_pass
恭喜!分数 {{code_1.output}} 达到及格线,请生成祝贺信。
[Else]
[Generation Block] name: gen_fail
分数 {{code_1.output}} 未达标,请生成鼓励信。根据分数是否大于等于 60,执行不同的 Generation Block。
示例 2:多路分支
[If-Else Block] name: ifElse_1
[If] condition: struct_1.category Equals "技术"
[Generation Block] 按技术文章风格处理...
[If] condition: struct_1.category Equals "新闻"
[Generation Block] 按新闻简报风格处理...
[Else]
[Generation Block] 按通用风格处理...根据文章分类走不同的处理路径,类似 switch-case 逻辑。
运行时约束
- 适用文档类型:普通文档(document)。不可用于 skill 文档。
- 可插入上下文:文档顶层。
- 节点结构:容器节点(
content: 'decisionPrompt? if+ else?'),可选的「判断说明」子节点(AI Prompt 条件用,见下文)之后是至少一个if分支,else分支可选。 - 分支内容:每个分支(
if/else)必须包含至少一个子 Block。 - 执行语义:按顺序检测
if条件,命中后执行该分支并跳过其余分支。仅执行一个分支。
注意事项
- If-Else Block 最多只会执行一个分支。即使多个
if条件同时满足,也只执行第一个命中的。 - 如果所有
if条件都不满足且没有else分支,则整个 If-Else Block 不执行任何操作。 - 内部 Block 的输出直接写入全局上下文,不需要通过 If-Else Block 的变量中转。
- 条件中的左值和右值支持变量引用(如引用其他 Block 的输出)和字面量(字符串、数字、布尔值)。
- 在 skill 文档中不可使用 If-Else Block。
- Else-If 多分支:支持无限数量的 Else-If 分支(if / elseif / elseif / ... / else),无硬性上限。第一个条件为 true 的分支被执行,其余全部跳过。
- 分支变量互斥:if 和 else 分支内定义的变量是互斥的——运行时只有一个分支会执行,因此不能在外部同时引用两个分支的变量。
- 条件格式:比较模式的 Condition 使用结构化对象(
{first, compare, second});AI Prompt 模式使用{mode:"prompt", prompts, combine, modelId},不支持直接传字符串表达式。
AI Prompt 判断模式(条件)
If 分支的条件支持两种模式:
- 比较判断(默认):变量/字面量的结构化比较(Equals / Contains 等)
- AI Prompt 判断:用 1 句或多句自然语言描述判断条件,由决策模型(默认
jev-latest)对**容器块级「判断说明」**里的材料逐句判定 true/false:- 全部为真(默认)/ 任一为真 组合方式
- 判断依据只来自 If-Else 容器的判断说明(块级说明区,写法与 Decision Block 的判断说明一致:文字 +
@引用具体变量,或@上文引用全部上文的纯文本部分);图片/文件等多模态引用会明确报错 - 判断语句内嵌变量(2026-09-27):判断语句本身也可以
@引用变量(编辑器输入@触发变量菜单,存储为@{变量路径}文本)。求值时引用渲染为当前值直接进入题目文本;变量当前无值时渲染为占位符[暂无值]并在材料中附一句说明(告知模型该占位代表尚无值)——不报错、不跳过,由模型按题自行判定,any/all 组合按题自然生效。多模态引用与密钥引用与判断说明同口径报错拒绝
- 旧文档(未迁移、无说明)回退读取整段累计纯文本上文——行为与改造前一致;显式空说明会在求值时报错中止(lint 会提示补写)
- 判断失败(渠道错误/配置错误)会中止运行并报错,不会静默走 else 分支
判断说明的 Markdown IR 写法
导出为 Markdown IR 时,判断说明编码为容器标头/开注释之后的逐行 > 引用块区(显式空说明 = 单个 > 行;没有引用块区 = 旧格式)。写法与 Decision Block 的判断说明一致。
输出判断详情(可选开关)
配置面板的「输出判断详情」开关开启后,If-Else 执行完产出 @{块名.decision} 详情变量:
{
matched: 命中 if 的零基分支序号(无命中为 null),
else: 是否执行了 else 兜底(true/false),
branches: [
{ index: 分支序号, results: [ {value: true/false, probability?: 概率, probabilities?: {true:0.xx, false:0.xx}} ] }
]
}命中某个 if → matched=该分支序号, else=false;执行 else → matched=null, else=true;无命中且无 else → matched=null, else=false。branches 只含参与合并判断的 AI 条件分支。
整组条件一次判断
进入 If-Else 时,系统先收集当前这组 if / else-if 的全部 AI Prompt 条件,使用进入时的判断说明(一次解析、一次模型调用)取得所有问题的答案;然后按分支顺序,仅执行第一个满足条件的分支。即使多个分支为 true,也只执行第一个;全部为 false 则执行 else(如存在)。不需要额外添加 Decision Block。
例如三个分支分别判断「是否退款」「是否咨询价格」「是否咨询产品」,一次返回 false / true / true,只执行第二个分支。
- 每个分支仍可配置多句问题,按自身「全部为真 / 任一为真」组合。
- 同组提示词条件必须使用同一个模型;未指定模型使用默认
jev-latest。旧配置选择了不同模型时,需要手动统一。 - 全部提示词合计最多 64 个非空问题,不是 64 个分支;普通比较条件不占题数。超过上限会在请求前报错,不会自动拆成多次请求。
- 可以混用普通比较条件,它们仍在本地判断。只要存在 AI Prompt 条件,系统就会先请求全部 AI 条件,即使前面的普通条件已能命中。
- 后面分支的无效提示词、缺失答案或渠道错误也会让整组失败,不会静默当 false 或走 else。
- 概率沿用现有规则:≥ 0.5 为 true;不按置信度高低重新排序分支。
- 嵌套 If-Else 只有实际进入时才单独判断;循环中每次进入都会重新解析判断说明(说明里的 @变量 取当时最新值)并判断,不复用上次结果。
- 一次调用指一次逻辑模型调用,渠道重试或降级可能产生多次网络尝试。问题总量较大可能增加耗时,仍受现有超时限制。
如果判断结果还要供多个后续块复用,也可以先用 Decision Block 一次生成多个布尔变量(判断说明放在 Decision 块内),再在 If-Else 的比较条件中引用这些变量并与布尔值 true 比较。这些比较本身不会再请求模型。