会話型アクション(Dialogflow)を構築する

フルフィルメントを使用してアクションの会話を定義します。 これは Webhook としてデプロイされるコードで、Dialogflow エージェントの 構築できます。フルフィルメントは、ユーザーがアクションを実行したときに できます。

Interactive Canvas の場合、フルフィルメントは ウェブアプリをアシスタントに移行させますHtmlResponse を使用してアシスタントに以下の操作を指示できます。 ウェブアプリをレンダリングしますHtmlResponse は、data のアップデートも提供できます。 ウェブアプリの変更に必要な ウェブアプリのカスタムロジックが使用します

このページでは、フルフィルメントで HtmlResponse を使用する方法と、 使用上のガイドラインを参照してください。

HTML レスポンス

ウェブアプリに関する情報をアシスタントに伝達するには、 HtmlResponse 挿入できます。HtmlResponse には URL を含めることができます。 更新するデータを指定します。送信時 HtmlResponse の場合、次のステップが発生します。

  1. 一致したインテントのフルフィルメントによって、デバイスに HtmlResponse が送信されます。
  2. デバイスは HtmlResponse 内の URL を使用してウェブアプリを読み込みます。
  3. data JSON ペイロードは、コールバックでウェブアプリに渡されます。
  4. 会話アクションが新しい HtmlResponse を送信して、最新情報や 新しい状態を読み込むことができます。

フルフィルメントの例

以下は、サンプルからの抜粋です。 フルフィルメント コードは、HtmlResponse の実装方法を示しています。

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

const app = dialogflow({debug: true});
app.intent('welcome', (conv) => {
  conv.ask('Welcome! Do you want me to change color or pause spinning?');
  conv.ask(new HtmlResponse({
    url: 'https://your-web-app.com',
  }));
});

// map of human speakable colors to color values
const tints = {
  red: 0xFF0000,
  green: 0x00FF00,
  blue: 0x0000FF,
};
app.intent('color', (conv, {color}) => {
  if (color in tints) {
    conv.ask(`Ok, I changed my color to ${color}. What else?`);
    conv.ask(new HtmlResponse({
      data: {
        tint: tints[color],
      },
    }));
    return;
  }
  conv.ask(`Sorry, I don't know that color. What else?`);
  conv.ask(new HtmlResponse({
    data: {
      query: conv.query,
    },
  }));
});
app.intent('start', (conv) => {
  conv.ask(`Ok, I'm spinning. What else?`);
  conv.ask(new HtmlResponse({
    data: {
      spin: true,
    },
  }));
});

app.intent('pause', (conv) => {
  conv.ask(`Ok, I paused spinning. What else?`);
  conv.ask(new HtmlResponse({
    data: {
      spin: false,
    },
  }));
});

app.intent('restart game', (conv) => {
  conv.ask(new HtmlResponse({
    data: {
      command: 'RESTART_GAME',
    },
  }));
});

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

welcome インテント

上記のスニペットでは、welcome インテントのフルフィルメントが、 HtmlResponse は、ウェブアプリの URL に置き換えます。アシスタントがこれを受信します そのアドレスの HTML と JavaScript を読み込みます。

...
app.intent('welcome', (conv) => {
  conv.ask('Welcome! Do you want me to change color or pause spinning?');
  conv.ask(new HtmlResponse({
    url: 'https://your-web-app.com',
  }));
});
...

その他のインテント

他のインテントのフルフィルメントの HtmlResponse が変数値を渡す (サンプルでは tint または spin)をウェブアプリに追加します。ウェブ用のカスタム ロジック アプリはこれらの値を使用して、要素(アニメーション、色など)を更新します。

...
app.intent('start', (conv) => {
  conv.ask(`Ok, I'm spinning. What else?`);
  conv.ask(new HtmlResponse({
    data: {
      spin: true,
    },
  }));
});
...

ガイドラインと制限事項

HtmlResponse に関する以下のガイドラインと制限事項に留意してください 以下の点に注意してください。

  • フルフィルメントの各インテントには HtmlResponse を含める必要があります。インテントが HtmlResponse が含まれていない場合、ウェブアプリは終了します。
  • 最初に送信するインテントに含める必要があるのは、ウェブアプリの URL だけです。 (通常は Welcome インテントです)。
  • HtmlResponse のサイズは 50 KB 以下にする必要があります。