Actions on Google Node.js 클라이언트 라이브러리 (Dialogflow)를 사용하여 처리 빌드

자바스크립트로 처리 웹훅을 만드는 경우 Actions on Google Node.js 클라이언트 라이브러리를 사용하여 Actions on Google 플랫폼에 액세스하고 상호작용할 수 있습니다.

소개

Node.js 클라이언트 라이브러리는 다음 기능을 제공하는 Actions on Google의 처리 라이브러리입니다.

  • 텍스트 및 리치 멀티미디어 응답, 계정 로그인, 데이터 저장용량, 거래 등을 포함하여 모든 Actions on Google 기능을 지원합니다.
  • 자바스크립트에서 대화 HTTP/JSON 웹훅 API를 래핑하는 관용적인 추상화 레이어를 제공합니다.
  • 처리와 Actions on Google 플랫폼 간의 통신에 관한 대략적인 세부정보를 처리합니다.
  • npm 또는 yarn와 같이 익숙한 패키지 관리 도구를 사용하여 설치할 수 있습니다.
  • Firebase용 Cloud Functions 또는 AWS Lambda와 같은 서버리스 컴퓨팅 플랫폼에 처리 웹훅을 쉽게 배포할 수 있습니다. 또한 클라우드 서비스 제공업체 또는 자체 호스팅 및 자체 관리형 환경에서 처리 웹훅을 호스팅할 수 있습니다.
  • Node.js v6.0.0 이상과 호환됩니다.

클라이언트 라이브러리를 Actions on Google용 Dialogflow 통합 또는 Actions SDK와 함께 사용할 수 있습니다.

클라이언트 라이브러리 사용을 위한 전체 코드 샘플을 확인하려면 샘플 페이지를 방문하세요.

API 참조 보기

API 참조는 Actions on Google Node.js 클라이언트 라이브러리 GitHub 페이지에 호스팅됩니다.

클라이언트 라이브러리 코드를 다운로드한 디렉터리에서 다음 명령어를 실행하여 참조의 로컬 사본을 생성할 수도 있습니다.

yarn docs

생성된 문서는 클라이언트 라이브러리 코드를 다운로드한 디렉터리의 docs 폴더에서 확인할 수 있습니다.

작동 원리 이해

클라이언트 라이브러리를 사용하기 전에 처리 웹훅에서 클라이언트 라이브러리를 사용하여 Actions on Google이 처리에 전송하는 사용자 요청을 처리하는 방법을 이해하면 도움이 됩니다.

자바스크립트로 처리 웹훅을 만들면 Google의 Firebase용 Cloud Functions 또는 AWS Lambda와 같은 서버리스 컴퓨팅 환경에서 코드를 배포하고 호스팅할 수 있습니다. Express 웹 프레임워크를 사용하여 추가 작업 없이 코드를 직접 호스팅할 수도 있습니다.

런타임 환경 내에서 처리 웹훅은 클라이언트 라이브러리의 함수를 호출하여 사용자 요청을 처리하고 사용자 출력에 렌더링하기 위해 Actions on Google에 응답을 다시 전송할 수 있습니다.

클라이언트 라이브러리를 사용하여 처리 웹훅에서 처리하는 주요 작업은 아래에 요약되어 있습니다.

