Webhook

より柔軟にアクションを作成できるように、ロジックをデリゲート HTTPS ウェブサービス(フルフィルメント)アクションで Webhook をトリガーし、 HTTPS エンドポイントにリクエストを送信できます。例として、Google Chat で フルフィルメントには以下が含まれます。

  • ユーザーから提供された情報に基づいて動的プロンプトを生成する。
  • 外部システムに注文を行い、成功を確認する。
  • バックエンド データによるスロットの検証。
図 1. 呼び出しインテントとシーンでトリガーできる Webhook などです。

Webhook のトリガーとハンドラ

アクションは、呼び出しインテントまたはシーン内で Webhook をトリガーできます。 フルフィルメント エンドポイントにリクエストを送信します。フルフィルメントに Webhook が含まれています ハンドラを定義します。Webhook をトリガーして 次のような場合です。

  • 呼び出しインテントの一致後
  • シーンの開始ステージ
  • シーンの条件ステージで条件が true と評価された後
  • シーンのスロット充填ステージ
  • シーンの入力ステージでインテント マッチが発生した後

アクションで Webhook をトリガーすると、Google アシスタントは (JSON ペイロードを含む)をフルフィルメントに送信します。 イベントの処理に使用するハンドラの名前。フルフィルメント エンドポイントは 適切なハンドラにイベントをルーティングしてロジックを実行し、 対応する JSON ペイロードを含むレスポンス

ペイロード

次のスニペットは、アクションから送信されるリクエストの例を示しています。 返すレスポンスが返されます詳しくは、 リファレンス ドキュメント 情報です。

{
 
"handler": {
   
"name": "handler_name"
 
},
 
"intent": {
   
"name": "actions.intent.MAIN",
   
"params": {},
   
"query": ""
 
},
 
"scene": {
   
"name": "SceneName",
   
"slotFillingStatus": "UNSPECIFIED",
   
"slots": {}
 
},
 
"session": {
   
"id": "example_session_id",
   
"params": {},
   
"typeOverrides": []
 
},
 
"user": {
   
"locale": "en-US",
   
"params": {
     
"verificationStatus": "VERIFIED"
   
}
 
},
 
"home": {
   
"params": {}
 
},
 
"device": {
   
"capabilities": [
     
"SPEECH",
     
"RICH_RESPONSE",
     
"LONG_FORM_AUDIO"
   
]
 
}
}
{
 
"session": {
   
"id": "example_session_id",
   
"params": {}
 
},
 
"prompt": {
   
"override": false,
   
"firstSimple": {
     
"speech": "Hello World.",
     
"text": ""
   
}
 
},
 
"scene": {
   
"name": "SceneName",
   
"slots": {},
   
"next": {
     
"name": "actions.scene.END_CONVERSATION"
   
}
 
}
}

ランタイム インタラクション

以降のセクションでは、 Webhook ハンドラを指定します。

プロンプトを送信する

シンプルなテキスト、リッチテキスト、カード、さらには本格的なプロンプトも作成できます。 Interactive Canvas を使用するウェブアプリに基づく HTML プロンプト。プロンプトのドキュメントに Webhook イベントの処理時にプロンプトを作成する方法に関する完全な情報をご確認ください。 次のスニペットは、カード プロンプトを示しています。

app.handle('rich_response', conv => {
  conv
.add('This is a card rich response.');
  conv
.add(new Card({
    title
: 'Card Title',
    subtitle
: 'Card Subtitle',
    text
: 'Card Content',
    image
: new Image({
      url
: 'https://developers.google.com/assistant/assistant_96.png',
      alt
: 'Google Assistant logo'
   
})
 
}));
});
{
 
"session": {
   
"id": "example_session_id",
   
"params": {}
 
},
 
"prompt": {
   
"override": false,
   
"content": {
     
"card": {
       
"title": "Card Title",
       
"subtitle": "Card Subtitle",
       
"text": "Card Content",
       
"image": {
         
"alt": "Google Assistant logo",
         
"height": 0,
         
"url": "https://developers.google.com/assistant/assistant_96.png",
         
"width": 0
       
}
     
}
   
},
   
"firstSimple": {
     
"speech": "This is a card rich response.",
     
"text": ""
   
}
 
}
}

