IBM webMethods Integrationを用いてwatsonx.aiを呼び出してみる

# watsonx.aiを用いたテキスト生成をAPIで呼び出したい
watsonx.aiは様々なLLMを提供し、API経由で生成AIを用いた処理を呼び出すことが可能です。しかし、APIを呼び出すためには、一度IAMのトークンを取得し、そのトークンをヘッダーにセットして呼び出すという2段階の処理が必要になります。そこで、今回は、トークンの取得＞テキスト生成の一連のフローをiPaaS製品であるwebMethodsを用いて実装し、単一のAPIとして呼び出すことが可能にしてみたいと思います。

## プロジェクトIDとIAMAPIキーの取得
事前の準備として、watsonx.ai上にプロジェクトを作成し、APIキーを生成する必要があります。
### プロジェクトIDの確認
watsonx.ai上でプロジェクトを作成し、プロジェクトIDを確認します。プロジェクトIDは管理タブから確認することが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/47a8b51e-1772-3aed-805a-15d839635193.png)

### APIキーの作成
IBMCloud上でIAM > APIキーと進み、APIキーを作成します。作成されたAPIキーは後から見ることができないので、コピーして保存しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/36e16cf0-6779-d6da-1a05-ed66442047c4.png)
## Workflowの作成
webMethodsにログインし、新規Workflowを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/2da10dc1-8c8d-cf07-0741-b06a2b8075a1.png)
まず、watsonx.aiへの接続部分を定義します。パレットより、2つのHTTP Requestノードを配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/f104008e-55d4-3de1-803a-440a52c66bb6.png)
1つ目のHTTP Requestノードをダブルクリックして開き、IAMトークン取得のためのリクエストの詳細を定義します。トークンの取得には以下のようなリクエストを送信する必要があります。
```
curl -X POST 'https://iam.cloud.ibm.com/identity/token' 
-H 'Content-Type: application/x-www-form-urlencoded' 
-d 'grant_type=urn:ibm:params:oauth:grant-type:apikey&apikey=MY_APIKEY'
```
そこで、以下の様にパラメータを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/33034794-0671-ab4a-2f2a-1d05ab73036b.png)
次の画面で、実際に呼び出して結果をテストすることが可能です。次の様にトークンが取得できていればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/f2bd1021-52fe-77f9-b1e4-6c072c327466.png)
次に、実際のテキスト生成のリクエストを設定します。.ai側のプロンプト・ラボで「コードの表示」アイコンをクリックすると実際のAPI呼び出しに必要なパラメータを確認することが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/8ddef88e-aaac-433e-9b2c-74ed280c6316.png)
先ほどと同じように、HTTP Requestの設定を行います。パラメータをマップする際は、{{と中括弧を2つタイプすか、左側のデータ項目をドラッグ＆ドロップして定義することができます。
AuthorizationヘッダーをBearerという文字列の後にスペースを入れて、取得したトークンをマップします。
Bodyについては、最終的には呼び出し時のパラメータをinputにマップしますが、ひとまず、固定値でJSONを指定しておくことにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/f9df5ddb-0d99-7052-6768-2ca21d5c53c8.png)
先ほどと同様にテストしてみます。正しくレスポンスを取得できていれば成功です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/41afd3c0-0284-d286-e031-c77d9ad3cc8a.png)
## Webhookの構成
ここまででWorkflowが完成しましたが、外からAPIとして呼び出せる形にはなっていません、このWorkflowをWebhookとして呼び出し、結果を受け取れるように変更します。
まず、トリガーノードをクリックし、Webhookを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/447f22ad-4806-8225-efb6-34116c761bb9.png)
BodyのJSONの形式を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/4e5f3634-63a6-855f-5bef-549994b8c448.png)
次のページで、追加の設定を行います。今回はWebhook Keyによる認証をONにして、また、戻りを受け取れるように、Autoconnect Return Sync on WebhookをOnにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/8b1ac6e6-3bcf-64bf-95cd-523b9cd45e1a.png)
Return Data on Sync Webhookというノードが自動的に作られるので、2つのHTTPRequestとStopノードの間に接続します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/a4168fdf-b25d-2f9f-0cc5-05fe3d83745f.png)
ダブルクリックして以下の様に設定します。Response Dataは文字列ですが、正しいJSONになるように注意してください。次の画面でテストをして動作確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/724a9366-97b2-b578-0e6e-26c132059d7f.png)
最後にテキスト生成のリクエスト（2番目のHTTP Request）にWebhook呼び出しのinputを含めるように修正します。JSONの中に、{{
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/878e87b1-97f4-3e1d-94bd-1cf489a0b6c3.png)
最後に保存してフローの開発は完了です。（フローはデフォルトでアクティブになっているはずです）
## POSTMANを用いたテスト
最後に出来上がったフローをPOSTMANから呼び出してみましょう。
先ほどwebhook keyによる認証をONにしたため、ヘッダーにwebhook_keyとしてキーを設定し、入力パラメータを指定して呼び出します。次の様に結果が受け取れれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/1bbee85a-3b5a-fd7f-1ac7-2837a32b047d.png)

## まとめ
この記事ではwebMethodsを使用してwatsonx.aiを単発のWebhookとして呼び出すための手順を説明しました。筆者はwebMethodsを使用するのは初めてでしたが、特にマニュアルを見ることもなく、30分程度でフローを作成することができました。各ノード毎に簡単に動作確認できるのも良い点だと感じました。webMethodsは様々なコネクターを提供するので、様々なSaaSアプリケーションからWebhookで複数の処理をフローとして呼び出したり、APIをスケジュール起動して呼び出す際などに便利に使えそうです。