您可以使用 fulfillment 为 Action 定义对话,fulfillment 是作为包含 Dialogflow 代理对话逻辑的网络钩子的代码。执行方式会告诉您的 Action,在用户发出请求时要执行什么操作。
对于 Interactive Canvas,您的执行方式还会将您的 Web 应用的相关信息传达给 Google 助理。您可以使用 HtmlResponse
让 Google 助理呈现您的 Web 应用。HtmlResponse
还可以对 data
提供更新,您的 Web 应用自定义逻辑会使用该更新对您的 Web 应用进行更改。
本页将介绍如何在您的执行方式中使用 HtmlResponse
,以及有关使用此响应类型的一般准则。
HTML 响应
如需向 Google 助理中继您的 Web 应用的相关信息,您必须在 intent 专用执行方式中添加 HtmlResponse
。HtmlResponse
可以包含 Web 应用的网址以及用于更新 Web 应用的数据。发送 HtmlResponse
时,会执行以下步骤:
- 所匹配 intent 的执行方式会向设备发送
HtmlResponse
。 - 设备使用
HtmlResponse
中的网址加载 Web 应用。 data
JSON 载荷通过回调传递给 Web 应用。您的对话式 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
会将变量值(示例中的 tint
或 spin
)传递给 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。