Action — одна из сущностей DSL, которая представляет собой реакцию на какое-либо событие. Например, отправка сообщения, запрос данных у внешней системы, изменение состояния и т.д.
Actions, которые будут использоваться многократно, хранятся в static/references/actions
.
Ниже описаны основные Actions, которые передаются в поле type:
- Actions по умолчанию
- Составные Actions
- Actions для управления сценарием
- Actions для интеграции с внешними системами
- Actions для взаимодействия с пользователем
- Actions для взаимодействия с счетчиками
- Actions для взаимодействия с переменными
Виды Actions
Actions по умолчанию
Тип | Описание |
---|---|
None |
|
{
"type": null
}
Составные Actions
Ниже представлено описание Actions, которые комбинируют другие Actions.
Тип | Описание |
---|---|
requirement |
Используемые параметры:
|
{
"type": "requirement",
"action": {
"type": "do_nothing",
"command": "ANSWER_TO_USER",
"nodes": {
"text": "Номер указан не верно, введите еще раз."
}
},
"requirement": {
"type": "external",
"requirement": "number_is_wrong"
}
}
Тип | Описание |
---|---|
else |
Используемые параметры:
|
{
"type": "else",
"requirement": {
"type": "external",
"requirement": "callcenter_white_list"
},
"action": {
"type": "external",
"action": "nothing_found"
},
"else_action": {
"type": "external",
"action": "just_callcenter_action"
}
}
Тип | Описание |
---|---|
choice |
Если не выполнен ни один из requirement_action и при этом указан else_action, то будет выполнен else_action (его использование необязательно, ключ может быть пропущен). Используемые параметры:
|
{
"type": "choice",
"requirement_actions": [
{
"requirement": {
"type": "external",
"requirement": "number_is_ok"
},
"action": {
"nodes": {
"answer": [
[
"Ваш номер {{main_form_phone_number}} введен верно"
]
]
}
}
},
{
"requirement": {
"type": "external",
"requirement": "number_is_wrong"
},
"action": {
"nodes": {
"answer": [
[
"Номер указан не верно, введите еще раз"
]
]
}
}
}
],
"else_action": {
"nodes": {
"answer": [
[
"Ваш номер и не ok, и не ok. Странно это"
]
]
}
}
}
Тип | Описание |
---|---|
external |
Используемые параметры:
|
{
"type": "external",
"action": "approve"
}
Тип | Описание |
---|---|
composite |
Используемые параметры:
|
{
"type": "composite",
"actions": [
{
"nodes": {
"answer": [
[
"Сейчас переведем вас на оператора"
]
]
}
},
{
"type": "external",
"action": "callcenter_action"
}
]
}
Actions для управления сценарием
Ниже представлено описание Actions, которые позволяют управлять сценарием и его компонентами.
Тип | Описание |
---|---|
clear_form_by_id |
Используемые параметры:
|
{
"type": "clear_form_by_id",
"form": "hello_app_form"
}
Тип | Описание |
---|---|
clear_inner_form_by_id |
Используемые параметры:
|
{
"type": "clear_form_by_id",
"form": "hello_app_form",
"inner_form": "inner_hello_app_form"
}
Тип | Описание |
---|---|
break_scenario |
По умолчанию форма сценария не очищается. Для этого необходимо использовать action |
{
"type": "break_scenario"
}
Тип | Описание |
---|---|
remove_form_field |
Используемые параметры:
|
{
"type": "remove_form_field",
"form": "form_name",
"field": "field_name"
}
Тип | Описание |
---|---|
remove_composite_form_field |
Используемые параметры:
|
{
"type": "remove_composite_form_field",
"form": "form_name",
"inner_form": "inner_form_name",
"field": "field_name"
}
Тип | Описание |
---|---|
run_scenario |
Используемые параметры:
|
{
"type": "run_scenario",
"scenario": "hello_app_scenario"
}
Тип | Описание |
---|---|
fill_field |
Используемые параметры:
|
{
"type": "fill_field",
"form": "form_name",
"field": "field_name",
"data_path": "data"
}
Тип | Описание |
---|---|
composite_fill_field |
Используемые параметры:
В качестве данных в |
{
"type": "composite_fill_field",
"form": "form_name",
"internal_form": "internal_form_name",
"field": "field_name",
"data_path": "data"
}
Тип | Описание |
---|---|
clear_scenario_by_id |
Используемые параметры:
|
{
"type": "clear_scenario_by_id",
"scenario_id": "SF_Vacations"
}
Тип | Описание |
---|---|
run_last_scenario |
|
{
"type": "run_last_scenario"
}
Тип | Описание |
---|---|
|
Используемые параметры:
|
{
"type": "reset_current_node",
"node_id": "your_node_id"
}
Тип | Описание |
---|---|
clear_current_scenario |
|
{
"type": "clear_current_scenario_form"
}
Тип | Описание |
---|---|
clear_current_scenario_form |
|
{
"type": "clear_current_scenario_form"
}
Тип | Описание |
---|---|
choice_scenario |
|
{
"type": "choice_scenario",
"scenarios": [
{
"scenario": {...},
"requirement": {...}
},
...
{
"scenario": {...},
"requirement": {...}
}
],
"else_action": {...}
}
Actions для интеграции с внешними системами
Ниже представлено описание Actions, которые позволяют сделать запрос из DSL и получить данные из внешних систем.
Название | Описание |
---|---|
save_behavior |
Используемые параметры:
|
{
"type": "save_behavior",
"check_scenario": true,
"behavior": "behavior_name"
}
Название | Описание |
---|---|
self_service_with_state |
Используемые параметры:
|
{
"type": "self_service_with_state",
"behavior": "common_behavior",
"command_action": {
"command": "INTEGRATIO_REQUEST",
"request_type": "kafka",
"request_data": {
"topic_key": "integration"
},
"nodes": {
"uniqueId": "test123"
}
}
}
Название | Описание |
---|---|
proccess_behavior |
|
{
"type": "process_behavior"
}
Название | Описание |
---|---|
http_request |
Используемые параметры:
|
{
"type": "http_request",
"behavior": "some_behavior",
"params": {
"url": "http://127.0.0.1",
"method": "post",
"json": {
"type": "unified_template",
"template": "{{data|to_json}}"
},
"some_request_param": 123
},
"store": "some_variable"
}
Actions для взаимодействия с пользователем
Ниже представлено описание Actions, которые позволяют взаимодействовать с пользователем.
Тип | Описание |
---|---|
string |
Используемые параметры:
|
Описание в DSL
{
"type": "string",
"command": "ANSWER_TO_USER",
"nodes": {
"pronounceText": "",
"items": [
{
"bubble": {
"text": "Чтобы прослушивать музыку, нужно авторизоваться в приложении Сбер"
}
}
],
"finished": true
}
}
Результат выполнения
[
{
"message_name": "RECHARGE_MOBILE",
"payload": {
"phone": "+79173213232",
"amount": 100
}
}
]
Тип | Описание |
---|---|
ask_again | AskAgainAction — это action, который позволяет повторно задать вопрос пользователю из последнего сценария и поля, к которому был задан последний вопрос. |
Описание в DSL
{
"type": "ask_again"
}
Тип | Описание |
---|---|
sdk_answer |
Используемые параметры:
|
Описание в DSL
{
"type": "sdk_answer",
"pronounceText": [
"Вот.",
"Смотрите."
],
"items": [
{
"bubble": {
"text": [
"Вот.",
"Смотрите.",
"Пожалуйста."
]
}
},
{
"card": {
"type": "unified_template",
"template": "{{ main_form.start.cards_to_show|tojson }}",
"loader": "json"
}
}
],
"suggestions": {
"buttons": [
{
"title": [
"Почему по карте минус"
],
"action": {
"text": "Почему по карте минус",
"type": "text"
}
}
]
}
}
Описание массива items и объекта suggestions смотрите в документации SmartApp API.
Тип | Описание |
---|---|
do_nothing |
Используемые параметры:
|
Описание в DSL
{
"type": "do_nothing",
"command": "ANSWER_TO_USER",
"nodes": {
"text": "Попробуй еще"
}
}
Результат выполнения
[
{
"message_name": "ANSWER_TO_USER",
"payload": {
"text": "Попробуй еще"
}
}
]
Тип | Описание |
---|---|
sdk_answer_to_user |
Используемые параметры:
Внутри элементов, можно добавлять requirement, который будет выполняться, и только в этом случае этот элемент может быть выбран. |
Пример запроса
{
"type": "sdk_answer_to_user",
"static": {
"ios_card": {
"type": "list_card",
"cells": [
{
"ios_params": "ios"
}
]
},
"android_card": {
"type": "list_card",
"cells": [
{
"android_params": "android"
}
]
},
"static_sg_dl": "www.www.www",
"static_sg_text": "static suggest text"
},
"random_choice": [
{
"random_choice_greeting": "random text1"
},
{
"random_choice_greeting": "random text2"
}
],
"root": [
{
"type": "pronounce_text",
"text": "random_choice_greeting"
}
],
"items": [
{
"type": "item_card",
"text": "ios_card",
"requirement": {
"type": "external",
"requirement": "OCTOBER_iOS"
}
},
{
"type": "item_card",
"text": "android_card",
"requirement": {
"type": "external",
"requirement": "OCTOBER_android"
}
},
{
"type": "bubble_text",
"text": "random_choice_greeting"
}
],
"suggestions": [
{
"type": "suggest_text",
"text": "static_sg_text",
"title": "tittle1"
},
{
"type": "suggest_deeplink",
"title": "title2",
"deep_link": "static_sg_dl"
}
]
}
Результат запроса
{
"items": [
{
"card": {
"type": "list_card",
"cells": [
{
"ios_params": "ios"
}
]
}
},
{
"bubble": {
"text": "random text2",
"markdown": True
}
}
],
"suggestions": {
"buttons": [
{
"title": "tittle1",
"action": {
"text": "static suggest text",
"type": "text"
}
},
{
"title": "title2",
"action": {
"deep_link": "www.www.www",
"type": "deep_link"
}
}
]
},
"pronounceText": "random text2"
}
Тип | Описание |
---|---|
push |
Используемые параметры:
|
Описание в DSL
{
"type": "push",
"surface": "COMPANION",
"push_data": {
"notificationHeader": "{% if day_time = 'morning' %}Время завтракать!{% else %}Хотите что нибудь заказать?{% endif %}",
"fullText": "В нашем магазине большой ассортимент{% if day_time = 'evening' %}. Успей заказать!{% endif %}",
"mobileAppParameters": {
"DeeplinkAndroid": "deep_link_url",
"DeeplinkIos": "deep_link_url",
"Logo": "icon_url"
}
}
}
О том, как отправить push-уведомление через HTTP, читайте в разделе Отправка push-уведомлений в Studio.
Actions для взаимодействия с счетчиками
Ниже представлено описание Actions, которые позволяют взаимодействовать с счетчиками.
Тип | Описание |
---|---|
counter_increment |
Используемые параметры:
|
{
"type": "counter_increment",
"key": "greeting"
}
Тип | Описание |
---|---|
counter_decrement |
Используемые параметры:
|
{
"type": "counter_decrement",
"key": "greeting"
}
Тип | Описание |
---|---|
counter_clear |
Используемые параметры:
|
{
"type": "counter_clear",
"key": "greeting"
}
Тип | Описание |
---|---|
counter_set |
Используемые параметры:
|
{
"type": "counter_set",
"key": "msgs_failed_before_operator_switch",
"value": 1,
"time_shift": 0,
"reset_time": false
}
Тип | Описание |
---|---|
counter_copy |
Используемые параметры:
|
{
"type": "counter_copy",
"source": "counter_name_1",
"destination": "counter_name_2",
"time_shift": 0,
"reset_time": false
}
Actions для взаимодействия с переменными
Ниже представлено описание Actions, которые позволяют взаимодействовать с переменными.
Тип | Описание |
---|---|
set_variable |
Используемые параметры:
|
{
"type": "set_variable",
"key": "greeting",
"value": "Привет!"
}
Тип | Описание |
---|---|
delete_variable |
Используемые параметры:
|
{
"type": "delete_variable",
"key": "greeting"
}
Тип | Описание |
---|---|
clear_variables |
|
{
"type": "clear_variables"
}
Тип | Описание |
---|---|
set_local_variable |
Используемые параметры:
|
{
"type": "set_local_variable",
"loader": "float",
"key": "x",
"value": "5"
}
Как передавать элементы интерфейса в Actions
Чтобы в ответ на запрос пользователя передать текст или карточки, используйте StringAction
и команду ANSWER_TO_USER
в Actions для взаимодействия с пользователем.
Пример Action для отправки текста:
"action": {
"type": "string",
"command": "ANSWER_TO_USER",
"nodes": {
"pronounceText": "Пример отправки текста",
"items": [
{
"bubble": {
"text": "*Пример текста",
"markdown": true,
"expand_policy": "auto_expand"
}
}
]
}
}
Пример Action для отправки карточек с помощью jinja-шаблона и без него:
"action": {
"type": "string",
"command": "ANSWER_TO_USER",
"nodes": {
"pronounceText": "Пример отправки карточек с помощью jinja-шаблона и без него",
"items": [
{
"card": {
"type": "unified_template",
"template": "{{main_form.start.card|tojson}}",
"loader": "json"
}
},
{
"card": {
"type": "list_card",
"cells": [
{
"type": "left_right_cell_view",
"paddings": {
"left": "8x",
"top": "8x",
"right": "8x",
"bottom": "8x"
},
"left": {
"type": "simple_left_view",
"texts": {
"title": {
"text": "Рассказать о возможностях смартаппа",
"typeface": "body1",
"text_color": "default"
},
"subtitle": {
"text": "Помощь и инструкции",
"typeface": "footnote1",
"text_color": "secondary",
"max_lines": 0,
"margins": {
"top": "2x"
}
}
}
},
"right": {
"type": "disclosure_right_view"
},
"actions": [
{
"type": "text",
"text": "Возможности смартаппа"
}
]
}
]
}
}
]
}
}
Описание формата объектов bubble
и card
ищите в разделе Карточки и тексты.
Как добавить свой Action
Для добавления своего Action необходимо:
Реализовать новый Action, производный от класса
core.basic_models.actions.basic_actions.Action
. При этом необходимо реализовать асинхронный методrun
, который будет вызван при запуске:async def run(self, user: BaseUser, text_preprocessing_result: BaseTextPreprocessingResult,
params: Optional[Dict[str, Union[str, float, int]]] = None) -> Optional[List[Command]]:Разместить новый Action в
app/basic_entities/actions.py
своего смартапа, либо создать новый модуль в удобном месте.Зарегистрировать Action в классе
CustomAppResources
для вызова по названию:/app/resources/custom_app_resources.py#CustomAppResources внутри метода init_actions
class CustomAppResources(SmartAppResources):
def init_actions(self):
super(CustomAppResourses, self).init_actions()
actions["simple_action"] = SamlpeActionДобавить unit-test на новый Action.
Кэширование результатов проверки условий
Если в действии проверяется условие, результат проверки можно сохранить в кэше. Этот результат будет использован при повторной проверке условия в другом действии. Использование сохраненных результатов I/O-bound условий повышает скорость исполнения сценария.
Вы также можете поддержать кэширование в собственных условиях.
Чтобы сохранить результат проверки, при декларации условия в действии укажите поле requirement.cache_result: true
:
{
"type": "else",
"requirement": {
"type": "external",
"cache_result": true,
"requirement": "my_http_classifier"
},
"action": {
"type": "external",
"action": "nothing_found"
},
"else_action": {
"type": "external",
"action": "just_callcenter_action"
}
}
При проверке условия в новом действии, объявление условия должно совпадать с тем, как оно было объявлено впервые: поля указаны в том же порядке, значения полей одинаковы.
Для получения результата, сохраненного в примере выше, повторная проверка условия должна выглядеть так:
{
"requirement": {
"type": "external",
"cache_result": true,
"requirement": "my_http_classifier"
},
}