Technical Articles
SAP Cloud SDK for JavaでCAIのWebhookを返す
SAP Cloud SDK for JavaのWebhookResponseWrapperを使ってSAP Conversational AIへWebhook Responseを返してみます。
今回のプログラムはGitHubに置いています(今回以外の内容もあるので注意)。
開発環境
以下の環境で実行しています。
- OS: Windows10 64-bit
- openJDK: 1.8.0_242
- Chocolatey: 0.10.15
- maven: 3.6.3
- IDE: IntelliJ IDEA Community Edition 2019.3.3
- CF cli: 6.37.0+a40009753.2018-05-25
- SAP Cloud SDK for Java: 3.15.1
手順
0. 前提
- 「SAP Cloud SDK for Javaの簡単な動かし方(CFへデプロイまで)」実行済であること。
- SAP Conversational AIのアカウントがあること
1. POM.xml調整
<project-root>/application/POM.xmlのdependenciesパス配下にServices Recast AI (Beta)を追加します。
※ベータ版のサービスなので利用にはご注意ください。
<!-- https://mvnrepository.com/artifact/com.sap.cloud.sdk.services/recast-ai -->
<!-- for recast-ai -->
<dependency>
<groupId>com.sap.cloud.sdk.services</groupId>
<artifactId>recast-ai</artifactId>
<version>3.15.1</version>
</dependency>
2. サーブレット作成
<project-root>/application/src/main/java/com/sap/cloud/sdkにChatServlet のJava Classを作成します。
package com.sap.cloud.sdk;
import com.google.gson.Gson;
import com.sap.cloud.sdk.services.recastai.RecastWebhookResponseWrapper;
import com.sap.cloud.sdk.services.recastai.botresponses.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@WebServlet("/chat")
public class ChatServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final Logger logger = LoggerFactory.getLogger(ChatServlet.class);
@Override
protected void doGet(final HttpServletRequest request, final HttpServletResponse response)
throws IOException {
logger.info("Start get method: " + request.getRequestURI());
String parameter = request.getParameter("name");
logger.info("Get parameter 'name': " + parameter);
TextResponse textResponse = new TextResponse("入力:" + parameter);
List<CardContent> cardContents = new ArrayList<>();
List<Button> buttons = new ArrayList<>(); //Dummy
CardContent cardContent = new CardContent();
cardContent.setTitle("タイトル");
cardContent.setSubtitle("サブタイトル");
cardContent.setButtons(buttons);
cardContents.add(cardContent);
ListContent listContent = new ListContent();
listContent.setElements(cardContents);
ListResponse listResponse = new ListResponse(listContent);
RecastWebhookResponseWrapper webhookResponse = new RecastWebhookResponseWrapper(textResponse, listResponse);
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.getWriter().write(webhookResponse.getResponse());
}
}
3. CFにデプロイ
SAP Cloud Platform の Cloud Foundry にデプロイします。
※省略しますが”mvn clean package && mvn tomee:run”でローカル起動して http://localhost:8080/chat?name=test をブラウザで開いて試しています。
cf login
cf push
デプロイ先(https://<route><domain>/chat?name=test)をブラウザで開くと以下のようなJSONが返ってきます。
{
"replies": [
{
"type": "text",
"content": "入力:test"
},
{
"type": "list",
"content": {
"elements": [
{
"title": "タイトル",
"subtitle": "サブタイトル",
"buttons": [
]
}
]
}
}
]
}
4. CAI作成
SAP Conversational AIでbotを作ります。
今回は通信だけが目的なのでfallbackスキルでActionにWebhookコールを設定します。
メモリのtestに「あああ」と設定してWebhookにその値をURLパラメータとして設定しています。
試すと、こんな感じで返ってきます。
参考情報
CAIのフォーマット
Send rich messagesを見てどのようにフォーマットを組み立てるか確認。
JSONテスト
JSONテストにmyjsonを使うと手っ取り早くJSONのRESTを作れます。myjsonのエンドポイントをCAIで呼び出して、意図しているフォーマットになっているかを確認。