視覺選取回應 (Dialogflow)

在 Dialogflow 中探索

按一下 [繼續],將回應範例匯入 Dialogflow。接著,請按照 部署及測試範例的步驟:

  1. 輸入虛擬服務專員名稱,並為範例建立新的 Dialogflow 代理程式。
  2. 代理程式匯入完畢後,按一下「Go to agent」
  3. 在主要導覽選單中,前往「Fulfillment」(執行要求)
  4. 啟用「Inline Editor」(內嵌編輯器),然後按一下 [Deploy] (部署)。編輯器包含範例 再也不是件繁重乏味的工作
  5. 在主要導覽選單中,前往「Integrations」(整合),然後按一下「Google」 Google 助理
  6. 在出現的互動視窗中,啟用「自動預覽變更」,然後按一下「測試」 以開啟動作模擬工具
  7. 在模擬工具中輸入 Talk to my test app 即可測試範例!
繼續

提供視覺選擇回應,希望使用者做出選擇 ,才能繼續執行動作。

視覺選擇回應可以顯示在純螢幕體驗中 結合音訊和螢幕元件的體驗

視覺選擇回應可包含以下元件:

或是參閱對話設計指南,瞭解 如何將這些視覺元素整合至動作中。

屬性

視覺選擇回應具有下列規定和選用 您可以設定下列屬性:

  • 支援具有 actions.capability.SCREEN_OUTPUT 功能的介面。
  • 視覺選取回應中的第一個項目必須是簡易回應
  • 最多一個簡單的回應。
  • 最多一個基本資訊卡、選項介面 (清單輪轉介面)。 或 StructuredResponse。(不能同時擁有基本卡片和選項 同時在介面中操作)。
  • 最多 8 個建議方塊
  • FinalResponse 不支援建議方塊。

以下各節將說明如何建立各種視覺選擇 回應。

清單

,瞭解如何調查及移除這項存取權。
圖 1.清單範例 (智慧型手機)

單選清單會向使用者顯示含有多個項目的垂直清單 並可讓使用者選取一個項目從清單中選取商品 會產生包含清單項目標題的使用者查詢 (即時通訊泡泡)。

具有以下項目的介面支援清單回應類型: actions.capability.SCREEN_OUTPUT 功能。

屬性

清單必須包含至少 2 個清單項目,最多 30 個。清單具有 屬性:

  • 清單標題 (選填)
    • 固定字型和字型大小
    • 僅限單行。(超過的字元會遭到截斷)。
    • 不支援純文字,例如 Markdown。
    • 如未指定標題,資訊卡高度會收合。
  • 清單項目
    • 標題
      • 固定字型和字型大小
      • 長度上限:1 行 (以刪節號截斷...)
      • 必要項目不得重複 (支援語音選項功能)
    • 說明 (選填)
      • 固定字型和字型大小
      • 長度上限:2 行 (以刪節號截斷...)
    • 圖片 (選用)
      • 大小:48x48 像素
  • 互動情形
    • 語音/簡訊
      • 使用者隨時可以說出或輸入項目標題,不必輕觸。
      • 必須針對可處理 actions_intent_OPTION事件。

指引

清單適用於區分選項的重要時機,或 使用者需要選擇需要一目了然的選項 例如「Peter」你是不是要跟 Peter Jons 還是 Peter Hans 說話?

建議你在清單下方加入建議方塊,方便使用者查看 引導或展開對話請勿重複顯示 將清單顯示為建議方塊這種情況下的方塊會用來 對話 (不適用於選取項目)。

請注意,在隨附的範例中,伴隨的 清單資訊卡是音訊的一部分 (TTS/SSML)。音訊輸出裝置 只包含第一個清單項目我們不建議讀取所有元素 確定要繼續嗎?

確保您的動作對使用者來說最重要的內容 清單頂端 (例如最熱門、最近購買或 最常談到的事)。清單一開始最多可顯示 10 個元素,但使用者 即可展開清單以顯示更多元素。清單中的項目數量 也可能隨著介面和時間而改變。

圖 2. 清單範例 (智慧螢幕)

程式碼範例

Node.js

