IBM Cloud Docs
メッセージの処理後に呼び出しを行う

メッセージの処理後に呼び出しを行う

ポストメッセージWebhookは、アシスタントがレスポンスをレンダリングするたびに、外部のサービスやアプリケーションを呼び出します。 外部サービスは、アシスタントの出力をチャンネルに送信する前に処理することができます。

各メッセージの応答が顧客に表示される前にWebhookをトリガーしたい場合は、アシスタントにポストメッセージWebhookを追加できます。

ポストメッセージWebhookを使用して、外部コンテンツリポジトリからカスタムレスポンスを抽出することができます。 例えば、応答でテキストの代わりにカスタム ID を使用してアクションを定義できます。 ポストメッセージWebhookは、これらのIDを外部データベースに渡して、保存されているテキストレスポンスを取得することができます。

このWebhookは、プレメッセージWebhookと連携して使用することができます。 例えば、事前メッセージウェブフックを使って、顧客の入力から個人を特定できる情報を取り除いた場合、事後メッセージウェブフックを使って、その情報を元に戻すことができます。 もし事前メッセージウェブフックを使って顧客の入力をアシスタントの言語に翻訳した場合、事後メッセージウェブフックを使ってレスポンスを返す前に顧客の言語に翻訳することができます。 詳しくは、メッセージを処理する前に呼び出しを行うを参照してください。

プライベート・エンドポイントが使用されている環境では、Web フックがトラフィックをインターネット経由で送信することに留意してください。

クラシックを体験するには、会話中に必要なときに1回限りのアクションを実行する必要がある場合、ダイアログウェブフックを使用してください。 たとえば、アシスタントが口座番号、ユーザーID、口座の秘密など、必要な情報をすべて収集した時点で条件は満たされる。 詳しくは、ダイアログからのプログラマチック呼び出しの実行を参照してください。

Web フックの定義

各メッセージ応答がチャネルに送信されて顧客に表示される前に、そのメッセージ応答の処理に使用する Webhook URL を 1 つ定義できます。

