OpenAI を UiPath から呼び出してみる

# OpenAI を UiPath から呼び出してみる

今話題のチャットGPT。UiPath の Integration Service でもコネクタのプレビュー版が出ています。
本記事では、前半 ***「HTTP要求」アクティビティをもちいたAPIの呼び出し方*** 、後半 ***Integration Service での実装例*** を書きたいとおもいます。

# コネクタの作成方法からチャットGPTに聞いてみる

![OpenAI1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/bc57c8d5-269f-4ab0-a712-60e9d07f8eda.png)
![OpenAI2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/c86506b7-3b21-043d-de30-f43eb66fac53.png)

素晴らしいですよね☀
APIを使う際は、サイトや仕様書を探すところで骨を折ることが多いので
この精度で導入手順を案内されただけで感動です(´Д⊂ヽ

# API キーを取得してみる
[***OpenAI***](https://openai.com/) のサイト上でアカウント登録 ～ API キーを取得する手順
![OpenAI3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/3ed95cd5-e453-ff6a-692a-96c4c0192604.jpeg)
「Product」画面の「Get started」ボタンをクリック
![OpenAI4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/ed9e91d0-d747-c4b8-88a8-b7f236328364.jpeg)
アカウント登録が完了したら画面上部の「API reference」をクリック
![OpenAI5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/d2f56223-9576-4937-532a-38f5dddbd2e2.jpeg)
「Authentication」セクションの「API Keys（リンク）」をクリック
![OpenAI6.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/46a1c73e-76e7-cc44-f60e-069111048921.jpeg)
「Create new secret key」をクリック
![OpenAI7.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/55960d0a-2fc6-876a-1690-cb8d0ae3b071.jpeg)
API キーが生成されるのでメモ帳にコピーしましょう

# 【前半】API を使ってみよう ~ HTTP要求アクティビティによる実装例 ~

[***OpenAI の利用規約***](https://openai.com/policies/terms-of-use)上、チャットGPTのサイト上から ***ロボを利用してデータの抽出・取得をおこなうことは禁止されています。
API を利用したデータ取得は許可されていますが、一般的には人が手動操作で可能なアクセスを越えての利用は許容されない認識のため、
以降にサンプルとして掲載するロボットでも繰り返し処理をもちいたアクセスはしません。***
本記事を参考に OpenAI（API） の利用を検討される方はその点ご注意ください。
>(iv) except as permitted through the API, use any automated or programmatic method to >extract data or output from the Services, including scraping, web harvesting, or web >data extraction; 

それでは早速簡単そうな WebAPI（エンドポイント）を実行してみようとおもいます。

![OpenAI9.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/d7b8194a-2dc9-4d99-da72-7d84a9b95fc0.jpeg)

モデル（※）の一覧取得のエンドポイント（以下、リクエスト例）
```
curl https://api.openai.com/v1/models \
  -H "Authorization: Bearer $OPENAI_API_KEY"
```
※機械学習済みのデータベースみたいなものです。AI の操作は、対象のモデルに対してパラメータを投げて、予測結果を受け取るのが基本です。

curl コマンドにおけるリクエスト例をみていただけばわかるとおもいますが、
このリクエストは ***ヘッダー情報に API キーを持たせてエンドポイントを GET メソッドで実行する*** だけです。

![OpenAI10.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/c014306b-e544-8d79-246e-082d27ddaf4e.jpeg)

1. Studio の「パッケージを管理」より「UiPath.WebAPI.Activities」をインストール
1. 「HTTP要求」アクティビティを配置
1. プロパティの「ヘッダー」に以下を登録
　　Name："Authorization"
　　Value："Bearer "+{作成したAPIキー}
1. プロパティの「本文形式」に「application/json」を、「受け入れ形式」に「JSON」を指定
1. プロパティの「要求URL」に「https://api.openai.com/v1/models」を指定
1. プロパティの「要求メソッド」に「GET」を指定

![OpenAI10-2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/72cf4bd1-8b29-2167-4e13-5e70befd38d8.jpeg)

実行すると、レスポンスのJSONデータを無事確認できます(*´ω｀*)

![OpenAI11.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/a34e65bd-81fc-310d-55ff-ea330af26303.jpeg)

疎通は問題ないことが確認できたので、いよいよとチャットをば
チャットのエンドポイント（以下、リクエスト例）
```
curl https://api.openai.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "model": "gpt-3.5-turbo",
    "messages": [{"role": "user", "content": "Hello!"}]
  }'
```
ヘッダーオプションは本文形式が追加となるのみ。
本文パラメータでモデルとメッセージを投げるかたちですね。

![OpenAI12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/45594a24-98f5-eb61-4385-bb810f4d3c03.png)

1. 「HTTP要求」アクティビティを配置
1. プロパティの「ヘッダー」に以下を登録
　　Name："Authorization"
　　Value："Bearer "+{作成したAPIキー}
1. プロパティの「本文形式」に「application/json」を、「受け入れ形式」に「JSON」を指定
1. プロパティの「要求URL」に「https://api.openai.com/v1/chat/completions」を指定
1. プロパティの「要求メソッド」に「POST」を指定
1. プロパティの「本文」に「"{""model"": ""gpt-3.5-turbo"",""messages"": [{""role"": ""user"", ""content"": """+チャット文+"""}]}"」を指定
　※「チャット文」はあらかじめ作成した String 型の引数です。

![OpenAI13.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/851f74f7-da9e-ef7e-06a6-0f4151f6ea89.jpeg)

レスポンス返ってきましたー(*ﾉωﾉ) やっほーい
で、欲しいフィールドは「content」に入っているのですが、
「choices」フィールドの下の階層で、かつ、配列という。。。

![OpenAI14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/0940b56d-0dd9-ff9a-d4a4-30291b8f4ef3.png)

一度レスポンスをJSONオブジェクトに変換し、「choices」フィールドのJSON配列を再度オブジェクト変換します。
変換後のオブジェクトの最初の要素から「"message":」を除去したテキスト（※）を再度逆シリアル化
※`{"role":"assistant","content":"Hello there!How may I assist you today?"}`

![OpenAI15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/3f8eb865-c7bd-363a-6ad6-0d7f29c112e3.png)

さぁ やっとフィールド名を指定して値を取得できます。
（なお、LINQを使えば、上の様な面倒くさいことしなくとも値を抽出することは可能です。りんたろうさんの[***こちらの記事***](https://qiita.com/MUCHIUCHI_OJISAN/items/815e7d5375da4962381c)をご参照ください。
本記事の変数で書くなら
***レスポンスのJオブジェクト.SelectToken("$..message.content")***
とするだけで最初に逆シリアル化してつくったJオブジェクトから値取得可能です。）

![OpenAI16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/7f87b3da-6805-c440-1c58-1a0f467f80d2.png)

引数に「こんにちわ」をセットして実行した結果↑
ちゃんと日本語で返ってきたー、うれしー(*‘∀‘)

# 【後半】UiPath の OpenAI のコネクタ（※プレビュー版）

![OpenAIコネクタ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/9e9801d3-9626-2e09-ccca-2aacc42544e1.jpeg)

Automation Cloud の Integration Service のカタログ上の「OpenAI」サービスをクリック

![OpenAIコネクタ2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/64609b96-3223-3e64-659e-b8e182da5d89.jpeg)

「コネクションを追加」をクリック

![OpenAIコネクタ3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/bf7d40ec-1348-f5af-688a-74077718f1de.jpeg)

生成済みの API キーを入力し「接続」をクリック

![OpenAIコネクタ4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/37fbb319-2b1d-1fb2-6845-3db57589e075.jpeg)

無事に一覧上にコネクションが作成されます！

![OpenAIコネクタ5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/ccd63ad9-0653-a528-b8fc-aff32bbcf3c5.jpeg)

Studio で「OpenAI」パッケージをインストール

![OpenAIコネクタ6.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/f084ac58-e5ab-5f85-7b79-00ae30457376.jpeg)

「Chat Completion」アクティビティの方から試していきます。
こちらは ChatGPT の3.5 のサービスに該当する模様。
コネクションが作成済みであれば、アクティビティを配置と同時に既定のコネクションが設定されます。
コネクションが複数ある際は、プルダウンで選び直しましょう。

![OpenAIコネクタ7.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/c9fca973-169e-8f42-939b-43258e69b9ba.jpeg)

入力欄に『目上の方向けに営業挨拶のメール本文例をください』を指定

![OpenAIコネクタ8.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/153d19b1-0585-4343-baa0-81cf0f2a12dd.jpeg)

詳細設定の出力プロパティに「チャットの応答文（変数）」を指定（オブジェクトが返ってくるので、「.Text」で応答文を取得しましょう）

![OpenAIコネクタ9.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/faeedd8a-a025-ebc8-d73a-a7068e2c0c00.jpeg)

おぉっ(*´ω｀*)簡単ですねー

お次は「Text Completion」アクティビティの方から試していきます。

![OpenAIコネクタ11.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/8c819bfc-4c50-2889-355a-283ab55464eb.jpeg)

こちらは詳細設定でモデルを指定できるんですね
先ほど同様に入力文と出力プロパティを設定して実行

![OpenAIコネクタ10.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/a298923b-70b1-5cd2-de8f-96c692e2eaba.jpeg)

モデル毎に違う例文をくれそうですね。どのモデルが一番優秀なんだろう(笑)
OpenAI は APIの仕様が非常にシンプルなため、HTTP要求アクティビティと Integration Service で実装難易度の差があまり見えませんが、
Integration Service の場合、複雑な WebAPI のサービスでも同様の手順でロボットに組み込むことができるところが大きなメリットです☀

長々と書きましたが、最後までお読みいただきありがとうございましたm(__)m

# 続編記事
https://qiita.com/Kajiita/items/f990e8ef025f2e699f17

https://qiita.com/Kajiita/items/5d2dc077f57cc72848e6