app.intent('List', (conv) => {   if (!conv.screen) {     conv.ask('Sorry, try this on a screen device or select the ' +       'phone surface in the simulator.');     return;   }    conv.ask('This is a list example.');   // Create a list   conv.ask(new List({     title: 'List Title',     items: {       // Add the first item to the list       'SELECTION_KEY_ONE': {         synonyms: [           'synonym 1',           'synonym 2',           'synonym 3',         ],         title: 'Title of First List Item',         description: 'This is a description of a list item.',         image: new Image({           url: 'https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png',           alt: 'Image alternate text',         }),       },       // Add the second item to the list       'SELECTION_KEY_GOOGLE_HOME': {         synonyms: [           'Google Home Assistant',           'Assistant on the Google Home',       ],         title: 'Google Home',         description: 'Google Home is a voice-activated speaker powered by ' +           'the Google Assistant.',         image: new Image({           url: 'https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png',           alt: 'Google Home',         }),       },       // Add the third item to the list       'SELECTION_KEY_GOOGLE_PIXEL': {         synonyms: [           'Google Pixel XL',           'Pixel',           'Pixel XL',         ],         title: 'Google Pixel',         description: 'Pixel. Phone by Google.',         image: new Image({           url: 'https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png',           alt: 'Google Pixel',         }),       },     },   })); });

Java

@ForIntent("List") public ActionResponse list(ActionRequest request) {   ResponseBuilder responseBuilder = getResponseBuilder(request);   if (!request.hasCapability(Capability.SCREEN_OUTPUT.getValue())) {     return responseBuilder         .add("Sorry, try ths on a screen device or select the phone surface in the simulator.")         .add("Which response would you like to see next?")         .build();   }    responseBuilder       .add("This is a list example.")       .add(           new SelectionList()               .setTitle("List Title")               .setItems(                   Arrays.asList(                       new ListSelectListItem()                           .setTitle("Title of First List Item")                           .setDescription("This is a description of a list item.")                           .setImage(                               new Image()                                   .setUrl(                                       "https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png")                                   .setAccessibilityText("Image alternate text"))                           .setOptionInfo(                               new OptionInfo()                                   .setSynonyms(                                       Arrays.asList("synonym 1", "synonym 2", "synonym 3"))                                   .setKey("SELECTION_KEY_ONE")),                       new ListSelectListItem()                           .setTitle("Google Home")                           .setDescription(                               "Google Home is a voice-activated speaker powered by the Google Assistant.")                           .setImage(                               new Image()                                   .setUrl(                                       "https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png")                                   .setAccessibilityText("Google Home"))                           .setOptionInfo(                               new OptionInfo()                                   .setSynonyms(                                       Arrays.asList(                                           "Google Home Assistant",                                           "Assistant on the Google Home"))                                   .setKey("SELECTION_KEY_GOOGLE_HOME")),                       new ListSelectListItem()                           .setTitle("Google Pixel")                           .setDescription("Pixel. Phone by Google.")                           .setImage(                               new Image()                                   .setUrl(                                       "https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png")                                   .setAccessibilityText("Google Pixel"))                           .setOptionInfo(                               new OptionInfo()                                   .setSynonyms(                                       Arrays.asList("Google Pixel XL", "Pixel", "Pixel XL"))                                   .setKey("SELECTION_KEY_GOOGLE_PIXEL")))));   return responseBuilder.build(); }

Node.js

if (!conv.screen) {   conv.ask('Sorry, try this on a screen device or select the ' +     'phone surface in the simulator.');   return; }  conv.ask('This is a list example.'); // Create a list conv.ask(new List({   title: 'List Title',   items: {     // Add the first item to the list     'SELECTION_KEY_ONE': {       synonyms: [         'synonym 1',         'synonym 2',         'synonym 3',       ],       title: 'Title of First List Item',       description: 'This is a description of a list item.',       image: new Image({         url: 'https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png',         alt: 'Image alternate text',       }),     },     // Add the second item to the list     'SELECTION_KEY_GOOGLE_HOME': {       synonyms: [         'Google Home Assistant',         'Assistant on the Google Home',     ],       title: 'Google Home',       description: 'Google Home is a voice-activated speaker powered by ' +         'the Google Assistant.',       image: new Image({         url: 'https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png',         alt: 'Google Home',       }),     },     // Add the third item to the list     'SELECTION_KEY_GOOGLE_PIXEL': {       synonyms: [         'Google Pixel XL',         'Pixel',         'Pixel XL',       ],       title: 'Google Pixel',       description: 'Pixel. Phone by Google.',       image: new Image({         url: 'https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png',         alt: 'Google Pixel',       }),     },   }, }));

Java

ResponseBuilder responseBuilder = getResponseBuilder(request); if (!request.hasCapability(Capability.SCREEN_OUTPUT.getValue())) {   return responseBuilder       .add("Sorry, try ths on a screen device or select the phone surface in the simulator.")       .add("Which response would you like to see next?")       .build(); }  responseBuilder     .add("This is a list example.")     .add(         new SelectionList()             .setTitle("List Title")             .setItems(                 Arrays.asList(                     new ListSelectListItem()                         .setTitle("Title of First List Item")                         .setDescription("This is a description of a list item.")                         .setImage(                             new Image()                                 .setUrl(                                     "https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png")                                 .setAccessibilityText("Image alternate text"))                         .setOptionInfo(                             new OptionInfo()                                 .setSynonyms(                                     Arrays.asList("synonym 1", "synonym 2", "synonym 3"))                                 .setKey("SELECTION_KEY_ONE")),                     new ListSelectListItem()                         .setTitle("Google Home")                         .setDescription(                             "Google Home is a voice-activated speaker powered by the Google Assistant.")                         .setImage(                             new Image()                                 .setUrl(                                     "https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png")                                 .setAccessibilityText("Google Home"))                         .setOptionInfo(                             new OptionInfo()                                 .setSynonyms(                                     Arrays.asList(                                         "Google Home Assistant",                                         "Assistant on the Google Home"))                                 .setKey("SELECTION_KEY_GOOGLE_HOME")),                     new ListSelectListItem()                         .setTitle("Google Pixel")                         .setDescription("Pixel. Phone by Google.")                         .setImage(                             new Image()                                 .setUrl(                                     "https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png")                                 .setAccessibilityText("Google Pixel"))                         .setOptionInfo(                             new OptionInfo()                                 .setSynonyms(                                     Arrays.asList("Google Pixel XL", "Pixel", "Pixel XL"))                                 .setKey("SELECTION_KEY_GOOGLE_PIXEL"))))); return responseBuilder.build();

JSON

請注意,下列 JSON 會說明 Webhook 回應。

{   "payload": {     "google": {       "expectUserResponse": true,       "systemIntent": {         "intent": "actions.intent.OPTION",         "data": {           "@type": "type.googleapis.com/google.actions.v2.OptionValueSpec",           "listSelect": {             "title": "List Title",             "items": [               {                 "optionInfo": {                   "key": "SELECTION_KEY_ONE",                   "synonyms": [                     "synonym 1",                     "synonym 2",                     "synonym 3"                   ]                 },                 "description": "This is a description of a list item.",                 "image": {                   "url": "https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png",                   "accessibilityText": "Image alternate text"                 },                 "title": "Title of First List Item"               },               {                 "optionInfo": {                   "key": "SELECTION_KEY_GOOGLE_HOME",                   "synonyms": [                     "Google Home Assistant",                     "Assistant on the Google Home"                   ]                 },                 "description": "Google Home is a voice-activated speaker powered by the Google Assistant.",                 "image": {                   "url": "https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png",                   "accessibilityText": "Google Home"                 },                 "title": "Google Home"               },               {                 "optionInfo": {                   "key": "SELECTION_KEY_GOOGLE_PIXEL",                   "synonyms": [                     "Google Pixel XL",                     "Pixel",                     "Pixel XL"                   ]                 },                 "description": "Pixel. Phone by Google.",                 "image": {                   "url": "https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png",                   "accessibilityText": "Google Pixel"                 },                 "title": "Google Pixel"               }             ]           }         }       },       "richResponse": {         "items": [           {             "simpleResponse": {               "textToSpeech": "This is a list example."             }           }         ]       }     }   } }

JSON

請注意,下列 JSON 會說明 Webhook 回應。

{   "expectUserResponse": true,   "expectedInputs": [     {       "possibleIntents": [         {           "intent": "actions.intent.OPTION",           "inputValueData": {             "@type": "type.googleapis.com/google.actions.v2.OptionValueSpec",             "listSelect": {               "title": "List Title",               "items": [                 {                   "optionInfo": {                     "key": "SELECTION_KEY_ONE",                     "synonyms": [                       "synonym 1",                       "synonym 2",                       "synonym 3"                     ]                   },                   "description": "This is a description of a list item.",                   "image": {                     "url": "https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png",                     "accessibilityText": "Image alternate text"                   },                   "title": "Title of First List Item"                 },                 {                   "optionInfo": {                     "key": "SELECTION_KEY_GOOGLE_HOME",                     "synonyms": [                       "Google Home Assistant",                       "Assistant on the Google Home"                     ]                   },                   "description": "Google Home is a voice-activated speaker powered by the Google Assistant.",                   "image": {                     "url": "https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png",                     "accessibilityText": "Google Home"                   },                   "title": "Google Home"                 },                 {                   "optionInfo": {                     "key": "SELECTION_KEY_GOOGLE_PIXEL",                     "synonyms": [                       "Google Pixel XL",                       "Pixel",                       "Pixel XL"                     ]                   },                   "description": "Pixel. Phone by Google.",                   "image": {                     "url": "https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png",                     "accessibilityText": "Google Pixel"                   },                   "title": "Google Pixel"                 }               ]             }           }         }       ],       "inputPrompt": {         "richInitialPrompt": {           "items": [             {               "simpleResponse": {                 "textToSpeech": "This is a list example."               }             }           ]         }       }     }   ] }

處理選取的項目

使用者選取某個商品時,系統會將選定項目的值做為 引數。在引數值中,您會取得key 已選取的項目:

Node.js

app.intent('List - OPTION', (conv, params, option) => {   const SELECTED_ITEM_RESPONSES = {     'SELECTION_KEY_ONE': 'You selected the first item',     'SELECTION_KEY_GOOGLE_HOME': 'You selected the Google Home!',     'SELECTION_KEY_GOOGLE_PIXEL': 'You selected the Google Pixel!',   };   conv.ask(SELECTED_ITEM_RESPONSES[option]);   conv.ask('Which response would you like to see next?'); });

Java

@ForIntent("List - OPTION") public ActionResponse listSelected(ActionRequest request) {   ResponseBuilder responseBuilder = getResponseBuilder(request);   String selectedItem = request.getSelectedOption();   String response;    if (selectedItem.equals("SELECTION_KEY_ONE")) {     response = "You selected the first item";   } else if (selectedItem.equals("SELECTION_KEY_GOOGLE_HOME")) {     response = "You selected the Google Home!";   } else if (selectedItem.equals("SELECTION_KEY_GOOGLE_PIXEL")) {     response = "You selected the Google Pixel!";   } else {     response = "You did not select a valid item";   }   return responseBuilder.add(response).add("Which response would you like to see next?").build(); }

Node.js

app.intent('actions.intent.OPTION', (conv, params, option) => {   const SELECTED_ITEM_RESPONSES = {     'SELECTION_KEY_ONE': 'You selected the first item',     'SELECTION_KEY_GOOGLE_HOME': 'You selected the Google Home!',     'SELECTION_KEY_GOOGLE_PIXEL': 'You selected the Google Pixel!',   };   conv.ask(SELECTED_ITEM_RESPONSES[option]);   conv.ask('Which response would you like to see next?'); });

Java

  @ForIntent("actions.intent.OPTION")   public ActionResponse listSelected(ActionRequest request) {     ResponseBuilder responseBuilder = getResponseBuilder(request);     String selectedItem = request.getSelectedOption();     String response;      if (selectedItem.equals("SELECTION_KEY_ONE")) {       response = "You selected the first item";     } else if (selectedItem.equals("SELECTION_KEY_GOOGLE_HOME")) {       response = "You selected the Google Home!";     } else if (selectedItem.equals("SELECTION_KEY_GOOGLE_PIXEL")) {       response = "You selected the Google Pixel!";     } else {       response = "You did not select a valid item";     }     return responseBuilder.add(response).add("Which response would you like to see next?").build();   }    public ActionResponse carousel(ActionRequest request) {     ResponseBuilder responseBuilder = getResponseBuilder(request);     if (!request.hasCapability(Capability.SCREEN_OUTPUT.getValue())) {       return responseBuilder           .add("Sorry, try ths on a screen device or select the phone surface in the simulator.")           .add("Which response would you like to see next?")           .build();     }      responseBuilder         .add("This is a carousel example.")         .add(             new SelectionCarousel()                 .setItems(                     Arrays.asList(                         new CarouselSelectCarouselItem()                             .setTitle("Title of First List Item")                             .setDescription("This is a description of a list item.")                             .setImage(                                 new Image()                                     .setUrl(                                         "https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png")                                     .setAccessibilityText("Image alternate text"))                             .setOptionInfo(                                 new OptionInfo()                                     .setSynonyms(                                         Arrays.asList("synonym 1", "synonym 2", "synonym 3"))                                     .setKey("SELECTION_KEY_ONE")),                         new CarouselSelectCarouselItem()                             .setTitle("Google Home")                             .setDescription(                                 "Google Home is a voice-activated speaker powered by the Google Assistant.")                             .setImage(                                 new Image()                                     .setUrl(                                         "https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png")                                     .setAccessibilityText("Google Home"))                             .setOptionInfo(                                 new OptionInfo()                                     .setSynonyms(                                         Arrays.asList(                                             "Google Home Assistant",                                             "Assistant on the Google Home"))                                     .setKey("SELECTION_KEY_GOOGLE_HOME")),                         new CarouselSelectCarouselItem()                             .setTitle("Google Pixel")                             .setDescription("Pixel. Phone by Google.")                             .setImage(                                 new Image()                                     .setUrl(                                         "https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png")                                     .setAccessibilityText("Google Pixel"))                             .setOptionInfo(                                 new OptionInfo()                                     .setSynonyms(                                         Arrays.asList("Google Pixel XL", "Pixel", "Pixel XL"))                                     .setKey("SELECTION_KEY_GOOGLE_PIXEL")))));     return responseBuilder.build();   } } 

JSON

請注意,以下 JSON 描述的是 Webhook 要求。

{   "responseId": "5d7732d1-d22d-4a0e-ad34-8bc0a7fde20c-21947381",   "queryResult": {     "queryText": "actions_intent_OPTION",     "action": "List.List-custom",     "parameters": {},     "allRequiredParamsPresent": true,     "fulfillmentText": "Webhook failed for intent: List - OPTION",     "fulfillmentMessages": [       {         "text": {           "text": [             "Webhook failed for intent: List - OPTION"           ]         }       }     ],     "outputContexts": [       {         "name": "projects/df-responses-kohler/agent/sessions/ABwppHHsebncupHK11oKhsCTgyH96GRNYH-xpeeMTqb-cvOxbd67QenbRlZM4bGAIB8_KXdTfI7-7lYVKN1ovAhCaA/contexts/actions_capability_screen_output"       },       {         "name": "projects/df-responses-kohler/agent/sessions/ABwppHHsebncupHK11oKhsCTgyH96GRNYH-xpeeMTqb-cvOxbd67QenbRlZM4bGAIB8_KXdTfI7-7lYVKN1ovAhCaA/contexts/actions_capability_account_linking"       },       {         "name": "projects/df-responses-kohler/agent/sessions/ABwppHHsebncupHK11oKhsCTgyH96GRNYH-xpeeMTqb-cvOxbd67QenbRlZM4bGAIB8_KXdTfI7-7lYVKN1ovAhCaA/contexts/actions_capability_media_response_audio"       },       {         "name": "projects/df-responses-kohler/agent/sessions/ABwppHHsebncupHK11oKhsCTgyH96GRNYH-xpeeMTqb-cvOxbd67QenbRlZM4bGAIB8_KXdTfI7-7lYVKN1ovAhCaA/contexts/actions_capability_audio_output"       },       {         "name": "projects/df-responses-kohler/agent/sessions/ABwppHHsebncupHK11oKhsCTgyH96GRNYH-xpeeMTqb-cvOxbd67QenbRlZM4bGAIB8_KXdTfI7-7lYVKN1ovAhCaA/contexts/actions_capability_web_browser"       },       {         "name": "projects/df-responses-kohler/agent/sessions/ABwppHHsebncupHK11oKhsCTgyH96GRNYH-xpeeMTqb-cvOxbd67QenbRlZM4bGAIB8_KXdTfI7-7lYVKN1ovAhCaA/contexts/google_assistant_input_type_touch"       },       {         "name": "projects/df-responses-kohler/agent/sessions/ABwppHHsebncupHK11oKhsCTgyH96GRNYH-xpeeMTqb-cvOxbd67QenbRlZM4bGAIB8_KXdTfI7-7lYVKN1ovAhCaA/contexts/list-followup",         "lifespanCount": 1       },       {         "name": "projects/df-responses-kohler/agent/sessions/ABwppHHsebncupHK11oKhsCTgyH96GRNYH-xpeeMTqb-cvOxbd67QenbRlZM4bGAIB8_KXdTfI7-7lYVKN1ovAhCaA/contexts/actions_intent_option",         "parameters": {           "OPTION": "SELECTION_KEY_GOOGLE_PIXEL",           "text": "Google Pixel"         }       }     ],     "intent": {       "name": "projects/df-responses-kohler/agent/intents/88904350-193e-4472-a2de-977eb5d9e26e",       "displayName": "List - OPTION"     },     "intentDetectionConfidence": 1,     "languageCode": "en"   },   "originalDetectIntentRequest": {     "source": "google",     "version": "2",     "payload": {       "user": {         "locale": "en-US",         "lastSeen": "2019-08-04T23:56:32Z",         "userVerificationStatus": "VERIFIED"       },       "conversation": {         "conversationId": "ABwppHHsebncupHK11oKhsCTgyH96GRNYH-xpeeMTqb-cvOxbd67QenbRlZM4bGAIB8_KXdTfI7-7lYVKN1ovAhCaA",         "type": "ACTIVE",         "conversationToken": "[\"list-followup\"]"       },       "inputs": [         {           "intent": "actions.intent.OPTION",           "rawInputs": [             {               "inputType": "TOUCH",               "query": "Google Pixel"             }           ],           "arguments": [             {               "name": "OPTION",               "textValue": "SELECTION_KEY_GOOGLE_PIXEL"             },             {               "name": "text",               "rawText": "Google Pixel",               "textValue": "Google Pixel"             }           ]         }       ],       "surface": {         "capabilities": [           {             "name": "actions.capability.SCREEN_OUTPUT"           },           {             "name": "actions.capability.ACCOUNT_LINKING"           },           {             "name": "actions.capability.MEDIA_RESPONSE_AUDIO"           },           {             "name": "actions.capability.AUDIO_OUTPUT"           },           {             "name": "actions.capability.WEB_BROWSER"           }         ]       },       "isInSandbox": true,       "availableSurfaces": [         {           "capabilities": [             {               "name": "actions.capability.WEB_BROWSER"             },             {               "name": "actions.capability.SCREEN_OUTPUT"             },             {               "name": "actions.capability.AUDIO_OUTPUT"             }           ]         }       ],       "requestType": "SIMULATOR"     }   },   "session": "projects/df-responses-kohler/agent/sessions/ABwppHHsebncupHK11oKhsCTgyH96GRNYH-xpeeMTqb-cvOxbd67QenbRlZM4bGAIB8_KXdTfI7-7lYVKN1ovAhCaA" }

JSON

請注意,以下 JSON 描述的是 Webhook 要求。

{   "user": {     "locale": "en-US",     "lastSeen": "2019-08-06T07:37:53Z",     "userVerificationStatus": "VERIFIED"   },   "conversation": {     "conversationId": "ABwppHGcqunXh1M6IE0lu2sVqXdpJfdpC5FWMkMSXQskK1nzb4IkSUSRqQzoEr0Ly0z_G3mwyZlk5rFtd1w",     "type": "NEW"   },   "inputs": [     {       "intent": "actions.intent.OPTION",       "rawInputs": [         {           "inputType": "TOUCH",           "query": "Google Home"         }       ],       "arguments": [         {           "name": "OPTION",           "textValue": "SELECTION_KEY_GOOGLE_HOME"         },         {           "name": "text",           "rawText": "Google Home",           "textValue": "Google Home"         }       ]     }   ],   "surface": {     "capabilities": [       {         "name": "actions.capability.AUDIO_OUTPUT"       },       {         "name": "actions.capability.MEDIA_RESPONSE_AUDIO"       },       {         "name": "actions.capability.ACCOUNT_LINKING"       },       {         "name": "actions.capability.SCREEN_OUTPUT"       },       {         "name": "actions.capability.WEB_BROWSER"       }     ]   },   "isInSandbox": true,   "availableSurfaces": [     {       "capabilities": [         {           "name": "actions.capability.WEB_BROWSER"         },         {           "name": "actions.capability.AUDIO_OUTPUT"         },         {           "name": "actions.capability.SCREEN_OUTPUT"         }       ]     }   ],   "requestType": "SIMULATOR" }
,瞭解如何調查及移除這項存取權。
圖 3.輪轉介面範例 (智慧型手機)

輪轉介面會橫向捲動畫面,讓使用者選取某個項目。比較 加入清單選擇器,就可以透過大型圖塊,呈現更豐富的內容。資訊方塊 構成輪轉介面的方法,與包含圖片的基本資訊卡類似。選取 系統會產生即時通訊泡泡,就像顯示回覆一樣 清單選取器。

屬性

輪轉介面回應類型具有下列規定和選用項目 您可以設定下列屬性:

  • 支援具有 actions.capability.SCREEN_OUTPUT 功能的介面。
  • 輪轉介面
    • 最多只能有十個圖塊。
    • 至少兩個圖塊。
    • 不支援純文字,例如 Markdown。
  • 輪轉介面圖塊
    • 圖片 (選用)
      • 圖片已強制調整為 128 dp 高 x 232 dp
      • 如果圖片的長寬比與圖片定界框不符 表示圖片置中,兩側皆有長條
      • 如果圖片連結損毀,系統會改用預留位置圖片
    • 標題 (必填)
      • 與基本文字資訊卡相同
      • 標題不得重複 (可支援語音選項功能)
    • 說明 (選填)
      • 格式選項與基本文字資訊卡相同
      • 最多 4 行
      • 不支援純文字,例如 Markdown。
  • 互動情形
    • 左右滑動:滑動輪轉介面即可顯示不同的資訊卡。
    • 輕觸資訊卡:輕觸項目即可產生含有相同內容的對話泡泡 做為元素標題
      • 必須針對可處理 actions_intent_OPTION 事件的觸控輸入意圖建立意圖。
    • 語音/鍵盤:使用資訊卡標題 (如有指定) 函式回覆 就像選取該項目一樣

指引

如果使用者能查看多種選項, 不需要比較名單 (和清單)。一般來說, 清單儲存至輪轉介面,因為系統在視覺上瀏覽清單內容 透過語音進行互動。

如果您想使用會連結至網頁的項目建立輪轉介面, 可以改為建立瀏覽輪轉介面

如要繼續操作,建議你在輪轉介面下方新增建議方塊 就能與會談。

建議不要在建議方塊內重複顯示清單中的選項。來自以下區塊的方塊: 此情境用於引導對話方向 (不適用於選取選項)。

如同清單,輪轉介面資訊卡隨附的即時通訊泡泡為 與音訊的子集 (TTS/SSML)這裡的音訊 (TTS/SSML) 整合了第一個 我們也強烈建議不要閱讀所有元素 選項。建議先提及第一個項目,並說明原因 例如最熱門、最近購買或最常購買 剛才談到的事)。

