Общие теги действий для проектов
В JAICP DSL есть особые теги действий, которые позволяют вызвать из стейта отдельный сценарий. Если вам не хватает встроенных тегов действий, вы можете создать свои.
По умолчанию ваши собственные теги доступны только в том проекте, в котором они созданы. Однако при помощи дополнительной настройки вы можете сделать тег доступным во всех проектах группы. Например, вы можете выделить проект под «библиотеку» тегов действий, которые вам часто бывают нужны. В остальных проектах такие теги можно использовать без дополнительного объявления.
Как создать общий тег
В этой статье будет пошагово рассмотрен процесс разработки тега InputName
,
который позволит запросить у пользователя его имя и сохранить его в переменную $client.name
.
Шаг 1. Создайте проект
Создайте новый проект под будущую библиотеку тегов.
В этом проекте создайте директории и файлы для тега действия InputName
.
Итоговая структура проекта может иметь следующий вид:
├── src
│ ├── blocks
│ │ └── InputName
│ │ ├── block.json
│ │ └── block.sc
│ └── main.sc
├── test
│ └── test.xml
└── chatbot.yaml
Шаг 2. Задайте настройки тега
В файле block.json
задайте настройки тега.
"sharedForAccount": true
.{
"tagName": "InputName",
"startState": "/Blocks/InputName",
"scenarioFile": "blocks/InputName/block.sc",
"sharedForAccount": true,
"parameters": [
{
"name": "prompt",
"type": "string",
"required": true
},
{
"name": "fallbackName",
"type": "string",
"required": true
},
{
"name": "then",
"type": "state",
"required": false
}
]
}
Шаг 3. Напишите сценарий
В файле block.sc
напишите сценарий тега.
# В сценарий подключается системный справочник личных имен.
# Он позволяет распознавать имена через именованный паттерн `$Name`.
require: name/name.sc
module = sys.zb-common
theme: /Blocks
state: InputName
script:
// Значения параметров тега копируются из объекта `$request.data.args` в `$session`.
// Так к ним можно будет обращаться не только из `InputName`, но и из следующего стейта.
$session.InputName = $request.data.args;
# Бот отправляет сообщение с текстом, переданным в параметре `prompt`.
a: {{$session.InputName.prompt}}
state: CatchName
# Стейт срабатывает по событию `noMatch`, поэтому бот попадет в него при любом вводе.
# Однако отдельно прописана обработка ответа при помощи паттерна `$Name`.
q: * $Name *
event: noMatch
script:
// В `$client.name` записывается либо распознанное имя из справочника,
// либо имя по умолчанию, переданное как параметр тега.
$client.name = $parseTree._Name
? $parseTree._Name.name
: $session.InputName.fallbackName;
// Чтобы выйти из тега в основной сценарий, формируется ответ с типом `context-return`.
var reply = { type: "context-return", data: {} };
// Если следующий стейт передан в тег как параметр, он сохраняется как свойство ответа.
// Иначе подходящий стейт будет определен динамически во время работы бота.
if ($session.InputName.then) {
reply.state = $session.InputName.then;
}
// Из ответа формируется массив `$response.replies`.
$response.replies = [reply];
Кроме того, поскольку бот из данного проекта не будет предполагать обычное взаимодействие, удалите из файла main.sc
все заранее созданные стейты.
Оставьте только стейт NoMatch
со специальной логикой:
theme: /
state: NoMatch
event!: noMatch
script:
$response.replies = [{ type: "context-return", data: {} }];
Шаг 4. Включите тег
В секции
customTags
конфигурационного файлаchatbot.yaml
укажите путь к файлу с настройками:customTags:
- src/blocks/InputName/block.jsonНажмите в правом верхнем углу, чтобы сохранить изменения, сделанные в редакторе кода.
Нажмите Тестировать бота, чтобы опубликовать сценарий.
подсказкаЕсли вы увидите в тестовом виджете ошибкуBot stack is empty
, не волнуйтесь. Пользователи не будут запускать этого бота напрямую и не столкнутся с этой ошибкой.
Шаг 5. Используйте тег в других проектах
Теперь вы можете перейти в любой другой проект и использовать только что созданный тег. Как любой другой тег, он будет доступен и в коде проекта, и в графическом редакторе J‑Graph как блок действия.
state: Start
q!: $regex</start>
a: Здравствуйте!
InputName:
prompt = Как вас зовут?
fallbackName = незнакомец
then = /Start/NiceToMeetYou
state: NiceToMeetYou
a: Очень приятно, {{$client.name}}!
Управление контекстом
При использовании тегов действий важно понимать, что происходит с контекстом общения пользователя с ботом, в сценарии которого использован тег.
Переключение контекста
Если тег действия является локальным (используется в том же проекте, в котором создан),
то вызов тега равносилен переходу в начальный стейт этого тега через тег go!
или метод $reactions.transition
.
Вернуться из него в основной сценарий также можно при помощи обычного перехода.
Если же тег является общим,
то его использование реализовано не как переход, а как переключение контекста в другой проект при помощи context-switch
.
Поэтому в конце сценария тега нужно вернуть контекст из бота с общими тегами обратно в основного бота.
Возврат контекста
Сценарий общего тега всегда должен заканчиваться возвратом контекста при помощи ответа с типом context-return
.
Пользователь не должен иметь возможности перейти из сценария тега куда-либо еще —
для этого в примере выше из main.sc
удалены почти все стейты, а возврат контекста добавлен и в глобальный NoMatch
.
context-return
в общем теге,
то пользователь «застрянет» в сценарии тега и не сможет продолжить общение с основным ботом.Общие теги для всех пользователей
On-premise
Если JAICP установлена к вам в контур, ваши сотрудники могут самостоятельно создавать теги действий, которые будут доступны всем пользователям вашей установки.
Разработчики создают удаленный репозиторий с проектом JAICP, в который добавляют новый тег по инструкции выше. В настройках тега необходимо указать поле
"sharedForPlatform": true
.Системные администраторы должны добавить параметры репозитория в переопределяющую конфигурацию компонента EditorBE, после чего перезапустить компонент:
configs/hosts/{env_name}/editorbe/application-override.ymlsystem-projects:
projects:
# Системные проекты по умолчанию…
- url: https://gitlab.custom.com/custom-tags # URL репозитория.
project-id: custom-tags # ID проекта.
bot-id: custom-tags # ID бота. Может совпадать с project-id.
branch: main # Ветка в репозитории проекта, по умолчанию master.подсказкаДля системных проектов с тегами действий всегда указывайтеbot-id
, чтобы такие проекты были опубликованы и JAICP могла переключать в них контекст черезcontext-switch
.Пользователи вашей установки JAICP смогут использовать новый тег так же, как все остальные встроенные теги.