그림 1. Node.js 클라이언트 라이브러리의 상위 수준 아키텍처
  1. 사용자 요청 수신: 사용자가 Google 어시스턴트에 쿼리를 실행하면 Actions on Google 플랫폼이 처리 웹훅에 HTTP 요청을 전송합니다. 요청에는 인텐트와 기타 데이터(예: 사용자 입력의 원시 텍스트, 사용자 기기의 노출 영역 기능)가 포함된 JSON 페이로드가 포함됩니다. JSON 페이로드 콘텐츠의 더 많은 예시는 Dialogflow 웹훅 형식대화 웹훅 형식 가이드를 참조하세요.
  2. 프레임워크 호출 형식 감지: 지원되는 프레임워크의 경우 클라이언트 라이브러리가 프레임워크의 호출 형식을 자동으로 감지하고 (예: 요청이 Express 웹 프레임워크 또는 AWS Lambda에서 온 경우) Actions on Google 플랫폼과의 통신을 원활하게 처리하는 방법을 인지합니다.
  3. 서비스 핸들러 처리: 클라이언트 라이브러리는 Dialogflow 및 Actions SDK용 대화 HTTP/JSON 웹훅 API를 서비스 함수로 나타냅니다. 처리 웹훅은 적절한 서비스를 사용하여 전역 app 인스턴스를 만듭니다. app 인스턴스는 HTTP 요청의 핸들러 역할을 하며 서비스의 특정 프로토콜을 이해합니다.
  4. 대화 처리: 클라이언트 라이브러리는 대화별 정보를 app 인스턴스에 연결된 Conversation 객체로 표현합니다. 처리 웹훅은 Conversation 객체를 사용하여 교차 대화에 저장된 데이터 또는 상태 정보를 검색하거나, 사용자에게 응답을 보내거나, 마이크를 닫을 수 있습니다.
  5. 미들웨어 처리: 클라이언트 라이브러리를 사용하면 자체 대화 서비스 미들웨어를 만들 수 있습니다. 이 미들웨어는 인텐트 핸들러를 호출하기 전에 클라이언트 라이브러리가 자동으로 실행되도록 정의한 함수 한 개 이상으로 구성됩니다. 처리 웹훅은 미들웨어를 사용하여 속성 또는 도우미 클래스를 Conversation 객체에 추가할 수 있습니다.
  6. 인텐트 핸들러 처리: 클라이언트 라이브러리를 사용하면 처리 웹훅이 이해하는 인텐트의 핸들러를 정의할 수 있습니다. Dialogflow의 경우 클라이언트 라이브러리가 Dialogflow 콘솔에 정의된 인텐트 이름의 정확한 문자열에 매핑하여 올바른 인텐트 핸들러로 요청을 라우팅합니다. Actions SDK의 경우 Actions on Google에서 전송한 intent 속성을 기반으로 라우팅됩니다.
  7. 사용자에게 응답 전송: 응답을 구성하기 위해 처리 웹훅에서 Conversation#ask() 함수를 호출합니다. ask() 함수를 여러 번 호출하여 점진적으로 응답을 빌드할 수 있습니다. 클라이언트 라이브러리는 응답을 JSON 페이로드가 포함된 HTTP 요청으로 직렬화하고 Actions on Google로 전송합니다. close() 함수는 ask()와 동작이 유사하지만 대화를 닫습니다.

로컬 개발 환경 설정

처리 웹훅을 구현하기 전에 먼저 클라이언트 라이브러리를 설치해야 합니다.

클라이언트 라이브러리 설치

클라이언트 라이브러리를 로컬 개발 환경에 설치하는 가장 쉬운 방법은 npm 또는 yarn와 같은 패키지 관리자를 사용하는 것입니다.

설치하려면 터미널에서 다음 명령어 중 하나를 실행합니다.

  • npm을 사용하는 경우: npm install actions-on-google
  • 원사를 사용하는 경우: yarn add actions-on-google

프로젝트 폴더 설정

처리 웹훅을 배포하려는 위치 (Google의 Firebase용 Cloud Functions, AWS Lambda 또는 자체 호스팅 Express)에 따라 특정 프로젝트 폴더 구조를 만들어 파일을 저장해야 할 수 있습니다.

예를 들어 Firebase용 Cloud Functions를 사용하는 경우 Node.js 및 Firebase CLI 설정 Cloud Functions용 Firebase 초기화에 설명된 단계를 수행하여 필요한 프로젝트 폴더를 설정할 수 있습니다. Firebase용 Cloud Functions의 경우 일반적으로 /functions/index.js 파일에 처리 웹훅을 작성합니다.

앱 인스턴스 빌드

Actions on Google은 Dialogflow를 사용하여 대화형 작업을 빌드하든 Actions SDK를 사용하여 빌드하든 스마트 홈 작업을 빌드하는지에 따라 처리 웹훅과 요청 및 응답을 교환하는 데 특정 메시지 형식을 사용합니다.