程式碼範例

處理選取的項目

使用者選取某個商品時,系統會將選定項目的值做為 引數。在引數值中,您會取得key 已選取的項目:

Node.js

app.intent('Carousel - OPTION', (conv, params, option) => {   const SELECTED_ITEM_RESPONSES = {     'SELECTION_KEY_ONE': 'You selected the first item',     'SELECTION_KEY_GOOGLE_HOME': 'You selected the Google Home!',     'SELECTION_KEY_GOOGLE_PIXEL': 'You selected the Google Pixel!',   };   conv.ask(SELECTED_ITEM_RESPONSES[option]);   conv.ask('Which response would you like to see next?'); });

Java

@ForIntent("Carousel - OPTION") public ActionResponse carouselSelected(ActionRequest request) {   ResponseBuilder responseBuilder = getResponseBuilder(request);   String selectedItem = request.getSelectedOption();   String response;    if (selectedItem.equals("SELECTION_KEY_ONE")) {     response = "You selected the first item";   } else if (selectedItem.equals("SELECTION_KEY_GOOGLE_HOME")) {     response = "You selected the Google Home!";   } else if (selectedItem.equals("SELECTION_KEY_GOOGLE_PIXEL")) {     response = "You selected the Google Pixel!";   } else {     response = "You did not select a valid item";   }   return responseBuilder.add(response).add("Which response would you like to see next?").build(); }