インテント パラメータの読み取り

アシスタント ランタイムはインテントを一致させると、 あります。元のプロパティはユーザーが入力として指定したもので、 「Resolved」プロパティは、タイプに基づいて NLU が入力を解決したプロパティです。 仕様。

conv.intent.params['param_name'].original
conv
.intent.params['param_name'].resolved
{
 
"handler": {
   
"name": "handler_name"
 
},
 
"intent": {
   
"name": "intent_name",
   
"params": {
     
"slot_name": {
       
"original": "1",
       
"resolved": 1
     
}
   
},
   
"query": ""
 
},
 
"scene": {
   
"name": "SceneName",
   
"slotFillingStatus": "UNSPECIFIED",
   
"slots": {},
   
"next": {
     
"name": "actions.scene.END_CONVERSATION"
   
}
 
},
 
"session": {
   
"id": "session_id",
   
"params": {},
   
"typeOverrides": []
 
},
 
"user": {
   
"locale": "en-US",
   
"params": {
     
"verificationStatus": "VERIFIED"
   
}
 
},
 
"home": {
   
"params": {}
 
},
 
"device": {
   
"capabilities": [
     
"SPEECH",
     
"RICH_RESPONSE",
     
"LONG_FORM_AUDIO"
   
]
 
}
}

ユーザーの言語 / 地域を読み取る

この値は、ユーザーの Google アシスタントの言語 / 地域設定に対応しています。

Node.jsJSON
conv.user.locale
{
 
"handler": {
   
"name": "handler_name"
 
},
 
"intent": {
   
"name": "actions.intent.MAIN",
   
"params": {},
   
"query": ""
 
},
 
"scene": {
   
"name": "SceneName",
   
"slotFillingStatus": "UNSPECIFIED",
   
"slots": {}
 
},
 
"session": {
   
"id": "session_id",
   
"params": {},
   
"typeOverrides": []
 
},
 
"user": {
   
"locale": "en-US",
   
"params": {
     
"verificationStatus": "VERIFIED"
   
}
 
},
 
"home": {
   
"params": {}
 
},
 
"device": {
   
"capabilities": [
     
"SPEECH",
     
"RICH_RESPONSE",
     
"LONG_FORM_AUDIO"
   
]
 
}
}

読み取りと書き込みのストレージ

リソースの作成方法については、ストレージのドキュメントをご覧ください。 さまざまなストレージ機能を使用します。

//read
conv
.session.params.key
conv
.user.params.key
conv
.home.params.key

// write
conv
.session.params.key = value
conv
.user.params.key = value
conv
.home.params.key = value
{
 
"handler": {
   
"name": "handler_name"
 
},
 
"intent": {
   
"name": "actions.intent.MAIN",
   
"params": {},
   
"query": ""
 
},
 
"scene": {
   
"name": "SceneName",
   
"slotFillingStatus": "UNSPECIFIED",
   
"slots": {}
 
},
 
"session": {
   
"id": "session_id",
   
"params": {
     
"key": "value"
   
},
   
"typeOverrides": [],
   
"languageCode": ""
 
},
 
"user": {
   
"locale": "en-US",
   
"params": {
     
"verificationStatus": "VERIFIED",
     
"key": "value"
   
}
 
},
 
"home": {
   
"params": {
     
"key": "value"
   
}
 
},
 
"device": {
   
"capabilities": [
     
"SPEECH",
     
"RICH_RESPONSE",
     
"LONG_FORM_AUDIO"
   
]
 
}
}
{
 
"session": {
   
"id": "session_id",
   
"params": {
     
"key": "value"
   
}
 
},
 
"prompt": {
   
"override": false,
   
"firstSimple": {
     
"speech": "Hello world.",
     
"text": ""
   
}
 
},
 
"user": {
   
"locale": "en-US",
   
"params": {
     
"verificationStatus": "VERIFIED",
     
"key": "value"
   
}
 
},
 
"home": {
   
"params": {
     
"key": "value"
   
}
 
}
}

