Instructions¶
Logic-related¶
Conditions¶
Conditionally execute instructions
Parameters :
No parameter
Children nodes :
Every conditions will be represented as parallel branches on your graph, each beginning with a blue box allowing you to edit the condition itself, followed by the instruction that you will add for that specific condition.
A default branch is automatically added to configure what instructions to execute when no other condition matches.
More details on Conditions syntax
Repeat¶
Execute a list of instructions N times, or for each record from an array or object variable
Parameters :
- on : An array or object variable name to loop on. Each record will be available inside an item variable, and current index will be inside an $index variable.
- until : A number of times to repeat this loop. Each iteration number will be stored inside an item variable
If on and until parameters are used together, only the first until items from on will be iterated.
Children nodes :
When adding a Repeat instruction, a new graph branch will appear, allowing you to create the instructions that will be repeated.
Break¶
Stops currently executing automation
Parameters :
- scope : possible values : all (breaks all parents automations), automation (breaks current automation only), repeat (breaks parent repeat)
All¶
Execute the given instructions in parallel
Coming soon
Variable-related¶
Set¶
Set a new or existing variable
Parameters :
- name : Variable name
- value : Variable value (might be a JSON object, a string, a number, ...)
- type : replace to replace target variable with given value, merge to try merging objects or arrays, or push to push to an array. replace by default
Objects manipulation¶
When setting object fields, parent objects are created on-the-fly :
- set:
name: some.house.field
value: ok
Here, some
and some.house
are automatically created :
"some": {
"house": {
"field": "ok
}
}
It is also possible to create lists and automatically add items to their end with a variable name suffix []
:
- set:
name: session.names
type: push
value: Mickael
# or :
- set:
name: session.names[]
value: Mickael
Each time this set is executed, Mickael
is appended to the session.names
list variable.
Same feature with type: merge option :
- set:
name: session.names
type: merge
value: Mickael
When both previous value and value are arrays, type: merge concatenate value at the end of the previous value :
- set:
name: myArray
value:
- one
- set:
name: myArray
type: merge
value:
- two
- three
# {{myArray}} = ['one', 'two', 'three']
When both previous value and value are objects, type: merge merge them together :
- set:
name: 'myObject'
value:
firstName: Martin
- set:
name: 'myObject'
type: merge
value:
age: 25
# {{myObject}} = { "firstName": "Martin", "age": 25 }
Expressions¶
We can also use expressions inside value
parameter, with all the same features (arithmetic operators, comparisons, ...) conditions have :
- set:
name: counter
value: '{% {{counter}} + 1 %}
Note that {% ... %}
is not specific to the set
instruction but can be used anywhere in automations.
Delete¶
Delete a variable
Parameters :
- name : Variable name
Interaction-related¶
Fetch¶
Sends an HTTP request to call external web services
Parameters :
- URL : Target URL
- method : Request method (get | post | put | patch | delete)
- headers : Request headers
- query : Query string (as an object)
- body : Request body (might be a JSON object, a string, a number, ...)
- multipart : List of field definitions for multipart/form-data requests
- emitErrors : Boolean enabling or disabling error events upon 4xx or 5xx responses. Enabled by default.
- stream : For streamed SSE responses, emit data chunks as they are received
- outputMode : Choose between 'body' | 'detailed_response' | 'data_url'. Defaults to 'body' (output will be the response body), pick
detailed_response
in order to access response headers withinoutput.headers
and body withinoutput.body
- output : Name of the variable that will store the response body
When receiving 4xx or 5xx HTTP errors, a native event runtime.fetch.failed
is automatically emitted, including both request & response contents.
If Content-Type header is set to 'application/x-www-form-urlencoded', the body will be automatically transformed into an urlencoded body.
multipart
- fetch:
url: ..
multipart:
- fieldname: file
value: someBase64EncodedFile | someBufferArray
filename: filename.png # Required if value is a file
contentType: image/png # Optional
- fieldname: metadata
value: some random metadata
Handling SSE
By default, HTTP responses indicating a content-type: text/event-stream
header will force their responseMode to detailed_response
, and their {{output.body}}
will be a stream that can be read in real time from the calling automation :
- fetch:
url: "some SSE url (i.e openai /chat-completion endpoint)"
output: output
- repeat:
'on': '{{output.body}}'
do:
- set:
name: test[]
value: '{{item}}'
Here, the repeat
instruction will block until all chunks have been processed & the HTTP socket is closed.
Each {{item}}
will look like this :
{
"chunk": {
"data": [
"data1",
"data2"
]
}
}
data1
and data2
correspond to 2 individual chunks written by the remote server, which can be grouped together if they were received at the same time.If these data strings are valid JSON, they will be automatically parsed into objects.
Alternatively, we can emit
received chunks so they can be processed asynchronously & concurrently from other automations :
- fetch:
url: ..
stream:
event: chunk
payload:
foo: bar
Each chunk will be emitted like this :
{
"type": "chunk",
"payload": {
"chunk": {
"data": [
"data1",
"data2"
]
},
"additionalPayload": {
"foo": "bar"
}
}
}
Emit¶
Emit a new event.
Events size must not exceed 100Ko, larger events are blocked and an error event is emitted.
Parameters :
- event : Event name
- payload : JSON object that will be sent as the event payload
- target : An optional object specifying this event target
- autocomplete : An optional object helping to find all events that can be computed when you set variables in your event value
- private : Optionnal Boolean. Exclude this event name from autocomplete values. Set it to
false
if you don't want your event is known from out of your application. - options : optional object
target parameters :
- userId : target user id
- sessionId : target session id
- userTopic : target userTopic
Event targets are automatically granted read access to the event
options parameters :
- persist : boolean enabling or disabling events persistence. Enabled by default.
autocomplete parameter :
When a field use an autocomplete widget and ask for events:emit or events:listen data source, they will be extracted from current workspace and all its installed apps instructions. If the event is a simple string, no problem, but if it contains variables, this is a way to help people to know what are the expected values.
- from : should be config to target the current workspace configuration or appConfig to target the installed app from where the instruction comes configuration.
- path : a JSON Path string starting from the from target. The syntax is described in this project.
- template : sometimes the event name is not explicit because it comes from computed variables. You can help building values with a string containing static caracters and a
${value}
placeholder.
Exemples :
With this in your workspace DSUL:
config:
value:
things:
- foo
- bar
- emit:
event: 'event.{{var}}'
autocomplete:
var:
from: config
path: things~
or
- set:
name: event
value: 'event.{{var}}'
- emit:
event: '{{event}}'
autocomplete:
var:
from: config
path: things~
template: event.${value}
will generate automplete values : event.foo and event.bar.
Wait¶
Wait for an event. Pauses the current execution until the requested event is received.
Parameters :
- oneOf : Pauses until one of these events is received
- timeout : If waits timeouts after N seconds, resume execution & outputs an empty result. Defaults to 20
- output : Name of the variable that will store the received event
oneOf parameter :
List of event candidates with the following parameters :
- event : Event name, required
- filters : Free form JSON object for filtering on any event fields. For example :
- wait:
oneOf:
event: someEvent
filters:
source.correlationId: '{{run.correlationId}}'
- cancelTriggers : If true, cancels the execution of the usual triggers for this event. Other waits still receive this event.
Waiting for an event triggered automation to finish
In addition to every regular events which might be directly listened by automations, wait instruction can also waits for runtime.automations.executed event.
This native events tells when an automation finishes executing, with its source trigger & output.
Waiting for this allows you to emit an event, than hang until whichever automation that received it finishes processing :
AutomationA:
name: AutomationA
when:
endpoint: true
output: '{{output}}'
do:
- emit:
event: 'someEvent'
output: emittedIntentEvent
- wait:
oneOf:
- event: runtime.automations.executed
# Filters specifically for our emited event
filters:
payload.trigger.id: '{{emittedIntentEvent.id}}'
output: event
- set:
name: output
value: '{{event.payload.output}}'
AutomationB:
name: AutomationB
when:
events:
- someEvent
output: 'someOutput'
do: []
createUserTopic¶
Create a new userTopic.
User topics allow sending events to multiple users without knowing who they are in advance, automatically granting them read access to these events without requiring any API Key.
Parameters :
- topic : Topic name
- userIds : List of the first userIds to join this topic
joinUserTopic¶
Makes a given user join a userTopic.
Joining a userTopic automatically grants read access to any event sent within this topic.
Parameters :
- topic : Topic name to join
- userIds : List of the userIds to join this topic. If not defined, automatically pick current user's id
rateLimit¶
Enforce custom rate limits per consumer during automation execution.
Required parameters :
- name : Rate limit name, i.e your automation name
- consumer : Consumer stable string identifier (user id, ip, project id, ...)
- window : Rate limit window in seconds (60 for 1 minute, 3600 for 1 hour, ...)
- limit : Maximum number of points consumer can use over given window
Optional parameters :
- consume : Number of points we want to consume per call (defaults to 1)
- break : Set to false in order to receive errors instead of breaking current automation (defaults to true)
Example :
- rateLimit:
name: FetchMyApi
window: 60
limit: 2
consumer: '{{user.id}}'
break: false # We want to handle errors ourself
output: limits
- conditions:
'!{{limits.ok}}':
...
Output limits variable will be :
{
"operation": "FetchMyApi",
"retryAfter": 58.458, // Number of seconds we have to wait before our limit resets
"limit": 2,
"window": 60,
"remaining": 0,
"ok": false,
"consumer": "<consumer user id>"
}