在 Dialogflow 中探索
點選「繼續」,在 Dialogflow 中匯入 Conversation 離開範例。接著,請按照 部署及測試範例的步驟:
- 輸入虛擬服務專員名稱,並為範例建立新的 Dialogflow 代理程式。
- 代理程式匯入完畢後,按一下「Go to agent」。
- 在主要導覽選單中,前往「Fulfillment」(執行要求)。
- 啟用「Inline Editor」(內嵌編輯器),然後按一下 [Deploy] (部署)。編輯器包含範例 再也不是件繁重乏味的工作
- 在主要導覽選單中,前往「Integrations」(整合),然後按一下「Google」 Google 助理。
- 在出現的互動視窗中,啟用「自動預覽變更」,然後按一下「測試」 以開啟動作模擬工具
- 在模擬工具中輸入
Talk to my test app
即可測試範例!
每當使用者想要離開對話中,可以說:
- "exit"
- 「取消」
- "停止"
- 「不用了」
- "再見"
根據預設,Google 助理會結束對話並播放音效。
如要覆寫此行為,您可以選擇接收最後一項要求
即可清除執行要求邏輯,以及最後一次回應使用者。
最終回應必須是單一簡單回應
textToSpeech
和 displayText
值最多只能有 60 個半形字元。
對話退出要求的執行時間上限為 2 秒。如果答案為「否」 對話結束後,對話就會以預設的退出耳機結束。 如果您的自訂取消回應失敗 (因為超過字元限制, 不當回應類型等) 對話也會以預設的退出音效結束對話。
Dialogflow
如何接收對話離開事件:
- 在左側導覽列中,按一下「Intents」(意圖) 選單項目旁的 + 圖示。
- 為意圖命名 (例如
Exit Conversation
),然後按一下「Events」(事件) 部分。 - 在「新增事件」欄位中輸入
actions_intent_CANCEL
。 - 在「Response」下方指定回應,或設定您自己的回應: 在 Webhook 程式碼中執行這項意圖
- 啟用「將此意圖設為對話結尾」。
- 按一下 [儲存]。
- 點選左側導覽面板中的「Integrations」(整合)。
- 選擇「Google 助理」,然後依序點選「更新草稿」和「測試」,即可建立 並確保專案已反映相關變更
當使用者要求對話結束時,系統會觸發您建立的意圖, 則會將回應傳回給使用者適用對象 例如,以下的執行要求程式碼使用用戶端程式庫處理 並傳回回應
const {dialogflow} = require('actions-on-google');
const functions = require('firebase-functions');
const app = dialogflow({debug: true});
app.intent('Exit Conversation', (conv) => {
conv.close(`Okay, talk to you next time!`);
});
exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);
package com.example;
import com.google.actions.api.ActionRequest;
import com.google.actions.api.ActionResponse;
import com.google.actions.api.DialogflowApp;
import com.google.actions.api.ForIntent;
import com.google.actions.api.response.ResponseBuilder;
public class MyActionsApp extends DialogflowApp {
@ForIntent("Exit Conversation")
public ActionResponse exit(ActionRequest request) {
ResponseBuilder responseBuilder = getResponseBuilder(request);
responseBuilder.add("Okay, talk to you next time!");
responseBuilder.endConversation();
return responseBuilder.build();
}
}
請注意,以下 JSON 描述的是 Webhook 要求。
{
"responseId": "e0c9d47f-aa99-4d03-bd48-a64c79e9c2a2-712767ed",
"queryResult": {
"queryText": "actions_intent_CANCEL",
"parameters": {},
"allRequiredParamsPresent": true,
"fulfillmentText": "Webhook failed for intent: Exit Conversation",
"fulfillmentMessages": [
{
"text": {
"text": [
"Webhook failed for intent: Exit Conversation"
]
}
}
],
"outputContexts": [
{
"name": "projects/df-exits-kohler/agent/sessions/ABwppHGVnlRtMz1RhGGmDOSlCFAbc2QaM12xYtw0raWvv-R5GYM6tkqiVOpIOexm_LTBCvmARwpbZ_onRuX0/contexts/actions_capability_audio_output"
},
{
"name": "projects/df-exits-kohler/agent/sessions/ABwppHGVnlRtMz1RhGGmDOSlCFAbc2QaM12xYtw0raWvv-R5GYM6tkqiVOpIOexm_LTBCvmARwpbZ_onRuX0/contexts/actions_capability_media_response_audio"
},
{
"name": "projects/df-exits-kohler/agent/sessions/ABwppHGVnlRtMz1RhGGmDOSlCFAbc2QaM12xYtw0raWvv-R5GYM6tkqiVOpIOexm_LTBCvmARwpbZ_onRuX0/contexts/actions_capability_account_linking"
},
{
"name": "projects/df-exits-kohler/agent/sessions/ABwppHGVnlRtMz1RhGGmDOSlCFAbc2QaM12xYtw0raWvv-R5GYM6tkqiVOpIOexm_LTBCvmARwpbZ_onRuX0/contexts/actions_capability_screen_output"
},
{
"name": "projects/df-exits-kohler/agent/sessions/ABwppHGVnlRtMz1RhGGmDOSlCFAbc2QaM12xYtw0raWvv-R5GYM6tkqiVOpIOexm_LTBCvmARwpbZ_onRuX0/contexts/actions_capability_web_browser"
},
{
"name": "projects/df-exits-kohler/agent/sessions/ABwppHGVnlRtMz1RhGGmDOSlCFAbc2QaM12xYtw0raWvv-R5GYM6tkqiVOpIOexm_LTBCvmARwpbZ_onRuX0/contexts/google_assistant_input_type_keyboard"
},
{
"name": "projects/df-exits-kohler/agent/sessions/ABwppHGVnlRtMz1RhGGmDOSlCFAbc2QaM12xYtw0raWvv-R5GYM6tkqiVOpIOexm_LTBCvmARwpbZ_onRuX0/contexts/actions_intent_cancel"
}
],
"intent": {
"name": "projects/df-exits-kohler/agent/intents/b506991f-ad7a-4c4b-8adc-5e6c62727381",
"displayName": "Exit Conversation"
},
"intentDetectionConfidence": 1,
"languageCode": "en"
},
"originalDetectIntentRequest": {
"source": "google",
"version": "2",
"payload": {
"user": {
"locale": "en-US",
"userVerificationStatus": "VERIFIED"
},
"conversation": {
"conversationId": "ABwppHGVnlRtMz1RhGGmDOSlCFAbc2QaM12xYtw0raWvv-R5GYM6tkqiVOpIOexm_LTBCvmARwpbZ_onRuX0",
"type": "ACTIVE",
"conversationToken": "[]"
},
"inputs": [
{
"intent": "actions.intent.CANCEL",
"rawInputs": [
{
"inputType": "KEYBOARD",
"query": "cancel"
}
]
}
],
"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"
}
]
},
"availableSurfaces": [
{
"capabilities": [
{
"name": "actions.capability.SCREEN_OUTPUT"
},
{
"name": "actions.capability.WEB_BROWSER"
},
{
"name": "actions.capability.AUDIO_OUTPUT"
}
]
}
]
}
},
"session": "projects/df-exits-kohler/agent/sessions/ABwppHGVnlRtMz1RhGGmDOSlCFAbc2QaM12xYtw0raWvv-R5GYM6tkqiVOpIOexm_LTBCvmARwpbZ_onRuX0"
}
請注意,下列 JSON 會說明 Webhook 回應。
{
"payload": {
"google": {
"expectUserResponse": false,
"richResponse": {
"items": [
{
"simpleResponse": {
"textToSpeech": "Okay, talk to you next time!"
}
}
]
}
}
}
}
Actions SDK
如要接收對話結束意圖,請按照下列步驟操作:
-
在動作套件中的
conversations
物件中宣告 且您要接收actions.intent.CANCEL
意圖的 每當使用者想要在對話中結束時就結束轉換。
{
"actions": [
{
"description": "Default Welcome Intent",
"name": "MAIN",
"fulfillment": {
"conversationName": "conversation_1"
},
"intent": {
"name": "actions.intent.MAIN"
}
}
],
"conversations": {
"conversation_1": {
"name": "conversation_1",
"url": "YOUR_ENDPOINT_URL",
"inDialogIntents": [
{
"name": "actions.intent.CANCEL"
}
]
}
}
} -
收到含有
actions.intent.CANCEL
的要求時 清理任何想使用的執行要求邏輯,然後傳回 提供適當的退出詞組例如以下的執行要求代碼 ,使用用戶端程式庫處理取消意圖。const {actionssdk} = require('actions-on-google');
const functions = require('firebase-functions');
const app = actionssdk({debug: true});
app.intent('actions.intent.MAIN', (conv) => {
conv.ask(`Hi! Try saying 'exit' or 'cancel'`);
});
app.intent('actions.intent.TEXT', (conv, input) => {
conv.ask(`You said ${input}`);
conv.ask(`Try saying 'exit' or 'cancel'`);
});
app.intent('actions.intent.CANCEL', (conv) => {
conv.close(`Okay, talk to you next time!`);
});
exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);package com.example;
import com.google.actions.api.ActionRequest;
import com.google.actions.api.ActionResponse;
import com.google.actions.api.ActionsSdkApp;
import com.google.actions.api.ConstantsKt;
import com.google.actions.api.ForIntent;
import com.google.actions.api.response.ResponseBuilder;
import com.google.actions.api.response.helperintent.Confirmation;
import com.google.actions.api.response.helperintent.DateTimePrompt;
import com.google.actions.api.response.helperintent.Permission;
import com.google.actions.api.response.helperintent.Place;
import com.google.api.services.actions_fulfillment.v2.model.DateTime;
import com.google.api.services.actions_fulfillment.v2.model.Location;
public class MyActionsApp extends ActionsSdkApp {
@ForIntent("actions.intent.MAIN")
public ActionResponse welcome(ActionRequest request) {
ResponseBuilder responseBuilder = getResponseBuilder(request);
responseBuilder.add("Hi! Try saying 'exit' or 'cancel'");
return responseBuilder.build();
}
@ForIntent("actions.intent.TEXT")
public ActionResponse fallback(ActionRequest request) {
ResponseBuilder responseBuilder = getResponseBuilder(request);
responseBuilder.add("You said " + request.getRawInput().getQuery());
responseBuilder.add("Try saying 'exit' or 'cancel'");
return responseBuilder.build();
}
@ForIntent("actions.intent.CANCEL")
public ActionResponse exit(ActionRequest request) {
ResponseBuilder responseBuilder = getResponseBuilder(request);
responseBuilder.add("Okay, talk to you next time!");
responseBuilder.endConversation();
return responseBuilder.build();
}
}請注意,以下 JSON 描述的是 Webhook 要求。
{
"user": {
"locale": "en-US",
"userVerificationStatus": "VERIFIED"
},
"conversation": {
"conversationId": "ABwppHEtH6XptryyLGWDBOVnLgy8EkOclTPETd4lcLh_f6ghQAzzg0seUuq3YocyFT8B17N6AGD6YPPjQw5CXBM",
"type": "NEW"
},
"inputs": [
{
"intent": "actions.intent.CANCEL",
"rawInputs": [
{
"inputType": "KEYBOARD",
"query": "exit"
}
]
}
],
"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"
}
]
},
"availableSurfaces": [
{
"capabilities": [
{
"name": "actions.capability.AUDIO_OUTPUT"
},
{
"name": "actions.capability.SCREEN_OUTPUT"
},
{
"name": "actions.capability.WEB_BROWSER"
}
]
}
]
}請注意,下列 JSON 會說明 Webhook 回應。
{
"expectUserResponse": false,
"finalResponse": {
"richResponse": {
"items": [
{
"simpleResponse": {
"textToSpeech": "Okay, talk to you next time!"
}
}
]
}
}
}