デバイスの機能を確認する

デバイスの機能を確認して、さまざまな機能を提供したり、 やり取りできます。

const supportsRichResponse = conv.device.capabilities.includes("RICH_RESPONSE");
const supportsLongFormAudio = conv.device.capabilities.includes("LONG_FORM_AUDIO");
const supportsSpeech = conv.device.capabilities.includes("SPEECH");
const supportsInteractiveCanvas = conv.device.capabilities.includes("INTERACTIVE_CANVAS");
{
 
"handler": {
   
"name": "handler_name"
 
},
 
"intent": {
   
"name": "actions.intent.MAIN",
   
"params": {},
   
"query": ""
 
},
 
"scene": {
   
"name": "SceneName",
   
"slotFillingStatus": "UNSPECIFIED",
   
"slots": {}
 
},
 
"session": {
   
"id": "session_id",
   
"params": {},
   
"typeOverrides": [],
   
"languageCode": ""
 
},
 
"user": {
   
"locale": "en-US",
   
"params": {
     
"verificationStatus": "VERIFIED"
   
}
 
},
 
"home": {
   
"params": {}
 
},
 
"device": {
   
"capabilities": [
     
"SPEECH",
     
"RICH_RESPONSE",
     
"LONG_FORM_AUDIO",
     
"INTERACTIVE_CANVAS"
   
]
 
}
}

サーフェス機能の完全なリストについては、Capability をご覧ください。 ご覧ください。

ランタイム タイプのオーバーライド

ランタイム タイプを使用すると、実行時にタイプの仕様を変更できます。こちらの 他のソースからデータを読み込んで型の有効な値を入力できます。対象 ランタイム タイプのオーバーライドを使用して、アンケートに動的オプションを追加できます。 日替わりメニューへの追加も可能です。

ランタイム タイプを使用するには、アクションから 使用します。そこから session.typeOverrides パラメータをアクションに対するレスポンスで渡します。使用可能 モードには、既存の型エントリを保持する TYPE_MERGE または TYPE_REPLACE が含まれます。 既存のエントリをオーバーライドに置き換えます。

conv.session.typeOverrides = [{
    name
: type_name,
    mode
: 'TYPE_REPLACE',
    synonym
: {
      entries
: [
       
{
          name
: 'ITEM_1',
          synonyms
: ['Item 1', 'First item']
       
},
       
{
          name
: 'ITEM_2',
          synonyms
: ['Item 2', 'Second item']
       
},
       
{
          name
: 'ITEM_3',
          synonyms
: ['Item 3', 'Third item']
       
},
       
{
          name
: 'ITEM_4',
          synonyms
: ['Item 4', 'Fourth item']
       
},
   
]
 
}
}];
{
 
"session": {
   
"id": "session_id",
   
"params": {},
   
"typeOverrides": [
     
{
       
"name": "type_name",
       
"synonym": {
         
"entries": [
           
{
             
"name": "ITEM_1",
             
"synonyms": [
               
"Item 1",
               
"First item"
             
]
           
},
           
{
             
"name": "ITEM_2",
             
"synonyms": [
               
"Item 2",
               
"Second item"
             
]
           
},
           
{
             
"name": "ITEM_3",
             
"synonyms": [
               
"Item 3",
               
"Third item"
             
]
           
},
           
{
             
"name": "ITEM_4",
             
"synonyms": [
               
"Item 4",
               
"Fourth item"
             
]
           
}
         
]
       
},
       
"typeOverrideMode": "TYPE_REPLACE"
     
}
   
]
 
},
 
"prompt": {
   
"override": false,
   
"firstSimple": {
     
"speech": "This is an example prompt.",
     
"text": "This is an example prompt."
   
}
 
}
}