이러한 다양한 요청 및 응답 프로토콜을 나타내기 위해 클라이언트 라이브러리는 세 가지 서비스 함수를 제공합니다.

대화 웹훅 프로토콜은 대화형 서비스 (Dialogflow 및 Actions SDK) 모두에서 사용되지만 서비스마다 메시지를 다르게 래핑합니다.

서비스를 사용하여 app 인스턴스를 만듭니다. app 인스턴스는 웹훅의 전역 상태 및 처리 로직을 캡슐화하고 서비스별 프로토콜을 사용하여 Actions on Google과 처리 간의 통신을 처리합니다.

app 인스턴스의 속성을 구성하고 메서드를 호출하여 처리 웹훅의 동작을 지시할 수 있습니다. 또한 JavaScript 함수를 HTTP 요청의 핸들러로 허용하는 Firebase용 Cloud Functions와 같은 서버리스 컴퓨팅 환경에 app 인스턴스를 쉽게 연결할 수 있습니다.

처리 웹훅에서 app 인스턴스를 빌드하려면 다음 단계를 따르세요.

  1. require() 함수를 호출하여 'actions-on-google' 모듈을 가져오고 원하는 서비스를 로드합니다. 예를 들어, 다음 스니펫은 dialogflow 서비스와 응답을 빌드하는 데 사용되는 일부 요소를 로드하여 dialogflow이라는 상수에 할당하는 방법을 보여줍니다.

    // Import the service function and various response classes
    const {
      dialogflow,
      actionssdk,
      Image,
      Table,
      Carousel,
    } = require('actions-on-google');

    여기서 actions-on-google는 프로젝트 폴더의 package.json 파일에 지정된 종속 항목을 나타냅니다 (이 예시 package.json 파일을 참고하세요).

    app 인스턴스를 가져올 때 리치 응답, 도우미 인텐트, 사용하려는 기타 Actions on Google 기능을 나타내는 클래스를 선택적으로 지정할 수 있습니다. 로드할 수 있는 유효한 클래스의 전체 목록은 대화 응답도우미 인텐트 모듈 참조 문서를 확인하세요.

  2. 로드한 서비스를 호출하여 app 인스턴스를 만듭니다. 예를 들면 다음과 같습니다.

    const app = dialogflow();

  3. 초기화 시 app 인스턴스를 구성하려면 서비스를 호출할 때 options 객체를 첫 번째 인수로 제공하면 됩니다. 자세한 내용은 DialogflowOptions를 참고하세요. 예를 들어 다음 스니펫은 { debug: true } 플래그를 설정하여 사용자 요청 또는 응답에서 원시 JSON 페이로드를 로깅하는 방법을 보여줍니다.

const app = dialogflow({
  debug: true
});

이벤트 핸들러 설정

작업과 사용자 상호작용의 수명 주기 동안 클라이언트 라이브러리에서 만든 Actions on Google 관련 이벤트를 처리하려면 클라이언트 라이브러리를 사용하여 사용자 요청을 처리하고 응답을 다시 전송하는 핸들러를 빌드해야 합니다.

클라이언트 라이브러리에서 인식하는 다음과 같은 기본 유형의 이벤트에 대한 핸들러 역할을 하는 함수를 만들 수 있습니다.

  • 인텐트 이벤트: 인텐트는 사용자가 특정 기능을 요청할 때마다 Actions on Google이 처리에 전송하는 고유 식별자입니다. Dialogflow를 사용하는 경우 이는 사용자 쿼리를 Dialogflow 에이전트의 인텐트와 일치시키는 Dialogflow에 해당합니다.
  • 오류 이벤트: 자바스크립트 또는 클라이언트 라이브러리 오류가 발생하면 app 인스턴스의 catch 함수를 사용하여 오류 예외를 적절하게 처리할 수 있습니다. 처리에서 처리하는 모든 오류를 처리하려면 단일 catch 함수를 구현해야 합니다.
  • 대체 이벤트: 대체 이벤트는 사용자가 Actions on Google에서 인식할 수 없는 쿼리를 전송할 때 발생합니다. app 인스턴스의 fallback 함수를 사용하여 수신되는 처리 요청에 일치하는 인텐트 핸들러가 없을 경우 트리거되는 일반 대체 핸들러를 등록할 수 있습니다. 모든 대체 이벤트를 처리하려면 단일 fallback 함수를 구현해야 합니다. Dialogflow를 사용하는 경우 일치하는 인텐트가 없으면 Dialogflow가 특정 대체 인텐트를 트리거할 수 있습니다. 이 대체 인텐트에 상응하는 인텐트 핸들러를 만들어야 합니다.

