Flows file
Flows file defines the flows to be run. It specifies the structure and sequence of flows, including their associated nodes, parameters, and macros settings.
Basic Syntax
Flows file is expressed in YAML format. The basic syntax is as follows:
---
<flows type| sequential or concurrent>:
flows:
- name: "flow name1"
flow:
- <node type>:
name: "node name1"
<node parameter1>: "param1"
<node parameter2>: "param2"
- name: "flow name2"
flow:
- <node type>:
name: "node name2"
<node parameter1>: "param1"
<node parameter2>: "param2"
- <node type>:
name: "node name2"
<node parameter1>: "param1"
<node parameter2>: "param2"
macros:
<macro name>: "macro data"
The flow type can be set to either sequential
or concurrent
.
Sequential flows run each flow in the order they are defined, from top to bottom.
Concurrent flows run multiple flows in parallel.
The elements that make up the flows are organized in the following hierarchical structure.
├── flows type
│ └── flows
│ ├── flow
│ │ ├── node
│ │ │ ├── parameter
│ │ │ └── parameter
│ │ └── node
│ │ ├── parameter
│ │ └── parameter
│ └── flow
│ ├── node
│ │ ├── parameter
│ │ └── parameter
│ └── node
│ ├── parameter
│ └── parameter
└── macros
├── macro
└── macro
Parent node
The nodes that constitute a flow are generally linked in a sequential manner. By default, a node implicitly considers the previously defined node as its parent.
For example, consider the following flow file.
- name: "flow"
flow:
- <node-A>:
name: "A"
- <node-B>:
name: "B"
- <node-C>:
name: "C"
The structure of the flow in the above example is as follows.
flowchart LR A --> B --> C
Below is an example demonstrating how to explicitly define a parent node. parent
parameter can be used to set a parent node.
Note that when specifying the parent node, the name in the name
parameter must be used.
- name: "flow"
flow:
- <node-A>:
name: "A"
- <node-B>:
name: "B"
parent: "A"
- <node-C>:
name: "C"
parent: "B"
Almost all nodes implicitly have a parameter called child
. When only the node name is specified in the parent
parameter, the reference is assigned to the child
parameter of that node. If you want to assign a node to a parameter other than child
in the control nodes, use the format <node name>.<parameter>
.
The following is an example that uses an if
node, which is categorized as the control node.
if
node supports two special child nodes: child_if
and child_else
. If the condition
parameter evaluates to True, the child_if
node is processed; otherwise, the child_else
node is processed. Once either of these branches completes, the standard child
node is subsequently processed.
- name: "flow"
flow:
- <node-A>:
name: "A"
- if:
name: "if-node"
condition: "1 == 1"
- <node-B>:
name: "B"
parent: "if-node.child_if"
- <node-C>:
name: "C"
- <node-D>:
name: "D"
parent: "if-node.child_else"
- <node-E>:
name: "E"
- <node-F>:
name: "F"
parent: "if-node"
- <node-G>:
name: "G"
The structure of the flow in the above example is as follows.
flowchart LR A --> if-node if-node -- child_if --> B --> C if-node -- child_else --> D --> E C --> F E --> F F --> G
Expressions
Within the node parameters, segments of a string that are enclosed in double curly braces ({{ }}
) are interpreted as expressions.
Expressions are generally evaluated before the execution of the node process.
Variables
Variables can be used within these expressions. The following table lists the names used to reference each variable within expressions.
Variable type |
Reference within expressions |
---|---|
Flowdata |
|
Blackboard |
|
Macros |
|
Variables stores values of arbitrary data types in a key-value dictionary structure. The following are examples of how to reference each variable.
# Access the value of 'key1' from the flowdata with dot (.) access.
item: "{{ fd.key1 }}"
# Access the value of 'key1' from the flowdata with subscript syntax ([]).
item: "{{ fd['key1'] }}"
# Access the value of 'name' from the dictionary stored under the 'key2' in the blackboard.
item: "{{ bb.key2.name }}"
# Access the value of 'head' from the macros.
item: "{{ macro.head }}"
Filters
Variables and data in expression can be manipulated using filters. Filters follow the variable and separated by a pipe symbol (|
).
Some filters require optional arguments in parentheses.
Multiple filters can be chained together, where the output of one filter is passed as the input to the next.
For example, {{ {"key1": 1, "key2": 2} | dict_keys }}
returns ["key1", "key2"]
.
For more information about each filter, see Filters page.
Operators
The table below shows the operators that can be used within expressions, as well as their order of precedence.
Operator |
Description |
---|---|
|
Grouping |
|
Multiplication, division, floor division, remainder |
|
Addition and subtraction |
|
Comparison and identity/membership tests |
|
Boolean NOT |
|
Boolean AND |
|
Boolean OR |
Data Types
The following data types are available for use within expressions. Most of them can be referenced in the same way as Python data types. However, list slicing is not supported.
str
int
float
bool
list
dict