音声バイアスを設定する

音声バイアスを使用すると、NLU にヒントを指定してインテント マッチングを改善できます。マイページ 最大 1,000 個のエントリを指定できます。

conv.expected.speech = ['value_1', 'value_2']
conv
.expected.language = 'locale_string'
{
 
"session": {
   
"id": "session_id",
   
"params": {}
 
},
 
"prompt": {
   
"override": false,
   
"firstSimple": {
     
"speech": "This is an example prompt.",
     
"text": "This is an example prompt."
   
}
 
},
 
"expected": {
   
"speech": "['value_1', 'value_2']",
   
"language": "locale_string"
 
}
}

遷移シーン

Actions プロジェクトで静的な遷移を定義するだけでなく、 実行時にシーンの遷移が発生します。

app.handle('transition_to_hidden_scene', conv => {
 
// Dynamic transition
  conv
.scene.next.name = "HiddenScene";
});
{
 
"session": {
   
"id": "session_id",
   
"params": {}
 
},
 
"prompt": {
   
"override": false,
   
"firstSimple": {
     
"speech": "This is an example prompt.",
     
"text": ""
   
}
 
},
 
"scene": {
   
"name": "SceneName",
   
"slots": {},
   
"next": {
     
"name": "HiddenScene"
   
}
 
}
}

シーンスロットの読み取り

スロット充填中に、フルフィルメントを使用してスロットを検証したり、 スロット充填のステータス(SlotFillingStatus)。

conv.scene.slotFillingStatus  // FINAL means all slots are filled
conv
.scene.slots  // Object that contains all the slots
conv
.scene.slots['slot_name'].<property_name> // Accessing a specific slot's properties

たとえば、レスポンスからタイムゾーンを抽出するとします。イン この例では、スロット名は datetime1 です。タイムゾーンを取得するには、次のようにします。 次のコマンドを使用します。

conv.scene.slots['datetime1'].value.time_zone.id
{
 
"handler": {
   
"name": "handler_name"
 
},
 
"intent": {
   
"name": "",
   
"params": {
     
"slot_name": {
       
"original": "1",
       
"resolved": 1
     
}
   
},
   
"query": ""
 
},
 
"scene": {
   
"name": "SceneName",
   
"slotFillingStatus": "FINAL",
   
"slots": {
     
"slot_name": {
       
"mode": "REQUIRED",
       
"status": "SLOT_UNSPECIFIED",
       
"updated": true,
       
"value": 1
     
}
   
},
   
"next": {
     
"name": "actions.scene.END_CONVERSATION"
   
}
 
},
 
"session": {
   
"id": "session_id",
   
"params": {
     
"slot_name": 1
   
},
   
"typeOverrides": []
 
},
 
"user": {
   
"locale": "en-US",
   
"params": {
     
"verificationStatus": "VERIFIED"
   
}
 
},
 
"home": {
   
"params": {}
 
},
 
"device": {
   
"capabilities": [
     
"SPEECH",
     
"RICH_RESPONSE",
     
"LONG_FORM_AUDIO"
   
]
 
}
}

シーンスロットを無効にする

スロットを無効にして、ユーザーに新しい値を指定させることができます。

conv.scene.slots['slot_name'].status = 'INVALID'
{
 
"session": {
   
"id": "session_id",
   
"params": {
     
"slot_name": 1
   
}
 
},
 
"prompt": {
   
"override": false,
   
"firstSimple": {
     
"speech": "This is an example prompt.",
     
"text": ""
   
}
 
},
 
"scene": {
   
"name": "SceneName",
   
"slots": {
     
"slot_name": {
       
"mode": "REQUIRED",
       
"status": "INVALID",
       
"updated": true,
       
"value": 1
     
}
   
},
   
"next": {
     
"name": "actions.scene.END_CONVERSATION"
   
}
 
}
}

