2024-04-28

前回:Watson AssistantをGUIで作成しAPIから呼び出す(準備編)の続き
アシスタントを作成したので、いよいよ外の自前のサーバーからAPIで呼び出す。まずはPythonで呼んでみる。
最新版Pythonのインストールなどはこちら。
まずは、APIを呼ぶとき必要なパラメータとなる情報を集める。
呼び出すアシスタントのIDとAPI Keyを取得
左上「IBM Watson Assistant」で、アシスタント画面トップに戻る。
アシスタント一覧でさきほど作成した「てすと」が居るので、右端メニュー「Setting」を選び、左メニュー「API Details」を表示する。
ここにある
「Assistant ID」例:aaaaaaaa-bbbbbbb-cccccc-ddddddd
「API Key」例:GGGGGG-KKKKKKKK-VVVVVV-XXXXXX
が必要になるので、メモする。
接続先URLを取得
以下、APIのドキュメント
https://cloud.ibm.com/apidocs/assistant/assistant-v2
に、「Service Endpoint」一覧があり、東京があるので
https://gateway-tok.watsonplatform.net/assistant/api
であることがわかる。
APIのバージョンを取得
以下、リリースノートを見る。
https://cloud.ibm.com/docs/assistant?topic=assistant-release-notes&locale=ja
V2 の現行バージョンは 2019-02-28 です。
とあるので、2019-02-28 をメモする。
以上でAPI接続するための値は得られたので、Pythonでwatsonを使えるようにする。
↑の「APIのドキュメント」に全部書いてはあるのだが。
Watson SDK for Pythonをインストール
pip3.7 install --upgrade "ibm-watson>=4.0.2"
当方環境Debian Buster + ソースからPythonインストール3.7ではエラーは無く完了した。
API接続しセッションIDを取得
さきほどの旅行アシスタント「てすと」に接続しセッションIDを得る。以下のコードを書いた。
Assistant ID,API Keyは自分のものに差し替えるとよい。
| Python | watson_create_session.py | GitHub Source |
import json
from ibm_watson import AssistantV2
from ibm_cloud_sdk_core.authenticators import IAMAuthenticator
authenticator = IAMAuthenticator('GGGGGG-KKKKKKKK-VVVVVV-XXXXXX')
assistant = AssistantV2(
version='2019-02-28',
authenticator=authenticator
)
assistant.set_service_url('https://gateway-tok.watsonplatform.net/assistant/api')
response = assistant.create_session(
assistant_id='aaaaaaaa-bbbbbbb-cccccc-ddddddd'
).get_result()
print(json.dumps(response, indent=2))
python3.7 watson_create_session.py
結果、セッションIDがJSONで返るので、以降これを指定し会話する。
無料版(ライトプラン)だとセッションIDの有効時間が非常に短く使い物になるのか疑問ではある。
{
"session_id": "b2553333-2ace-4999-855c-da8cb666f39f"
}
会話してみる
作成編のTry itと同じように、「旅行に行きたい」と言ってみる。Try itとの違いは、
コンテキスト変数として自分の名前=username=太郎をセットして同時送信しているところ。
| Python | watson_send_message_1.py | GitHub Source |
import json
from ibm_watson import AssistantV2
from ibm_cloud_sdk_core.authenticators import IAMAuthenticator
authenticator = IAMAuthenticator('GGGGGG-KKKKKKKK-VVVVVV-XXXXXX')
assistant = AssistantV2(
version='2019-02-28',
authenticator=authenticator
)
assistant.set_service_url('https://gateway-tok.watsonplatform.net/assistant/api')
response = assistant.message(
assistant_id='aaaaaaaa-bbbbbbb-cccccc-ddddddd',
session_id='b2553333-2ace-4999-855c-da8cb666f39f',
input={
'message_type': 'text',
'text': '旅行に行きたい',
'options': {
'return_context': True
}
},
context={
"skills": {
"main skill": {
"user_defined": {
"username": "太郎"
}
}
}
}
).get_result()
print(json.dumps(response, indent=2))
python3.7 watson_send_message_1.py
結果、さきほどのTry itとは違い、ちゃんと名前で呼ばれて質問されている。
| JSON | watson_recv_message_1.json | GitHub Source |
{
"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
}
}
}
}
質問に答えてみる
海外か国内か問われたので、今度は「海外ですね。」と答えてみる。
最大のポイントは今度はコンテキスト変数=自分の名前=を送信していないところ。
Watson API v2では、一度アシスタントに送信した変数はWatson側のサーバーセッションで以降保持されるため、再送信の必要がない。
| Python | watson_send_message_2.py | GitHub Source |
import json
from ibm_watson import AssistantV2
from ibm_cloud_sdk_core.authenticators import IAMAuthenticator
authenticator = IAMAuthenticator('GGGGGG-KKKKKKKK-VVVVVV-XXXXXX')
assistant = AssistantV2(
version='2019-02-28',
authenticator=authenticator
)
assistant.set_service_url('https://gateway-tok.watsonplatform.net/assistant/api')
response = assistant.message(
assistant_id='aaaaaaaa-bbbbbbb-cccccc-ddddddd',
session_id='b2553333-2ace-4999-855c-da8cb666f39f',
input={
'message_type': 'text',
'text': '海外ですね。',
'options': {
'return_context': True
}
}
).get_result()
print(json.dumps(response, indent=2))
python3.7 watson_send_message_2.py
結果、さきほどのTry itとは違い、今度は名乗っていないにかかわらずちゃんと名前で呼ばれて応えてくれた。
| JSON | watson_recv_message_2.json | GitHub Source |
{
"output": {
"generic": [
{
"response_type": "text",
"text": "そうですか、海外に行きたいんですね太郎さん"
}
],
"intents": [],
"entities": [
{
"entity": "旅行の種類",
"location": [
0,
2
],
"value": "海外",
"confidence": 1
}
]
},
"context": {
"global": {
"system": {
"turn_count": 3
}
},
"skills": {
"main skill": {
"user_defined": {
"username": "太郎",
"traveltype": "海外"
},
"system": {}
}
}
}
}
以上、Watson Assistant GUI画面で登録したAssistantを外部APIから呼び出すサンプルでした。最後は以下、Node.js版となります。
Watson AssistantをGUIで作成しAPIから呼び出す(Node.js編)
※本記事内容の無断転載を禁じます。
ご連絡は以下アドレスまでお願いします★
Wav2Lipのオープンソース版を改造して外部から呼べるAPI化する
Wav2Lipのオープンソース版で静止画の口元のみを動かして喋らせる
【iOS】アプリアイコン・ロゴ画像の作成・設定方法
オープンソースリップシンクエンジンSadTalkerをAPI化してアプリから呼ぶ【2】
オープンソースリップシンクエンジンSadTalkerをAPI化してアプリから呼ぶ【1】
【Xcode】iPhone is not available because it is unpairedの対処法
【Let's Encrypt】Failed authorization procedure 503の対処法
【Debian】古いバージョンでapt updateしたら404 not foundでエラーになる場合
ファイアウォール内部のWindows11 PCにmacOS Sequoiaからリモートデスクトップする
【Windows10】リモートデスクトップ間のコピー&ペーストができなくなった場合の対処法
Windows11+WSL2でUbuntuを使う【2】ブリッジ接続+固定IPの設定
【C/C++】小数点以下の切り捨て・切り上げ・四捨五入
GitLabにHTTPS経由でリポジトリをクローン&読み書きを行う
Windows11のコマンドプロンプトでテキストをコピーする
Googleスプレッドシートを編集したら自動で更新日時を入れる
タスクスケジューラで変更を適用できません。ユーザーアカウントが不明であるか、パスワードが正しくないか、またはユーザーアカウントにタスクを変更する許可がありません。と出た
【Apache】サーバーに同時接続可能なクライアント数を調整する
【Raspberry Piメモ・3】オンボード無線LANでWi-fi Direct対応機器に接続する