外部サービスへのプログラマチック呼び出しは、以下の要件を満たす必要があります。

  • 呼び出しは POST HTTP 要求であること。
  • 呼び出しは 30 秒以内に完了する必要があります。
  • 要求と応答の形式は JSON であること ( 例えば、Content-Type: application/json です。

アシスタントがデプロイされ、お客様と対話している実稼働環境では、Web フックをセットアップしてテストしないでください。

手順

Web フックの詳細を追加するには、以下の手順を実行します。

  1. アシスタントで、 「環境」 に移動し、Webhook を構成する環境を開きます。

  2. 「環境設定」アイコン アイコンをクリックして、環境設定を開きます。

  3. 環境設定ページで、 ポストメッセージWebhookをクリックします。

    クラシックを体験するには、以下のステップを完了する:

    • 設定したいアシスタントの「 Overflow」メニューアイコンを クリックし、「 Settings 」を選択します。

    • Webhooks > Post-message webhook をクリックします。

  4. ポストメッセージ Webhook スイッチを 有効に設定します。

  5. Synchronous event(同期イベント )で、以下のオプションから1つを選択する:

    • エラーが発生した場合は、Webhookを更新せずにユーザー入力の処理を続行します。

    • Webhookの呼び出しに失敗した場合、クライアントにエラーを返します。

    詳細については、 後処理のためのウェブフック・エラー処理の設定を 参照してください。

  6. **「URL」**フィールドに、HTTP POST 要求コールアウトを送信する外部アプリケーションの URL を追加します。

    例えば、アシスタントの応答を別のコンテンツ管理システムに保管するとします。 アシスタントが入力を理解すると、処理されたアクションは、CMS 内の応答に対応する固有 ID を返します。 特定の固有 ID について CMS から応答を取得するサービスを呼び出すには、サービス・インスタンスの URL を指定します。 例えば、https://example.com/get_answer です。

    SSL プロトコルを使用する URL を指定する必要があります。したがって、https で始まる URL を指定してください。

  7. メッセージ送信後 Webhook の認証を設定するには、 認証の編集をクリックします。 詳細な手順については、 プレメッセージとポストメッセージのウェブフックの認証方法を定義するを 参照してください。

  8. Timeout フィールドで、アシスタントがエラーを返す前にWebhookからの応答を待つ時間(秒)を指定します。 タイムアウト期間は、1 秒未満に短くすることも、30 秒超に長くすることもできません。

  9. ヘッダーセクションでヘッダーの追加をクリックし、サービスに渡したいヘッダーを1つずつ追加します。

    Classicエクスペリエンスでは、サービスは自動的にJWT付きのAuthorizationヘッダーを送信する。 認可を自分で処理したい場合は、独自の認可ヘッダーを追加し、サービスがそれを代わりに使用する。

    あなたが呼び出した外部アプリケーションが応答を返す場合、そのアプリケーションは異なるフォーマットで応答を送信できるかもしれない。 Webhook では、応答が JSON でフォーマットされている必要があります。 以下の表は、結果として返される値がJSON形式であることを示すヘッダーの追加方法を示している。

    ヘッダーの例
    ヘッダー名 ヘッダー値
    Content-Type application/json
  10. ヘッダー値を保存すると、文字列はアスタリスクに置き換えられ、再度表示することはできません。

  11. Web フックの詳細は自動的に保存されます。

クラシック体験のみのシークレットを追加

Classicの場合はSecret フィールドに秘密鍵を追加して、外部サービスとの認証リクエストに渡します:

  • purple unicorn のように、テキスト文字列としてキーを入力する。

  • 最大1,024文字まで。

  • コンテキスト変数は使用しないでください。

外部サービスは秘密のチェックと検証に責任を負う。 トークンが不要な場合は、任意の文字列を指定する。 このフィールドを空欄にすることはできない。

入力中に秘密を表示するには、入力前に パスワードを表示する アイコン アイコンを見る をクリックします。 秘密を保存すると、文字列がアスタリスクに置き換えられ、二度と見ることができなくなる。

このフィールドの使用方法の詳細については、 ClassicエクスペリエンスのみのWebhook セキュリティを参照してください。

後処理のためのウェブフック・エラー処理の設定

ウェブフック・コールが失敗した場合、前処理ステップでエラーを返すかどうかを決めることができます。 次の 2 つのオプションがあります。

  • エラーが発生した場合、Webhook を更新せずにユーザー入力の処理を続行します。アシスタントはエラーを無視し、Webhook の結果なしでメッセージを処理します。 後処理が便利だが必須ではない場合は、このオプションを検討してほしい。

  • Webhook呼び出しが失敗した場合、クライアントにエラーを返します :アシスタントがレスポンスを送信した後の後処理が重要な場合、このオプションを選択します。

Webhook呼び出しが失敗した場合、クライアントにエラーを返すを有効にすると、後処理ステップが正常に完了するまで、すべてが停止します。

定期的に外部プロセスをテストし、潜在的な障害を特定する。 必要に応じてこの設定を調整し、応答処理の中断を防ぐ。

Webhook のテスト

本番環境で使用されるアシスタントのためにそれを有効にする前に、Webhookの広範なテストを行ってください。

Webhookは、アシスタントがメッセージを処理し、チャネルにレスポンスを返す準備ができたときにのみトリガーされます。

Webhook のトラブルシューティング

以下のエラー・コードは、発生する可能性がある問題の原因を追跡するのに役立ちます。 例えば、Web チャット統合がある場合、送信するすべてのテスト・メッセージが There is an error with the message you just sent, but feel free to ask me something else などのメッセージを返すと、Web フックに問題があることが分かります。 このメッセージが表示されたら、cURL,のようなREST APIツールを使ってテスト /message APIリクエストを送信し、エラー・コードと返されるメッセージの全文を確認してください。

エラー・コードの詳細
エラー・コードとメッセージ 説明
422 Webhook が無効な JSON 本体で応答しました Webhook の HTTP 応答本体を JSON として構文解析できませんでした。
422 Webhook が [500] 状況コードで応答しました お客様が呼び出した外部サービスで問題が発生しました。 コードが失敗したか、外部サーバーが要求を拒否しました。
500 プロセッサー例外: [connections to all backends failing] Webhook マイクロサービスでエラーが発生しました。 バックエンド・サービスに接続できませんでした。

ClassicエクスペリエンスのみのWebhookセキュリティ

Classicエクスペリエンスでは、リクエストとともに送信されるJSON Web Token(JWT)を検証することで、Webhookリクエストを認証します。 ウェブフック・マイクロサービスは自動的にJWTを生成し、各ウェブフック・コールで Authorization ヘッダーにそれを送信する:

  • 新しい Webhook または Edit 認証で更新された Webhook の場合、authorization ヘッダーは無視されます。

  • 認証ヘッダーが保存されている既存の Webhook の場合、[ 認証の編集 ] ボタンは無効になります。

  • 新しい認証設定を使用するように既存のWebhookを更新すると、その動作が変更されます。

JWT検証をテストする必要がある場合は、外部サービスにコードを追加できます。 例えば、 Secret フィールドに purple unicorn

const jwt = require('jsonwebtoken');
...
const token = request.headers.authentication; // grab the "Authentication" header
try {
  const decoded = jwt.verify(token, 'purple unicorn');
} catch(err) {
  // error thrown if token is invalid
}

要求本文の例

リクエスト・ポストメッセージのウェブフック・ボディのフォーマットを知っておくと、外部コードがそれを処理できるので便利です。

ペイロードには、v2 /message(ステートフルおよびステートレス)APIコールに対してアシスタントが返すレスポンスボディが含まれます。 イベント名 message_processed は、ポストメッセージWebhookがリクエストを生成することを示す。 メッセージ要求本体について詳しくは、 API リファレンスを参照してください。

次のサンプルは、単純なリクエストボディがどのようにフォーマットされるかを示しています:

{
 "event": {
    "name": "message_processed"
},
"options": {},
"payload": {
    "output": {
        "intents": [
            {
                "intent": "General_Greetings",
                "confidence": 1
            }
        ],
        "entities": [],
        "generic": [
            {
                "response_type": "text",
                "text": "Hello. Good evening"
            }
        ]
    },
    "user_id": "test user",
    "context": {
        "global": {
            "system": {
                "user_id": "test user",
                "turn_count": 11
            },
            "session_id": "sxxx"
        },
        "skills": {
            "actions skill": {
                "user_defined": {
                    "var": "anthony"
                },
                "system": {
                    "state": "nnn"
                }
            }
        }
    }
}

補助処理を省略する

プレメッセージWebhookの機能強化により、 watsonx Assistant、メッセージ処理をスキップし、Webhookからのレスポンスを直接返すことができるようになりました。 この機能は、ウェブフックの HTTP のレスポンスに x-watson-assistant-webhook-returnheader を設定することで有効になります。

開始前に

以下のステップを実行します。

  • ウェブフックからの HTTP の応答に、任意の値を指定した x-watson-assistant-webhook-returnheader を含めます。

  • Webhook レスポンスに有効なメッセージ・レスポンスが含まれ、それが watsonx Assistant の要件に従ってフォーマットされていることを確認する。

この機能により、ウェブフックが会話の流れを動的に制御できるようになり、必要なときに即座に対応できるようになります。

応答本体

レスポンスボディでは、output はクライアントに直接返されるので、payload プロパティの中にラップする必要はありません:

{
    "output": {
      "generic": [
        {
          "response_type": "text",
          "text": "This response is directly from the pre-message webhook."
        }
      ]
    }
}

この機能の実用的な実装については、 例3を 参照のこと。

例 1

この例では、アシスタントからの各レスポンスの最後に y'all を追加する方法を示しています。

ポストメッセージWebhook設定ページでは、以下の値を指定します:

クラシック経験者にとって、 シークレットフィールドに価値はない。

  • URL: https://your-webhook-url/
  • ヘッダー名: Content-Type
  • ヘッダー値: application/json

ポストメッセージ Webhook は IBM Cloud Functions Web アクション名 add_southern_charm を呼び出します。

add_southern_charm Web アクションの node.js コードは、以下のようになります。

function main(params) {
  console.log(JSON.stringify(params))
  if (params.payload.output.generic[0].text !== '') {
      //Get the length of the input text
        var length = params.payload.output.generic[0].text.length;
        //create a substring that removes the last character from the input string, which is typically punctuation.
        var revision = params.payload.output.generic[0].text.substring(0,length-1);
        const response = {
            body : {
                payload : {
                    output : {
                        generic : [
                              {
                                  //Replace the input text with your shortened revision and append y'all to it.
                                "response_type": "text",
                                "text": revision + ', ' + 'y\'all.'
                              }
                        ],
                    },
                },
            },
        };
        return response;
  }
  else {
    return {
        body : params
    }
  }
}

例 2

この例では、メッセージ応答を顧客の言語に翻訳する方法を示します。 これは、 例2の ステップを実行し、オリジナルのメッセージを英語に翻訳するプレメッセージWebhookを定義した場合にのみ機能します。

IBM Cloud Functions で Web アクションのシーケンスを定義します。 この変数は、プレメッセージのウェブフック・コードの original_input というコンテキスト変数に格納されています。 シーケンス内の 2 番目のアクションは、ダイアログ応答テキストを英語から顧客が使用した元の言語に変換します。

プレメッセージWebhook設定ページでは、以下の値を指定します:

クラシック経験者にとって、 シークレットフィールドに価値はない。

  • URL: https://your-webhook-url/
  • ヘッダー名: Content-Type
  • ヘッダー値: application/json

シーケンス内の最初の Web アクションの node.js コードは、以下のようになります。

let rp = require("request-promise");

function main(params) {
console.log(JSON.stringify(params))

if (params.payload.output.generic[0].text !== '') {
const options = { method: 'POST',
  url: 'https://api.us-south.language-translator.watson.cloud.ibm.com/instances/572b37be-09f4-4704-b693-3bc63869nnnn/v3/identify?version=2018-05-01',
  auth: {
           'username': 'apikey',
           'password': 'nnnn'
       },
  headers: {
    "Content-Type":"text/plain"
},
  body: [
          params.payload.context.skills['actions skill'].user_defined.original_input
  ],
  json: true,
};
     return rp(options)
    .then(res => {
      //Set the language property of the incoming message to the language that was identified by Watson Language Translator.
        params.payload.context.skills['actions skill'].user_defined['language'] = res.languages[0].language;
        console.log(JSON.stringify(params))
        return params;
})
}
else {
    params.payload.context.skills['actions skill'].user_defined['language'] = 'none';
    return param
}
};

シーケンス内の 2 番目の Web アクションは、以下のようになります。

let rp = require("request-promise");

function main(params) {
  console.log(JSON.stringify(params))
    if ((params.payload.context.skills["actions skill"].user_defined.language !== 'en') && (params.payload.context.skills["actions skill"].user_defined.language !== 'none')) {
    const options = { method: 'POST',
    url: 'https://api.us-south.language-translator.watson.cloud.ibm.com/instances/572b37be-09f4-4704-b693-3bc63869nnnn/v3/translate?version=2018-05-01',
    auth: {
            'username': 'apikey',
            'password': 'nnn'
        },
    body: {
        text: [
            params.payload.output.generic[0].text
            ],
            target: params.payload.context.skills["actions skill"].user_defined.language
    },
    json: true
    };
      return rp(options)
      .then(res => {
          params.payload.context.skills["actions skill"].user_defined["original_output"] = params.payload.output.generic[0].text;
          params.payload.output.generic[0].text = res.translations[0].translation;
          return {
            body : params
          }
  })
  }
  return {
    body : params
  }
};

例 3

この例では、 watsonx Assistant にメッセージの処理を省略させ、webhook のレスポンスを直接返すように webhook レスポンスを構成する方法を示します。

Webhook 構成

ウェブフック設定ページで、以下の値を指定します

webhook_skip ウェブ・アクションの node.js コードは以下のようになる。

function main(params) {
  // Your custom logic to determine the response
  let responseText = "This response is directly from the pre-message webhook.";

  const response = {
    headers: {
      "X-Watson-Assistant-Webhook-Return": "true"
    },
    body: {
      output: {
        generic: [
          {
            response_type: "text",
            text: responseText
          }
        ]
      }
    }
  };

  return response;
}

Webhook の削除

Webhook を使ってメッセージ・レスポンスを処理したくないと判断した場合は、以下の手順を実行してください:

  1. アシスタントで 「環境」 に移動し、ウェブフックを削除したい環境を開きます。

  2. 「環境設定」アイコン アイコンをクリックして、環境設定を開きます。

  3. 環境設定ページで、 ポストメッセージWebhookをクリックします。

    クラシックを体験するには、以下のステップを完了する:

    • 設定したいアシスタントの「 Overflow」メニューアイコンを クリックし、「 Settings 」を選択します。

    • Webhooks > Post-message webhook をクリックします。

  4. 以下のいずれかのステップを実行します。

  • すべての受信メッセージを処理するためにウェブフックを呼び出すのを停止するには、 ポストメッセージウェブフックスイッチ を無効に設定します

  • 呼び出す Webhook を変更するには、 Delete webhook をクリックします。