在 Dialogflow 中探索
點選 [繼續],在 Dialogflow 中匯入我們的 Helpers 範例。接著,請按照 部署及測試範例的步驟:
- 輸入虛擬服務專員名稱,並為範例建立新的 Dialogflow 代理程式。
- 代理程式匯入完畢後,按一下「Go to agent」。
- 在主要導覽選單中,前往「Fulfillment」(執行要求)。
- 啟用「Inline Editor」(內嵌編輯器),然後按一下 [Deploy] (部署)。編輯器包含範例 再也不是件繁重乏味的工作
- 在主要導覽選單中,前往「Integrations」(整合),然後按一下「Google」 Google 助理。
- 在出現的互動視窗中,啟用「自動預覽變更」,然後按一下「測試」 以開啟動作模擬工具
- 在模擬工具中輸入
Talk to my test app
即可測試範例!
幫手會請 Google 助理暫時接管對話,以便取得 使用者全名、日期和時間或寄送地址等常用資料。 當你要求協助者時,Google 助理會顯示一致的標準 UI, 使用者可以取得這些資訊,因此您不必自行設計這些內容。
用量總覽
如要瞭解搭配 Dialogflow 和 Actions SDK 使用輔助程式的一般程序,請參閱 下文說明 Dialogflow 和 Actions SDK。請參閱 進一步瞭解每個輔助程式。
Dialogflow
Node.js
- 使用適當的輔助物件呼叫
conv.ask()
。時間 當您呼叫一個輔助函式時,用戶端程式庫就會傳送回應給 包含對應的輔助意圖的 Google 助理。根據 意圖,但 Google 助理知道如何執行 輔助程式。 - 宣告 Dialogflow 意圖,以指定對應至以下事件的事件: 其中一個輔助意圖請參閱輔助意圖 部分中查看支援的事件清單。這項意圖不一定要 任何「使用者說」詞組,因為這項事件一律會在事件發生時觸發 (當 Google 助理伸出援手時)。
- Google 助理在後續 相關要求,對應的 Dialogflow 意圖會觸發,您通常會正常處理意圖。
JSON
- 請在 possibleIntents 物件。Google 助理收到 回應時,就會知道應執行輔助程式的對話方塊。詳情請見 輔助意圖:以瞭解您的意圖 才能履行
- 宣告 Dialogflow 意圖,以指定對應至以下事件的事件: 其中一個輔助意圖請參閱輔助意圖 部分中查看支援的事件清單。這項意圖不一定要 任何「使用者說」詞組,因為這項事件一律會在事件發生時觸發 。
- Google 助理在後續 傳送至執行要求,剖析要求和資料。
Actions SDK
Node.js
- 使用合適的參數呼叫
ask
。輔助函式詢問 Google 助理會執行 輔助意圖 -當您呼叫輔助函式時 用戶端程式庫會將回應傳送給 Google 助理,當中含有 這些意圖Google 助理會根據使用者意圖,決定採取 相應輔助程式的對話方塊。 - Google 助理在後續 並在執行要求時接收 {0} 請求。這可讓您偵測輔助程式傳回結果。使用 對應的 getter 函式 用於取得資料 需求。
JSON
- 請在 possibleIntents 物件。Google 助理收到 回應時,就會知道應執行輔助程式的對話方塊。詳情請見 輔助意圖:以瞭解您的意圖 才能履行
- Google 助理在後續 傳送至執行要求,剖析要求和資料。
輔助意圖
下表說明您可以要求支援的意圖,以及 可執行 Google 助理的指令。如果使用 Dialogflow,您還需建立 指定輔助意圖對應事件的 Dialogflow 意圖。
Intent (意圖名稱) | Dialogflow 事件名稱 | 用量 |
---|---|---|
actions.intent.PERMISSION |
actions_intent_PERMISSION |
取得使用者的全名、概略位置或精確位置;或者全部 3 種。 |
actions.intent.OPTION |
actions_intent_OPTION |
從清單或輪轉介面 UI 接收所選項目。或者,如果使用者 未從清單或輪轉介面 UI 選取,接收語音或文字 與清單或輪轉介面 UI 中的鍵相符的輸入來源。 |
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 |
向使用者進行確認,例如回答是非題。 |
以下各節說明可用的輔助程式和相關意圖 才能使用輔助程式
使用者資訊
您可以使用這個輔助程式取得下列使用者資訊:
- 顯示名稱
- 名字
- 系列名稱
- 概略裝置位置 (郵遞區號和城市)
- 裝置的精確位置 (座標和街道地址)
呼叫輔助程式
以下程式碼範例顯示如何使用用戶端呼叫輔助程式 資源庫。JSON 程式碼片段會顯示對應的 Webhook 回應。
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 程式碼片段代表要求,其中包含 您的執行要求會收到的輔助程式結果。
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 PsyChicago 範例 在 Node.js 中 和 Java ,瞭解 UserStorage 的實際運作情形。
清單和輪轉介面選項
呼叫輔助程式
以下程式碼範例顯示如何使用用戶端呼叫輔助程式 資源庫。JSON 程式碼片段會顯示對應的 Webhook 回應。
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." } } ] } } } ] }
您可以顯示清單或輪轉介面 UI,然後取得使用者所選的選項
使用 actions.intent.OPTION
意圖。
取得輔助程式的結果
以下程式碼範例顯示如何使用 用戶端程式庫JSON 程式碼片段代表要求,其中包含結果 您的執行要求接收的輔助程式。
下列程式碼片段說明如何查看使用者選取的選項。
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
意圖。
呼叫輔助程式
以下程式碼範例顯示如何使用用戶端呼叫輔助程式 資源庫。JSON 程式碼片段會顯示對應的 Webhook 回應。
您可以在要求使用者提供日期和時間時,指定自訂提示,方法為使用
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 程式碼片段代表要求,其中包含結果 您的執行要求接收的輔助程式。
下列程式碼片段說明如何檢查使用者是否已授予存取權,以及確認方法 存取資料。
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
意圖的執行要求。位使用者
無法透過 OAuth 以語音登入。
呼叫輔助程式
以下程式碼範例顯示如何使用用戶端呼叫輔助程式 資源庫。JSON 程式碼片段會顯示對應的 Webhook 回應。
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 程式碼片段代表要求,其中包含結果 您的執行要求接收的輔助程式。
下列程式碼片段說明如何檢查使用者是否已授予存取權,以及確認方法 存取資料。
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
意圖。這個輔助程式能提示使用者
地址和其他位置,包括所有住家/公司/聯絡地點
儲存到 Google 的檔案
已儲存的地點只會傳回地址,不會傳回相關聯的對應 (例如「中山路 123 號」而非「中正路 123 號」)。
呼叫輔助程式
以下程式碼範例顯示如何使用用戶端呼叫輔助程式 資源庫。JSON 程式碼片段會顯示對應的 Webhook 回應。
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 程式碼片段代表要求,其中包含結果 您的執行要求接收的輔助程式。
下列程式碼片段說明如何檢查使用者是否已授予存取權,以及確認方法 存取資料。
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」的文法和「否」會自然延伸至 例如「Yea」或「不需要」 在許多情況下都會用到
呼叫輔助程式
以下程式碼範例顯示如何使用用戶端呼叫輔助程式 資源庫。JSON 程式碼片段會顯示對應的 Webhook 回應。
您可以在要求使用者確認時,指定自訂提示。
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 程式碼片段代表要求,其中包含結果 您的執行要求接收的輔助程式。
使用者回應協助者後,您會收到以下要求: 並檢查使用者是否已確認。
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" } ] } ] }