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