開発オプション

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder"></ph>

Actions Builder には、Cloud Functions エディタと呼ばれるインライン エディタが備わっています。 これにより、Cloud Functions for Firebase を できます。フルフィルメントを構築して任意のホスティングにデプロイすることもできる HTTPS フルフィルメント エンドポイントを Webhook ハンドラとして登録します。

インライン エディタ

Cloud Functions エディタで開発するには:

  1. Actions プロジェクトを開き、[Develop] タブ >Webhook >乗り換え フルフィルメント方法。[Fulfillment Method] ウィンドウが表示されます。
  2. [インライン Cloud Functions] を選択し、[確認] をクリックします。
で確認できます。

外部 HTTPS エンドポイント

このセクションでは、Cloud Functions for Firebase を フルフィルメント サービスが提供されます。ただし、Google Cloud の 任意のホスティング サービスに納品できます。

環境を設定する

環境の設定手順は次のとおりです。

  1. Node.js をダウンロードしてインストールします
  2. Firebase CLI を設定して初期化します。次のコマンドを実行すると、 EACCES エラーが発生した場合は、npm の権限の変更が必要になる場合があります。

    npm install -g firebase-tools
  3. Google アカウントを使用して Firebase ツールを認証します。

    firebase login
  4. Actions プロジェクトを保存したプロジェクト ディレクトリを開始します。 設定する Firebase CLI 機能を選択するよう求められます。 追加することもできます。Functions と、利用したいその他の機能を選択します Enter キーを押して確定し、続行します。

    $ cd <ACTIONS_PROJECT_DIRECTORY>
    $ firebase init
  5. Firebase ツールを Actions プロジェクトに関連付けるため、 矢印キーを使ってプロジェクト リスト内を移動します。

  6. プロジェクトを選択すると、Firebase ツールが Functions の関数を 使用する言語を尋ねられます矢印キーで選択します Enter キーを押して続行します。

    === Functions Setup
    A functions directory will be created in your project with a Node.js
    package pre-configured. Functions can be deployed with firebase deploy.
    
    ? What language would you like to use to write Cloud Functions? (Use arrow keys)
    > JavaScript
    TypeScript
    
  7. ESLint を使用して潜在的なバグを検出し、スタイルを適用するかどうかを選択します(Y または N を入力します)。

    ? Do you want to use ESLint to catch probable bugs and enforce style? (Y/n)
  8. プロンプトに「Y」と入力して、プロジェクトの依存関係を取得します。

    ? Do you want to install dependencies with npm now? (Y/n)

    設定が完了すると、次のような出力が表示されます。

      Firebase initialization complete!
  9. @assistant/conversation の依存関係をインストールします。

    $ cd <ACTIONS_PROJECT_DIRECTORY>/functions
    $ npm install @assistant/
    conversation --save
  10. フルフィルメント依存関係を取得し、フルフィルメント関数をデプロイします。

    $ npm install
    $ firebase deploy
    --only functions

    デプロイには数分かかります。完了すると、以下のような出力が表示されます。 追加します。Dialogflow を入力するには、Function URL が必要です。

    ✔  Deploy complete!
    Project Console: https://console.firebase.google.com/project/<PROJECT_ID>/overview Function URL (<FUNCTION_NAME>): https://us-central1-<PROJECT_ID>.cloudfunctions.net/<FUNCTION_NAME>
  11. フルフィルメント URL をコピーして、次のセクションで使用します。

Webhook ハンドラを登録

Cloud Functions の関数のエンドポイントを Webhook ハンドラとして登録するには:

  1. Actions Console で、[Develop] >Webhook
  2. [Change fulfillment method](フルフィルメント方法を変更)をクリックします。[Fulfillment Method] ウィンドウ 表示されます。
  3. [Webhook] を選択し、[Confirm] をクリックします。
  4. ウェブサービスの URL を [Webhook] フィールドに貼り付けます。
  5. [保存] をクリックします。