模板字符串语法
自动化节点的几乎所有文本字段(HTTP body、URL、命令行参数、LLM prompt、通知文案 …)
都支持模板字符串:用 {{#nodeId.varName.path#}} 嵌入上游节点的输出,运行时引擎
(pkg/engine/workflow/resolver.go)会按节点输出 namespace 解析并替换。
{{#nodeId.varName.path.to.field#}}| 段 | 含义 | 例子 |
|---|---|---|
nodeId | 上游节点的内部 id(不是 label) | findUser |
varName | 节点输出的 namespace(由节点类型决定) | records / body / output |
path | 嵌套对象的字段路径,可选 | data.items[0].name |
包围标记是 {{# 和 #}}(两个 {/} + 一个 #)—— 这跟 Vue 模板的 {{ }}
故意错开,避免在 mdx / 文档里被误解析。
引用查找记录节点的第一条记录
Section titled “引用查找记录节点的第一条记录”https://api.example.com/users/{{#findUser.records[0].id#}}findUser 是一个 FindRecords 节点(id 由你在画板上设),它的输出 namespace 是
records(一个数组)。[0] 取第一条,.id 取那条记录的 id 字段。
拼 HTTP body
Section titled “拼 HTTP body”{ "name": "{{#findUser.records[0].name#}}", "age": {{#findUser.records[0].age#}}}嵌套 if-else 输出
Section titled “嵌套 if-else 输出”IfElse 节点会标记 case id 给下游用:
当前分支:{{#myIfElse.case#}}LLM 节点引用
Section titled “LLM 节点引用”请基于以下数据写一段摘要:
记录数:{{#findUser.records.length#}}第一条标题:{{#findUser.records[0].title#}}节点输出的 namespace 速查
Section titled “节点输出的 namespace 速查”不同节点类型的 varName 不一样:
| 节点 | 主 namespace | 形状 |
|---|---|---|
FindRecords | records | Array<{id, ...cells}> |
CreateRecord / UpdateRecord | record | {id, ...cells} |
HttpRequest | body / status / headers | string / number / object |
LLM | output | string |
CommandLine | stdout / stderr / exitCode | string / number |
TriggerRecord | record / event | 触发那行 + ‘create’/‘update’/‘delete’ |
TriggerWebhook | body / headers / query | 外部 POST 进来的原样 |
IfElse | case | 命中的 case id |
Loop | item / index | 当前循环值 + 序号 |
完整 schema 见 节点参考页 或仓库内 pkg/engine/workflow/executors.go。
❌ 用了 label 而不是 id
Section titled “❌ 用了 label 而不是 id”{{#查找记录.records[0].id#}} ← 错,"查找记录" 是 label{{#findUser.records[0].id#}} ← 对,nodeId 是画板上节点配置里的 id节点 id 在节点头浮窗能看到;新建节点时引擎按 <type>_<rand> 生成(如 findRecords_abc),
可以手动改成短名(推荐)。
❌ 路径少了一段
Section titled “❌ 路径少了一段”FindRecords 输出是数组,不能直接 .id,要 [0].id:
{{#findUser.id#}} ← 错,records 是数组,没有顶层 id{{#findUser.records[0].id#}} ← 对❌ 字符串字段没套引号(JSON 上下文)
Section titled “❌ 字符串字段没套引号(JSON 上下文)”{ "name": {{#findUser.records[0].name#}} } ← 错,渲染出 { "name": Alice } 不是合法 JSON{ "name": "{{#findUser.records[0].name#}}" } ← 对❌ 引用了下游节点
Section titled “❌ 引用了下游节点”节点只能引用上游(执行顺序在自己前面的)节点。BFS 引擎按图遍历,到本节点 执行时只有上游变量在 scope 里。下游节点的引用会渲染成空字符串。
❌ 上游被 if-else “杀掉”
Section titled “❌ 上游被 if-else “杀掉””如果上游节点在 IfElse 的某个分支里,且当前执行没走那条分支,引擎会把整条边
标 skipped,被它引用就拿不到值。这种情况下变量渲染为空串。
- 试运行:编辑器右下角运行历史面板里展开节点查看 input / output; 变量没解析对会肉眼可见。
- 变量选择器:节点配置面板里 hover 输入框右上角的
{ }按钮,会弹出 一个变量树,从上游节点的输出 schema 里点选 —— 避免手敲拼错节点 id。 - JSON 转义:自动化引擎不对模板做 JSON 转义。如果上游变量本身就是字符串
且可能含双引号 / 换行,建议用
JSON.stringify()风格的中间节点(CommandLine 走echo+jq或 LLM 包一层)。