# Запуск сценария по таймеру | Слот Timer

## Назначение слота и общая информация

Слот Timer (таймер) предназначен для запуска Сценарий агента Агента по истечении заданного времени после наступления определенных условий в конкретном Чате.![image.png](https://codahosted.io/docs/_pM7PjYCmj/blobs/bl-qpCfyMqH0W/411b4f04b2db6526cc8ee186e71e3b13efe52295e02babe3713061177b808332bd6d93d5670d7fab9b5648db4200159195439c08cf41f20ce73ad519fa47e482a1f3857d98fa028a402e6fc134e33954329ab12dbac6fcef91ed352781d8e6e17d9a9da0)![image.png](https://codahosted.io/docs/_pM7PjYCmj/blobs/bl-7XRzD1Nu5e/dc149af26db8470f4f94906d9b95a51556f81679d2f85b7bfc9bac3a55997b61d08372eb37f3177f175ce20cb1c2afbb40ac807478f6b570ac1712adf9aa5e2cb52358bff140a12d3413fcb820609313fd54cf0e1b6ae2ee337d85e1289dbf1bd4e999c4)

Например, с помощью слота Timer можно (значения времени в примерах могут быть любыми):

* “разбудить” Агента через 2 часа после Закрытие диалога, если Собеседник не завершил оформлять заказ в Чате, чтобы напомнить ему завершить оформление
* принудительно перевести Диалог на оператора, если с начала диалога прошло 10 минут, а вопрос Собеседника не решен
* “напомнить” Собеседнику вернуться в Диалог, если Агент не получает ответа на вопрос в течение 5 минут
* С периодичностью раз в сутки делать запросы о статусе доставки во внешнюю систему и уведомить Собеседника, если статус изменился

## Создание и настройка слота

1. Слот Timer можно создать только после Слота Start  при наличии обычной ветки обработки входящих через Канал Проекта сообщений.
2. ![image.png](https://codahosted.io/docs/_pM7PjYCmj/blobs/bl-eUTHvEhLCg/5d9d79df89bde161a65eb1063c987853cc9854adb0d2188a5d7038f6b7b90944c380f76aabea1bfdf2fa6df93fc26d2053ba8b49194c843c61b22d00dc58f32367cd89f8dad35ea032a08185f648ce3631b91ce1e756a98ad88edd7833a269b3e896dbf3)
3. Разрешено несколько слотов Timer в Сценарий агента, причем их параметры могут быть одинаковыми.

### Атрибуты слота

![image.png](https://codahosted.io/docs/_pM7PjYCmj/blobs/bl-io0TqVcanJ/efab033a0c2b681661639af202ef57bc7b1f91089fc18dd83de1763543b86e9b02b3bb731392318463738782cf465c7453ea198545c888bd4deca35b6b7c59968739e8a39ed89686c4b63891ff0e638de22d4501714e7ff2cf71585544ee9d9d7bc74e74)

Вышеуказанные параметры по умолчанию следует читать так: завести таймер в режиме Interruptable на 1 час после закрытия диалога

1. Slot Name\* — название слота, которое будет отображено в Дерево сценария. Максимальная длина значения поля — 40 символов.
2. Count down\* — время обратного отсчета, которое установится при Запуск таймера, после окончания отсчета этого времени произойдет Срабатывание таймера. Значение не может быть пустым, минимальное значение 1 минута, шаг 1 минута. При создании слота предустановлено значение времени, равное 1 ч.
3. При попытке ввода в поле min значения, равного или более 60, значение будет автоматически конвертировано в часы и перенесено в поле hours. При заполненном поле hours произойдет сложение конвертированного значения и ранее указанного в поле hours значения.При попытке ввода в поле hours значения, равного или более 24, значение будет автоматически конвертировано в дни и перенесено в поле day. При заполненном поле day произойдет сложение конвертированного значения и ранее указанного в поле day значения.
4. after\* — событие которое запускает проверку условия if для Запуск таймера.
5. if: — условие, при котором таймер будет запущен при наступлении события after. Выражение в этом поле должно давать логический результат True или False (подробнее Синтаксис).
6. > Примечание: без дополнительного условия есть риск бесконечного перезапуска таймера, например: Закрытие диалога запускает таймер на 5 минут → через 5 минут срабатывает таймер → Агент пишет что-то Собеседнику → это сообщение стартует новый Диалог → этот диалог будет снова закрыт, например, по таймауту → Закрытие диалога снова запускает таймер на 5 минут .... и так по кругу
7. > Можно ввести Контекстная переменная, как признак того, напоминал ли Агент о себе, если она заполнена, то не стартовать таймер.
8. Mode\* — режим работы таймера, он определяет, как таймер может быть прерван:
9. * Interruptable: режим, при котором любое изменение Состояние общения останавливает таймер, например: Собеседник что-то написал, пришел Incoming Request, Агент продвинулся по сценарию, сработал другой таймер этого Агента.
   * Always on: режим, при котором изменение Состояние общения не останавливают таймер, его может остановить только Обучение Агента пользователем или запуск нового таймера из этого же слота (например, когда условия выполнились снова).

### Использование синтаксиса в Слоте Timer

В Слоте Timer допустимо использование Выражение в поле If. Подробнее: Синтаксис.

## Работа слота Timer

![image.png](https://codahosted.io/docs/_pM7PjYCmj/blobs/bl-XZyBTjt7i1/7058a18274703a1448d51bb2e680bfe5b31227d96ed1f63f2891fa464760b2b44d4246af5ba55b338335cc64ac0e250b6274d6916ebcb84d23c73bb9c1f1498e55704169a65846d6794cc5936ae5ef21e33adcb38475ade385cdf5b880715a086ea7846f)

### Мониторинг

Платформа мониторит Чаты на события-триггеры для каждого слота Timer в их Сценарий агента.

| Триггер             | Описание                                                                                                                                                                          | Особенности                                                                                                                                                                                                                                                                                                                                                                                                                                         | Примеры применения                                                                                                                                                                                                                                                                                                                                      |
| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Dialog closed       | Закрытие диалога по сценарию запускает таймер, если выполняется Дополнительное условие запуска таймера                                                                            |                                                                                                                                                                                                                                                                                                                                                                                                                                                     | <ul><li>Напомнить собеседнику, что он не закончил диалог, оформление заказа, бросил корзину</li><li>Отправить данные во внешнюю систему после окончания диалога</li><li>Периодически “ходить” во внешнюю систему за статусом задачи\заказа и уведомлять собеседника при его изменении</li><li>Отправить просьбу оценить качество обслуживания</li></ul> |
| Dialog started      | Открытие диалога запускает таймер, если выполняется Дополнительное условие запуска таймера                                                                                        |                                                                                                                                                                                                                                                                                                                                                                                                                                                     | <ul><li>принудительно подключить оператора, если диалог длится долгое время, но вопрос не решен</li></ul>                                                                                                                                                                                                                                               |
| Variable changed    | Изменение переменной на новое (другое) значение запускает таймер, если выполняется Дополнительное условие запуска таймера                                                         | Переменная указывается пользователем в новом поле, которое отображается при выборе этого пункта. Ввод переменной обязателен, имя переменной указывается без кавычек![image.png](https://codahosted.io/docs/_pM7PjYCmj/blobs/bl-V2vE3l3XuS/f2bbb27d1fedb5717316dbc824d92972dbb7d309342e1a5605767be04002fcebf4a9025519347d31e8d30cf73a6f0103387887539d2ae6a34ce2d577a0a92679ffb0ccb78c9a5d4b882f3e933d1a9bd13cffd1b91933ff6733f1d0499ae00ca548d0be40) | <ul><li>через час после получения ключевых данных (например, номер телефона), отправить их во внешнюю систему, не зависимо от статуса диалога</li></ul>                                                                                                                                                                                                 |
| Bot started waiting | Переход Агента в состояние ожидания ввода от Собеседника: Wait For Reaction, Slot Filling, Button Menu запускает таймер, если выполняется Дополнительное условие запуска таймера. |                                                                                                                                                                                                                                                                                                                                                                                                                                                     | <ul><li>“пропинговать” собеседника, если он отвлекся от диалога</li><li>пригласить оператора в диалог, если собеседник не отвечает</li></ul>                                                                                                                                                                                                            |

\
Дальнейшие действия выполняются для каждого слота Timer в Агенте:

### Запуск таймера

* Если Триггер запуска таймера сработал, Платформа проверяет Дополнительное условие запуска таймера.
* Когда Дополнительное условие запуска таймера выполняется, таймер запускается — в системе создается задание по расписанию. Если Дополнительное условие запуска таймера не выполняется — ничего не происходит.
* Сам Запуск таймера не влияет на Общение и не изменяет Состояние общения, он просто создает задачу по расписанию в системе.
* Запуск таймера прерывает предыдущий, еще не сработавший таймер, заведенный из этого же слота Timer, если такой Заведенный таймер есть.
* > Примечание: технически, в базе остается все тот же первоначальный Заведенный таймер, но в нем устанавливается новое время срабатывания.

### Срабатывание таймера

Платформа проверяет, какие из Заведенный таймер закончили обратный отсчет (поле Count down) и выполняет активацию их Слотов Timer в соответствующих Чатах — происходит Срабатывание таймера, и в Чатах запускаются соответствующие Ветка сценария.Период проверки: 1 минута.Это означает, что возможна задержка между плановым и фактическим срабатыванием таймера до 1 минуты (59 секунд).

* Если в Заведенный таймер обратный отсчет закончен до окончания очередной минуты, Срабатывание таймера все еще не произойдет, так как Платформа еще не произвела проверку и не знает, что отсчет времени закончен. Но как только эта минута закончится, Платформа произведет проверку таймер сработает.
* > Примечание: как показывает практика чаще всего задержка бывает в промежутке от 40 до 59 секунд, следует это учесть, при выставлении значения обратного отсчета.
* По окончании каждой минуты срабатывают сразу друг за другом все таймеры, обратный отсчет в которых закончился за минуту. Т.е. они могли быть запущены “на одно и то же время” с промежутком в 1-59 секунды, но сработают “одновременно”, так как Платформа  узнала об этом в рамках одной проверки (см. Несколько слотов Timer в одном Агенте)

Срабатывание таймера изменяет Состояние общения:

* 1. Текущий сценарий в Активный диалог “прервется”, т.к Агент незамедлительно “перескочит” на Ветка сценария после Слота Timer и продолжит общение со следующего за Слотом Timer Слота.
  2. Если на этот момент в данном Чате нет Активный диалог, то Сценарий агента в Чате запустится, но Диалог будет открыт при первом входящем или исходящем сообщении.

### Удаление (остановка) таймера

Заведенный таймер может быть остановлен (сброшен, удален) определенными событиями, исходя из режима, в котором он запущен.Любой Заведенный таймер может быть сброшен запуском нового таймера из этого же Слота Timer.

> Примечание: технически, в базе остается все тот же первоначальный Заведенный таймер, но в нем устанавливается новое время срабатывания.

Переобучение Агента или удаление/деактивация Канал Проекта удаляет все Заведенный таймер в сбрасываемых Чатах.

| Режим         | Описание                                                                                                                                                                                                                   | Прерывание переобучением агента | Прерывание изменением состояния Общения | Прерыванием запуском нового таймера из этого же слота |
| ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------- | --------------------------------------- | ----------------------------------------------------- |
| Interruptable | прерываемый таймер - режим, при котором изменение Состояние общения останавливает таймер, например: Собеседник что-то написал, пришел Incoming Request, Агент сдвинулся по сценарию, сработал другой таймер этого Агента . | <ul><li></li></ul>              | <ul><li></li></ul>                      | <ul><li></li></ul>                                    |
| Always оn     | непрерывный таймер - режим, при котором  изменение Состояние общения  не останавливают таймер, его может остановить только запуск нового таймера из этого же слота (например, когда условия выполнились снова)             | <ul><li></li></ul>              | <ul><li></li></ul>                      | <ul><li></li></ul>                                    |

### Несколько слотов Timer в одном Агенте

В одном Агенте допускается несколько слотов Timer, при чем их Режимы работы таймера, Триггеры запуска таймера, время отсчета и дополнительные условия могут частично или полностью совпадать.Каждый Слот Timer в Сценарий агента запускает свой отдельный таймер.

#### Запуск нескольких таймеров в одном агенте

* Каждый таймер запускается из своего Слота Timer независимо от других согласно порядку запуска — см. Запуск таймера.
* Одновременно могут быть запущены несколько таймеров, в т.ч “одинаковых”.

#### Срабатывание нескольких таймеров в одном агенте

Так как проверка таймеров в Платформа происходит с периодичностью один раз в минуту, то запущенные в одном Агенте таймеры, которые должны сработать в разницей меньше минуты, могут сработать “одновременно” и в случайном порядке:

* Платформа при очередной ежеминутной проверке обнаружит все несработанные (заведенные) таймеры Агента, у которых закончился отсчет, и отправит их “на выполнение”
* После чего произойдет их срабатывание в случайном порядке.
* > Т.е. одновременно если было запущено 2 таймера на один час, то неизвестно, какой из них сработает первым через час.
* При этом, если среди "отправленных на выполнение” таймеров есть Interruptable-таймеры, то они уже не прервутся срабатыванием первого в очереди таймера.

<br>