Node.js

app.intent('actions.intent.OPTION', (conv, params, option) => {   const SELECTED_ITEM_RESPONSES = {     'SELECTION_KEY_ONE': 'You selected the first item',     'SELECTION_KEY_GOOGLE_HOME': 'You selected the Google Home!',     'SELECTION_KEY_GOOGLE_PIXEL': 'You selected the Google Pixel!',   };   conv.ask(SELECTED_ITEM_RESPONSES[option]);   conv.ask('Which response would you like to see next?'); });

Java

  @ForIntent("actions.intent.OPTION")   public ActionResponse listSelected(ActionRequest request) {     ResponseBuilder responseBuilder = getResponseBuilder(request);     String selectedItem = request.getSelectedOption();     String response;      if (selectedItem.equals("SELECTION_KEY_ONE")) {       response = "You selected the first item";     } else if (selectedItem.equals("SELECTION_KEY_GOOGLE_HOME")) {       response = "You selected the Google Home!";     } else if (selectedItem.equals("SELECTION_KEY_GOOGLE_PIXEL")) {       response = "You selected the Google Pixel!";     } else {       response = "You did not select a valid item";     }     return responseBuilder.add(response).add("Which response would you like to see next?").build();   }    public ActionResponse carousel(ActionRequest request) {     ResponseBuilder responseBuilder = getResponseBuilder(request);     if (!request.hasCapability(Capability.SCREEN_OUTPUT.getValue())) {       return responseBuilder           .add("Sorry, try ths on a screen device or select the phone surface in the simulator.")           .add("Which response would you like to see next?")           .build();     }      responseBuilder         .add("This is a carousel example.")         .add(             new SelectionCarousel()                 .setItems(                     Arrays.asList(                         new CarouselSelectCarouselItem()                             .setTitle("Title of First List Item")                             .setDescription("This is a description of a list item.")                             .setImage(                                 new Image()                                     .setUrl(                                         "https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png")                                     .setAccessibilityText("Image alternate text"))                             .setOptionInfo(                                 new OptionInfo()                                     .setSynonyms(                                         Arrays.asList("synonym 1", "synonym 2", "synonym 3"))                                     .setKey("SELECTION_KEY_ONE")),                         new CarouselSelectCarouselItem()                             .setTitle("Google Home")                             .setDescription(                                 "Google Home is a voice-activated speaker powered by the Google Assistant.")                             .setImage(                                 new Image()                                     .setUrl(                                         "https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png")                                     .setAccessibilityText("Google Home"))                             .setOptionInfo(                                 new OptionInfo()                                     .setSynonyms(                                         Arrays.asList(                                             "Google Home Assistant",                                             "Assistant on the Google Home"))                                     .setKey("SELECTION_KEY_GOOGLE_HOME")),                         new CarouselSelectCarouselItem()                             .setTitle("Google Pixel")                             .setDescription("Pixel. Phone by Google.")                             .setImage(                                 new Image()                                     .setUrl(                                         "https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png")                                     .setAccessibilityText("Google Pixel"))                             .setOptionInfo(                                 new OptionInfo()                                     .setSynonyms(                                         Arrays.asList("Google Pixel XL", "Pixel", "Pixel XL"))                                     .setKey("SELECTION_KEY_GOOGLE_PIXEL")))));     return responseBuilder.build();   } } 

