watsonx.aiのAgent LabでAgentをデプロイし、watsonx Orchestrateに組み込んでみる

# Agent Labとwatsonx Orchestrate
Agent Labは現在ベータ版が提供されているwatsonx.ai上で簡単にAIAgentを作成、デプロイできる機能です。また、watsonx Orchestrateには外部のAgentを登録して利用できる機能があります。この記事では、Agent Labで作成したAI Agentをwatsonx Orchestrateに組み込んで動作させるまでの流れについて説明します。
~~なお、現時点では、直接組み込むことはできず、wrapperのコードが必要になります。今回は[こちら](https://github.com/watson-developer-cloud/watsonx-orchestrate-developer-toolkit/blob/main/external_agent/examples/agent_builder/README.md)に公開されているwrapperを利用して接続します。~~(2025/03/27のアップデートで、直接接続することが可能になりました！）


## Agentの定義
watsonx.aiでプロジェクトを作成し、Agent Labを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/ee20fcdc-28c9-4cf3-ab3e-afccf293c76c.png)
Agentの定義画面が表示されるので、各種設定を行います。
現時点では、フレームワークとしてはLangGraphのみ選択することが可能です。
今回は、ツールとして、Google Web SearchとWeatherを追加してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/9fb57986-1007-4089-a6e6-b358956a23bb.png)
右側のプレビュー画面より、以下の質問を入力してみます。

Tell me the temperature of the city where the biggest baseball stadium in Japan is located.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/03d8d8b9-8ff8-47a4-bfb9-a09dd42faf06.png)

正しく結果が返ってきました。Agentがどのように処理を呼び出して回答を生成しているかも確認することが可能です。
なお、プロンプトなどを調整することで日本語でも動作しますが、API呼び出し時のパラメータがうまく英語に変換されないケースがあったため、ここでは英語で実施しています。

## Agentのデプロイ
定義したAgentは右上のdeployボタンより、簡単にデプロイすることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/1383571f-bf9a-488f-aaac-346165a7c2e9.png)

なお、デプロイを行うには、ターゲットとなるnamespaceの作成と、API-Keyが必要になります。watsonxのAPI-Keyはユーザーのプロファイル画面から生成することが可能です。

デプロイが完了すると以下のような画面が表示され、エンドポイントなどの情報を確認できます。この後wrapperを作成する際に必要となるので、URLの/deployments/以降の文字列をコピーして保存しておきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/b996589a-79db-4ed8-9ef3-8c53aaae4858.png)

## wrapperのビルド
以下のGitをCloneする、もしくはダウンロードして解凍します。

https://github.com/watson-developer-cloud/watsonx-orchestrate-developer-toolkit/blob/main/external_agent/examples/agent_builder/README.md

CodeEngineにデプロイする前に、ローカルで動作確認してみます。
まず、環境変数が必要なので、今回は、DockerFileに以下2行を追加しました。
```
ENV WATSONX_DEPLOYMENT_ID=先ほど確認したDeploymentID
ENV WATSONX_API_KEY=ibmcloudのAPIKey（IAM設定画面より取得可能です）
```

```docker build ./ -t agent```
```docker run -p 8080:8080 agent```
ブラウザより、http://localhost:8080/docs にアクセスするとSwaggerのUIが表示されます。/chat/completionsのAPIを呼び出してみます。すると、次のエラーが表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/7f3d6a4f-0baf-48dd-931f-9ab5c5b40455.png)

どうやら、client.set.default_projectでデフォルトプロジェクトIDをセットしろとのことです。
そこで、以下の様にコードを修正しました。環境変数を使うべきですが、今回はハードコードしました。

```utils.pyの68行目あたりに以下を追加
   client.set.default_project(watsonx.aiのプロジェクトID)
```
再度テストすると無事に応答が返ってきました。

## wrapperのデプロイ
ビルドしたイメージをCodeEngineにデプロイします。

まず、ContainerRegistryにイメージをプッシュします。
ログイン方法などは、様々ですので環境に応じて適切なコマンドを使用してください。また、必要に応じてnamespaceの新規作成などを行ってください。

以下コマンドの流れです。
```
ibmcloud login -apikey ZZZZZZ -region jp-tok
ibmcloud cr login
docker tag agent jp.icr.io/namespace/agent:latest
docker push jp.icr.io/namespace/agent:latest
```
なお、pushする際は、ログインしてから時間が経っていると失敗するケースがあり、ログイン直後に実施すると成功する可能性が高かったです。

PUSHが成功したら、IBMCloudのCodeEngine画面より、アプリケーションを作成し、先ほどPUSHしたイメージを選択してデプロイします。
デプロイが完了すると以下の様にエンドポイントが確認できますのでコピーしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/e19774f1-918b-451b-950c-1d49fb7a9019.png)

## watsonx OrchestrateへのAgentの登録
デプロイしたAgentのwrapperをwatsonx Orchestrateに登録します。
チャット設定＞Agentsより、Agentを登録します。今回のwrapperは認証が実装されていないので、API keyとしてはダミーの値を入力します。
先ほどのエンドポイントのURLに/chat/completionsを付加したものが、Service instanceのURLになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/8d93e2c1-992a-4cb0-b8e6-1cb0ebdc3aec.png)

## 動作確認
AgentChatから質問をなげてみます。
正しく、external agentにルーティングされて、結果が返ってきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/8019fff5-f5ed-43c8-98c7-0629f7257d9e.png)

## まとめ
この記事では、watsonx.aiのAgent Labを用いて、Agentを定義し、watsonx Orchestrateに登録してルーティングするまでの流れを解説しました。現時点ではBetaの機能もあり、少し手間がかかりますが、今後はより簡単にこれらのことが可能になるでしょう。

LangGraphやCrewAIといったAgentフレームワークを用いたAgent開発が進んでくると、Agentが入り乱れたAgentMeshと呼ばれるような問題が出てきます、また企業内で利用するための認証の基盤、ユーザー管理といった仕組みと組み合わせて利用する必要があります。

watsonx Orchestrateは単体のフレームワークではカバーできないそれらの機能や、必ずしもAgenticに解決する必要が無い固定された業務フローの定義、実行や、AIが苦手とするルール・ベースの意思決定なども含めて提供できるプラットフォームとしての位置付けがより明確になっていくと思われます。