构建对话 Action (Dialogflow)

您可以使用 fulfillment 定义 Action 的对话, 它是以网络钩子形式部署的代码,其中包含您的 Dialogflow 代理的 对话逻辑。当用户执行这些操作时,执行方式会告知 Action 该执行什么操作 请求。

对于 Interactive Canvas,您的执行方式还会传达 Web 应用添加到 Google 助理。你可以使用HtmlResponse让 Google 助理执行下列操作: 呈现您的 Web 应用HtmlResponse 还可以为 data 提供更新, 您的 Web 应用自定义逻辑用于对您的 Web 应用进行更改。

本页介绍了如何在执行方式中使用 HtmlResponse,以及常规操作 使用此响应类型的准则。

HTML 响应

要将有关你的 Web 应用的信息转发给 Google 助理,你必须添加 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 的 fulfillment 会发送一个 将 HtmlResponse 替换为 Web 应用的网址。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 的以下准则和限制 构建 fulfillment:

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