사용자가 작업에 요청을 보낼 때마다 app 인스턴스는 대화 세션을 나타내는 Conversation 객체를 만듭니다. 인텐트 핸들러 함수에 첫 번째 함수 인수로 전달된 conv 변수 이름을 통해 이 객체에 액세스합니다. 일반적으로 핸들러의 conv 객체를 사용하여 사용자에게 응답을 보냅니다.

사용자 쿼리는 작업에서 추출하고 응답을 미세 조정하는 데 사용할 수 있는 매개변수를 포함할 수도 있습니다.

  • Actions SDK를 사용하는 경우 작업 패키지에서 매개변수를 정의합니다. 인텐트에서 매개변수를 추출하는 방법의 예는 Eliza 코드 샘플을 참고하세요.
  • Dialogflow를 사용하는 경우 params 변수를 통해 매개변수 값에 액세스할 수 있습니다. Dialogflow에서 매개변수가 있는 인텐트를 처리하는 예를 보려면 매개변수 및 컨텍스트 액세스를 참조하세요.

인텐트의 핸들러 설정

인텐트의 핸들러를 설정하려면 app 인스턴스의 intent() 함수를 호출합니다. 예를 들어 Dialogflow를 사용하는 경우 DialogflowApp#intent() 함수입니다. 인수에서 인텐트 이름을 지정하고 핸들러 함수를 제공합니다.

Dialogflow를 사용하는 경우 에이전트의 모든 인텐트에 핸들러를 설정할 필요가 없습니다. 대신 Dialogflow의 기본 제공 응답 핸들러를 활용하여 자체 핸들러 함수를 구현하지 않고도 인텐트를 자동으로 처리할 수 있습니다. 예를 들어 기본 시작 인텐트를 이러한 방식으로 Dialogflow에 위임할 수 있습니다.

다음 예는 'greeting' 및 'bye' 인텐트의 인텐트 핸들러를 보여줍니다. 익명 핸들러 함수는 conv 인수를 취하고 conv.ask() 함수를 통해 사용자에게 간단한 문자열 응답을 반환합니다.

app.intent('Default Welcome Intent', (conv) => {
  conv.ask('How are you?');
});

app.intent('bye', (conv) => {
  conv.close('See you later!');
});

close() 함수는 마이크를 닫고 대화가 종료된다는 점을 제외하면 ask()와 유사합니다.

인텐트의 핸들러를 빌드하는 방법에 관한 자세한 내용은 인텐트 핸들러 빌드를 참고하세요.

오류 이벤트에 대한 핸들러 설정

오류에 대한 핸들러를 설정하려면 app 인스턴스의 catch() 함수를 호출합니다. 예를 들어 Dialogflow를 사용하는 경우에는 DialogflowApp#catch() 함수입니다.

다음 예시는 오류를 콘솔 출력에 전송하고 간단한 문자열 응답을 반환하여 conv.ask() 함수를 통해 사용자에게 메시지를 표시하는 간단한 catch 오류 핸들러를 보여줍니다.

app.catch((conv, error) => {
  console.error(error);
  conv.ask('I encountered a glitch. Can you say that again?');
});

대체 이벤트의 핸들러 설정

수신되는 요청에 맞는 인텐트가 없을 때 일반 대체 핸들러를 설정하려면 app 인스턴스의 fallback() 함수를 호출합니다. 예를 들어 Dialogflow를 사용하는 경우에는 DialogflowApp#fallback() 함수입니다.

다음 예는 간단한 문자열 응답을 반환하여 conv.ask() 함수를 통해 사용자에게 메시지를 표시하는 간단한 대체 핸들러를 보여줍니다.

