botpressのchannelモジュール作成方法(1)
概要
botpress[1]はカスタムモジュールを作成する事で、配布可能な形で機能追加や拡張ができるようです。この記事ではbotpressが外部からメッセージを受け取るメッセージチャンネル[2]をカスタムモジュールで作成する方法をまとめています。
利用しているbotpressのバージョンはv12.21.0です
この記事を読むと
- botpressでのモジュール作成のとっかかりになる
- メッセージチャネルをモジュールで作成する際の要点がわかる(別記事)
- Botpressに外部からメッセージを受け取るURLの追加方法
- 埋めとったメッセージをbotrepssのメッセージ処理フローに渡す方法
- 処理されたメッセージの応答を外部システムに返す方法
そもそもbotpressって?
チャットボット構築するためのプラットフォーム[3]です。開発フレームワークでもありモジュールによって機能追加もできます。
下記の書籍が日本語で一番まとまっていておすすめです。(4章以降でbotpressを利用したチャットボット作成が解説されています)
- チャットボットの教科書
-
Chatbot Today
- チャットボットの教科書のサポートサイトです
例として作成するモジュール
最終的にはHTTP経由で外部システムからメッセージを受け取り、botpressが生成した応答メッセージを単純に返すモジュールを作成します。
前準備
botpressを動作させて、モジュールの動作を確認できる環境を用意します。
- ソースコード解析の環境構築 - Botpress詳解(2)を参考にしてv12.21.0で起動まで行っておきます。
- 初回は管理者のID,パスワード設定になりますので設定してログインします。
テンプレートからモジュールを作成する
ここからはcloneしたbotpress内のディレクトリ内で作業です。公式のカスタムモジュールの作り方[4]を参考にカスタムモジュールを作成します。
botpressのソースコード内のbotpress/examples/module-templatesにモジュールを作成する際の雛形があるのでこちらをbotpress/modulesディレクトリ以下にコピーします。
# channel-simple-httpという名称でコピー
cp -r examples/module-templates/basic-module modules/channel-simple-http
cd modules/channel-simple-http
モジュールのディレクトリ構成
雛形のディレクトリ構成をみてみます。
公式のModule Structureをみるとこれが最小限の構成のようです。
今回修正するのは、package.json, src/backend/index.tsの2ファイルです。
ModuleEntryPointオブジェクト
モジュールは必ずsdk.ModuleEntryPointオブジェクトをエクスポートして、botpress側にモジュールの情報を伝える必要があります。ModuleEntryPointの定義はこちら
ざっくりメタデータ設定とハンドラ設定の2つだけ押さえておけば動かせます。
メタデータ設定
definitionプロパティにモジュールのメタデータの設定をします。
- モジュールの名称設定(nameプロパティ)
- botpressの管理画面の拡張を行う場合はメニューにアイコンが追加されるため、設定などを行います(menuIcon, menuTextプロパティ)
ハンドラの設定
onServerStarted, onServerReadyなどのあらかじめきまったタイミングでbotpress側からモジュールに呼び出しがあるのので呼び出して欲しい箇所のハンドラを設定します。
実用的なモジュールを作る場合は、ハンドラの引数で渡されるsdkのAPIを使って何をするかというのがポイントになるかと思います。
テンプレートは下記のようになっており、最低限メタデータとハンドラ設定がされている状態です。
import * as sdk from 'botpress/sdk'
const onServerStarted = async (bp: typeof sdk) => {}
const onServerReady = async (bp: typeof sdk) => {}
const entryPoint: sdk.ModuleEntryPoint = {
onServerStarted,
onServerReady,
definition: {
name: 'basic-module',
menuIcon: 'none',
menuText: 'BasicExample',
noInterface: false,
fullName: 'BasicExample',
homepage: 'https://botpress.com'
}
}
export default entryPoint
モジュールを作成してビルドする
- package.jsonとsrc/backend/index.tsを変更する
name, fullName, descriptionプロパティを変更します。
+++ package.json 2021-05-01 15:08:04.000000000 +0900
@@ -1,7 +1,8 @@
{
- "name": "basic-module",
+ "name": "channel-simple-http",
+ "fullName": "Channel - simple http",
"version": "1.0.0",
- "description": "",
+ "description": "simple http channel",
"private": true,
"main": "dist/backend/index.js",
"author": "Botpress, Inc.",
モジュールがbotpressから呼び出され動作している事が確認できるように、コンソールにメッセージを出すように修正します。
import * as sdk from 'botpress/sdk'
-const onServerStarted = async (bp: typeof sdk) => {
- console.log("simple httpのonServerStarted")
-}
-
-const onServerReady = async (bp: typeof sdk) => {
- console.log("simple httpのonServerReady")
-}
+const onServerStarted = async (bp: typeof sdk) => {}
+const onServerReady = async (bp: typeof sdk) => {}
const entryPoint: sdk.ModuleEntryPoint = {
onServerStarted,
onServerReady,
definition: {
- name: 'channel-simple-http',
+ name: 'basic-module',
menuIcon: 'none',
- menuText: 'Channel SimpleHTTP',
- noInterface: true,
- fullName: 'Channel SimpleHTTP',
+ menuText: 'BasicExample',
+ noInterface: false,
+ fullName: 'BasicExample',
homepage: 'https://botpress.com'
}
}
- ビルドする
yarn build
動作確認
-
モジュール画面に移動してモジュールを有効にして動作を確認する
メニューのModules画面に移動すると、package.jsonで編集したモジュール名や説明が表示されsimple httpモジュールが追加されます。
-
無効になっているので、スイッチを反転させて追加したモジュールを有効にします。
修正したメッセージがコンソールの表示と、botpressがモジュールの読み込みに成功したメッセージが表示されていれば、作成したモジュールが動作しています!
参考
-
Botpressでは外部からメッセージを受け取る経路をMessaging Channelsとしているようです。
Messaging Channels · | Developer's Guide
標準でMicrosoft Teams, Slackなどからメッセージを受け取れるchannelがモジュールで実装されています。 ↩︎
Discussion