Dialogflow от Google (ранее известный как API.ai) — отличная платформа для разработки чат-ботов для нескольких платформ. Ранее, когда Dialogflow был известен как API.ai, у них была клиентская библиотека Android и iOS для интеграции чат-ботов в мобильные приложения. Но после слияния с Google существующая библиотека не обновляется; скорее мы видим, что Dialogflow добавлен к облачной платформе Google, и разрабатывается новый клиентский API на основе Java.
В этой статье я покажу вам, как вы можете интегрировать чат-бота, разработанного в Dialogflow, с помощью нового клиентского API Java.
1. Сначала мы создадим агента Dialogflow, который назовем FirstActionApp.
Пожалуйста, нажмите на эту ссылку .
Примечание. Dialogflow V1 API будет закрыт 31 марта 2020 года.
Итак, мы создаем приложение Dialogflow с версией API V2. Учетная запись службы в этом образе используется для создания учетных данных для API клиента Java.
Для создания чат-бота с API V1 мы используем токен клиентского доступа, который используется для интеграции клиентской библиотеки Android. Для создания чат-бота с V2 API нам нужно использовать служебную учетную запись.
-
Выберите ваше приложение.
-
Создайте новый ключ с интеграциями Dialogflow и загрузите созданный файл JSON.
2. Теперь мы создадим Intents и Entities для обучения агента.
-
Добавление синонимов для записи значений трека.
-
Создайте параметр для извлечения трека.
-
Разрешить вызовы webhook развертывают код через веб-сервис для предоставления данных пользователю.
По умолчанию ваш агент отвечает на согласованное намерение статическим ответом. Если вы используете один из вариантов интеграции, вы можете предоставить более динамичный ответ, используя выполнение. Когда вы включаете выполнение для намерения, Dialogflow отвечает на это намерение, вызывая определенную вами службу. Например, если конечный пользователь хочет запланировать стрижку на пятницу, ваша служба может проверить вашу базу данных и ответить конечному пользователю с информацией о доступности на пятницу.
-
Конечный пользователь печатает или говорит выражение.
-
Диалоговый поток сопоставляет выражение конечного пользователя с намерением и извлекает параметры.
-
Dialogflow отправляет сообщение о запросе webhook в службу webhook. Это сообщение содержит информацию о согласованном намерении, действии, параметрах и ответе, определенном для намерения.
-
Ваш сервис выполняет необходимые действия, такие как запросы к базе данных или внешние вызовы API.
-
Ваша служба отправляет ответное сообщение webhook в Dialog Flow. Это сообщение содержит ответ, который должен быть отправлен конечному пользователю.
-
Dialogflow отправляет ответ конечному пользователю.
-
Конечный пользователь видит или слышит ответ.
3. Создайте выполнение облачной функции для обработки запроса webhook. На основании обнаруженного номера дорожки пользователю будет отправлен соответствующий ответ.
Консоль Dialogflow имеет встроенный редактор кода, называемый встроенным редактором, который можно использовать для создания кода выполнения и развертывания кода в функциях Clout для Firebase. Встроенный редактор предназначен для простого тестирования выполнения и создания прототипов. Когда вы будете готовы создать производственное приложение, вы должны создать сервис webhook.
4. Теперь наш агент готов, и теперь мы интегрируем его в приложение для Android. В build.gradle (приложение) мы добавим зависимости как для клиентской библиотеки Android, так и для клиентского API Java, так как мы будем разрабатывать для обоих.
Джава
xxxxxxxxxx
1
// Java V2
2
implementation 'com.google.cloud:google-cloud-dialogflow:0.67.0-alpha'
5. Чатбот будет инициирован в методе onCreate активности Android. Сначала мы настроим агент потока диалога, используя токен клиентского доступа или ключ JSON. Затем создается новый сеанс с использованием уникального идентификатора, а затем бот готов к общению с пользователем.
-
Маркер клиентского доступа не может быть использован, потому что он использовался API V1.
-
Мы используем V2, поэтому мы будем использовать ключ JSON.
Джава
1
private void initV2Chatbot() {
2
try {
3
InputStream stream = getResources().openRawResource(R.raw.test_agent_credentials);
4
GoogleCredentials credentials = GoogleCredentials.fromStream(stream);
5
String projectId = ((ServiceAccountCredentials)credentials).getProjectId();
6
SessionsSettings.Builder settingsBuilder = SessionsSettings.newBuilder();
7
SessionsSettings sessionsSettings = settingsBuilder.setCredentialsProvider(FixedCredentialsProvider.create(credentials)).build();
8
sessionsClient = SessionsClient.create(sessionsSettings);
9
session = SessionName.of(projectId, uuid);
10
} catch (Exception e) {
11
e.printStackTrace();
12
}
13
}
-
Это
test_agent_credentials
файл JSON, который мы загрузили на первом этапе из учетной записи службы. -
У нас есть скопировать и вставить этот файл в каталог приложения -> res -> raw (новый каталог) и вставить.
6. Мы будем взаимодействовать с чат-ботом асинхронно. Это мы сделаем в том случае, AsyncTask
когда запрос от пользователя отправляется как запрос в чат-бот, и ответ захватывается.
Джава
xxxxxxxxxx
1
public class RequestJavaV2Task extends AsyncTask<Void, Void, DetectIntentResponse> {
2
Activity activity;
3
private SessionName session;
4
private SessionsClient sessionsClient;
5
private QueryInput queryInput;
6
RequestJavaV2Task(Activity activity, SessionName session, SessionsClient sessionsClient, QueryInput queryInput) {
7
this.activity = activity;
8
this.session = session;
9
this.sessionsClient = sessionsClient;
10
this.queryInput = queryInput;
11
}
12
13
protected DetectIntentResponse doInBackground(Void... voids) {
14
try{
15
DetectIntentRequest detectIntentRequest =
16
DetectIntentRequest.newBuilder()
17
.setSession(session.toString())
18
.setQueryInput(queryInput)
19
.build();
20
return sessionsClient.detectIntent(detectIntentRequest);
21
} catch (Exception e) {
22
e.printStackTrace();
23
}
24
return null;
25
}
26
28
protected void onPostExecute(DetectIntentResponse response) {
29
((MainActivity) activity).callbackV2(response);
30
}
31
}
7. Пользователь может отправить запрос из приложения Android, используя EditText, и ответ будет показан в TextView.
Джава
xxxxxxxxxx
1
private void sendMessage(View view) {
2
String msg = queryEditText.getText().toString();
3
if (msg.trim().isEmpty()) {
4
Toast.makeText(MainActivity.this, "Please enter your query!", Toast.LENGTH_LONG).show();
5
} else {
6
showTextView(msg, USER);
7
queryEditText.setText("");
8
9
// Java V2
10
QueryInput queryInput = QueryInput.newBuilder().setText(TextInput.newBuilder().setText(msg).setLanguageCode("en-US")).build();
11
new RequestJavaV2Task(MainActivity.this, session, sessionsClient, queryInput).execute();
12
}
13
}
Получите ответ:
Джава
xxxxxxxxxx
1
public void callbackV2(DetectIntentResponse response) {
2
if (response != null) {
3
// process aiResponse here
4
String botReply = response.getQueryResult().getFulfillmentText();
5
showTextView(botReply, BOT);
6
} else {
7
showTextView("There was some communication issue. Please Try again!", BOT);
8
}
9
}