帮助程序 intent (Dialogflow)

在 Dialogflow 中探索

点击继续以在 Dialogflow 中导入我们的帮助程序示例。然后,按照 部署和测试示例的步骤如下:

  1. 输入代理名称并为示例创建新的 Dialogflow 代理。
  2. 代理导入完成后,点击转到代理 (Go to agent)。
  3. 在主导航菜单中,前往 Fulfillment
  4. 启用内嵌编辑器,然后点击部署。编辑器包含示例 代码。
  5. 在主导航菜单中,前往 Integrations(集成),然后点击 Google Google 助理
  6. 在显示的模态窗口中,启用 Auto-preview changes(自动预览更改),然后点击 Test(测试) 打开 Actions 模拟器。
  7. 在模拟器中,输入 Talk to my test app 以测试该示例!
<ph type="x-smartling-placeholder"></ph> 继续

助手会让 Google 助理暂时接管对话,以获取 常见数据,例如用户全名、日期和时间或配送地址。 当您请求帮助程序时,Google 助理会呈现一个一致的标准界面 用户来获取这些信息,因此您无需自行设计。

用法概览

下面介绍了将帮助程序与 Dialogflow 和 Actions SDK 结合使用的一般流程 。请参阅 每个帮助程序的详细信息。

Dialogflow

Node.js

  1. 使用适当的辅助对象调用 conv.ask()。时间 当您调用辅助函数时,客户端库会向 包含相应帮助程序 intent 的 Google 助理。基于 意图,Google 助理就知道要针对相应的 帮助程序。
  2. 声明一个 Dialogflow intent,指定 帮助程序意图之一请参阅帮助程序 intent 部分,查看支持的事件列表。此 intent 不需要 任何“用户说”短语,因为事件始终会在事件发生时被触发 触发(在 Google 助理完成帮助程序后)。
  3. 当 Google 助理在后续请求返回帮助程序的结果时 向 fulfillment 发送的所有请求, Dialogflow intent 被触发,您可以正常处理该 intent。

JSON

  1. possibleIntents 对象。当 Google 助理收到 它知道自己应该为帮助程序执行此对话框。请参阅 帮助程序 intent,用于了解 可以请求完成
  2. 声明一个 Dialogflow intent,指定 帮助程序意图之一请参阅帮助程序 intent 部分,查看支持的事件列表。此 intent 不需要 任何“用户说”短语,因为事件始终会在事件发生时被触发 触发。
  3. 当 Google 助理在后续请求返回帮助程序的结果时 向您的 fulfillment 发出的请求,解析请求和您需要的数据。

Actions SDK

Node.js

  1. 使用适当的参数调用 ask。辅助函数会询问 让 Google 助理执行 Google 助理中描述的某个 intent 辅助意图。调用辅助函数时 客户端库向 Google 助理发送响应,其中包含 这些 intent。根据 intent,Google 助理知道执行 相应帮助程序的对话框。
  2. 当 Google 助理在后续请求返回帮助程序的结果时 请求,您将在 请求。这样,您就可以检测帮助程序是否返回了结果。使用 帮助程序获取您所需的数据 。

JSON

  1. possibleIntents 对象。当 Google 助理收到 它知道自己应该为帮助程序执行此对话框。请参阅 帮助程序 intent,用于了解 可以请求完成
  2. 当 Google 助理在后续请求返回帮助程序的结果时 向您的 fulfillment 发出的请求,解析请求和您需要的数据。

帮助程序 intent

下表介绍了您可以请求 让 Google 助理帮你执行这些操作。如果您使用的是 Dialogflow,则还需要创建一个 Dialogflow intent,用于为帮助程序 intent 指定相应事件。

意图名称 Dialogflow 事件名称 用法
actions.intent.PERMISSION actions_intent_PERMISSION 获取用户的全名、粗略位置或确切位置,或同时获取这 3 项信息。
actions.intent.OPTION actions_intent_OPTION 从列表或轮播界面接收选定项。或者,如果用户 不从列表或轮播界面中进行选择,也不接收语音或短信 与列表或轮播界面中的键匹配的输入。
actions.intent.DATETIME actions_intent_DATETIME 获取用户输入的日期和时间。
actions.intent.SIGN_IN actions_intent_SIGN_IN 请求账号关联流程,以关联用户的账号。
actions.intent.PLACE actions_intent_PLACE 从用户那里获取一个地址或保存的位置。
actions.intent.CONFIRMATION actions_intent_CONFIRMATION 获得用户的确认(例如,回答是或否)。

以下部分介绍了可用的帮助程序和关联的 intent 您必须请求其才能使用帮助程序。

用户信息

您可以通过此帮助程序获取以下用户信息:

  • 显示名称
  • 名字
  • 系列名称
  • 设备的粗略位置信息(邮政编码和城市)
  • 设备的确切位置(坐标和街道地址)

呼叫帮助程序

以下代码示例展示了如何使用客户端 库。JSON 代码段显示了相应的网络钩子响应。

Node.js

