$conversationApi
Встроенный сервис $conversationApi
позволяет мгновенно отправлять сообщения бота в канал, не дожидаясь окончания обработки запроса пользователя.
Вы можете использовать методы этого сервиса, например, чтобы предупредить пользователя о подготовке ответа, пока бот ожидает ответ от LLM-модели, производит вычисления или получает информацию из CRM-системы.
Методы
Метод | Что делает |
---|---|
sendTextToClient | Отправляет текстовый ответ. В качестве аргумента принимает строку. |
sendRepliesToClient | Отправляет ответы с различными типами: например, изображения и кнопки. В качестве аргумента принимает массив объектов replies . |
Принцип работы
Сервис $conversationApi
поддерживается как в классической среде исполнения JavaScript (ECMAScript 5) в теге script
,
так и в среде исполнения ECMAScript 6 в теге scriptEs6
.
Однако из-за особенностей того, как в них исполняется код, использовать этот сервис нужно по-разному.
ECMAScript 5
В среде исполнения ECMAScript 5 обработка запроса пользователя всегда является синхронной:
бот получает запрос, переходит в нужный стейт и выполняет реакции из тегов реакций, в том числе код из тегов script
.
Чтобы отправить ответ бота в канал, можно вызывать методы встроенного сервиса $reactions
или добавлять ответы в $response
.
Однако эти ответы отправляются в канал не мгновенно, а только после того, как все реакции будут выполнены.
state: 1
script:
$reactions.answer("Первый ответ");
$reactions.answer("Второй ответ");
$http.get("https://httpbin.org/delay/5"); // HTTP-запрос длительностью 5 секунд
$response.replies.push({type: "text", text: "Третий ответ"});
# После задержки в пять секунд бот отправит в канал сразу три ответа.
В отличие от отправки ответов через $reactions
и $response
,
отправка через $conversationApi
происходит мгновенно, а оставшиеся реакции выполняются уже после нее.
state: 2
script:
$reactions.answer("Первый ответ");
$conversationApi.sendTextToClient("Второй ответ");
$http.get("https://httpbin.org/delay/5"); // HTTP-запрос длительностью 5 секунд
$response.replies.push({type: "text", text: "Третий ответ"});
# Бот сразу отправит в канал второй ответ, а после задержки в пять секунд дошлет первый и третий.
ECMAScript 6
В среде исполнения ECMAScript 6 для запуска кода в JAICP используется платформа Node.js,
поэтому вы можете использовать в нем асинхронные операции.
Однако у асинхронного кода в JAICP есть важное ограничение:
чтобы использовать его результат для ответа пользователю через встроенный сервис $reactions
,
его всегда нужно дожидаться при помощи ключевого слова await
.
Это связано с тем, что методы $reactions
являются синхронными и работают только во время обработки запроса.
state: 3
scriptEs6:
$reactions.answer("Первый ответ");
await new Promise(resolve => setTimeout(resolve, 5000)); // Таймаут длительностью 5 секунд
$reactions.answer("Второй ответ");
setTimeout(() => $reactions.answer("Третий ответ"), 5000);
# После задержки в пять секунд бот отправит в канал первый и второй ответ.
# Код на последней строке будет выполнен на следующей итерации цикла событий. Третий ответ уже не будет отправлен в канал.