Dialogflow에서 살펴보기
계속을 클릭하여 Dialogflow에서 대화 종료 샘플을 가져옵니다. 그런 다음 다음 단계에 따라 샘플을 배포하고 테스트합니다.
- 에이전트 이름을 입력하고 샘플의 새 Dialogflow 에이전트를 만듭니다.
- 에이전트 가져오기가 완료되면 Go to agent를 클릭합니다.
- 기본 탐색 메뉴에서 fulfillment로 이동합니다.
- 인라인 편집기를 사용 설정한 다음 배포를 클릭합니다. 편집기에 샘플 파일이 포함되어 있고 있습니다.
- 기본 탐색 메뉴에서 Integrations로 이동한 다음 Google을 클릭합니다. 어시스턴트를 탭합니다.
- 모달 창이 나타나면 변경사항 자동 미리보기를 사용 설정하고 테스트를 클릭합니다. 작업 시뮬레이터를 엽니다.
- 시뮬레이터에서
Talk to my test app
를 입력하여 샘플을 테스트합니다.
사용자는 대화 도중에 종료하고자 할 때마다 다음과 같이 말하면 됩니다.
- "종료"
- "취소"
- "중지"
- 'nevermind'
- "안녕히 가세요"
기본적으로 어시스턴트는 대화를 종료하고 이어콘을 재생합니다.
이 동작을 재정의하려면
처리 로직을 정리하고 사용자에게 마지막으로 한 번 응답할 수 있습니다.
최종 응답은 하나의 간단한 응답이어야 합니다.
textToSpeech
및 displayText
값에 대해 60자(영문 기준)로 제한됩니다.
대화 종료 요청에 허용되는 최대 실행 시간은 2초입니다. '아니요'인 경우 응답이 수신되면 기본 종료 이어콘으로 대화가 종료됩니다. 글자 수 제한을 초과하여 맞춤 취소 응답이 실패하면 부적절한 응답 유형 등) 기본 종료 이어콘으로 대화도 종료됩니다.
Dialogflow
대화 이탈 이벤트를 수신하는 방법:
- 왼쪽 탐색 메뉴에서 인텐트 메뉴 항목 옆에 있는 + 아이콘을 클릭합니다.
- 인텐트에 이름 (예:
Exit Conversation
)을 지정하고 이벤트 섹션을 클릭합니다. - 이벤트 추가 필드에
actions_intent_CANCEL
를 입력합니다. - 응답에서 응답을 지정하거나 이 인텐트를 추가해야 합니다.
- 이 인텐트를 대화 종료문으로 설정을 사용 설정합니다.
- 저장을 클릭합니다.
- 왼쪽 탐색 메뉴에서 Integrations(통합)를 클릭합니다.
- Google 어시스턴트를 선택하고 초안 업데이트를 클릭한 후 테스트를 클릭하여 변경사항이 프로젝트에 반영되었는지 확인합니다
사용자가 대화 종료를 요청하면 개발자가 만든 인텐트가 트리거되고 사용자에게 반환됩니다. 대상 다음은 클라이언트 라이브러리를 사용하여 요청을 처리하는 응답을 반환할 수 있습니다.
Node.js
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 요청
아래 JSON은 웹훅 요청을 설명합니다.
{ "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
아래 JSON은 웹훅 응답을 설명합니다.
{ "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
에서 요청을 받는 경우 원하는 처리 로직을 정리하고 적절한 종료 구문을 사용해야 합니다. 예를 들어 다음은 몇 가지 fulfillment 코드입니다. 클라이언트 라이브러리를 사용하여 취소 인텐트를 처리합니다.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 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 요청
아래 JSON은 웹훅 요청을 설명합니다.
{ "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
아래 JSON은 웹훅 응답을 설명합니다.
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "simpleResponse": { "textToSpeech": "Okay, talk to you next time!" } } ] } } }