【enebular 2022】ChatGPT用ノード「node-red-contrib-simple-chatgpt」を enebular・Node-REDで試したり API を Python から利用してみた話

## はじめに
この記事は、[enebular Advent Calendar 2022](https://qiita.com/advent-calendar/2022/enebular) の 14日目の記事です。

内容は、以下ツイートや記事に出てきている「[ChatGPT用ノード（node-red-contrib-simple-chatgpt）](https://flows.nodered.org/node/node-red-contrib-simple-chatgpt)」に関する内容です。

https://twitter.com/n0bisuke/status/1601114476358443013

●Node-REDでChatGPTを試す - Qiita
　https://qiita.com/h-takauma/items/80a7ab7c167155baf324

自分も [enebular](https://www.enebular.com/ja/) で、ChatGPT用のノードのお試しを少しやってみます。

### ChatGPT について
ChatGPT は、今年のアドベントカレンダー用に公開した記事でも 2回とりあげていて、自分の中ですごく興味深い技術です。

- [【KDDI Engineer&Designer】AI にブラウザ用の JavaScript のプログラムをいくつか作ってもらった話 ⇒ OpenAI の ChatGPT で生成されたプログラムの解析も少々 - Qiita](https://qiita.com/youtoy/items/8eacb1af28ac18301b74)
- [【完走賞ゲット-4】続・OpenAI の ChatGPT のネタ：JavaScript の特定の技術仕様を教えてもらう - Qiita](https://qiita.com/youtoy/items/a4d9f3b0736475d0770a)

## ノードのページを見てみる
ChatGPT用のノードを実際に試していく前に、まずは node-red-contrib-simple-chatgpt のページの情報を見てみます。

●node-red-contrib-simple-chatgpt (node) - Node-RED
　https://flows.nodered.org/node/node-red-contrib-simple-chatgpt
![node-red-contrib-simple-chatgpt](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/a512dbe7-11e7-e407-1cb0-a725855fb3eb.png)

利用するノードは、上の画像では右下にある、緑色のノード 1つだけになるようです。

## ChatGPT用ノードを使う
## OpenAI の APIキーを取得
上記のノードを利用するには、OpenAI の APIキーが必要になるようです。

自分は既にアカウントを作っていて、 APIキーも発行していたのですが、新規に 1つ追加してそれを使ってみました。キーの発行は https://beta.openai.com/account/api-keys にて。
![APIキーの取得](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/94bffbfd-7ba3-1dfb-6586-99864706348a.png)

### enebular でノードを追加する
それでは、 enebular を開いて、ChatGPT用ノードを追加するところから始めます。

まずは https://enebular.com/sign-in からログインをして、開発ができる画面へと進んでいきます。
![enebularの開発画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/7115da1b-5f12-dd2c-5b8b-6a7cedced0ed.png)

そして、右上のメニューの「パレットの管理」へと進み、「simple-chatgpt」などを検索キーワードにして出てきた ChatGPT用ノードを追加します。
![ノードの追加](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/7b9081f1-ee57-4110-a8de-2f101aace812.png)

以下のように、無事にノードが追加されました。
![ノードの追加後](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/708e9774-b206-4685-e3dc-d7858af26e39.png)

### ChatGPT用ノードのプロパティを見てみる
次に、ChatGPT用ノードのプロパティを見てみます。Token という部分に、先ほど取得した OpenAI の APIキーをセットする形です。

![ChatGPT用ノードのプロパティ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/3f680264-4398-17e3-1ebf-96235988902b.png)

このあたりは、冒頭に書いていた ChatGPT用ノードに関する記事の流れと同じです。

### 処理を実行してみたけれど...
そして、APIキーを使って処理をしてみたのですが、処理中という表示が出てから処理が終わる気配がない状況に。

https://twitter.com/youtoy/status/1602418710765252608

どうやら、OpenAI へのアクセス自体に制限がかかった状況っぽく、ノードで実行したリクエストが処理されない状態になったようでした（※ これは違った原因があったかも、という話を後述）。
とりあえず、復活するまで待つことに...

### 再度 ChatGPT用ノードを試す
その後、OpenAI のサイトへ直接アクセスして、ChatGPT を公式ページ内で試せる状態に戻ったのを確認しました。

https://twitter.com/youtoy/status/1602422867257610241

あらためて、enebular上で、ChatGPT用ノードを試していきます。
そして、無事に以下の ChatGPT のレスポンスを得ることができました。

https://twitter.com/youtoy/status/1602446258530287616

ログに出力されたテキストを書き出すと、こんな感じでした。

```html
<script>
  // 現在の日時を取得する
  var now = new Date();
  // 日時をテキストで表示する
  document.write("今は" + now.getFullYear() + "年" + (now.getMonth()+1) + "月" + now.getDate() + "日" + now.getHours() + "時" + now.getMinutes() + "分" + now.getSeconds() + "秒です。");
</script>
```

ちなみに、GUI上で試した時とは出力されたプログラムの内容が異なっていたようでした。

### 【余談】 実はこんなハマり方をしてしまいました...
ここからは余談なので、もしご興味があればお読みいただければ、という部分です。

上記で、お試しの最初でつまずいた話があり、その後は成功したような流れで書いていましたが、実はそれらの失敗と成功の流れの間で、また別の内容でハマっていたことがありました。

結論から言うと、自分のアカウントの API利用の枠がなくなっていた状態で、API をたたいていたため、うまく応答が得られない状況になったというものです（※ もしかしたら、上記の最初にハマった話も、そちらが原因だったかも？）。

そうとは気づけず、ローカルの Node-RED で同じことを試してみたり、Python版のライブラリで API をたたいてみたりしました。そして、Python で API をたたいた時のレスポンスの内容から、上記の原因に気づけて成功した流れになったという...

#### ローカルの Node-RED での検証
enebular とは別の環境で試した話も、少し記載しておきます。

ローカルの Node-RED で実行した際は、サーバーとの接続が切れたという表示がでてきたりもしていました（なぜか、ChatGPT用のノードの処理を実行すると、Node-RED が落ちるという挙動に）。

https://twitter.com/youtoy/status/1602424872247779329

この Node-RED上で原因を探る方法を考えようかとも思ったのですが、ここで、Node-RED用のノードで何か起こっているのか、API側で問題があるのかを切り分けるのが良さそうかと思い、[API を使うための公式ライブラリ](https://beta.openai.com/docs/libraries)を触ってみることにしました。
![公式ライブラリ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/b5d01a34-0baf-3573-a31d-db2f6908e855.png)

#### Python版のライブラリでの検証
enebular・Node-RED で動かない原因の切り分けのため、APIキーを用いた処理を Python版のライブラリを使って行うことにしました。

https://twitter.com/youtoy/status/1602444897206030336

そのお試しの結果、出力されたメッセージの中に「API の利用枠がない」という意味合いの内容が出てきて、その利用枠不足だった件に対応したことで、無事に API から応答を得られる状態にできました。

## おわりに
無事、ChatGPT用ノード「node-red-contrib-simple-chatgpt」を enebular で試せました。

本当は、API をたたいて得られた結果を、さらに何か利用した構成にして...、と考えてもいたのですが、上記のハマってしまった話があり、思った以上に時間を使ってしまったため、今回の記事のゴールはここまでとなりました。

### 余談
余談ですが、node-red-contrib-simple-chatgpt のページの下にリンクが書かれていた、「Libraries.io」が気になりました。

●Libraries.io - The Open Source Discovery Service
　https://libraries.io/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/bc27bbc5-3394-85e1-b8eb-f8341954e6e1.png)

ウィキペディアの記載によると、こんな感じらしい。

●Libraries.io - Wikipedia
　https://en.wikipedia.org/wiki/Libraries.io
> Libraries.io is an open source web service that lists software development project dependencies and alerts developers to new versions of the software libraries they are using.

## 【追記】 さらに余談
今回の内容と全然違ったものですが、enebular が絡む内容を以下の別カレンダー用の記事でも書きました。

●【Zoom 2022】Zoom の会議開始を LINEアプリにお知らせする仕組みを Zoom Webhook と enebular で作る（Webhook のバリデーション対応も行いつつ） - Qiita
　https://qiita.com/youtoy/items/8d2aa5257c0f4e9e3cc7