app.fallback((conv) => {
  conv.ask(`I couldn't understand. Can you say that again?`);
});

인텐트 핸들러 빌드

이 섹션에서는 클라이언트 라이브러리를 사용하여 인텐트 핸들러를 구현할 때 일반적으로 발생하는 사용 사례를 다룹니다. 클라이언트 라이브러리가 인텐트와 어떻게 일치하는지 확인하려면 작동 방식 이해의 '인텐트 핸들러 처리' 섹션을 참고하세요.

매개변수 및 컨텍스트 액세스

Dialogflow를 사용하는 경우 Dialogflow 에이전트에서 매개변수컨텍스트를 정의하여 상태 정보를 유지하고 대화 흐름을 제어할 수 있습니다.

매개변수는 사용자 쿼리에서 중요한 단어, 구문 또는 값을 캡처하는 데 유용합니다. Dialogflow는 런타임에 사용자 쿼리에서 해당 매개변수를 추출하며, 처리 웹훅에서 이러한 매개변수 값을 처리하여 사용자에게 응답하는 방법을 결정할 수 있습니다.

사용자가 작업에 요청을 전송할 때마다 DialogflowApp 인스턴스는 Dialogflow가 해당 요청에서 추출한 매개변수 값을 나타내는 parameters 객체를 만듭니다. 이 객체는 params 변수 이름을 통해 액세스합니다.

다음 스니펫은 사용자가 요청을 보낼 때 params 객체에서 name 속성에 액세스하는 방법을 보여줍니다.

app.intent('Default Welcome Intent', (conv, params) => {
  conv.ask(`How are you, ${params.name}?`);
});

다음은 동일한 작업을 수행하는 대체 스니펫입니다. 중괄호({})는 자바스크립트 디스트럭처링을 실행하여 parameters 객체에서 name 속성을 가져와 로컬 변수로 사용합니다.

app.intent('Default Welcome Intent', (conv, {name}) => {
  conv.ask(`How are you, ${name}?`);
});

다음 스니펫에서 매개변수 이름은 full-name이지만 구조화되지 않았으며 name라는 로컬 변수에 할당됩니다.

app.intent('Default Welcome Intent', (conv, {'full-name': name}) => {
  conv.ask(`How are you, ${name}?`);
});

컨텍스트는 Dialogflow의 고급 기능입니다. 컨텍스트를 사용하여 대화 상태, 흐름, 분기를 관리할 수 있습니다. 클라이언트 라이브러리는 DialogflowConversation#contexts 객체를 통해 컨텍스트에 대한 액세스를 제공합니다. 다음 스니펫은 처리 웹훅에서 프로그래매틱 방식으로 컨텍스트를 설정하는 방법과 컨텍스트 객체를 검색하는 방법을 보여줍니다.

app.intent('intent1', (conv) => {
  const lifespan = 5;
  const contextParameters = {
    color: 'red',
  };
  conv.contexts.set('context1', lifespan, contextParameters);
  // ...
  conv.ask('...');
});

app.intent('intent2', (conv) => {
  const context1 = conv.contexts.get('context1');
  const contextParameters = context1.parameters;
  // ...
  conv.ask('...');
});

app.intent('intent3', (conv) => {
  conv.contexts.delete('context1');
  // ...
  conv.ask('...');
});

도우미 인텐트 결과 액세스

편의를 위해 클라이언트 라이브러리는 작업에서 자주 요청하는 일반적인 유형의 사용자 데이터를 래핑하는 도우미 인텐트 클래스를 제공합니다. 여기에는 다양한 Actions on Google 도우미 인텐트의 결과를 나타내는 클래스가 포함됩니다. 대화에서 사용자가 입력을 제공해야 대화를 계속할 수 있는 부분을 Google 어시스턴트가 처리하도록 하려면 도우미 인텐트를 사용합니다.

예: 확인 도우미 결과

확인 도우미 인텐트를 사용하면 사용자에게 예/아니요 확인을 요청하고 결과로 도출되는 답변을 얻을 수 있습니다. 다음 스니펫은 확인 도우미 인텐트에서 반환된 결과에 따라 웹훅이 응답을 맞춤설정하는 방법을 보여줍니다. 전체 예는 Confirmation 클래스 참조 문서를 확인하세요.

