Dialogflow と Firebase Cloud Functions で Actions On Google の Node.js Client Library v2対応


以前、Dialogflow と Firebase Cloud Functions で Actions On Google 作り を書いてから半年ほど。。時代の流れは早いもので、そのレポートの通りやっても動かない!!

ということで、簡単なポイントまとめです。

前のレポートの通りにやって動かないのは、Firebase Cloud Functions のテンプレートを利用すると DialogflowApp の Node.js Client Library が v2 になるからです。

無理矢理 v1 を使用することもできますが、上図(Actions on Google のリファレンスより引用)のように v1 は、既に"deprecated"になっています。なので、それに従い、v2 を使うやり方にシフトします。
v1 と v2 でどのように変わったのかを、ソースコードベースでレポートしたいと思います。

比較

途中略してますが、大体同じになるようにソースコードを書いています。以下の2つを見比べてみてください。

v1

index_v1.js
'use strict';

process.env.DEBUG = 'actions-on-google:*';

const { DialogflowApp } = require('actions-on-google');
const functions = require('firebase-functions');

exports.funcDecisionAction = functions.https.onRequest((request, response) => {
    const app = new DialogflowApp({ request, response });

    function funcHandler(app) {
        let speechStr = "";
        let func_id = app.getArgument(funcid);
        console.log(app.getRawInput());

        ....

        if (speechStr === "") {
            speechStr = "値ないよ!最初からやり直して!!";
            app.tell(speechStr);
        } else {
            app.ask(speechStr);
        }
    }

    const actionMap = new Map();
    actionMap.set('action.funcdecision', funcHandler);

    app.handleRequest(actionMap);
});

v2

index_v2.js
'use strict';

const { dialogflow } = require('actions-on-google');
const functions = require('firebase-functions');

const app = dialogflow({ debug: true });

app.intent('funcdecisionIntent', (conv, { funcid }) => {
    let speechStr = "";
    let func_id = funcid;
    console.log(conv.input.raw);

    ....

    if (speechStr === "") {
        speechStr = "値ないよ!最初からやり直して!!";
        conv.close(speechStr);
    } else {
        conv.ask(speechStr);
    }
});

exports.funcDecisionAction = functions.https.onRequest(app);

Dialogflow 側に"funcdecisionIntent"という名前の Intent、"funcid"という名前の Entity があるものとします。(v1の方では、更に Intent に"action.funcdecision"という Action名がつけられているとします。)

ポイントとしては下記が挙げられます。

  • "app"の代わりに"conv"
  • ".tell"が".close"に
  • 処理に Intent 名を直接指定するように(action名をつけなくてよくなった、最後にまとめて action名と処理の紐付けを行わなくてよくなった)
  • Entity名を引数に指定して処理で使う

v2の方がより直感的で無駄がなくなったように感じますね。

まとめ

すごい大雑把ですが、以上です。
不足点多くて、もっと詳細に知りたい!って人は公式のリファレンスなど見に行ってください!私的には、Samples を見るのがおすすめです!