JSON

請注意,以下 JSON 描述的是 Webhook 要求。

{   "responseId": "fd9c865a-e628-4e89-ae72-14a002361244-21947381",   "queryResult": {     "queryText": "actions_intent_OPTION",     "action": "Carousel.Carousel-custom",     "parameters": {},     "allRequiredParamsPresent": true,     "fulfillmentText": "Webhook failed for intent: Carousel - OPTION",     "fulfillmentMessages": [       {         "text": {           "text": [             "Webhook failed for intent: Carousel - OPTION"           ]         }       }     ],     "outputContexts": [       {         "name": "projects/df-responses-kohler/agent/sessions/ABwppHHsebncupHK11oKhsCTgyH96GRNYH-xpeeMTqb-cvOxbd67QenbRlZM4bGAIB8_KXdTfI7-7lYVKN1ovAhCaA/contexts/actions_capability_media_response_audio"       },       {         "name": "projects/df-responses-kohler/agent/sessions/ABwppHHsebncupHK11oKhsCTgyH96GRNYH-xpeeMTqb-cvOxbd67QenbRlZM4bGAIB8_KXdTfI7-7lYVKN1ovAhCaA/contexts/actions_capability_account_linking"       },       {         "name": "projects/df-responses-kohler/agent/sessions/ABwppHHsebncupHK11oKhsCTgyH96GRNYH-xpeeMTqb-cvOxbd67QenbRlZM4bGAIB8_KXdTfI7-7lYVKN1ovAhCaA/contexts/actions_capability_web_browser"       },       {         "name": "projects/df-responses-kohler/agent/sessions/ABwppHHsebncupHK11oKhsCTgyH96GRNYH-xpeeMTqb-cvOxbd67QenbRlZM4bGAIB8_KXdTfI7-7lYVKN1ovAhCaA/contexts/actions_capability_screen_output"       },       {         "name": "projects/df-responses-kohler/agent/sessions/ABwppHHsebncupHK11oKhsCTgyH96GRNYH-xpeeMTqb-cvOxbd67QenbRlZM4bGAIB8_KXdTfI7-7lYVKN1ovAhCaA/contexts/actions_capability_audio_output"       },       {         "name": "projects/df-responses-kohler/agent/sessions/ABwppHHsebncupHK11oKhsCTgyH96GRNYH-xpeeMTqb-cvOxbd67QenbRlZM4bGAIB8_KXdTfI7-7lYVKN1ovAhCaA/contexts/google_assistant_input_type_touch"       },       {         "name": "projects/df-responses-kohler/agent/sessions/ABwppHHsebncupHK11oKhsCTgyH96GRNYH-xpeeMTqb-cvOxbd67QenbRlZM4bGAIB8_KXdTfI7-7lYVKN1ovAhCaA/contexts/carousel-followup",         "lifespanCount": 1       },       {         "name": "projects/df-responses-kohler/agent/sessions/ABwppHHsebncupHK11oKhsCTgyH96GRNYH-xpeeMTqb-cvOxbd67QenbRlZM4bGAIB8_KXdTfI7-7lYVKN1ovAhCaA/contexts/actions_intent_option",         "parameters": {           "OPTION": "SELECTION_KEY_ONE",           "text": "Title of First Carousel Item"         }       }     ],     "intent": {       "name": "projects/df-responses-kohler/agent/intents/89289810-95e0-4dfd-a26a-b49a2ac51406",       "displayName": "Carousel - OPTION"     },     "intentDetectionConfidence": 1,     "languageCode": "en"   },   "originalDetectIntentRequest": {     "source": "google",     "version": "2",     "payload": {       "user": {         "locale": "en-US",         "lastSeen": "2019-08-04T23:59:37Z",         "userVerificationStatus": "VERIFIED"       },       "conversation": {         "conversationId": "ABwppHHsebncupHK11oKhsCTgyH96GRNYH-xpeeMTqb-cvOxbd67QenbRlZM4bGAIB8_KXdTfI7-7lYVKN1ovAhCaA",         "type": "ACTIVE",         "conversationToken": "[\"carousel-followup\"]"       },       "inputs": [         {           "intent": "actions.intent.OPTION",           "rawInputs": [             {               "inputType": "TOUCH",               "query": "Title of First Carousel Item"             }           ],           "arguments": [             {               "name": "OPTION",               "textValue": "SELECTION_KEY_ONE"             },             {               "name": "text",               "rawText": "Title of First Carousel Item",               "textValue": "Title of First Carousel Item"             }           ]         }       ],       "surface": {         "capabilities": [           {             "name": "actions.capability.MEDIA_RESPONSE_AUDIO"           },           {             "name": "actions.capability.ACCOUNT_LINKING"           },           {             "name": "actions.capability.WEB_BROWSER"           },           {             "name": "actions.capability.SCREEN_OUTPUT"           },           {             "name": "actions.capability.AUDIO_OUTPUT"           }         ]       },       "isInSandbox": true,       "availableSurfaces": [         {           "capabilities": [             {               "name": "actions.capability.WEB_BROWSER"             },             {               "name": "actions.capability.AUDIO_OUTPUT"             },             {               "name": "actions.capability.SCREEN_OUTPUT"             }           ]         }       ],       "requestType": "SIMULATOR"     }   },   "session": "projects/df-responses-kohler/agent/sessions/ABwppHHsebncupHK11oKhsCTgyH96GRNYH-xpeeMTqb-cvOxbd67QenbRlZM4bGAIB8_KXdTfI7-7lYVKN1ovAhCaA" }

