アプリケーション開発ポータルサイト
ServerNote.NET
Amazon.co.jpでPC関連商品タイムセール開催中!
カテゴリー【IBM WatsonNode.js
Watson AssistantをGUIで作成しAPIから呼び出す(Node.js編)
POSTED BY
2023-04-28
Watson AssistantをGUIで作成しAPIから呼び出す(準備編)
Watson AssistantをGUIで作成しAPIから呼び出す(Python編)


最後に、Node.js版です。書式がPythonからNodeに変わっただけで、入出力データは全く同じとなります。

Node.jsのインストールなどはこちら

Watson SDK for Node.jsをインストール

npm install ibm-watson@^5.1.0

プロキシ環境下固有の修正

プロキシサーバを利用していない場合、飛ばしてください。現バージョンではプロキシ環境下では、SDKを直接修正する必要があります。

tunnelを入れる

npm install tunnel

node_modules/ibm-cloud-sdk-core/lib/request-wrapper.js を直接編集する。

ファイル先頭部にtunnelをrequireする。

"use strict";
var tunnel = require("tunnel");

70行目あたり~

        // merge valid Axios Config into default.
        extend(true, axiosConfig, allowedAxiosConfig.reduce(function (reducedConfig, key) {
            reducedConfig[key] = axiosOptions[key];
            return reducedConfig;
        }, {}));

        this.axiosInstance = axios_1.default.create(axiosConfig);

となっているところ、間に以下プロキシ記述を追加する。
プロキシサーバーのURLが http://proxy.local.example1155.jp:3128/ であるとすると、

        // merge valid Axios Config into default.
        extend(true, axiosConfig, allowedAxiosConfig.reduce(function (reducedConfig, key) {
            reducedConfig[key] = axiosOptions[key];
            return reducedConfig;
        }, {}));

        var agent = tunnel.httpsOverHttp({
         proxy: {
             host: 'proxy.local.example1155.jp',
             port: 3128,
         },
        });

        axiosConfig.httpsAgent = agent;
        axiosConfig.proxy = false;

        this.axiosInstance = axios_1.default.create(axiosConfig);

と、修正します。

あとは、前回のWatson AssistantをGUIで作成しAPIから呼び出す(Python編)のPythonソースがNode.jsソースになるだけですので、以下、ソースと出力のみ置いておきます。
Assistant ID,API Key,Session IDは自分のものに差し替えてください。

API接続しセッションIDを取得

JavaScriptwatson_create_session.jsGitHub Source
const AssistantV2 = require('ibm-watson/assistant/v2');
const { IamAuthenticator } = require('ibm-watson/auth');

const service = new AssistantV2({
  version: '2019-02-28',
  authenticator: new IamAuthenticator({
    apikey: 'GGGGGG-KKKKKKKK-VVVVVV-XXXXXX',
  }),
  url: 'https://gateway-tok.watsonplatform.net/assistant/api',
});

service.createSession({
  assistantId: 'aaaaaaaa-bbbbbbb-cccccc-ddddddd'
})
  .then(res => {
    console.log(JSON.stringify(res, null, 2));
  })
  .catch(err => {
    console.log(err);
  });

node watson_create_session.js

JSONwatson_create_session.js.jsonGitHub Source
{
  "status": 201,
  "statusText": "Created",
  "headers": {
    "content-type": "application/json; charset=utf-8",
    "content-length": "53",
    "access-control-allow-origin": "*",
    "access-control-allow-methods": "GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS",
    "access-control-allow-headers": "Content-Type, Content-Length, Authorization, X-Watson-Authorization-Token, X-WDC-PL-OPT-OUT, X-Watson-UserInfo, X-Watson-Learning-Opt-Out, X-Watson-Metadata",
    "access-control-max-age": "3600",
    "content-security-policy": "default-src 'none'",
    "x-dns-prefetch-control": "off",
    "x-frame-options": "SAMEORIGIN",
    "strict-transport-security": "max-age=31536000; includeSubDomains;",
    "x-download-options": "noopen",
    "x-content-type-options": "nosniff",
    "x-xss-protection": "1; mode=block",
    "x-response-time": "12.757ms",
    "x-global-transaction-id": "d82240d4719a15b86be4321f8fcef3b7",
    "x-dp-watson-tran-id": "d82240d4719a15b86be4321f8fcef3b7",
    "x-edgeconnect-midmile-rtt": "8",
    "x-edgeconnect-origin-mex-latency": "66",
    "date": "Sun, 01 Dec 2019 10:50:16 GMT",
    "connection": "close"
  },
  "result": {
    "session_id": "b2553333-2ace-4999-855c-da8cb666f39f"
  }
}

会話してみる

JavaScriptwatson_send_message_1.jsGitHub Source
const AssistantV2 = require('ibm-watson/assistant/v2');
const { IamAuthenticator } = require('ibm-watson/auth');

const service = new AssistantV2({
  version: '2019-02-28',
  authenticator: new IamAuthenticator({
    apikey: 'GGGGGG-KKKKKKKK-VVVVVV-XXXXXX',
  }),
  url: 'https://gateway-tok.watsonplatform.net/assistant/api',
});

service.message({
  assistantId: 'aaaaaaaa-bbbbbbb-cccccc-ddddddd',
  sessionId: 'b2553333-2ace-4999-855c-da8cb666f39f',
  input: {
    'message_type': 'text',
    'text': '旅行に行きたい',
    'options': {
      'return_context': true
    }
  },
  context: {
    'skills': {
      'main skill': {
        'user_defined': {
          'username': '太郎'
        }
      }
    }
  }
  })
  .then(res => {
    console.log(JSON.stringify(res, null, 2));
  })
  .catch(err => {
    console.log(err);
  });

node watson_send_message_1.js

