首页 > 解决方案 > 如何呈现从 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-on-googleactions-builder

解决方案


我与大家分享这个解决方案。

确实,文档省略了某些部分来完成这项工作,但如果我们注意阅读并遵循它,它确实有效。

一旦我们有了 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 }))
  })
}

这是我们配置为在我们想要呈现集合时调用的一段代码。如果我们仔细观察,我们指的是类型而不是插槽的名称。

有了这个,如果我们从模拟器中进行测试,一切都应该工作。一切都很完美。

在此处输入图像描述

我希望我的帮助对您有所帮助。


推荐阅读