// Create Dialogflow intent with `actions_intent_CONFIRMATION` event
app.intent('get_confirmation', (conv, input, confirmation) => {
  if (confirmation) {
    conv.close(`Great! I'm glad you want to do it!`);
  } else {
    conv.close(`That's okay. Let's not do it now.`);
  }
});

다음 스니펫은 처리 웹훅이 캐러셀에 대한 사용자 입력을 기반으로 응답을 맞춤설정하는 방법을 보여줍니다. 캐러셀 구성요소를 사용하면 작업에서 사용자가 선택할 수 있는 옵션을 표시할 수 있습니다. 더 완전한 예는 Carousel 클래스 참조 문서를 확인하세요.

app.intent('carousel', (conv) => {
  conv.ask('Which of these looks good?');
  conv.ask(new Carousel({
    items: {
      car: {
        title: 'Car',
        description: 'A four wheel vehicle',
        synonyms: ['automobile', 'vehicle'],
      },
      plane: {
        title: 'Plane',
        description: 'A flying machine',
        synonyms: ['aeroplane', 'jet'],
      }
    }
  }));
});

// Create Dialogflow intent with `actions_intent_OPTION` event
app.intent('get_carousel_option', (conv, input, option) => {
  if (option === 'one') {
    conv.close(`Number one is a great choice!`);
  } else {
    conv.close(`Number ${option} is a great choice!`);
  }
});

대화 응답 객체 구성

클라이언트 라이브러리는 작업에서 전송할 수 있는 풍부한 응답 또는 멀티미디어 요소를 나타내는 대화 응답 클래스를 제공합니다. 일반적으로 사용자가 대화를 계속하기 위해 입력할 필요가 없는 경우 이러한 응답 또는 요소를 전송합니다.

예: 이미지

다음 스니펫은 fulfillment 웹훅이 라이브러리에 의해 자동으로 BasicCard 응답에 연결될 Image를 응답에 전송하는 방법을 보여줍니다.

app.intent('Default Welcome Intent', (conv) => {
  conv.ask('Hi, how is it going?');
  conv.ask(`Here's a picture of a cat`);
  conv.ask(new Image({
    url: '/web/fundamentals/accessibility/semantics-builtin/imgs/160204193356-01-cat-500.jpg',
    alt: 'A cat',
  }));
});

비동기 함수 호출

Actions on Google Node.js 클라이언트 라이브러리는 비동기 프로그래밍을 위해 설계되었습니다. 인텐트 핸들러는 처리 웹훅이 응답 생성을 완료하면 확인되는 프로미스를 반환할 수 있습니다.

다음 스니펫은 비동기 함수를 호출하여 프로미스 객체를 반환하고 처리 웹훅이 '인사말' 인텐트를 수신하는 경우 메시지로 응답하는 방법을 보여줍니다. 이 스니펫에서 프로미스는 외부 API 호출의 프로미스가 확인된 후에만 처리 웹훅이 대화형 응답을 반환하도록 합니다.

이 예에서는 날씨 데이터를 가져오기 위해 모조 API를 사용합니다.

/**
 * Make an external API call to get weather data.
 * @return {Promise<string>}
 */
const forecast = () => {
  // ...
};

app.intent('Default Welcome Intent', (conv) => {
  return forecast().then((weather) => {
    conv.ask('How are you?');
    conv.ask(`Today's weather is ${weather}.`);
  });
});

다음의 간소화된 코드 스니펫은 효과가 동일하지만 ECMA 2017 (Node.js 버전 8)에 도입된 async await 기능을 사용합니다. Firebase용 Cloud Functions에서 이 코드를 사용하려면 올바른 버전의 firebase-tools를 사용하고 있고 구성이 올바른지 확인해야 합니다.

app.intent('Default Welcome Intent', async (conv) => {
  const weather = await forecast();
  conv.ask('How are you?');
  conv.ask(`Today's weather is ${weather}.`);
});

대화 데이터 저장