JSONwatson_recv_message_1.js.jsonGitHub Source
{
  "status": 200,
  "statusText": "OK",
  "headers": {
    "content-type": "application/json; charset=utf-8",
    "content-length": "312",
    "access-control-allow-origin": "*",
    "access-control-allow-methods": "GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS",
    "access-control-allow-headers": "Content-Type, Content-Length, Authorization, X-Watson-Authorization-Token, X-WDC-PL-OPT-OUT, X-Watson-UserInfo, X-Watson-Learning-Opt-Out, X-Watson-Metadata",
    "access-control-max-age": "3600",
    "content-security-policy": "default-src 'none'",
    "x-dns-prefetch-control": "off",
    "x-frame-options": "SAMEORIGIN",
    "strict-transport-security": "max-age=31536000; includeSubDomains;",
    "x-download-options": "noopen",
    "x-content-type-options": "nosniff",
    "x-xss-protection": "1; mode=block",
    "x-watson-session-timeout": "session_timeout=300",
    "x-response-time": "62.473ms",
    "x-global-transaction-id": "b8b0c4fed970307e208399419c2163d7",
    "x-dp-watson-tran-id": "b8b0c4fed970307e208399419c2163d7",
    "x-edgeconnect-midmile-rtt": "8",
    "x-edgeconnect-origin-mex-latency": "114",
    "date": "Sun, 01 Dec 2019 10:50:39 GMT",
    "connection": "close"
  },
  "result": {
    "output": {
      "generic": [
        {
          "response_type": "text",
          "text": "太郎さん、国内ですか?海外ですか?"
        }
      ],
      "intents": [
        {
          "intent": "旅行",
          "confidence": 0.9467347621917725
        }
      ],
      "entities": []
    },
    "context": {
      "skills": {
        "main skill": {
          "user_defined": {
            "username": "太郎"
          },
          "system": {}
        }
      },
      "global": {
        "system": {
          "turn_count": 1
        }
      }
    }
  }
}

質問に答えてみる

JavaScriptwatson_send_message_2.jsGitHub Source
const AssistantV2 = require('ibm-watson/assistant/v2');
const { IamAuthenticator } = require('ibm-watson/auth');

const service = new AssistantV2({
  version: '2019-02-28',
  authenticator: new IamAuthenticator({
    apikey: 'GGGGGG-KKKKKKKK-VVVVVV-XXXXXX',
  }),
  url: 'https://gateway-tok.watsonplatform.net/assistant/api',
});

service.message({
  assistantId: 'aaaaaaaa-bbbbbbb-cccccc-ddddddd',
  sessionId: 'b2553333-2ace-4999-855c-da8cb666f39f',
  input: {
    'message_type': 'text',
    'text': '行くなら国内がいいです。',
    'options': {
      'return_context': true
    }
  }
  })
  .then(res => {
    console.log(JSON.stringify(res, null, 2));
  })
  .catch(err => {
    console.log(err);
  });

node watson_send_message_2.js

JSONwatson_recv_message_2.js.jsonGitHub Source
{
  "status": 200,
  "statusText": "OK",
  "headers": {
    "content-type": "application/json; charset=utf-8",
    "content-length": "372",
    "access-control-allow-origin": "*",
    "access-control-allow-methods": "GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS",
    "access-control-allow-headers": "Content-Type, Content-Length, Authorization, X-Watson-Authorization-Token, X-WDC-PL-OPT-OUT, X-Watson-UserInfo, X-Watson-Learning-Opt-Out, X-Watson-Metadata",
    "access-control-max-age": "3600",
    "content-security-policy": "default-src 'none'",
    "x-dns-prefetch-control": "off",
    "x-frame-options": "SAMEORIGIN",
    "strict-transport-security": "max-age=31536000; includeSubDomains;",
    "x-download-options": "noopen",
    "x-content-type-options": "nosniff",
    "x-xss-protection": "1; mode=block",
    "x-watson-session-timeout": "session_timeout=300",
    "x-response-time": "89.074ms",
    "x-global-transaction-id": "327b5a1cf3bcb014dd3be1f1b0637d03",
    "x-dp-watson-tran-id": "327b5a1cf3bcb014dd3be1f1b0637d03",
    "x-edgeconnect-midmile-rtt": "8",
    "x-edgeconnect-origin-mex-latency": "120",
    "date": "Sun, 01 Dec 2019 10:52:43 GMT",
    "connection": "close"
  },
  "result": {
    "output": {
      "generic": [
        {
          "response_type": "text",
          "text": "そうですか、国内に行きたいんですね太郎さん"
        }
      ],
      "intents": [],
      "entities": [
        {
          "entity": "旅行の種類",
          "location": [
            4,
            6
          ],
          "value": "国内",
          "confidence": 1
        }
      ]
    },
    "context": {
      "skills": {
        "main skill": {
          "user_defined": {
            "username": "太郎",
            "traveltype": "国内"
          },
          "system": {}
        }
      },
      "global": {
        "system": {
          "turn_count": 2
        }
      }
    }
  }
}

以上です。お疲れ様でした。

Watson AssistantをGUIで作成しAPIから呼び出す(準備編)
Watson AssistantをGUIで作成しAPIから呼び出す(Python編)

※本記事は当サイト管理人の個人的な備忘録です。本記事の参照又は付随ソースコード利用後にいかなる損害が発生しても当サイト及び管理人は一切責任を負いません。
※本記事内容の無断転載を禁じます。
【WEBMASTER/管理人】
自営業プログラマーです。お仕事ください!
ご連絡は以下アドレスまでお願いします★

☆ServerNote.NETショッピング↓
ShoppingNote / Amazon.co.jp
☆お仲間ブログ↓
一人社長の不動産業務日誌
【キーワード検索】