watsonx OrchestrateからMicrosoft Graph APIを呼んでみる

# watsonx OrchestrateからMicrosoft Graph APIを呼んでみる
watsonx OrchestrateはIBMのAiAssitant構築のためのプラットフォームです。ユーザーはチャットにやりたいことを入力することで様々な「スキル」を呼び出すことが可能です。製品にはあらかじめ1500以上のスキルが付属し、カタログから選択することですぐに利用が可能です。
また、製品に付属しないスキルについては、OpenAPI定義を読み込むことでスキルとして取り込むことが可能です。この記事ではMicrosoftのGraphAPIを例に、スキルの取り込み方法について解説します。

## アプリケーションの定義
まず、watsonx OrchestrateがMicrosoftのアカウントに接続できるように、Microsoftのアカウント側にアプリケーションを定義する必要があります。
Entra管理センターにアクセスし、アプリケーション＞アプリの登録からアプリケーションを登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/f01bf417-dd7a-0192-3d39-8b7e23b64517.png)

リダイレクトURIとしては、以下の値を設定します。（環境によって異なる可能性があります。）
https://dl.watson-orchestrate.ibm.com/mfe_connectors/api/v1/oauth/_callback

### シークレットの作成
「証明書とシークレット」からシークレットを作成します。シークレットの値はこのタイミングでしかコピーできないため、忘れずにコピーしておきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/1df25d20-ed87-6eed-5c6f-55c4e861be12.png)
以上で、アプリケーションの定義は完了です。次に、GraphAPIを呼び出すためのAPI定義を作成します。

## OpenAPI BuilderによるOpenAPI定義の作成
スキルを定義する際には、IBMのワークフロー製品や、UiPathのボットの取り込み、もしくはOpenAPI定義ファイルからインポートすることが可能です。APIによってはjson形式やyamlファイル形式で提供されているものもありますが、残念ながらGraphAPIでは提供されていません。そこで今回は、watsonx OrchestrateのOpenAPI Builderという機能を用いてOpenAPI定義を作成してみようと思います。この機能は、APIに関する情報が記述されているWebサイトのURLを指定すると生成AIを用いて定義を生成してくれるものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/50194176-a703-cf2a-2ed4-5ee678c87d62.png)


今回は以下のURLを指定し、GraphAPIのユーザーの取得APIをスキルとして登録してみることにします。
https://learn.microsoft.com/ja-jp/graph/api/user-get?view=graph-rest-1.0&tabs=http
使い方は簡単で以下の様にURLを指定してボタンをクリックし、生成するメソッドを選択するだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/9ce2fc7d-ac80-20e3-87db-91ad12321d2b.png)

※この機能は現状Beta版となり、利用するタイミングや、読み込むWebサイトによっては、上手く動作しないケースなどがあります。

しばらく待つと、OpenAPI定義が出力されるため、必要に応じて修正します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/b58b0d47-2639-0c1e-9b58-1a186a18791f.png)
今回のケースでは、セキュリティ設定が基本認証として定義されていたため、oauthを使用するようにAPIのsecurity設定とsecuirtySchemesを変更します。
なお、GraphAPIはスコープにoffline_accessを含めないとトークン・リクエストの応答にリフレッシュ・トークンが含まれないため、APIに必要なスコープに加えて、offline_accessをスコープに追加してください。以下にsecuritySchemesの例を示します。
```
 "components": {
        "securitySchemes": {
            "oauth": {
                "type": "oauth2",
                "flows": {
                    "authorizationCode": {
                        "authorizationUrl": "https://login.microsoftonline.com/oauth2/v2.0/authorize",
                        "tokenUrl": "https://login.microsoftonline.com/oauth2/v2.0/token",
                        "scopes": {
                            "offline_access": "required for reflesh token",
                            "User.Read": "read user info"
                        }
                    }
                }
            }
        }
    }
```
また、エンドポイントには、テナントのIDが含まれるケースがあるため、前述のアプリケーション設定画面でエンドポイントを確認してください。

## OpenAPI定義の読み込み
watsonx Orchestrateのスキル・スタジオから作成したOpenAPIファイルを読み込みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/72efb4d6-2232-b251-5234-49788e4c8142.png)
OpenAPI定義に問題が無ければスキルのインポートが可能になります。（今回はOperationIDにスペースが含まれており、検証に失敗したため、ファイルを修正して再インポートしました。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/71833e02-f116-1869-1765-b6916727bc4a.png)

スキルが読み込まれるので、スキルの拡張＞Publishを行います。その後カタログからスキルを追加し、接続を行います。
ClientSecretとして先ほどコピーしたシークレットを、ClientIDとしてアプリケーションIDを指定してください。（シークレットIDでないことに注意）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/926d998a-87db-93a1-da61-1c6f1f6c4816.png)
テナントへのログイン画面が表示され、アクセス許可への同意ダイアログが表示されます。先ほどのスコープ定義で定義した権限が表示されていることを確認し、承諾ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/799d1138-e9ee-60c4-309b-4fcd5de6da37.png)

## スキルの呼び出し
チャット画面より、先ほど定義したスキルを呼び出し、正しく動作することを確認します。
今回は、OpenAPIBuilderが生成した戻りのデータ型が正しく定義できていなかったために、一部のデータのみ返されましたが呼び出し自体は正しく動作しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/1ce85f84-521d-a72b-91ba-5e8840157e22.png)

## まとめ
今回は、watsonx OrchestrateでMicrosoft Graph APIを呼び出す手順について説明しました。まだBeta機能のためか、OpenAPI定義を生成AIを用いて生成する部分に関しては完全なものができませんでしたが、APIの呼び出しは無事に成功しました。スコープ設定周りで躓くケースが多そうですが、そのあたりに注意すればスムーズに実装できるはずです。
戻りの型の修正については、手作業で修正したり、戻りの一部を生成AIに渡して型定義を生成したりすることも可能ですが、[公開されているもの](https://github.com/microsoftgraph/msgraph-metadata/blob/master/openapi/v1.0/openapi.yaml)もあり、こちらを用いることも可能でしょう。

watsonx Orchestrateに関する最新情報については[こちら](https://community.ibm.com/community/user/automation/communities/community-home/recent-community-blogs?communitykey=a80f199e-a0d6-43ab-bca0-7303a731ede9)でも発信中ですので是非ご覧ください。