构建对话 Action (Dialogflow)

您可以使用 fulfillment 为 Action 定义对话,fulfillment 是作为包含 Dialogflow 代理对话逻辑的网络钩子的代码。执行方式会告诉您的 Action,在用户发出请求时要执行什么操作。

对于 Interactive Canvas,您的执行方式还会将您的 Web 应用的相关信息传达给 Google 助理。您可以使用 HtmlResponse 让 Google 助理呈现您的 Web 应用。HtmlResponse 还可以对 data 提供更新,您的 Web 应用自定义逻辑会使用该更新对您的 Web 应用进行更改。

本页将介绍如何在您的执行方式中使用 HtmlResponse,以及有关使用此响应类型的一般准则。

HTML 响应

如需向 Google 助理中继您的 Web 应用的相关信息,您必须在 intent 专用执行方式中添加 HtmlResponseHtmlResponse 可以包含 Web 应用的网址以及用于更新 Web 应用的数据。发送 HtmlResponse 时,会执行以下步骤:

  1. 所匹配 intent 的执行方式会向设备发送 HtmlResponse
  2. 设备使用 HtmlResponse 中的网址加载 Web 应用。
  3. data JSON 载荷通过回调传递给 Web 应用。
  4. 您的对话式 Action 会发送新的 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 intent

在上面的代码段中,welcome intent 的执行方式会发送包含 Web 应用网址的 HtmlResponse。Google 助理会收到该网址,并在该网址加载 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',
  }));
});
...

其他 intent

其他 intent 的执行方式中的 HtmlResponse 会将变量值(示例中的 tintspin)传递给 Web 应用。Web 应用的自定义逻辑使用这些值来更新元素(动画、颜色等):

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

准则和限制

构建执行方式时,请牢记有关 HtmlResponse 的以下准则和限制:

  • 执行方式中的每个 intent 都必须包含一个 HtmlResponse。如果某个 intent 不包含 HtmlResponse,您的 Web 应用会关闭。
  • 您只需在向用户发送的第一个 intent(通常是 Welcome intent)中添加您的 Web 应用网址。
  • HtmlResponse 的大小不得超过 50kb。