이 클라이언트 라이브러리를 사용하면 처리 웹훅에서 나중에 사용할 수 있도록 대화에 데이터를 저장할 수 있습니다. 데이터 스토리지에 사용할 수 있는 주요 객체는 다음과 같습니다.

다음 스니펫은 처리 웹훅이 사용자가 정의한 임의의 속성 (someProperty)에 데이터를 저장하고 Conversation#user.storage 객체에 연결하는 방법을 보여줍니다. 더 완전한 예는 Conversation#user.storage 클래스 참조 문서를 확인하세요.

app.intent('Default Welcome Intent', (conv) => {
  conv.user.storage.someProperty = 'someValue';
  conv.ask('...');
});

Conversation#user 객체를 사용하여 문자열 식별자, 개인 정보 등 사용자에 관한 정보를 가져올 수 있습니다. conv.user.name.displayconv.user.email와 같은 특정 필드는 Google 로그인의 경우 각각 NAME에 conv.ask(new Permission), conv.ask(new SignIn)를 요청해야 합니다.

const {Permission} = require('actions-on-google');
app.intent('Default Welcome Intent', (conv) => {
  if (conv.user.last.seen) {
    conv.ask('Welcome back! How are you?');
  } else {
    conv.ask('Nice to meet you! How are you doing?');
  }
});

app.intent('permission', (conv) => {
  conv.ask(new Permission({
    context: 'To greet you personally',
    permissions: 'NAME',
  }));
});

// Create Dialogflow intent with `actions_intent_PERMISSION` event
app.intent('get_permission', (conv, input, granted) => {
  if (granted) {
    conv.close(`Hi ${conv.user.name.display}!`);
  } else {
    // User did not grant permission
    conv.close(`Hello!`);
  }
});

미들웨어를 사용한 확장

미들웨어를 통해 클라이언트 라이브러리를 확장할 수 있습니다.

미들웨어 레이어는 인텐트 핸들러를 호출하기 전에 클라이언트 라이브러리가 자동으로 실행하는 함수를 하나 이상 정의하는 함수로 구성됩니다. 미들웨어 레이어를 사용하면 Conversation 인스턴스를 수정하고 기능을 추가할 수 있습니다.

Dialogflow 및 Actions SDK 서비스는 Conversation 인스턴스에 속성 또는 도우미 클래스를 추가할 수 있는 app.middleware() 함수를 노출합니다.

다음 스니펫은 미들웨어 사용 방법의 예를 보여줍니다.

class Helper {
  constructor(conv) {
    this.conv = conv;
  }

  func1() {
    this.conv.ask(`What's up?`);
  }
}

app.middleware((conv) => {
  conv.helper = new Helper(conv);
});

app.intent('Default Welcome Intent', (conv) => {
  conv.helper.func1();
});

앱 내보내기

웹 프레임워크 또는 서버리스 컴퓨팅 플랫폼의 처리 웹훅을 노출하려면 app 객체를 공개적으로 액세스할 수 있는 웹훅으로 내보내야 합니다. 클라이언트 라이브러리는 다양한 환경에 즉시 배포할 수 있도록 지원합니다.

다음 스니펫은 다양한 런타임 내에서 app를 내보내는 방법을 보여줍니다.

예: Firebase용 Cloud Functions

const functions = require('firebase-functions');
// ... app code here
exports.fulfillment = functions.https.onRequest(app);

예: Dialogflow 인라인 편집기

const functions = require('firebase-functions');

// ... app code here

// Exported function name must be 'dialogflowFirebaseFulfillment'
exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);

예: 자체 호스팅 익스프레스 서버 (단순)

const express = require('express');
const bodyParser = require('body-parser');  

// ... app code here

express().use(bodyParser.json(), app).listen(3000);

예: 자체 호스팅 익스프레스 서버 (여러 경로)

const express = require('express');
const bodyParser = require('body-parser');

// ... app code here

const expressApp = express().use(bodyParser.json());

expressApp.post('/fulfillment', app);

expressApp.listen(3000);

예: AWS Lambda API 게이트웨이

// ... app code here

exports.fulfillment = app;