Overview
Written by
Updated at August 18, 2026
Note
Currently, there are two UIs that support Workflows: Yandex Cloud
- Workflows created in the Yandex Cloud UI are automatically available in the AI Studio UI.
- Workflows created in the AI Studio UI are not available in the Yandex Cloud UI.
Starting September 3, 2026, Workflows will no longer be supported in the Yandex Cloud UI. To create and manage workflows, use the AI Studio UI.
Workflow
For a JSON schema of a workflow, visit this GitHub repository
| Field name | Type | Required | Description |
|---|---|---|---|
yawl |
string |
Yes | Specification language version. The possible value is 0.1. |
start |
string |
Yes | ID of the step to start off the workflow execution. |
defaultRetryPolicy |
RetryPolicy | None | Retry policy applied by default to any step throwing an error during execution. |
steps |
map<string, Step> |
Yes | Description of workflow steps. Object where key is the step ID selected by the user, and value is the object describing the step parameters. |
Step object
| Field name | Type | Required | Description |
|---|---|---|---|
title |
string |
None | Step name. |
description |
string |
None | Step description. |
<step_type> |
string(FunctionCall| ContainerCall| HTTPCall| GRPCCall| YDBDocument| YDS| YMQ| FoundationModelsCall| ObjectStorage| Disk| Tracker| Postbox| Workflow| TelegramBot| AIStudioAgent| VectorStore| DatabaseQuery| OCR| STT| Switch| Foreach| Parallel| Success| Fail| NoOp| Wait| While) |
Yes | Step specification. Possible parameters depend on selected <step_type>. |
Integration steps
- HTTPCall
- GRPCCall
- YMQ
- YDS
- YDBDocument
- FunctionCall
- ContainerCall
- FoundationModelsCall
- ObjectStorage
- Tracker
- Postbox
- Workflow
- Disk
- TelegramBot
- AIStudioAgent
- VectorStore
- DatabaseQuery
- OCR
- STT
Common fields
The fields described herein are available for all integration steps.
| Field name | Type | Required | Default value | Description |
|---|---|---|---|---|
input |
string |
None | Overall state of the workflow | jq template to filter the workflow state fed into the step. |
output |
string |
None | Step output data | A jq template to filter the step outputs added into the workflow state. |
next |
string |
None | None | ID of the next step. |
retryPolicy |
RetryPolicy | None | defaultRetryPolicy, if set on the workflow level |
Retry policy applied if a step throws an error during execution. |
timeout |
Duration |
None | 15 minutes | Maximum step execution time. |
catch |
CatchRule[] | None | [] |
Transition rules for errors encountered during a step. The rules are applied one by one following the retryPolicy. |
RetryPolicy object
| Field name | Type | Required | Default value | Threshold value | Description |
|---|---|---|---|---|---|
errorList |
WorkflowError[] |
Yes | [] |
— | List of errors for which the step will be retried. Read more in Possible error codes. |
errorListMode |
INCLUDE/EXCLUDE |
None | INCLUDE |
— | Error selection mode: INCLUDE to retry on errors listed in error_list; EXCLUDE to retry on any error other than those listed in error_list. |
initialDelay |
Duration |
None | 1s |
1s |
Initial value for a delay between retries. |
backoffRate |
double |
None | 1.0 |
1.0 |
Multiplier for time between each next retry. |
retryCount |
int |
None | 0 |
100 |
Maximum number of reattempts. |
maxDelay |
Duration |
None | 1s |
1h |
Maximum delay between retries. |
CatchRule object
| Field name | Type | Required | Default value | Threshold value | Description |
|---|---|---|---|---|---|
errorList |
WorkflowError[] |
Yes | [] |
— | List of errors to apply the transition rule to. For more information, see Possible error codes. |
errorListMode |
INCLUDE/EXCLUDE |
None | INCLUDE |
— | Error selection mode: INCLUDE to apply the transition rule to errors from error_list; EXCLUDE, to any error except those from error_list. |
output |
string |
Yes | None | — | A jq template to filter the step outputs added into the workflow state. Input data for filtering: an ErrorInfo object. If a step throws an error covered by a transition rule (catch), the jq template specified in the output field of the entire step is not applied. |
next |
string |
Yes | None | — | ID of the next step. |
ErrorInfo object
| Field name | Type | Description |
|---|---|---|
error |
WorkflowError |
Error type. |
message |
string |
Error text message. |
Control steps
Specification example
For the workflow covered by the YaWL specification below, execution is contingent upon input data (input).
| Payload | Result |
|---|---|
{"final_action": "success"} |
Success |
{"final_action": "fail"} |
fail now! error |
| Other inputs | Error code: STEP_NO_CHOICE_MATCHED, message: no condition is true, and there is no default |
YaWL specification
yawl: "0.1"
start: parallel_step
steps:
parallel_step:
parallel:
next: join_post_and_users
branches:
fetch_posts_branch:
start: fetch_posts
steps:
fetch_posts:
httpCall:
url: https://jsonplaceholder.typicode.com/posts
method: GET
next: filter_posts
output: '\({"posts": .})'
filter_posts:
functionCall:
functionId: b09kpe9j2c5l********
retryPolicy:
errorList:
- HTTP_CALL_502
input: |-
\({
"posts": .posts,
"action": "filter"
})
fetch_users_branch:
start: fetch_users
steps:
fetch_users:
httpCall:
url: https://jsonplaceholder.typicode.com/users
method: GET
retryPolicy:
errorList:
- HTTP_CALL_500
- HTTP_CALL_502
- HTTP_CALL_429
backoffRate: 2.0
initialDelay: 2s
retryCount: 5
output: '\({"users": .})'
join_post_and_users:
functionCall:
next: crop_long_posts
functionId: b09kpe9j2c5l5********
input: |-
\({
"posts": .fetch_posts_branch.posts,
"users": .fetch_users_branch.users,
"action": "join"
})
crop_long_posts:
foreach:
next: grpc_call
input: \(.user_posts)
do:
start: filter_long_posts
steps:
filter_long_posts:
switch:
choices:
- condition: |-
.body | length > 160
next: call_crop_long_posts
default:
next: do_nothing
call_crop_long_posts:
containerCall:
containerId: flh16b3vmu3n********
body: |-
\({
"user_post": .,
"action": "crop"
})
do_nothing:
noOp:
next: ymq_write
ymq_write:
ymq:
put:
body: |-
\(.)
queueArn: "yrn:yc:ymq:ru-central1:aoehdt6d6hbk********:test-queue"
output: |-
\({
"queue_res": .
})
output: |-
\({
"user_posts": .
})
grpc_call:
grpcCall:
useServiceAccount: true
endpoint: 'serverless-functions.api.cloud.yandex.net:443'
method: yandex.cloud.serverless.functions.v1.FunctionService/List
body: |-
\({
"folder_id": "aoehdt6d6hbk********"
})
next: ydb_call
ydb_call:
ydbDocument:
database: "/ru-central1/aoedgvjds14c********/cc8dg7eqfuod********"
update:
key: |-
\({
"x": 123
})
expression: |-
SET name = :name
expressionAttributeValues: |-
\({
":name": "myname1"
})
tableName: "doc-table"
next: yagpt_call
yagpt_call:
foundationModelsCall:
modelUrl: gpt://aoehdt6d6hbk********/yandexgpt/latest
generate:
maxTokens: 100
messages:
messages:
- role: system
text: "Define the language of this text"
- role: user
text: \(.posts.[0].body)
next: yds_step
yds_step:
yds:
topic: test-topic
database: /ru-central1/aoedgvjds14c********/cc8dg7eqfuod********
put:
body: "Hello world!"
partitionKey: \(. | tostring | length)
next: storage_step
storage_step:
objectStorage:
bucket: werelaxe-public-bucket
object: file
put:
content: \(.)
next: final_parallel
final_parallel:
parallel:
branches:
wait_branch:
start: wait_call
steps:
wait_call:
functionCall:
functionId: b09kpe9j2c5l********
input: |-
\({
"action": "wait",
"delay": 10
})
terminate_branch:
start: terminate_switch
steps:
terminate_switch:
switch:
choices:
- condition: .final_action == "success"
next: success_step
- condition: .final_action == "fail"
next: fail_step
success_step:
success: {}
fail_step:
fail:
errorMessage: "fail now!"
output: \(.terminate_branch.fetch_posts_branch)