actions-on-google - 如何呈现从 webhook 返回的列表
问题描述
我正在使用 Google 操作。当我在模拟器中测试我的操作时,我从我的 webhook 返回 JSON 并收到以下错误:
“由于缺少插槽的类型覆盖,无法呈现列表或集合提示。注意,列表和集合只能用于插槽填充。应该有相应的类型覆盖来描述如何呈现此类型的列表或集合。 "
JSON 是从https://developers.google.com/assistant/conversational/prompts-selection上的文档中获取的稍作修改的示例。
typeOverrides 名称“items”与场景的插槽名称匹配。
这是 webhook 请求和响应 JSON。
*** 要求 ***
{
"handler": {
"name": "aa"
},
"intent": {
"name": "searchIntent",
"params": {
"searchParm": {
"original": "milk",
"resolved": "milk"
}
},
"query": "milk"
},
"scene": {
"name": "Start",
"slotFillingStatus": "UNSPECIFIED",
"slots": {},
"next": {
"name": "SearchScene"
}
},
"session": {
"id": "ABwppHGln0UTzfUPqJ1SMr1Cuw2TyPjJQoGUkULazcObus3vUwJCJCpba--5PSRwjqMQelRqMAUnwPvl",
"params": {},
"typeOverrides": [],
"languageCode": ""
},
"user": {
"locale": "en-AU",
"params": {},
"accountLinkingStatus": "ACCOUNT_LINKING_STATUS_UNSPECIFIED",
"verificationStatus": "VERIFIED",
"packageEntitlements": [],
"lastSeenTime": "2020-11-05T21:24:16Z"
},
"home": {
"params": {}
},
"device": {
"capabilities": [
"SPEECH",
"RICH_RESPONSE",
"LONG_FORM_AUDIO"
]
}
}
*** 回复 ***
{
"session": {
"id": "ABwppHGln0UTzfUPqJ1SMr1Cuw2TyPjJQoGUkULazcObus3vUwJCJCpba--5PSRwjqMQelRqMAUnwPvl",
"params": {},
"typeOverrides": [
{
"name": "items",
"synonym": {
"entries": [
{
"name": "ITEM_1",
"synonyms": [
"Item 1",
"First item"
],
"display": {
"title": "Item #1",
"description": "Description of Item #1",
"image": {
"alt": "Google Assistant logo",
"height": 0,
"url": "https://developers.google.com/assistant/assistant_96.png",
"width": 0
}
}
},
{
"name": "ITEM_2",
"synonyms": [
"Item 2",
"Second item"
],
"display": {
"title": "Item #2",
"description": "Description of Item #2",
"image": {
"alt": "Google Assistant logo",
"height": 0,
"url": "https://developers.google.com/assistant/assistant_96.png",
"width": 0
}
}
},
{
"name": "ITEM_3",
"synonyms": [
"Item 3",
"Third item"
],
"display": {
"title": "Item #3",
"description": "Description of Item #3",
"image": {
"alt": "Google Assistant logo",
"height": 0,
"url": "https://developers.google.com/assistant/assistant_96.png",
"width": 0
}
}
},
{
"name": "ITEM_4",
"synonyms": [
"Item 4",
"Fourth item"
],
"display": {
"title": "Item #4",
"description": "Description of Item #4",
"image": {
"alt": "Google Assistant logo",
"height": 0,
"url": "https://developers.google.com/assistant/assistant_96.png",
"width": 0
}
}
}
]
},
"typeOverrideMode": "TYPE_REPLACE"
}
]
},
"prompt": {
"override": false,
"content": {
"list": {
"items": [
{
"key": "ITEM_1"
},
{
"key": "ITEM_2"
},
{
"key": "ITEM_3"
},
{
"key": "ITEM_4"
}
],
"subtitle": "List subtitle",
"title": "List title"
}
},
"firstSimple": {
"speech": "This is a list.",
"text": "This is a list."
}
}
}
解决方案
我与大家分享这个解决方案。
确实,文档省略了某些部分来完成这项工作,但如果我们注意阅读并遵循它,它确实有效。
一旦我们有了 Actions Builder 项目,我们要做的第一件事就是在类型部分创建一个实体。就是这样,我们不需要添加输入或值,只需创建类型。
下一步是准备展示我们收藏的场景。在这种情况下,我创建了一个名为 INTRO。
这是您遇到错误的地方。您正在尝试在进入场景时触发的 webhook 中显示集合。什么都不需要放在那里,它必须是空的。
下一步是添加插槽类型和名称。我们还必须配置另外两件事,一是使所说的插槽成为强制性的,另一个是激活复选框,以便它调用我们负责绘制集合的处理程序。
如果您注意到,我将插槽命名为:type_option,它的类型为prompt_type,即我在第一步中声明的类型。然后我根据需要标记了该插槽,最后我激活了它以调用我的 webhook 中名为LaunchRequest的处理程序。
现在让我们看看代码。
const LaunchRequestHandler = app => {
app.handle('LaunchRequest', conv => {
conv.session.typeOverrides = [
{
name: 'prompt_option', // We reference the type of slot, not the name
mode: 'TYPE_REPLACE',
synonym: {
entries: [
{
name: 'ITEM_1',
synonyms: ['Item 1', 'First item'],
display: {
title: 'Element 1',
description: 'This is the element 1',
image: new Image({
url: '<YOUR URL>',
alt: 'example'
})
}
},
{
name: 'ITEM_2',
synonyms: ['Item 2', 'Second item'],
display: {
title: 'Element 2',
description: 'This is the element 2',
image: new Image({
url: '<YOUR URL>',
alt: 'example 2'
})
}
}
]
}
}
];
const items = [{ key: 'ITEM_1' }, { key: 'ITEM_2' }]
conv.add(new Collection({ title: '<YOUR TITLE>', subtitle: '<YOUR SUBTITLE>', items }))
})
}
这是我们配置为在我们想要呈现集合时调用的一段代码。如果我们仔细观察,我们指的是类型而不是插槽的名称。
有了这个,如果我们从模拟器中进行测试,一切都应该工作。一切都很完美。
我希望我的帮助对您有所帮助。
推荐阅读
- css - 全宽容器引导程序
- visual-c++ - c_src\bcrypt_nif.c(94) : 错误 C2275: 'ERL_NIF_TERM' : 非法使用这种类型作为表达式
- python - 按数据框中的行号范围分组
- javascript - 如何在 smtp.js 中发送 URL
- javascript - 数组元素的样式 .src 属性
- reactjs - mapDispatchToProp 不能作为对象工作
- typescript - 没有使用 oidc-client 调用静默重定向 uri
- python - 如何在html中将字符串编码为utf8
- java - Google Play 安装推荐人库 - 推荐人生成
- firebase - Firebase 存储安全规则:是否可以在安全规则中使用 Firebase 数据库集合字段值?如果不是,我该如何解决这个问题?