app.intent('Permission', (conv) => {   const permissions = ['NAME'];   let context = 'To address you by name';   // Location permissions only work for verified users   // https://developers.google.com/actions/assistant/guest-users   if (conv.user.verification === 'VERIFIED') {     // Could use DEVICE_COARSE_LOCATION instead for city, zip code     permissions.push('DEVICE_PRECISE_LOCATION');     context += ' and know your location';   }   const options = {     context,     permissions,   };   conv.ask(new Permission(options)); });

Java

@ForIntent("Permission") public ActionResponse getPermission(ActionRequest request) {   ResponseBuilder responseBuilder = getResponseBuilder(request);   String[] permissions = new String[] {ConstantsKt.PERMISSION_NAME};   String context = "To address you by name";   // Location permissions only work for verified users   // https://developers.google.com/actions/assistant/guest-users   if (request.getUser().getUserVerificationStatus().equals("VERIFIED")) {     // Could use PERMISSION_DEVICE_COARSE_LOCATION instead for city, zip code     permissions =         new String[] {           ConstantsKt.PERMISSION_NAME, ConstantsKt.PERMISSION_DEVICE_PRECISE_LOCATION         };   }   responseBuilder       .add("PLACEHOLDER")       .add(new Permission().setPermissions(permissions).setContext(context));    return responseBuilder.build(); }

Node.js

const permissions = ['NAME']; let context = 'To address you by name'; // Location permissions only work for verified users // https://developers.google.com/actions/assistant/guest-users if (conv.user.verification === 'VERIFIED') {   // Could use DEVICE_COARSE_LOCATION instead for city, zip code   permissions.push('DEVICE_PRECISE_LOCATION');   context += ' and know your location'; } const options = {   context,   permissions, }; conv.ask(new Permission(options));

Java

ResponseBuilder responseBuilder = getResponseBuilder(request); String[] permissions = new String[] {ConstantsKt.PERMISSION_NAME}; String context = "To address you by name"; // Location permissions only work for verified users // https://developers.google.com/actions/assistant/guest-users if (request.getUser().getUserVerificationStatus().equals("VERIFIED")) {   // Could use PERMISSION_DEVICE_COARSE_LOCATION instead for city, zip code   permissions =       new String[] {         ConstantsKt.PERMISSION_NAME, ConstantsKt.PERMISSION_DEVICE_PRECISE_LOCATION       }; } responseBuilder     .add("PLACEHOLDER")     .add(new Permission().setPermissions(permissions).setContext(context));  return responseBuilder.build();

JSON

请注意,下面的 JSON 描述的是 webhook 请求。

{   "payload": {     "google": {       "expectUserResponse": true,       "systemIntent": {         "intent": "actions.intent.PERMISSION",         "data": {           "@type": "type.googleapis.com/google.actions.v2.PermissionValueSpec",           "optContext": "To address you by name and know your location",           "permissions": [             "NAME",             "DEVICE_PRECISE_LOCATION"           ]         }       }     }   } }

JSON

请注意,下面的 JSON 描述的是 webhook 请求。

{   "expectUserResponse": true,   "expectedInputs": [     {       "possibleIntents": [         {           "intent": "actions.intent.PERMISSION",           "inputValueData": {             "@type": "type.googleapis.com/google.actions.v2.PermissionValueSpec",             "optContext": "To address you by name and know your location",             "permissions": [               "NAME",               "DEVICE_PRECISE_LOCATION"             ]           }         }       ]     }   ] }

获取帮助程序的结果

以下代码示例展示了如何使用 客户端库。JSON 代码段表示请求,其中包含 您的 fulfillment 将收到的帮助程序的结果。

Node.js

app.intent('Permission Handler', (conv, params, confirmationGranted) => {   // Also, can access latitude and longitude   // const { latitude, longitude } = location.coordinates;   const {location} = conv.device;   const {name} = conv.user;   if (confirmationGranted && name && location) {     conv.ask(`Okay ${name.display}, I see you're at ` +       `${location.formattedAddress}`);   } else {     conv.ask(`Looks like I can't get your information.`);   }   conv.ask(`Would you like to try another helper?`);   conv.ask(new Suggestions([     'Confirmation',     'DateTime',     'Place',   ])); });

Java

@ForIntent("Permission Handler") public ActionResponse handlePermission(ActionRequest request) {   ResponseBuilder responseBuilder = getResponseBuilder(request);   Location location = request.getDevice().getLocation();   String name = request.getUser().getProfile().getDisplayName();    if (request.isPermissionGranted()) {     responseBuilder.add("Okay " + name + ", I see you're at " + location.getFormattedAddress());   } else {     responseBuilder.add("Looks like I can't get your information");   }   responseBuilder       .add("Would you like to try another helper?")       .addSuggestions(new String[] {"Confirmation", "DateTime", "Place"});    return responseBuilder.build(); }

Node.js

app.intent('actions.intent.PERMISSION', (conv, confirmationGranted) => {   // Also, can access latitude and longitude   // const { latitude, longitude } = location.coordinates;   const {location} = conv.device;   const {name} = conv.user;   if (confirmationGranted && name && location) {     conv.ask(`Okay ${name.display}, I see you're at ` +       `${location.formattedAddress}`);   } else {     conv.ask(`Looks like I can't get your information.`);   }   conv.ask(`Would you like to try another helper?`);   conv.ask(new Suggestions([     'Confirmation',     'DateTime',     'Place',   ])); });

Java

@ForIntent("actions.intent.PERMISSION") public ActionResponse handlePermission(ActionRequest request) {   ResponseBuilder responseBuilder = getResponseBuilder(request);   Location location = request.getDevice().getLocation();   String name = request.getUser().getProfile().getDisplayName();    if (request.isPermissionGranted()) {     responseBuilder.add("Okay " + name + ", I see you're at " + location.getFormattedAddress());   } else {     responseBuilder.add("Looks like I can't get your information");   }   responseBuilder       .add("Would you like to try another helper?")       .addSuggestions(new String[] {"Confirmation", "DateTime", "Place"});    return responseBuilder.build(); }

JSON

请注意,下面的 JSON 描述的是 webhook 请求。

{   "responseId": "f26883c9-0283-4827-85bf-533f4442b4f9-712767ed",   "queryResult": {     "queryText": "actions_intent_PERMISSION",     "parameters": {},     "allRequiredParamsPresent": true,     "fulfillmentText": "Webhook failed for intent: Permission Handler",     "fulfillmentMessages": [       {         "text": {           "text": [             "Webhook failed for intent: Permission Handler"           ]         }       }     ],     "outputContexts": [       {         "name": "projects/df-helpers-kohler/agent/sessions/ABwppHGu7m_m6bTsKuLb6noyG_o-9BMSf8J9cfY8dpJIPN_hHT79qfqRrZPtyx515K-sl9SU8Jy3auH6pLmy99Y/contexts/actions_capability_account_linking"       },       {         "name": "projects/df-helpers-kohler/agent/sessions/ABwppHGu7m_m6bTsKuLb6noyG_o-9BMSf8J9cfY8dpJIPN_hHT79qfqRrZPtyx515K-sl9SU8Jy3auH6pLmy99Y/contexts/actions_capability_screen_output"       },       {         "name": "projects/df-helpers-kohler/agent/sessions/ABwppHGu7m_m6bTsKuLb6noyG_o-9BMSf8J9cfY8dpJIPN_hHT79qfqRrZPtyx515K-sl9SU8Jy3auH6pLmy99Y/contexts/actions_capability_web_browser"       },       {         "name": "projects/df-helpers-kohler/agent/sessions/ABwppHGu7m_m6bTsKuLb6noyG_o-9BMSf8J9cfY8dpJIPN_hHT79qfqRrZPtyx515K-sl9SU8Jy3auH6pLmy99Y/contexts/actions_capability_audio_output"       },       {         "name": "projects/df-helpers-kohler/agent/sessions/ABwppHGu7m_m6bTsKuLb6noyG_o-9BMSf8J9cfY8dpJIPN_hHT79qfqRrZPtyx515K-sl9SU8Jy3auH6pLmy99Y/contexts/actions_capability_media_response_audio"       },       {         "name": "projects/df-helpers-kohler/agent/sessions/ABwppHGu7m_m6bTsKuLb6noyG_o-9BMSf8J9cfY8dpJIPN_hHT79qfqRrZPtyx515K-sl9SU8Jy3auH6pLmy99Y/contexts/google_assistant_input_type_keyboard"       },       {         "name": "projects/df-helpers-kohler/agent/sessions/ABwppHGu7m_m6bTsKuLb6noyG_o-9BMSf8J9cfY8dpJIPN_hHT79qfqRrZPtyx515K-sl9SU8Jy3auH6pLmy99Y/contexts/actions_intent_permission",         "parameters": {           "PERMISSION": true,           "text": "yes"         }       }     ],     "intent": {       "name": "projects/df-helpers-kohler/agent/intents/6475b0ef-dd52-4afa-a1b9-7a19e7e93a80",       "displayName": "Permission Handler"     },     "intentDetectionConfidence": 1,     "languageCode": "en"   },   "originalDetectIntentRequest": {     "source": "google",     "version": "2",     "payload": {       "user": {         "profile": {           "displayName": "Sachit Mishra",           "givenName": "Sachit",           "familyName": "Mishra"         },         "permissions": [           "NAME",           "DEVICE_PRECISE_LOCATION"         ],         "locale": "en-US",         "userVerificationStatus": "VERIFIED"       },       "conversation": {         "conversationId": "ABwppHGu7m_m6bTsKuLb6noyG_o-9BMSf8J9cfY8dpJIPN_hHT79qfqRrZPtyx515K-sl9SU8Jy3auH6pLmy99Y",         "type": "ACTIVE",         "conversationToken": "[]"       },       "inputs": [         {           "intent": "actions.intent.PERMISSION",           "rawInputs": [             {               "inputType": "KEYBOARD",               "query": "yes"             }           ],           "arguments": [             {               "name": "PERMISSION",               "boolValue": true,               "textValue": "true"             },             {               "name": "text",               "rawText": "yes",               "textValue": "yes"             }           ]         }       ],       "surface": {         "capabilities": [           {             "name": "actions.capability.ACCOUNT_LINKING"           },           {             "name": "actions.capability.SCREEN_OUTPUT"           },           {             "name": "actions.capability.WEB_BROWSER"           },           {             "name": "actions.capability.AUDIO_OUTPUT"           },           {             "name": "actions.capability.MEDIA_RESPONSE_AUDIO"           }         ]       },       "device": {         "location": {           "coordinates": {             "latitude": 37.42241550000001,             "longitude": -122.0840805           },           "formattedAddress": "Google Building 40 1600 Amphitheatre Parkway, Mountain View, California 94043",           "zipCode": "94043",           "city": "Mountain View"         }       },       "availableSurfaces": [         {           "capabilities": [             {               "name": "actions.capability.WEB_BROWSER"             },             {               "name": "actions.capability.SCREEN_OUTPUT"             },             {               "name": "actions.capability.AUDIO_OUTPUT"             }           ]         }       ]     }   },   "session": "projects/df-helpers-kohler/agent/sessions/ABwppHGu7m_m6bTsKuLb6noyG_o-9BMSf8J9cfY8dpJIPN_hHT79qfqRrZPtyx515K-sl9SU8Jy3auH6pLmy99Y" }

JSON

请注意,下面的 JSON 描述的是 webhook 请求。

{   "user": {     "profile": {       "displayName": "Sachit Mishra",       "givenName": "Sachit",       "familyName": "Mishra"     },     "permissions": [       "DEVICE_PRECISE_LOCATION",       "NAME"     ],     "locale": "en-US",     "userVerificationStatus": "VERIFIED"   },   "conversation": {     "conversationId": "ABwppHEcidO2jguO4hS8maDeMVx8aasSCcBWZHrF3EmOMIaWRP9qF0BcACistiIoeyiSNTW6KD_tqN_U-xAIOXhPvA",     "type": "NEW"   },   "inputs": [     {       "intent": "actions.intent.PERMISSION",       "rawInputs": [         {           "inputType": "KEYBOARD",           "query": "yes"         }       ],       "arguments": [         {           "name": "PERMISSION",           "boolValue": true,           "textValue": "true"         },         {           "name": "text",           "rawText": "yes",           "textValue": "yes"         }       ]     }   ],   "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"       }     ]   },   "device": {     "location": {       "coordinates": {         "latitude": 37.4197238,         "longitude": -122.08212759999999       },       "formattedAddress": "Google Building 45 1585 Charleston Road, Mountain View, California 94043",       "zipCode": "94043",       "city": "Mountain View"     }   },   "availableSurfaces": [     {       "capabilities": [         {           "name": "actions.capability.SCREEN_OUTPUT"         },         {           "name": "actions.capability.WEB_BROWSER"         },         {           "name": "actions.capability.AUDIO_OUTPUT"         }       ]     }   ] }

上面的代码段展示了如何查看用户是否向你授予了信息以及 然后访问相应数据。

获取用户信息后,我们建议您保留此 因此您不必再次询问您可以使用用户存储空间 跨会话存储用户信息。看看我们的“Name Psychic”示例 Node.jsJava 了解 UserStorage 的实际应用。

呼叫帮助程序

以下代码示例展示了如何使用客户端 库。JSON 代码段显示了相应的网络钩子响应。

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."               }             }           ]         }       }     }   ] }

您可以显示列表或轮播界面,并从用户处获取所选选项 actions.intent.OPTION intent。

获取帮助程序的结果

以下代码示例展示了如何使用 客户端库。JSON 代码段表示请求,其中包含结果 你的 fulfillment 将收到的帮助程序的名称。

以下代码段展示了如何查看用户选择了哪个选项。

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" }

日期和时间

您可以通过请求履行 actions.intent.DATETIME intent。

呼叫帮助程序

以下代码示例展示了如何使用客户端 库。JSON 代码段显示了相应的网络钩子响应。

使用 options 对象。DateTime

Node.js

app.intent('Date Time', (conv) => {   const options = {     prompts: {       initial: 'When would you like to schedule the appointment?',       date: 'What day was that?',       time: 'What time works for you?',     },   };   conv.ask(new DateTime(options)); });

Java

@ForIntent("Date Time") public ActionResponse getDateTime(ActionRequest request) {   ResponseBuilder responseBuilder = getResponseBuilder(request);    responseBuilder       .add("PLACEHOLDER")       .add(           new DateTimePrompt()               .setDateTimePrompt("When would you like to schedule the appointment?")               .setDatePrompt("What day was that?")               .setTimePrompt("What time works for you?"));   return responseBuilder.build(); }

Node.js

const options = {   prompts: {     initial: 'When would you like to schedule the appointment?',     date: 'What day was that?',     time: 'What time works for you?',   }, }; conv.ask(new DateTime(options));

Java

ResponseBuilder responseBuilder = getResponseBuilder(request);  responseBuilder     .add("PLACEHOLDER")     .add(         new DateTimePrompt()             .setDateTimePrompt("When would you like to schedule the appointment?")             .setDatePrompt("What day was that?")             .setTimePrompt("What time works for you?")); return responseBuilder.build();

JSON

请注意,下面的 JSON 描述的是 webhook 请求。

{   "payload": {     "google": {       "expectUserResponse": true,       "systemIntent": {         "intent": "actions.intent.DATETIME",         "data": {           "@type": "type.googleapis.com/google.actions.v2.DateTimeValueSpec",           "dialogSpec": {             "requestDatetimeText": "When would you like to schedule the appointment?",             "requestDateText": "What day was that?",             "requestTimeText": "What time works for you?"           }         }       }     }   } }

JSON

请注意,下面的 JSON 描述的是 webhook 请求。

{   "expectUserResponse": true,   "expectedInputs": [     {       "possibleIntents": [         {           "intent": "actions.intent.DATETIME",           "inputValueData": {             "@type": "type.googleapis.com/google.actions.v2.DateTimeValueSpec",             "dialogSpec": {               "requestDatetimeText": "When would you like to schedule the appointment?",               "requestDateText": "What day was that?",               "requestTimeText": "What time works for you?"             }           }         }       ]     }   ] }

获取帮助程序的结果

以下代码示例展示了如何使用 客户端库。JSON 代码段表示请求,其中包含结果 你的 fulfillment 将收到的帮助程序的名称。

以下代码段展示了如何检查用户是否已授予访问权限以及如何 访问数据的权限。

Node.js

app.intent('Date Time Handler', (conv, params, datetime) => {   const {month, day} = datetime.date;   const {hours, minutes} = datetime.time;   conv.ask(`<speak>` +       `Great, we will see you on ` +       `<say-as interpret-as="date" format="dm">${day}-${month}</say-as>` +       `<say-as interpret-as="time" format="hms12" detail="2">${hours}` +       `:${minutes || '00'}</say-as>` +       `</speak>`);   conv.ask('Would you like to try another helper?');   conv.ask(new Suggestions([     'Confirmation',     'Permission',     'Place',   ])); });

Java

@ForIntent("Date Time Handler") public ActionResponse handleDateTime(ActionRequest request) {   ResponseBuilder responseBuilder = getResponseBuilder(request);    DateTime dateTimeValue = request.getDateTime();   Integer day = dateTimeValue.getDate().getDay();   Integer month = dateTimeValue.getDate().getMonth();   Integer hours = dateTimeValue.getTime().getHours();   Integer minutes = dateTimeValue.getTime().getMinutes();   String minutesStr = (minutes != null) ? String.valueOf(minutes) : "00";   responseBuilder.add(       "<speak>"           + "Great, we will see you on "           + "<say-as interpret-as=\"date\" format=\"dm\">"           + day           + "-"           + month           + "</say-as>"           + "<say-as interpret-as=\"time\" format=\"hms12\" detail=\"2\">"           + hours           + ":"           + minutesStr           + "</say-as>"           + "</speak>");   responseBuilder       .add("Would you like to try another helper?")       .addSuggestions(new String[] {"Confirmation", "Permission", "Place"});   return responseBuilder.build(); }

Node.js

app.intent('actions.intent.DATETIME', (conv) => {   const datetime = conv.arguments.get('DATETIME');   const {month, day} = datetime.date;   const {hours, minutes} = datetime.time;   conv.ask(`<speak>` +       `Great, we will see you on ` +       `<say-as interpret-as="date" format="dm">${day}-${month}</say-as>` +       `<say-as interpret-as="time" format="hms12" detail="2">${hours}` +       `:${minutes || '00'}</say-as>` +       `</speak>`);   conv.ask('Would you like to try another helper?');   conv.ask(new Suggestions([     'Confirmation',     'Permission',     'Place',   ])); });

Java

@ForIntent("actions.intent.DATETIME") public ActionResponse datetimeHandler(ActionRequest request) {   ResponseBuilder responseBuilder = getResponseBuilder(request);    DateTime dateTimeValue = request.getDateTime();   Integer day = dateTimeValue.getDate().getDay();   Integer month = dateTimeValue.getDate().getMonth();   Integer hours = dateTimeValue.getTime().getHours();   Integer minutes = dateTimeValue.getTime().getMinutes();   String minutesStr = (minutes != null) ? String.valueOf(minutes) : "00";   responseBuilder.add(       "<speak>"           + "Great, we will see you on "           + "<say-as interpret-as=\"date\" format=\"dm\">"           + day           + "-"           + month           + "</say-as>"           + "<say-as interpret-as=\"time\" format=\"hms12\" detail=\"2\">"           + hours           + ":"           + minutesStr           + "</say-as>"           + "</speak>");   responseBuilder       .add("Would you like to try another helper?")       .addSuggestions(new String[] {"Confirmation", "Permission", "Place"});   return responseBuilder.build(); }

JSON

请注意,下面的 JSON 描述的是 webhook 请求。

{   "responseId": "2b0a039d-b033-4256-bd8a-ebb1f0ad90b4-712767ed",   "queryResult": {     "queryText": "actions_intent_DATETIME",     "action": "DateTime.DateTime-custom",     "parameters": {},     "allRequiredParamsPresent": true,     "fulfillmentText": "Webhook failed for intent: Date Time Handler",     "fulfillmentMessages": [       {         "text": {           "text": [             "Webhook failed for intent: Date Time Handler"           ]         }       }     ],     "outputContexts": [       {         "name": "projects/df-helpers-kohler/agent/sessions/ABwppHHnU7RSIOU994H8vd2wLYXbnoIAs3rk-4zUeiRAaX3aJ0dp68Y50MgvddE2stYuI6Hlu-MfWO75Gz76EeY/contexts/actions_capability_audio_output"       },       {         "name": "projects/df-helpers-kohler/agent/sessions/ABwppHHnU7RSIOU994H8vd2wLYXbnoIAs3rk-4zUeiRAaX3aJ0dp68Y50MgvddE2stYuI6Hlu-MfWO75Gz76EeY/contexts/actions_capability_screen_output"       },       {         "name": "projects/df-helpers-kohler/agent/sessions/ABwppHHnU7RSIOU994H8vd2wLYXbnoIAs3rk-4zUeiRAaX3aJ0dp68Y50MgvddE2stYuI6Hlu-MfWO75Gz76EeY/contexts/actions_capability_media_response_audio"       },       {         "name": "projects/df-helpers-kohler/agent/sessions/ABwppHHnU7RSIOU994H8vd2wLYXbnoIAs3rk-4zUeiRAaX3aJ0dp68Y50MgvddE2stYuI6Hlu-MfWO75Gz76EeY/contexts/actions_capability_account_linking"       },       {         "name": "projects/df-helpers-kohler/agent/sessions/ABwppHHnU7RSIOU994H8vd2wLYXbnoIAs3rk-4zUeiRAaX3aJ0dp68Y50MgvddE2stYuI6Hlu-MfWO75Gz76EeY/contexts/actions_capability_web_browser"       },       {         "name": "projects/df-helpers-kohler/agent/sessions/ABwppHHnU7RSIOU994H8vd2wLYXbnoIAs3rk-4zUeiRAaX3aJ0dp68Y50MgvddE2stYuI6Hlu-MfWO75Gz76EeY/contexts/google_assistant_input_type_keyboard"       },       {         "name": "projects/df-helpers-kohler/agent/sessions/ABwppHHnU7RSIOU994H8vd2wLYXbnoIAs3rk-4zUeiRAaX3aJ0dp68Y50MgvddE2stYuI6Hlu-MfWO75Gz76EeY/contexts/datetime-followup",         "lifespanCount": 1       },       {         "name": "projects/df-helpers-kohler/agent/sessions/ABwppHHnU7RSIOU994H8vd2wLYXbnoIAs3rk-4zUeiRAaX3aJ0dp68Y50MgvddE2stYuI6Hlu-MfWO75Gz76EeY/contexts/actions_intent_datetime",         "parameters": {           "DATETIME": "2019-08-14T10:30:00",           "text": "1030am"         }       }     ],     "intent": {       "name": "projects/df-helpers-kohler/agent/intents/3c145f18-32fe-40aa-842e-b99ab28c3f2a",       "displayName": "Date Time Handler"     },     "intentDetectionConfidence": 1,     "languageCode": "en"   },   "originalDetectIntentRequest": {     "source": "google",     "version": "2",     "payload": {       "user": {         "locale": "en-US",         "userVerificationStatus": "VERIFIED"       },       "conversation": {         "conversationId": "ABwppHHnU7RSIOU994H8vd2wLYXbnoIAs3rk-4zUeiRAaX3aJ0dp68Y50MgvddE2stYuI6Hlu-MfWO75Gz76EeY",         "type": "ACTIVE",         "conversationToken": "[\"datetime-followup\"]"       },       "inputs": [         {           "intent": "actions.intent.DATETIME",           "rawInputs": [             {               "inputType": "KEYBOARD",               "query": "1030am"             }           ],           "arguments": [             {               "name": "DATETIME",               "datetimeValue": {                 "date": {                   "year": 2019,                   "month": 8,                   "day": 14                 },                 "time": {                   "hours": 10,                   "minutes": 30                 }               }             },             {               "name": "text",               "rawText": "1030am",               "textValue": "1030am"             }           ]         }       ],       "surface": {         "capabilities": [           {             "name": "actions.capability.AUDIO_OUTPUT"           },           {             "name": "actions.capability.SCREEN_OUTPUT"           },           {             "name": "actions.capability.MEDIA_RESPONSE_AUDIO"           },           {             "name": "actions.capability.ACCOUNT_LINKING"           },           {             "name": "actions.capability.WEB_BROWSER"           }         ]       },       "availableSurfaces": [         {           "capabilities": [             {               "name": "actions.capability.AUDIO_OUTPUT"             },             {               "name": "actions.capability.SCREEN_OUTPUT"             },             {               "name": "actions.capability.WEB_BROWSER"             }           ]         }       ]     }   },   "session": "projects/df-helpers-kohler/agent/sessions/ABwppHHnU7RSIOU994H8vd2wLYXbnoIAs3rk-4zUeiRAaX3aJ0dp68Y50MgvddE2stYuI6Hlu-MfWO75Gz76EeY" }

JSON

请注意,下面的 JSON 描述的是 webhook 请求。

{   "user": {     "profile": {       "displayName": "Sachit Mishra",       "givenName": "Sachit",       "familyName": "Mishra"     },     "permissions": [       "DEVICE_PRECISE_LOCATION",       "NAME"     ],     "locale": "en-US",     "userVerificationStatus": "VERIFIED"   },   "conversation": {     "conversationId": "ABwppHEcidO2jguO4hS8maDeMVx8aasSCcBWZHrF3EmOMIaWRP9qF0BcACistiIoeyiSNTW6KD_tqN_U-xAIOXhPvA",     "type": "NEW"   },   "inputs": [     {       "intent": "actions.intent.DATETIME",       "rawInputs": [         {           "inputType": "KEYBOARD",           "query": "430pm"         }       ],       "arguments": [         {           "name": "DATETIME",           "datetimeValue": {             "date": {               "year": 2019,               "month": 8,               "day": 18             },             "time": {               "hours": 16,               "minutes": 30             }           }         },         {           "name": "text",           "rawText": "430pm",           "textValue": "430pm"         }       ]     }   ],   "surface": {     "capabilities": [       {         "name": "actions.capability.ACCOUNT_LINKING"       },       {         "name": "actions.capability.WEB_BROWSER"       },       {         "name": "actions.capability.AUDIO_OUTPUT"       },       {         "name": "actions.capability.MEDIA_RESPONSE_AUDIO"       },       {         "name": "actions.capability.SCREEN_OUTPUT"       }     ]   },   "device": {     "location": {       "coordinates": {         "latitude": 37.4197238,         "longitude": -122.08212759999999       },       "formattedAddress": "Google Building 45 1585 Charleston Road, Mountain View, California 94043",       "zipCode": "94043",       "city": "Mountain View"     }   },   "availableSurfaces": [     {       "capabilities": [         {           "name": "actions.capability.AUDIO_OUTPUT"         },         {           "name": "actions.capability.SCREEN_OUTPUT"         },         {           "name": "actions.capability.WEB_BROWSER"         }       ]     }   ] }

账号登录

您可以让用户登录与您的 actions.intent.SIGN_IN intent 来实现。用户 无法通过 OAuth 进行语音登录。

呼叫帮助程序

以下代码示例展示了如何使用客户端 库。JSON 代码段显示了相应的网络钩子响应。

Node.js

const {SignIn} = require('actions-on-google'); app.intent('ask_for_sign_in_detail', (conv) => {   conv.ask(new SignIn()); });

Java

ResponseBuilder responseBuilder = getResponseBuilder(request); return responseBuilder.add("This is the SignIn helper intent").add(new SignIn()).build();

JSON

{   "payload": {     "google": {       "expectUserResponse": true,       "systemIntent": {         "intent": "actions.intent.SIGN_IN",         "data": {           "@type": "type.googleapis.com/google.actions.v2.SignInValueSpec"         }       }     }   } }

JSON

{   "expectUserResponse": true,   "expectedInputs": [     {       "possibleIntents": [         {           "intent": "actions.intent.SIGN_IN",           "inputValueData": {             "@type": "type.googleapis.com/google.actions.v2.SignInValueSpec"           }         }       ]     }   ] }

获取帮助程序的结果

以下代码示例展示了如何使用 客户端库。JSON 代码段表示请求,其中包含结果 你的 fulfillment 将收到的帮助程序的名称。

以下代码段展示了如何检查用户是否已授予访问权限以及如何 访问数据的权限。

Node.js

app.intent('ask_for_sign_in_confirmation', (conv, params, signin) => {   if (signin.status !== 'OK') {     return conv.ask('You need to sign in before using the app.');   }   // const access = conv.user.access.token;   // possibly do something with access token   return conv.ask('Great! Thanks for signing in.'); });

Java

ResponseBuilder responseBuilder = getResponseBuilder(request); boolean signedIn = request.isSignInGranted(); return responseBuilder     .add(signedIn ? "Great! Thanks for signin in." : "You must sign in before using the app.")     .build();

JSON

{   "responseId": "",   "queryResult": {     "queryText": "",     "action": "",     "parameters": {},     "allRequiredParamsPresent": true,     "fulfillmentText": "",     "fulfillmentMessages": [],     "outputContexts": [],     "intent": {       "name": "ask_for_sign_in_confirmation",       "displayName": "ask_for_sign_in_confirmation"     },     "intentDetectionConfidence": 1,     "diagnosticInfo": {},     "languageCode": ""   },   "originalDetectIntentRequest": {     "source": "google",     "version": "2",     "payload": {       "isInSandbox": true,       "surface": {         "capabilities": [           {             "name": "actions.capability.SCREEN_OUTPUT"           },           {             "name": "actions.capability.AUDIO_OUTPUT"           },           {             "name": "actions.capability.MEDIA_RESPONSE_AUDIO"           },           {             "name": "actions.capability.WEB_BROWSER"           }         ]       },       "inputs": [         {           "rawInputs": [],           "intent": "",           "arguments": [             {               "name": "SIGN_IN",               "extension": {                 "@type": "type.googleapis.com/google.actions.v2.SignInValue",                 "status": "OK"               }             }           ]         }       ],       "user": {},       "conversation": {},       "availableSurfaces": [         {           "capabilities": [             {               "name": "actions.capability.SCREEN_OUTPUT"             },             {               "name": "actions.capability.AUDIO_OUTPUT"             },             {               "name": "actions.capability.MEDIA_RESPONSE_AUDIO"             },             {               "name": "actions.capability.WEB_BROWSER"             }           ]         }       ]     }   },   "session": "" }

JSON

{   "user": {},   "device": {},   "surface": {     "capabilities": [       {         "name": "actions.capability.SCREEN_OUTPUT"       },       {         "name": "actions.capability.AUDIO_OUTPUT"       },       {         "name": "actions.capability.MEDIA_RESPONSE_AUDIO"       },       {         "name": "actions.capability.WEB_BROWSER"       }     ]   },   "conversation": {},   "inputs": [     {       "rawInputs": [],       "intent": "ask_for_sign_in_confirmation",       "arguments": [         {           "name": "SIGN_IN",           "extension": {             "@type": "type.googleapis.com/google.actions.v2.SignInValue",             "status": "OK"           }         }       ]     }   ],   "availableSurfaces": [     {       "capabilities": [         {           "name": "actions.capability.SCREEN_OUTPUT"         },         {           "name": "actions.capability.AUDIO_OUTPUT"         },         {           "name": "actions.capability.MEDIA_RESPONSE_AUDIO"         },         {           "name": "actions.capability.WEB_BROWSER"         }       ]     }   ] }

地点和位置

您可以通过请求履行 actions.intent.PLACE intent。此帮助程序用于提示用户 地址和其他位置,包括任何家庭/工作/联系地址 您保存在 Google 中的文件

保存的地点将仅返回地址,而不返回关联的映射 (例如,您可以输入“大街 123 号”,而不是“家 = 大街 123 号”)。

呼叫帮助程序

以下代码示例展示了如何使用客户端 库。JSON 代码段显示了相应的网络钩子响应。

Node.js

app.intent('Place', (conv) => {   const options = {     context: 'To find a location',     prompt: 'Where would you like to go?',   };   conv.ask(new Place(options)); });

Java

@ForIntent("Place") public ActionResponse getPlace(ActionRequest request) {   ResponseBuilder responseBuilder = getResponseBuilder(request);   responseBuilder       .add("PLACEHOLDER")       .add(           new Place()               .setRequestPrompt("Where would you like to go?")               .setPermissionContext("To find  a location"));   return responseBuilder.build(); }

Node.js

const options = {   context: 'To find a location',   prompt: 'Where would you like to go?', }; conv.ask(new Place(options));

Java

ResponseBuilder responseBuilder = getResponseBuilder(request); responseBuilder     .add("PLACEHOLDER")     .add(         new Place()             .setRequestPrompt("Where would you like to go?")             .setPermissionContext("To find  a location")); return responseBuilder.build();

JSON

请注意,下面的 JSON 描述的是 webhook 请求。

{   "payload": {     "google": {       "expectUserResponse": true,       "systemIntent": {         "intent": "actions.intent.PLACE",         "data": {           "@type": "type.googleapis.com/google.actions.v2.PlaceValueSpec",           "dialogSpec": {             "extension": {               "@type": "type.googleapis.com/google.actions.v2.PlaceValueSpec.PlaceDialogSpec",               "permissionContext": "To find a location",               "requestPrompt": "Where would you like to go?"             }           }         }       }     }   } }

JSON

请注意,下面的 JSON 描述的是 webhook 请求。

{   "expectUserResponse": true,   "expectedInputs": [     {       "possibleIntents": [         {           "intent": "actions.intent.PLACE",           "inputValueData": {             "@type": "type.googleapis.com/google.actions.v2.PlaceValueSpec",             "dialogSpec": {               "extension": {                 "@type": "type.googleapis.com/google.actions.v2.PlaceValueSpec.PlaceDialogSpec",                 "permissionContext": "To find a location",                 "requestPrompt": "Where would you like to go?"               }             }           }         }       ]     }   ] }

获取帮助程序的结果

以下代码示例展示了如何使用 客户端库。JSON 代码段表示请求,其中包含结果 你的 fulfillment 将收到的帮助程序的名称。

以下代码段展示了如何检查用户是否已授予访问权限以及如何 访问数据的权限。

Node.js

app.intent('Place Handler', (conv, params, place) => {   if (!place) {     conv.ask(`Sorry, I couldn't get a location from you.`);   } else {     // Place also contains formattedAddress and coordinates     const {name} = place;     conv.ask(`${name} sounds like a great place to go!`);   }   conv.ask('Would you like to try another helper?');   conv.ask(new Suggestions([     'Confirmation',     'DateTime',     'Permission',   ])); });

Java

@ForIntent("Place Handler") public ActionResponse handlePlace(ActionRequest request) {   ResponseBuilder responseBuilder = getResponseBuilder(request);   Location location = request.getPlace();   if (location == null) {     responseBuilder.add("Sorry, I couldn't get a location from you.");   } else {     responseBuilder.add(location.getName() + " sounds like a great place to go!");   }   responseBuilder       .add("Would you like to try another helper?")       .addSuggestions(new String[] {"Confirmation", "DateTime", "Permission"});   return responseBuilder.build(); }

Node.js

app.intent('actions.intent.PLACE', (conv) => {   const place = conv.arguments.get('PLACE');   if (!place) {     conv.ask(`Sorry, I couldn't get a location from you.`);   } else {     // Place also contains formattedAddress and coordinates     const {name} = place;     conv.ask(`${name} sounds like a great place to go!`);   }   conv.ask('Would you like to try another helper?');   conv.ask(new Suggestions([     'Confirmation',     'DateTime',     'Permission',   ])); });

Java

@ForIntent("actions.intent.PLACE") public ActionResponse handlePlace(ActionRequest request) {   ResponseBuilder responseBuilder = getResponseBuilder(request);   Location location = request.getPlace();   if (location == null) {     responseBuilder.add("Sorry, I couldn't get a location from you.");   } else {     responseBuilder.add(location.getName() + " sounds like a great place to go!");   }   responseBuilder       .add("Would you like to try another helper?")       .addSuggestions(new String[] {"Confirmation", "DateTime", "Permission"});   return responseBuilder.build(); }

JSON

请注意,下面的 JSON 描述的是 webhook 请求。

{   "responseId": "ce99fd40-b9ed-4151-bc99-f25db9eda8c5-712767ed",   "queryResult": {     "queryText": "actions_intent_PLACE",     "action": "Place.Place-custom",     "parameters": {},     "allRequiredParamsPresent": true,     "fulfillmentText": "Webhook failed for intent: Place Handler",     "fulfillmentMessages": [       {         "text": {           "text": [             "Webhook failed for intent: Place Handler"           ]         }       }     ],     "outputContexts": [       {         "name": "projects/df-helpers-kohler/agent/sessions/ABwppHEdLCo3vaqVs-pED_sPQDIUr_Ls5JYICyNks9vKbfUaIF8n4P7fYsKEYSiKvD3Vmnli9deu_uTB8s3nPeA/contexts/actions_capability_audio_output"       },       {         "name": "projects/df-helpers-kohler/agent/sessions/ABwppHEdLCo3vaqVs-pED_sPQDIUr_Ls5JYICyNks9vKbfUaIF8n4P7fYsKEYSiKvD3Vmnli9deu_uTB8s3nPeA/contexts/actions_capability_screen_output"       },       {         "name": "projects/df-helpers-kohler/agent/sessions/ABwppHEdLCo3vaqVs-pED_sPQDIUr_Ls5JYICyNks9vKbfUaIF8n4P7fYsKEYSiKvD3Vmnli9deu_uTB8s3nPeA/contexts/actions_capability_media_response_audio"       },       {         "name": "projects/df-helpers-kohler/agent/sessions/ABwppHEdLCo3vaqVs-pED_sPQDIUr_Ls5JYICyNks9vKbfUaIF8n4P7fYsKEYSiKvD3Vmnli9deu_uTB8s3nPeA/contexts/actions_capability_account_linking"       },       {         "name": "projects/df-helpers-kohler/agent/sessions/ABwppHEdLCo3vaqVs-pED_sPQDIUr_Ls5JYICyNks9vKbfUaIF8n4P7fYsKEYSiKvD3Vmnli9deu_uTB8s3nPeA/contexts/actions_capability_web_browser"       },       {         "name": "projects/df-helpers-kohler/agent/sessions/ABwppHEdLCo3vaqVs-pED_sPQDIUr_Ls5JYICyNks9vKbfUaIF8n4P7fYsKEYSiKvD3Vmnli9deu_uTB8s3nPeA/contexts/google_assistant_input_type_keyboard"       },       {         "name": "projects/df-helpers-kohler/agent/sessions/ABwppHEdLCo3vaqVs-pED_sPQDIUr_Ls5JYICyNks9vKbfUaIF8n4P7fYsKEYSiKvD3Vmnli9deu_uTB8s3nPeA/contexts/place-followup",         "lifespanCount": 1       },       {         "name": "projects/df-helpers-kohler/agent/sessions/ABwppHEdLCo3vaqVs-pED_sPQDIUr_Ls5JYICyNks9vKbfUaIF8n4P7fYsKEYSiKvD3Vmnli9deu_uTB8s3nPeA/contexts/actions_intent_place",         "parameters": {           "PLACE": "KFC, 2523 North Carson Street, Carson City, NV 89706, United States",           "text": "yes"         }       }     ],     "intent": {       "name": "projects/df-helpers-kohler/agent/intents/4cf9e154-e151-44db-ae79-84d8c5a707de",       "displayName": "Place Handler"     },     "intentDetectionConfidence": 1,     "languageCode": "en"   },   "originalDetectIntentRequest": {     "source": "google",     "version": "2",     "payload": {       "user": {         "permissions": [           "DEVICE_PRECISE_LOCATION"         ],         "locale": "en-US",         "userVerificationStatus": "VERIFIED"       },       "conversation": {         "conversationId": "ABwppHEdLCo3vaqVs-pED_sPQDIUr_Ls5JYICyNks9vKbfUaIF8n4P7fYsKEYSiKvD3Vmnli9deu_uTB8s3nPeA",         "type": "ACTIVE",         "conversationToken": "[\"place-followup\"]"       },       "inputs": [         {           "intent": "actions.intent.PLACE",           "rawInputs": [             {               "inputType": "KEYBOARD",               "query": "Query handled by Actions on Google"             }           ],           "arguments": [             {               "name": "PLACE",               "placeValue": {                 "coordinates": {                   "latitude": 39.182895,                   "longitude": -119.7679113                 },                 "formattedAddress": "KFC, 2523 North Carson Street, Carson City, NV 89706, United States",                 "name": "KFC",                 "placeId": "ChIJZfBpmMEKmYARFsfc574LgB8"               }             },             {               "name": "text",               "rawText": "yes",               "textValue": "yes"             }           ]         }       ],       "surface": {         "capabilities": [           {             "name": "actions.capability.AUDIO_OUTPUT"           },           {             "name": "actions.capability.SCREEN_OUTPUT"           },           {             "name": "actions.capability.MEDIA_RESPONSE_AUDIO"           },           {             "name": "actions.capability.ACCOUNT_LINKING"           },           {             "name": "actions.capability.WEB_BROWSER"           }         ]       },       "device": {         "location": {           "coordinates": {             "latitude": 39.2814592,             "longitude": -120.12421119999999           },           "formattedAddress": "Currant Road, Truckee, California 96161",           "zipCode": "96161",           "city": "Truckee"         }       },       "availableSurfaces": [         {           "capabilities": [             {               "name": "actions.capability.WEB_BROWSER"             },             {               "name": "actions.capability.SCREEN_OUTPUT"             },             {               "name": "actions.capability.AUDIO_OUTPUT"             }           ]         }       ]     }   } }

JSON

请注意,下面的 JSON 描述的是 webhook 请求。

{   "user": {     "permissions": [       "DEVICE_PRECISE_LOCATION"     ],     "locale": "en-US",     "userVerificationStatus": "VERIFIED"   },   "conversation": {     "conversationId": "ABwppHEcidO2jguO4hS8maDeMVx8aasSCcBWZHrF3EmOMIaWRP9qF0BcACistiIoeyiSNTW6KD_tqN_U-xAIOXhPvA",     "type": "NEW"   },   "inputs": [     {       "intent": "actions.intent.PLACE",       "rawInputs": [         {           "inputType": "KEYBOARD",           "query": "Query handled by Actions on Google"         }       ],       "arguments": [         {           "name": "PLACE",           "placeValue": {             "coordinates": {               "latitude": 37.4219999,               "longitude": -122.0840575             },             "formattedAddress": "Googleplex, 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States",             "name": "Googleplex",             "placeId": "ChIJj61dQgK6j4AR4GeTYWZsKWw"           }         },         {           "name": "text",           "rawText": "googleplex",           "textValue": "googleplex"         }       ]     }   ],   "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"       }     ]   },   "device": {     "location": {       "coordinates": {         "latitude": 37.4197238,         "longitude": -122.08212759999999       },       "formattedAddress": "Google Building 45 1585 Charleston Road, Mountain View, California 94043",       "zipCode": "94043",       "city": "Mountain View"     }   },   "availableSurfaces": [     {       "capabilities": [         {           "name": "actions.capability.SCREEN_OUTPUT"         },         {           "name": "actions.capability.WEB_BROWSER"         },         {           "name": "actions.capability.AUDIO_OUTPUT"         }       ]     }   ] }

确认

您可以向用户提出一般性确认(是/否问题), 生成的答案。“yes”的语法和“no”自然地展开 如“Yea”或“否”,因此在很多情况下都可以使用。

呼叫帮助程序

以下代码示例展示了如何使用客户端 库。JSON 代码段显示了相应的网络钩子响应。

您可以在要求用户确认时指定自定义提示。

Node.js

app.intent('Confirmation', (conv) => {   conv.ask(new Confirmation('Can you confirm?')); });

Java

@ForIntent("Confirmation") public ActionResponse getConfirmation(ActionRequest request) {   ResponseBuilder responseBuilder = getResponseBuilder(request);   responseBuilder       .add("PLACEHOLDER")       .add(new Confirmation().setConfirmationText("Can you confirm?"));   return responseBuilder.build(); }

Node.js

conv.ask(new Confirmation('Can you confirm?'));

Java

ResponseBuilder responseBuilder = getResponseBuilder(request); responseBuilder     .add("PLACEHOLDER")     .add(new Confirmation().setConfirmationText("Can you confirm?")); return responseBuilder.build();

JSON

请注意,下面的 JSON 描述的是 webhook 请求。

{   "payload": {     "google": {       "expectUserResponse": true,       "systemIntent": {         "intent": "actions.intent.CONFIRMATION",         "data": {           "@type": "type.googleapis.com/google.actions.v2.ConfirmationValueSpec",           "dialogSpec": {             "requestConfirmationText": "Can you confirm?"           }         }       }     }   } }

JSON

请注意,下面的 JSON 描述的是 webhook 请求。

{   "expectUserResponse": true,   "expectedInputs": [     {       "possibleIntents": [         {           "intent": "actions.intent.CONFIRMATION",           "inputValueData": {             "@type": "type.googleapis.com/google.actions.v2.ConfirmationValueSpec",             "dialogSpec": {               "requestConfirmationText": "Can you confirm?"             }           }         }       ]     }   ] }

获取帮助程序的结果

以下代码示例展示了如何使用 客户端库。JSON 代码段表示请求,其中包含结果 你的 fulfillment 将收到的帮助程序的名称。

在用户响应帮助程序后,您会收到对 您的执行方式,并且可以检查用户是否已确认。

Node.js

app.intent('Confirmation Handler', (conv, params, confirmationGranted) => {   conv.ask(confirmationGranted     ? 'Thank you for confirming'     : 'No problem, you have not confirmed');   conv.ask('Would you like to try another helper?');   conv.ask(new Suggestions([     'DateTime',     'Permission',     'Place',   ])); });

Java

@ForIntent("Confirmation Handler") public ActionResponse handleConfirmation(ActionRequest request) {   ResponseBuilder responseBuilder = getResponseBuilder(request);   boolean userConfirmation = request.getUserConfirmation();   responseBuilder       .add(userConfirmation ? "Thank you for confirming" : "No problem, you have not confirmed")       .addSuggestions(new String[] {"Place", "DateTime", "Permission"});   return responseBuilder.build(); }

Node.js

app.intent('actions.intent.CONFIRMATION', (conv, confirmationGranted) => {   conv.ask(confirmationGranted     ? 'Thank you for confirming'     : 'No problem, you have not confirmed');   conv.ask('Would you like to try another helper?');   conv.ask(new Suggestions([     'DateTime',     'Permission',     'Place',   ])); });

Java

@ForIntent("actions.intent.CONFIRMATION") public ActionResponse handleConfirmation(ActionRequest request) {   ResponseBuilder responseBuilder = getResponseBuilder(request);   boolean userConfirmation = request.getUserConfirmation();   responseBuilder       .add(userConfirmation ? "Thank you for confirming" : "No problem, you have not confirmed")       .addSuggestions(new String[] {"Place", "DateTime", "Permission"});   return responseBuilder.build(); }

JSON

请注意,下面的 JSON 描述的是 webhook 请求。

{   "responseId": "26c3dd46-321c-4ab5-9f6c-a445f6d5de01-712767ed",   "queryResult": {     "queryText": "actions_intent_CONFIRMATION",     "parameters": {},     "allRequiredParamsPresent": true,     "fulfillmentText": "Webhook failed for intent: Confirmation Handler",     "fulfillmentMessages": [       {         "text": {           "text": [             "Webhook failed for intent: Confirmation Handler"           ]         }       }     ],     "outputContexts": [       {         "name": "projects/df-helpers-kohler/agent/sessions/ABwppHEdLCo3vaqVs-pED_sPQDIUr_Ls5JYICyNks9vKbfUaIF8n4P7fYsKEYSiKvD3Vmnli9deu_uTB8s3nPeA/contexts/actions_capability_account_linking"       },       {         "name": "projects/df-helpers-kohler/agent/sessions/ABwppHEdLCo3vaqVs-pED_sPQDIUr_Ls5JYICyNks9vKbfUaIF8n4P7fYsKEYSiKvD3Vmnli9deu_uTB8s3nPeA/contexts/actions_capability_media_response_audio"       },       {         "name": "projects/df-helpers-kohler/agent/sessions/ABwppHEdLCo3vaqVs-pED_sPQDIUr_Ls5JYICyNks9vKbfUaIF8n4P7fYsKEYSiKvD3Vmnli9deu_uTB8s3nPeA/contexts/actions_capability_audio_output"       },       {         "name": "projects/df-helpers-kohler/agent/sessions/ABwppHEdLCo3vaqVs-pED_sPQDIUr_Ls5JYICyNks9vKbfUaIF8n4P7fYsKEYSiKvD3Vmnli9deu_uTB8s3nPeA/contexts/actions_capability_web_browser"       },       {         "name": "projects/df-helpers-kohler/agent/sessions/ABwppHEdLCo3vaqVs-pED_sPQDIUr_Ls5JYICyNks9vKbfUaIF8n4P7fYsKEYSiKvD3Vmnli9deu_uTB8s3nPeA/contexts/actions_capability_screen_output"       },       {         "name": "projects/df-helpers-kohler/agent/sessions/ABwppHEdLCo3vaqVs-pED_sPQDIUr_Ls5JYICyNks9vKbfUaIF8n4P7fYsKEYSiKvD3Vmnli9deu_uTB8s3nPeA/contexts/google_assistant_input_type_keyboard"       },       {         "name": "projects/df-helpers-kohler/agent/sessions/ABwppHEdLCo3vaqVs-pED_sPQDIUr_Ls5JYICyNks9vKbfUaIF8n4P7fYsKEYSiKvD3Vmnli9deu_uTB8s3nPeA/contexts/actions_intent_confirmation",         "parameters": {           "CONFIRMATION": true,           "text": "yes"         }       }     ],     "intent": {       "name": "projects/df-helpers-kohler/agent/intents/11cc7c8e-0710-42ea-9cd9-723aff03e97f",       "displayName": "Confirmation Handler"     },     "intentDetectionConfidence": 1,     "languageCode": "en"   },   "originalDetectIntentRequest": {     "source": "google",     "version": "2",     "payload": {       "user": {         "locale": "en-US",         "userVerificationStatus": "VERIFIED"       },       "conversation": {         "conversationId": "ABwppHEdLCo3vaqVs-pED_sPQDIUr_Ls5JYICyNks9vKbfUaIF8n4P7fYsKEYSiKvD3Vmnli9deu_uTB8s3nPeA",         "type": "ACTIVE",         "conversationToken": "[]"       },       "inputs": [         {           "intent": "actions.intent.CONFIRMATION",           "rawInputs": [             {               "inputType": "KEYBOARD",               "query": "yes"             }           ],           "arguments": [             {               "name": "CONFIRMATION",               "boolValue": true             },             {               "name": "text",               "rawText": "yes",               "textValue": "yes"             }           ]         }       ],       "surface": {         "capabilities": [           {             "name": "actions.capability.ACCOUNT_LINKING"           },           {             "name": "actions.capability.MEDIA_RESPONSE_AUDIO"           },           {             "name": "actions.capability.AUDIO_OUTPUT"           },           {             "name": "actions.capability.WEB_BROWSER"           },           {             "name": "actions.capability.SCREEN_OUTPUT"           }         ]       },       "availableSurfaces": [         {           "capabilities": [             {               "name": "actions.capability.AUDIO_OUTPUT"             },             {               "name": "actions.capability.SCREEN_OUTPUT"             },             {               "name": "actions.capability.WEB_BROWSER"             }           ]         }       ]     }   },   "session": "projects/df-helpers-kohler/agent/sessions/ABwppHEdLCo3vaqVs-pED_sPQDIUr_Ls5JYICyNks9vKbfUaIF8n4P7fYsKEYSiKvD3Vmnli9deu_uTB8s3nPeA" }

JSON

请注意,下面的 JSON 描述的是 webhook 请求。

{   "user": {     "locale": "en-US",     "userVerificationStatus": "VERIFIED"   },   "conversation": {     "conversationId": "ABwppHGY8XRtymCExS313Cc6Vp42zR0uQuGf6BwpSW0772Er-rxSTtFjs3KfGYu6jCDgHbA8IKVWjB8Gr9odc4yHhg",     "type": "NEW"   },   "inputs": [     {       "intent": "actions.intent.CONFIRMATION",       "rawInputs": [         {           "inputType": "KEYBOARD",           "query": "yes"         }       ],       "arguments": [         {           "name": "CONFIRMATION",           "boolValue": true         },         {           "name": "text",           "rawText": "yes",           "textValue": "yes"         }       ]     }   ],   "surface": {     "capabilities": [       {         "name": "actions.capability.MEDIA_RESPONSE_AUDIO"       },       {         "name": "actions.capability.SCREEN_OUTPUT"       },       {         "name": "actions.capability.WEB_BROWSER"       },       {         "name": "actions.capability.ACCOUNT_LINKING"       },       {         "name": "actions.capability.AUDIO_OUTPUT"       }     ]   },   "availableSurfaces": [     {       "capabilities": [         {           "name": "actions.capability.AUDIO_OUTPUT"         },         {           "name": "actions.capability.SCREEN_OUTPUT"         },         {           "name": "actions.capability.WEB_BROWSER"         }       ]     }   ] }