JSON

請注意,以下 JSON 描述的是 Webhook 要求。

{   "user": {     "locale": "en-US",     "lastSeen": "2019-08-06T07:37:15Z",     "userVerificationStatus": "VERIFIED"   },   "conversation": {     "conversationId": "ABwppHGcqunXh1M6IE0lu2sVqXdpJfdpC5FWMkMSXQskK1nzb4IkSUSRqQzoEr0Ly0z_G3mwyZlk5rFtd1w",     "type": "NEW"   },   "inputs": [     {       "intent": "actions.intent.OPTION",       "rawInputs": [         {           "inputType": "TOUCH",           "query": "Google Home"         }       ],       "arguments": [         {           "name": "OPTION",           "textValue": "SELECTION_KEY_GOOGLE_HOME"         },         {           "name": "text",           "rawText": "Google Home",           "textValue": "Google Home"         }       ]     }   ],   "surface": {     "capabilities": [       {         "name": "actions.capability.AUDIO_OUTPUT"       },       {         "name": "actions.capability.MEDIA_RESPONSE_AUDIO"       },       {         "name": "actions.capability.WEB_BROWSER"       },       {         "name": "actions.capability.SCREEN_OUTPUT"       },       {         "name": "actions.capability.ACCOUNT_LINKING"       }     ]   },   "isInSandbox": true,   "availableSurfaces": [     {       "capabilities": [         {           "name": "actions.capability.WEB_BROWSER"         },         {           "name": "actions.capability.AUDIO_OUTPUT"         },         {           "name": "actions.capability.SCREEN_OUTPUT"         }       ]     }   ],   "requestType": "SIMULATOR" }