Khám phá trong Dialogflow
Nhấp vào Tiếp tục để nhập mẫu Lời nhắc lại của chúng tôi vào Dialogflow. Sau đó, hãy làm theo các bước bên dưới để triển khai và thử nghiệm mẫu:
- Nhập tên nhân viên hỗ trợ và tạo một nhân viên hỗ trợ Dialogflow mới cho mẫu.
- Sau khi nhân viên hỗ trợ nhập xong, hãy nhấp vào Chuyển đến nhân viên hỗ trợ.
- Trong trình đơn điều hướng chính, hãy chuyển đến phần Fulfillment (Thực hiện đơn hàng).
- Bật Inline Editor (Trình chỉnh sửa cùng dòng), sau đó nhấp vào Deploy (Triển khai). Trình chỉnh sửa chứa mẫu .
- Trong trình đơn điều hướng chính, hãy chuyển đến mục Tích hợp, rồi nhấp vào Google Trợ lý Google.
- Trong cửa sổ phụ xuất hiện, hãy bật tuỳ chọn Tự động xem trước các thay đổi rồi nhấp vào Kiểm tra để mở Trình mô phỏng thao tác.
- Trong trình mô phỏng, hãy nhập
Talk to my test app
để kiểm tra mẫu!
Bạn có thể sử dụng các tính năng sau đây để xử lý những trường hợp người dùng không cung cấp đầu vào cho Hành động của bạn (lỗi không nhập):
- Lời nhắc lại theo mặc định của hệ thống – Những câu lệnh này sẽ tự động nhắc lại người dùng với những câu lệnh nhắc lại soạn sẵn dành cho mọi trường hợp.
- Lời nhắc lại linh hoạt – Khai báo rằng bạn muốn xử lý việc nhắc lại trên sở hữu và nhận ý định (SDK hành động) hoặc sự kiện (Dialogflow) mỗi khi không có dữ liệu đầu vào, do đó bạn có thể xử lý theo từng trường hợp.
Câu lệnh nhắc lại theo mặc định của hệ thống
Theo mặc định, khi bạn trả lời Trợ lý, hệ thống sẽ sử dụng các lời nhắc mặc định để yêu cầu người dùng lặp lại hoặc nhập lại nội dung họ đã nhập.
Dialogflow
Dialogflow thực thi tối đa 3 giá trị đầu vào không khớp và không có dữ liệu đầu vào. Sau khi một cuộc trò chuyện đạt 3 lượt thử thu thập dữ liệu, nhân viên hỗ trợ Dialogflow của bạn sẽ kết thúc cuộc trò chuyện bằng phản hồi mặc định. Mục nhập không khớp trong Dialogflow là khi một trong các ý định dự phòng của bạn được kích hoạt.
Câu lệnh lại linh hoạt
Bạn có thể nhận được một ý định hoặc sự kiện Dialogflow mỗi khi Hành động của bạn không thực hiện được nhận bất kỳ thông tin đầu vào nào. Thao tác này cho phép bạn trả về một phản hồi khác dựa trên một số logic (nếu cần) và nhắc lại người dùng một cách thích hợp.
Dialogflow
Bạn có thể tạo 2 loại ý định không có đầu vào:
Ý định thông thường – Phương thức này không áp dụng bất kỳ ngữ cảnh nào nên sẽ được kích hoạt khi không có ý định nào khác phù hợp với bối cảnh để kích hoạt. Thông tin này hữu ích cho những câu lệnh chung mà bạn muốn áp dụng trong hầu hết các trường hợp.
Ý định theo dõi – Ý định tiếp theo được thực thi thông qua Dialogflow ngữ cảnh, đảm bảo lời nhắc lại chỉ được kích hoạt sau một số lượt cuộc trò chuyện. Thông tin này rất hữu ích cho các câu lệnh nhắc lại được điều chỉnh cho phù hợp với bạn mà bạn muốn áp dụng tình huống cụ thể.
Cách xử lý sự kiện không nhập dữ liệu:
- Trong bảng điều hướng bên trái, hãy nhấp vào Ý định.
- Tạo một ý định thông thường hoặc ý định theo dõi.
- Đối với ý định thông thường: Nhấp vào biểu tượng + trong trình đơn Ý định
mục và đặt tên cho ý định của bạn, chẳng hạn như "Nhắc lại".
- Đối với ý định tiếp theo: Di chuột qua ý định mà bạn muốn
tuỳ chỉnh lời nhắc không nhập dữ liệu và nhấp vào Thêm ý định tiếp theo >
tuỳ chỉnh. Một ý định mới được tạo bên dưới ý định ban đầu.
- Đối với ý định thông thường: Nhấp vào biểu tượng + trong trình đơn Ý định
mục và đặt tên cho ý định của bạn, chẳng hạn như "Nhắc lại".
- Nhấp vào ý định mới tạo để mở trình chỉnh sửa ý định.
- Nhấp vào mục Sự kiện rồi nhập " actions_intent_NO_INPUT" vào Trường Thêm sự kiện.
- Trong phần Hành động, hãy nhập tên hành động hoặc sử dụng tên được cung cấp
theo mặc định. Trong ví dụ này, chúng tôi sẽ sử dụng "no.input".
- Nhấp vào Lưu.
- Trong thanh điều hướng bên trái, hãy nhấp vào Tích hợp
- Chọn Trợ lý Google rồi nhấp vào Kiểm tra để thực hiện đảm bảo các thay đổi được phản ánh trong dự án Actions của bạn.
Mỗi khi xảy ra trường hợp không nhập dữ liệu cho ý định này, bạn có thể sử dụng phương thức thực hiện của bạn để trả về một câu trả lời phù hợp hoặc tạo một câu trả lời trong Dialogflow. Ví dụ: dưới đây là một số mã phương thức thực hiện sử dụng thư viện ứng dụng để xử lý một ý định thông thường không có dữ liệu đầu vào có tên là "Reprompt".
Node.js
const {dialogflow} = require('actions-on-google'); const functions = require('firebase-functions'); const app = dialogflow({debug: true}); app.intent('Reprompt', (conv) => { const repromptCount = parseInt(conv.arguments.get('REPROMPT_COUNT')); if (repromptCount === 0) { conv.ask(`What was that?`); } else if (repromptCount === 1) { conv.ask(`Sorry I didn't catch that. Could you repeat yourself?`); } else if (conv.arguments.get('IS_FINAL_REPROMPT')) { conv.close(`Okay let's try this again later.`); } }); exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);
Java
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("Reprompt") public ActionResponse reprompt(ActionRequest request) { ResponseBuilder responseBuilder = getResponseBuilder(request); int repromptCount = request.getRepromptCount(); String response; if (repromptCount == 0) { response = "What was that?"; } else if (repromptCount == 1) { response = "Sorry, I didn't catch that. Could you repeat yourself?"; } else { responseBuilder.endConversation(); response = "Okay let's try this again later."; } return responseBuilder.add(response).build(); } }
Yêu cầu JSON
Xin lưu ý rằng tệp JSON bên dưới mô tả một yêu cầu webhook.
{ "responseId": "f26a9188-4998-42eb-ac16-d0e6e273b137-712767ed", "queryResult": { "queryText": "actions_intent_NO_INPUT", "parameters": {}, "allRequiredParamsPresent": true, "fulfillmentText": "Webhook failed for intent: Reprompt", "fulfillmentMessages": [ { "text": { "text": [ "Webhook failed for intent: Reprompt" ] } } ], "outputContexts": [ { "name": "projects/df-reprompts-kohler/agent/sessions/ABwppHFi9Dpwy6KiEtS0UIPDNVfa7mlkrPIEZRlikFkjuN_4SGPixgX8OCatpXu38ln7VG43-nk-7veZWhds3nLljA/contexts/actions_capability_media_response_audio" }, { "name": "projects/df-reprompts-kohler/agent/sessions/ABwppHFi9Dpwy6KiEtS0UIPDNVfa7mlkrPIEZRlikFkjuN_4SGPixgX8OCatpXu38ln7VG43-nk-7veZWhds3nLljA/contexts/actions_capability_account_linking" }, { "name": "projects/df-reprompts-kohler/agent/sessions/ABwppHFi9Dpwy6KiEtS0UIPDNVfa7mlkrPIEZRlikFkjuN_4SGPixgX8OCatpXu38ln7VG43-nk-7veZWhds3nLljA/contexts/actions_capability_audio_output" }, { "name": "projects/df-reprompts-kohler/agent/sessions/ABwppHFi9Dpwy6KiEtS0UIPDNVfa7mlkrPIEZRlikFkjuN_4SGPixgX8OCatpXu38ln7VG43-nk-7veZWhds3nLljA/contexts/google_assistant_input_type_voice" }, { "name": "projects/df-reprompts-kohler/agent/sessions/ABwppHFi9Dpwy6KiEtS0UIPDNVfa7mlkrPIEZRlikFkjuN_4SGPixgX8OCatpXu38ln7VG43-nk-7veZWhds3nLljA/contexts/actions_intent_no_input", "parameters": { "REPROMPT_COUNT": 2, "IS_FINAL_REPROMPT": true } } ], "intent": { "name": "projects/df-reprompts-kohler/agent/intents/75dfd97d-6368-4436-9533-70f05ae76c96", "displayName": "Reprompt" }, "intentDetectionConfidence": 1, "languageCode": "en" }, "originalDetectIntentRequest": { "source": "google", "version": "2", "payload": { "user": { "locale": "en-US", "userVerificationStatus": "VERIFIED" }, "conversation": { "conversationId": "ABwppHFi9Dpwy6KiEtS0UIPDNVfa7mlkrPIEZRlikFkjuN_4SGPixgX8OCatpXu38ln7VG43-nk-7veZWhds3nLljA", "type": "ACTIVE", "conversationToken": "[]" }, "inputs": [ { "intent": "actions.intent.NO_INPUT", "rawInputs": [ { "inputType": "VOICE" } ], "arguments": [ { "name": "REPROMPT_COUNT", "intValue": "2" }, { "name": "IS_FINAL_REPROMPT", "boolValue": true } ] } ], "surface": { "capabilities": [ { "name": "actions.capability.MEDIA_RESPONSE_AUDIO" }, { "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" } ] } ] } }, "session": "projects/df-reprompts-kohler/agent/sessions/ABwppHFi9Dpwy6KiEtS0UIPDNVfa7mlkrPIEZRlikFkjuN_4SGPixgX8OCatpXu38ln7VG43-nk-7veZWhds3nLljA" }
JSON phản hồi
Xin lưu ý rằng JSON bên dưới mô tả phản hồi webhook.
{ "payload": { "google": { "expectUserResponse": false, "richResponse": { "items": [ { "simpleResponse": { "textToSpeech": "Okay let's try this again later." } } ] } } } }
SDK Hành động
Cách xử lý các ý định không có đầu vào:
- Trong đối tượng
conversations
bên trong gói hành động, hãy khai báo rằng bạn muốn để nhận ý địnhactions.intent.NO_INPUT
mỗi khi người dùng không cung cấp đầu vào.{ a"ctions:" [ { d"escription:" D"efault Welcome Intent," n"ame:" M"AIN," f"ulfillment:" { c"onversationName:" c"onversation_1 " }, i"ntent:" { n"ame:" a"ctions.intent.MAIN " } } ], c"onversations:" { c"onversation_1:" { n"ame:" c"onversation_1," u"rl:" Y"OUR_FULFILLMENT_URL," i"nDialogIntents:" [ { n"ame:" a"ctions.intent.NO_INPUT " } ] } } }a
- Khi Trợ lý không nhận được bất kỳ hoạt động đầu vào nào từ người dùng, bạn sẽ nhận được
ý định không đầu vào trong yêu cầu tiếp theo đến phương thức thực hiện của bạn. Sau đó, bạn có thể
xử lý ý định và trả về phản hồi nhắc lại thích hợp. Dưới đây là một ví dụ:
Node.js
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 this sample on a speaker device, ` + `and stay silent when the mic is open. If trying ` + `on the Actions console simulator, click the no-input ` + `button next to the text input field.`); }); app.intent('actions.intent.TEXT', (conv, input) => { conv.ask(`You said ${input}`); conv.ask(`Try this sample on a speaker device, ` + `and stay silent when the mic is open. If trying ` + `on the Actions console simulator, click the no-input ` + `button next to the text input field.`); }); app.intent('actions.intent.NO_INPUT', (conv) => { const repromptCount = parseInt(conv.arguments.get('REPROMPT_COUNT')); if (repromptCount === 0) { conv.ask(`What was that?`); } else if (repromptCount === 1) { conv.ask(`Sorry I didn't catch that. Could you repeat yourself?`); } else if (conv.arguments.get('IS_FINAL_REPROMPT')) { conv.close(`Okay let's try this again later.`); } }); exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);
Java
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 this sample on a speaker device, and stay silent when the mic is open. If trying on the Actions console simulator, click the no-input button next to the text input field."); 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 this sample on a speaker device, and stay silent when the mic is open. If trying on the Actions console simulator, click the no-input button next to the text input field."); return responseBuilder.build(); } @ForIntent("actions.intent.NO_INPUT") public ActionResponse reprompt(ActionRequest request) { ResponseBuilder responseBuilder = getResponseBuilder(request); int repromptCount = request.getRepromptCount(); String response; if (repromptCount == 0) { response = "What was that?"; } else if (repromptCount == 1) { response = "Sorry, I didn't catch that. Could you repeat yourself?"; } else { responseBuilder.endConversation(); response = "Okay let's try this again later."; } return responseBuilder.add(response).build(); } }
Yêu cầu JSON
Xin lưu ý rằng tệp JSON bên dưới mô tả một yêu cầu webhook.
{ "user": { "locale": "en-US", "userVerificationStatus": "VERIFIED" }, "conversation": { "conversationId": "ABwppHEVDuKUPjdZ4Ud-F2yBXN5ssRg2funUp59hSHQheAi-B5Y3EzehAKFtVwMkduqMRWscUp77ScrDjYnYxISqAM-qOXuXEuCw", "type": "ACTIVE", "conversationToken": "{\"data\":{}}" }, "inputs": [ { "intent": "actions.intent.NO_INPUT", "rawInputs": [ { "inputType": "VOICE" } ], "arguments": [ { "name": "REPROMPT_COUNT", "intValue": "2" }, { "name": "IS_FINAL_REPROMPT", "boolValue": true } ] } ], "surface": { "capabilities": [ { "name": "actions.capability.AUDIO_OUTPUT" }, { "name": "actions.capability.ACCOUNT_LINKING" }, { "name": "actions.capability.MEDIA_RESPONSE_AUDIO" } ] }, "availableSurfaces": [ { "capabilities": [ { "name": "actions.capability.SCREEN_OUTPUT" }, { "name": "actions.capability.WEB_BROWSER" }, { "name": "actions.capability.AUDIO_OUTPUT" } ] } ] }
JSON phản hồi
Xin lưu ý rằng JSON bên dưới mô tả phản hồi webhook.
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "simpleResponse": { "textToSpeech": "Okay let's try this again later." } } ] } } }