すぐに始めるchatGPT API③PowerAppsからカスタムコネクタを呼び出す

前回まででChatGPT APIの応答・要求や仕組みなどを解説しまして、カスタムコネクタを生成するところまでいきました。
次はいよいよPower Apps アプリを作成して、言葉のキャッチボールをしてみましょう。

# Power Apps キャンバスアプリを作成する

①Power Appsホーム画面から「アプリ」→「新しいアプリ」→「キャンバス」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/447009e4-2865-abb9-6a2d-4b2209f4550a.png)

②アプリ名を入力して「作成」をクリックし、しばらく待ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/f488631f-d238-ae88-e1bb-c31bcf6684b2.png)

③ユーザーがメッセージを入力するための「テキスト入力」と送信ボタンとして利用する「ボタン」を配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/2a209c58-4acd-b84c-0814-bf991c4918df.png)
テキスト入力のプロパティを変更します。必要そうなのは既定を空白にすることと、モードを「複数行」にすることぐらいでしょうか。文字のサイズなどは任意に設定ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/b1acc991-7b61-9edf-2b58-70cd9c12a1c6.png)

④ボタンのテキストは「送信」に変更しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/d4002528-b263-b615-d873-a24598659145.png)

大きさや位置を変更して配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/8b2a70bb-a08b-875b-2664-7644c004ad1b.png)

## カスタムコネクタに接続する

画面の左側に並んでいるアイコンのうち「データベース型」のアイコンをクリックし、データの追加をクリックします。
データソースの選択のほうの検索テキストに、前回作成したコネクタの名前を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/c6d59a74-443e-053c-e1e1-827cf65738eb.png)

作成したコネクタが出てきますので（2回）クリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/20e3f403-5741-8b47-cd93-73eb2a2591ed.png)

これでこのアプリからカスタムコネクタが利用可能になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/e11e17cd-b008-7439-3624-d51c94ae378a.png)


## ギャラリーを作成する

実際にやりとりを表示するためのエリアを作成します。今回の場合「ユーザーとGPTの言葉のキャッチボール」を表示したいので、複数のテキストを表示したいです。またテキストの量は各contentによって変わります。そこで、今回は「高さが伸縮可能な空のギャラリー」を利用します。

①挿入から「レイアウト」を展開して「高さが伸縮可能な空のギャラリー」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/77665e09-ca24-1fc0-2fd9-5fbc3f108836.png)

以下のように表示されますが、まだメッセージを格納する領域（コレクション）が用意されていないので、いったん配置だけして次に進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/c7fc170e-554c-e369-5098-50f154977ae4.png)

## ボタンを押したらGPTにメッセージを送信する

次は、送信ボタンを押したらテキスト入力の内容をカスタムコネクタに送信する部分を実装します。
ボタンのOnSelectを以下のように記述します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/f5c3acc1-79f2-9061-19cd-909897ae1164.png)

コードは以下のようになります。
```javascript:
Set(varResponse,ChatGPTTestConnector.SendUserMessage("gpt-3.5-turbo",Collect(colChat,{role:"user",content:TextInput1.Text})));
Collect(colChat,First(varResponse.choices).message);
Reset(TextInput1)
```

Set(varResponse,ChatGPTTestConnector.SendUserMessage(〇〇));
この部分はカスタムコネクタChatGPTTestConnectorのアクションであるSendUserMessageを実行して、実行結果を変数であるvarResponseに入れる、という意味です。作成したコネクタ名とアクション名によってこの部分は変わります。〇〇の中身については以下のようになります。

～～.SendUserMessage("gpt-3.5-turbo",Collect(△△));

作成したアクションは model とmessage を要求としています。 model と role と content じゃないの？と思いますが、 role と model は合わせて messages でした。なのでここでは messages として{user:●● , content:▲▲} を必要とします。

Collect(colChat,{role:"user",content:TextInput1.Text})

さらに前回説明した通り、今までの会話のやり取りやシステムもメッセージとして複数、要求に含めることができます。
これをPower Apps で記載する場合は「コレクション」が利用できます。
この分は今までのやり取りが入っているcolChatに新しく{role:"user",content:TextInput1.Text}を追加している、という意味です。
ここまでが1行目の意味になります。

Collect(colChat,First(varResponse.choices).message);

2行目では応答として得られた内容をさらにコレクションに追加しています。

Reset(TextInput1)

3行目は次のテキストを入力しやすくするため、リセット（空白にする）しています。

## ギャラリーのデータソースにコレクションを設定する

上記のコードによって、colChatというコレクションに複数のメッセージが入るというところまでできました。これをギャラリーのデータソースとして設定します。
ギャラリーをクリックして「データソースの選択」でcolChatをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/e02a608a-94d1-f562-af4c-2f8ca37d5671.png)

鉛筆アイコンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/89b9a58a-11bf-58c4-0d1c-0f6d4e590edd.png)
一つのデータ当たりの表示内容を設定できるようになります。必要な表示はroleとcontentなのでラベルを2つ配置します。
ギャラリーの中にラベルが2つあることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/97045f69-736e-1d34-1a3b-b9cd2ea16bd3.png)

一つ目のラベルは枠の左上に配置し、TextをThisItem.roleに変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/74725946-21f9-67b4-5a62-577589522373.png)

２つ目のラベルは左側は1つ目のラベルと被らない位置に配置し、右側は枠につくかつかないかぐらいまで伸ばします。
TextをThisItem.content に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/09c1f261-832f-5cf8-74b7-b33d54e11056.png)

さらに2つ目のラベルはプロパティを垂直方向の配置を「上」に変更し、高さの自動調整をオンにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/e1d42d31-430b-46ac-4141-e1b38c81fbb5.png)

このようになります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/d6413c7c-bbf1-f225-9467-2da63380d295.png)

##動作確認をする

プレビュー実行をし、メッセージのやり取りができるか確認しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/903ce74d-d4c5-318e-923a-1d3b0249e934.png)

「じゃあ2番目は？」という質問を、最初の質問を踏まえて回答していることがわかります。

# まとめ
カスタムコネクタを使ってPower AppsでChatGPTと言葉のキャッチボールができるアプリを作成しました。
メッセージリセット機能（Clearするだけ）やデザインを変えたり、やり取りの内容をどこかのデータソースに入れる機能を追加してもいいかもしれません。

# おまけ

システムメッセージを追加するドロップダウンも作れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/8a4ab22d-0856-c079-ed14-a5babe0d8326.png)
DropdownのOnChangeに以下のようなコードを書くだけです。

Collect(colChat,{role:"system",content:"次のメッセージは"& Dropdown1.Selected.Value & "口調でお願いします。"})

ちょっと信濃川の周辺を一緒に散歩して来ます（多分、川に突き落とされるやつ）